From e892ab45b228614eef5666479b3ea423faae39a7 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sat, 20 Jun 2026 07:05:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(client):=20=E5=8E=86=E5=8F=B2=E5=8D=95?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E4=BC=98=E5=85=88=E8=AF=BB=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=E5=88=97=E3=80=81=E5=9B=9E=E9=80=80=20product=20=E5=85=B3?= =?UTF-8?q?=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 入库/出库明细 fromJson 改为优先取明细行自身的 product_code/name/series/spec 快照列,回退到 product 关联。历史导入单 product_id 为占位、无 product join, 靠快照列正常展示商品信息;App 新建单据仍走 product 关联,行为不变。 Co-Authored-By: Claude Opus 4.8 --- client/lib/models/stock_in.dart | 21 ++++++++++++++++----- client/lib/models/stock_out.dart | 21 ++++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/client/lib/models/stock_in.dart b/client/lib/models/stock_in.dart index f10c526..5ade070 100644 --- a/client/lib/models/stock_in.dart +++ b/client/lib/models/stock_in.dart @@ -34,7 +34,17 @@ class StockInItem { this.productStorage, }); - factory StockInItem.fromJson(Map json) => StockInItem( + factory StockInItem.fromJson(Map json) { + final product = json['product'] as Map?; + // 历史导入行 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?)?['name'] as String?, - productCode: (json['product'] as Map?)?['code'] as String?, - productSeries: (json['product'] as Map?)?['series'] as String?, - productSpec: (json['product'] as Map?)?['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?)?['unit'] as String?, productOrigin: ((json['product'] as Map?)?['origin'] as Map?)?['name'] as String?, @@ -56,6 +66,7 @@ class StockInItem { productStorage: ((json['product'] as Map?)?['storage'] as Map?)?['name'] as String?, ); + } Map toJson() => { 'product_id': productId, diff --git a/client/lib/models/stock_out.dart b/client/lib/models/stock_out.dart index 415a10a..b25fe4c 100644 --- a/client/lib/models/stock_out.dart +++ b/client/lib/models/stock_out.dart @@ -23,7 +23,17 @@ class StockOutItem { this.productUnit, }); - factory StockOutItem.fromJson(Map json) => StockOutItem( + factory StockOutItem.fromJson(Map json) { + final product = json['product'] as Map?; + // 历史导入行 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?)?['name'] as String?, - productCode: (json['product'] as Map?)?['code'] as String?, - productSeries: (json['product'] as Map?)?['series'] as String?, - productSpec: (json['product'] as Map?)?['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?)?['unit'] as String?, ); + } } class StockOutOrder {