feat(client): 历史单明细优先读快照列、回退 product 关联
入库/出库明细 fromJson 改为优先取明细行自身的 product_code/name/series/spec 快照列,回退到 product 关联。历史导入单 product_id 为占位、无 product join, 靠快照列正常展示商品信息;App 新建单据仍走 product 关联,行为不变。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -34,7 +34,17 @@ class StockInItem {
|
||||
this.productStorage,
|
||||
});
|
||||
|
||||
factory StockInItem.fromJson(Map<String, dynamic> json) => StockInItem(
|
||||
factory StockInItem.fromJson(Map<String, dynamic> json) {
|
||||
final product = json['product'] as Map<String, dynamic>?;
|
||||
// 历史导入行 product_id=0、无 product 关联,商品信息存在明细行自身列上。
|
||||
// 优先取明细行快照列,回退到 product 关联(App 新建单据走 product)。
|
||||
String? lineOrProduct(String lineKey, String productKey) {
|
||||
final line = json[lineKey] as String?;
|
||||
if (line != null && line.isNotEmpty) return line;
|
||||
return product?[productKey] as String?;
|
||||
}
|
||||
|
||||
return StockInItem(
|
||||
orderId: json['order_id'] != null
|
||||
? (json['order_id'] as num).toInt()
|
||||
: null,
|
||||
@@ -44,10 +54,10 @@ class StockInItem {
|
||||
totalPrice: (json['total_price'] as num).toDouble(),
|
||||
batchNo: json['batch_no'] as String?,
|
||||
productionDate: json['production_date'] as String?,
|
||||
productName: (json['product'] as Map<String, dynamic>?)?['name'] as String?,
|
||||
productCode: (json['product'] as Map<String, dynamic>?)?['code'] as String?,
|
||||
productSeries: (json['product'] as Map<String, dynamic>?)?['series'] as String?,
|
||||
productSpec: (json['product'] as Map<String, dynamic>?)?['spec'] as String?,
|
||||
productName: lineOrProduct('product_name', 'name'),
|
||||
productCode: lineOrProduct('product_code', 'code'),
|
||||
productSeries: lineOrProduct('series', 'series'),
|
||||
productSpec: lineOrProduct('spec', 'spec'),
|
||||
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
||||
productOrigin: ((json['product'] as Map<String, dynamic>?)?['origin']
|
||||
as Map<String, dynamic>?)?['name'] as String?,
|
||||
@@ -56,6 +66,7 @@ class StockInItem {
|
||||
productStorage: ((json['product'] as Map<String, dynamic>?)?['storage']
|
||||
as Map<String, dynamic>?)?['name'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'product_id': productId,
|
||||
|
||||
@@ -23,7 +23,17 @@ class StockOutItem {
|
||||
this.productUnit,
|
||||
});
|
||||
|
||||
factory StockOutItem.fromJson(Map<String, dynamic> json) => StockOutItem(
|
||||
factory StockOutItem.fromJson(Map<String, dynamic> json) {
|
||||
final product = json['product'] as Map<String, dynamic>?;
|
||||
// 历史导入行 product_id=0、无 product 关联,商品信息存在明细行自身列上。
|
||||
// 优先取明细行快照列,回退到 product 关联(App 新建单据走 product)。
|
||||
String? lineOrProduct(String lineKey, String productKey) {
|
||||
final line = json[lineKey] as String?;
|
||||
if (line != null && line.isNotEmpty) return line;
|
||||
return product?[productKey] as String?;
|
||||
}
|
||||
|
||||
return StockOutItem(
|
||||
orderId: json['order_id'] != null
|
||||
? (json['order_id'] as num).toInt()
|
||||
: null,
|
||||
@@ -31,12 +41,13 @@ class StockOutItem {
|
||||
quantity: (json['quantity'] as num).toDouble(),
|
||||
unitPrice: (json['unit_price'] as num).toDouble(),
|
||||
totalPrice: (json['total_price'] as num).toDouble(),
|
||||
productName: (json['product'] as Map<String, dynamic>?)?['name'] as String?,
|
||||
productCode: (json['product'] as Map<String, dynamic>?)?['code'] as String?,
|
||||
productSeries: (json['product'] as Map<String, dynamic>?)?['series'] as String?,
|
||||
productSpec: (json['product'] as Map<String, dynamic>?)?['spec'] as String?,
|
||||
productName: lineOrProduct('product_name', 'name'),
|
||||
productCode: lineOrProduct('product_code', 'code'),
|
||||
productSeries: lineOrProduct('series', 'series'),
|
||||
productSpec: lineOrProduct('spec', 'spec'),
|
||||
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class StockOutOrder {
|
||||
|
||||
Reference in New Issue
Block a user