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,
|
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
|
orderId: json['order_id'] != null
|
||||||
? (json['order_id'] as num).toInt()
|
? (json['order_id'] as num).toInt()
|
||||||
: null,
|
: null,
|
||||||
@@ -44,10 +54,10 @@ class StockInItem {
|
|||||||
totalPrice: (json['total_price'] as num).toDouble(),
|
totalPrice: (json['total_price'] as num).toDouble(),
|
||||||
batchNo: json['batch_no'] as String?,
|
batchNo: json['batch_no'] as String?,
|
||||||
productionDate: json['production_date'] as String?,
|
productionDate: json['production_date'] as String?,
|
||||||
productName: (json['product'] as Map<String, dynamic>?)?['name'] as String?,
|
productName: lineOrProduct('product_name', 'name'),
|
||||||
productCode: (json['product'] as Map<String, dynamic>?)?['code'] as String?,
|
productCode: lineOrProduct('product_code', 'code'),
|
||||||
productSeries: (json['product'] as Map<String, dynamic>?)?['series'] as String?,
|
productSeries: lineOrProduct('series', 'series'),
|
||||||
productSpec: (json['product'] as Map<String, dynamic>?)?['spec'] as String?,
|
productSpec: lineOrProduct('spec', 'spec'),
|
||||||
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
||||||
productOrigin: ((json['product'] as Map<String, dynamic>?)?['origin']
|
productOrigin: ((json['product'] as Map<String, dynamic>?)?['origin']
|
||||||
as Map<String, dynamic>?)?['name'] as String?,
|
as Map<String, dynamic>?)?['name'] as String?,
|
||||||
@@ -56,6 +66,7 @@ class StockInItem {
|
|||||||
productStorage: ((json['product'] as Map<String, dynamic>?)?['storage']
|
productStorage: ((json['product'] as Map<String, dynamic>?)?['storage']
|
||||||
as Map<String, dynamic>?)?['name'] as String?,
|
as Map<String, dynamic>?)?['name'] as String?,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
'product_id': productId,
|
'product_id': productId,
|
||||||
|
|||||||
@@ -23,7 +23,17 @@ class StockOutItem {
|
|||||||
this.productUnit,
|
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
|
orderId: json['order_id'] != null
|
||||||
? (json['order_id'] as num).toInt()
|
? (json['order_id'] as num).toInt()
|
||||||
: null,
|
: null,
|
||||||
@@ -31,12 +41,13 @@ class StockOutItem {
|
|||||||
quantity: (json['quantity'] as num).toDouble(),
|
quantity: (json['quantity'] as num).toDouble(),
|
||||||
unitPrice: (json['unit_price'] as num).toDouble(),
|
unitPrice: (json['unit_price'] as num).toDouble(),
|
||||||
totalPrice: (json['total_price'] as num).toDouble(),
|
totalPrice: (json['total_price'] as num).toDouble(),
|
||||||
productName: (json['product'] as Map<String, dynamic>?)?['name'] as String?,
|
productName: lineOrProduct('product_name', 'name'),
|
||||||
productCode: (json['product'] as Map<String, dynamic>?)?['code'] as String?,
|
productCode: lineOrProduct('product_code', 'code'),
|
||||||
productSeries: (json['product'] as Map<String, dynamic>?)?['series'] as String?,
|
productSeries: lineOrProduct('series', 'series'),
|
||||||
productSpec: (json['product'] as Map<String, dynamic>?)?['spec'] as String?,
|
productSpec: lineOrProduct('spec', 'spec'),
|
||||||
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
productUnit: (json['product'] as Map<String, dynamic>?)?['unit'] as String?,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StockOutOrder {
|
class StockOutOrder {
|
||||||
|
|||||||
Reference in New Issue
Block a user