feat(client): 入库表单关联商品属性字典(产地/保质期/储存方式/描述文档)
- product_option.dart: 新增 4 个字典 model(Origin/ShelfLife/Storage/DescriptionDoc) - product_option_repository.dart: 新增 4 个 list 方法(listOrigins/ShelfLives/Storages/DescriptionDocs) - product_option_provider.dart: 新增 4 个 FutureProvider 供表单使用 - product_repository.dart: findOrCreate 加 originId/shelfLifeId/storageId/descriptionDocId 可选参数 - stock_in_form_screen.dart: _ItemRow 加 4 个可选 ID 字段;新增 4 个 SearchableOptionField 方法;移动端卡片视图增加 4 个可选字段;提交时传入属性 ID Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -66,3 +66,95 @@ class ProductSpecOption {
|
||||
remark: json['remark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
// ── 商品属性字典(产地/保质期/储存方式) ─────────────────────────
|
||||
|
||||
class ProductOriginOption {
|
||||
final int id;
|
||||
final String? code;
|
||||
final String name;
|
||||
final String? remark;
|
||||
|
||||
const ProductOriginOption({
|
||||
required this.id,
|
||||
this.code,
|
||||
required this.name,
|
||||
this.remark,
|
||||
});
|
||||
|
||||
factory ProductOriginOption.fromJson(Map<String, dynamic> json) =>
|
||||
ProductOriginOption(
|
||||
id: (json['id'] as num).toInt(),
|
||||
code: json['code'] as String?,
|
||||
name: json['name'] as String,
|
||||
remark: json['remark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
class ProductShelfLifeOption {
|
||||
final int id;
|
||||
final String? code;
|
||||
final String name;
|
||||
final String? remark;
|
||||
|
||||
const ProductShelfLifeOption({
|
||||
required this.id,
|
||||
this.code,
|
||||
required this.name,
|
||||
this.remark,
|
||||
});
|
||||
|
||||
factory ProductShelfLifeOption.fromJson(Map<String, dynamic> json) =>
|
||||
ProductShelfLifeOption(
|
||||
id: (json['id'] as num).toInt(),
|
||||
code: json['code'] as String?,
|
||||
name: json['name'] as String,
|
||||
remark: json['remark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
class ProductStorageOption {
|
||||
final int id;
|
||||
final String? code;
|
||||
final String name;
|
||||
final String? remark;
|
||||
|
||||
const ProductStorageOption({
|
||||
required this.id,
|
||||
this.code,
|
||||
required this.name,
|
||||
this.remark,
|
||||
});
|
||||
|
||||
factory ProductStorageOption.fromJson(Map<String, dynamic> json) =>
|
||||
ProductStorageOption(
|
||||
id: (json['id'] as num).toInt(),
|
||||
code: json['code'] as String?,
|
||||
name: json['name'] as String,
|
||||
remark: json['remark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
// ── 描述文档 ─────────────────────────────────────────────────────
|
||||
|
||||
class ProductDescriptionDoc {
|
||||
final int id;
|
||||
final String title;
|
||||
final String? content;
|
||||
final String? remark;
|
||||
|
||||
const ProductDescriptionDoc({
|
||||
required this.id,
|
||||
required this.title,
|
||||
this.content,
|
||||
this.remark,
|
||||
});
|
||||
|
||||
factory ProductDescriptionDoc.fromJson(Map<String, dynamic> json) =>
|
||||
ProductDescriptionDoc(
|
||||
id: (json['id'] as num).toInt(),
|
||||
title: json['title'] as String,
|
||||
content: json['content'] as String?,
|
||||
remark: json['remark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user