feat(client): 库存表列按原型重排 + 商品列 name/code 合并两行

列序照原型:商品(name+code 两行) · 规格 · 系列 · 批次 · 单价 · 生产日期 ·
入库时间 · 供应商 · 仓库 · 备注 · 状态 · 操作。遵项目铁律跳过「库存数量/成本价」
(装箱数脏数据 + 进价敏感),仓库/备注保留为可隐藏列。新增 _productCell
(name 加粗可点进详情 + code 等宽 muted,fsXs 走 AppDims)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
This commit is contained in:
wangjia
2026-06-25 10:05:00 +08:00
parent 3f1053dec7
commit 8e5cc5054d
@@ -46,18 +46,18 @@ class _InventoryListScreenState extends ConsumerState<InventoryListScreen> {
static const _screenId = 'inventory_list';
// 列序照原型重排;商品 = name+code 合并两行。
// 库存量/成本价列按项目铁律不展示(装箱数脏数据 + 进价敏感);仓库/备注作可隐藏列。
static const _colDefs = [
ColDef('code', '商品编码', required: true),
ColDef('name', '商品名称', required: true),
ColDef('product', '商品', required: true),
ColDef('spec', '规格'),
ColDef('series', '系列'),
ColDef('batch', '批次号'),
ColDef('warehouse', '仓库'),
// 库存量列已移除:序列号模型下每件独立,原数量列含历史装箱数脏数据易误导
ColDef('price', '单价'),
ColDef('prodDate', '生产日期'),
ColDef('inTime', '入库时间'),
ColDef('supplier', '供应商'),
ColDef('warehouse', '仓库'),
ColDef('remark', '备注'),
ColDef('status', '状态'),
ColDef('actions', '操作', required: true),
@@ -283,31 +283,44 @@ class _InventoryListScreenState extends ConsumerState<InventoryListScreen> {
);
}
/// 商品列:name(可点进详情)+ code 两行(还原原型 .pname/.pcode)。
Widget _productCell(Inventory item, BuildContext context) {
final linked = item.productId != null;
final body = Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.productName.isEmpty ? '-' : item.productName,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w600,
color: linked ? context.tokens.primary : context.tokens.text,
),
),
if (item.productCode.isNotEmpty)
Text(
item.productCode,
style: TextStyle(
fontFamily: 'monospace',
fontSize: AppDims.fsXs,
color: context.tokens.muted,
),
),
],
);
final cell = SizedBox(width: 200, child: body);
if (!linked) return cell;
return GestureDetector(
onTap: () => context.push('/products/${item.productId}'),
child: cell,
);
}
/// 库存查询:宽屏表格单元格(按列 key 返回对应 DataCell
DataCell _buildInventoryCell(String key, Inventory item, BuildContext context) {
return switch (key) {
'code' => DataCell(Text(
item.productCode.isEmpty ? '-' : item.productCode,
style: TextStyle(
fontFamily: 'monospace', fontSize: 12, color: context.tokens.muted))),
'name' => DataCell(item.productId != null
? GestureDetector(
onTap: () => context.push('/products/${item.productId}'),
child: SizedBox(
width: 180,
child: Text(
item.productName.isEmpty ? '-' : item.productName,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: context.tokens.primary,
decoration: TextDecoration.underline,
decorationColor: context.tokens.primary,
),
),
),
)
: Text(item.productName.isEmpty ? '-' : item.productName,
overflow: TextOverflow.ellipsis)),
'product' => DataCell(_productCell(item, context)),
'spec' => DataCell(Text(item.spec.isEmpty ? '-' : item.spec)),
'series' => DataCell(Text(item.series.isEmpty ? '-' : item.series)),
'batch' => DataCell(Text(item.batchNo.isEmpty ? '-' : item.batchNo,