Files
shanxia2.0/docs/superpowers/specs/2026-09-08-pl-slip-print-brand-in-product-name-design.md
T
2026-09-09 13:03:02 +08:00

5.5 KiB
Raw Blame History

运输计划 · 打印单据产品名称附带品牌 — 设计文档

日期: 2026-09-08
状态: 已实施
范围: web-admin 运输计划「打印单据」— 入库单 / 送(提)货单 / 分装单
前置: 现网三套 slip 模板与 PlanProduct.brandName / brandQtys

目标

打印入库单、送(提)货单、分装单时:

  • 产品有品牌名 → 名称展示为 产品名(品牌名),例如 片碱(红四方)
  • 无品牌名 → 仍只显示产品名
  • 存在多品牌数量明细(brandQtys)→ 按品牌拆成多行,每行带对应品牌名与该品牌数量

已确认决策

# 决策 说明
D1 有品牌名才拼接 brandName(或品牌明细中的品牌名)非空才追加 (品牌);空则不拼
D2 多品牌拆行 有效 brandQtys 按品牌各打一行,不合并为「红四方、君正」
D3 数量口径 有有效 brandQtys → 行数量用该品牌 qty;否则用原产品行数量逻辑
D4 方案 A:公共展开函数 统一 expandPlanProductsForSlipPrint,三套模板 buildProductRows 共用
D5 空白单据不变 空白入库/送货/分装不读产品,不受影响
D6 不改列表/库表 仅打印渲染层;不改产品列表展示、不改后端表结构

非目标(本期不做)

  • 后端打印接口返回已拆行数据
  • 列表页、查看弹窗、现场公开页的产品名格式改造
  • 新增「品牌」独立打印列
  • 修改富文本模板列结构或条款文案

展开规则

输入:PlanProduct[]
输出:展开后的 PlanProduct[](浅拷贝行;名称与数量字段按下列规则覆写)

1. 有效品牌明细

取 brandQtys 中同时满足:

  • Number(qty) > 0
  • String(brandName || '').trim() 非空

若结果非空 → 按明细拆行(规则 2)。
否则 → 单行(规则 3)。

2. 拆行

对每条有效明细生成一行:

字段 值
productName 原产品名(品牌名);若原名已以 (该品牌名) 结尾则不重复拼接
数量相关 见下表「数量覆写」
其余字段 继承原产品行(编码、规格、单位、包装等)
brandName 该明细品牌名(便于排查)
brandQtys 可置为仅含当前品牌,或清空(打印不再二次展开)

数量覆写(与现网各单口径一致,仅把「行数量」换成品牌 qty):

单据 覆写字段
入库单 inboundQty(模板优先读 inboundQty ?? inboundEstimateQty ?? quantity)
送(提)货单 / 分装单 outboundQty(模板优先读 outboundQty ?? outboundEstimateQty ?? quantity)

实现时:展开函数接受 qtyMode: 'inbound' | 'outbound',按模式写对应字段,并同步写 quantity 为该品牌 qty,避免兜底读到总计划量。

3. 单行(无有效 brandQtys)

  • 有 brandName(trim 非空)→ productName = 原名(brandName),数量不变
  • 无 brandName → 原样返回(浅拷贝即可)

4. 合打 / 多计划

合打时若已对每计划产品带上 slipPlanNo,展开须保留该字段;按产品顺序展开,不跨计划合并品牌行。


送(提)货单数据补齐

送货段 PlanStopProduct 可能有 brandQtys,但当前 stopProductToPlanProduct 未拷贝品牌字段,且类型上无 brandName / brandMode。

本期在 pl-delivery-slip-print.ts:

  1. stopProductToPlanProduct 拷贝 brandQtys
  2. 用计划级 plan.products 按 planProductId / productId 回填 brandMode / brandId / brandName;若段上无 brandQtys 则回填计划级 brandQtys
  3. mergePlanProducts 合并同产品时:数量仍求和;brandQtys 按 brandId(无则品牌名)合并并求和 qty;brandName 仅当两边一致时保留,否则清空并依赖合并后的 brandQtys 拆行

展开发生在模板 buildProductRows(或填充占位符前对 plan.products 调用),保证入库/送货/分装一致。


技术落点

项 路径
公共展开 + 名称拼接 新建 web-admin/src/utils/pl-slip-product-brand.ts(或放入 pl-display.ts;优先独立小文件避免 display 膨胀)
入库单 pl-inbound-slip-template.ts → buildProductRows 前 expand(..., 'inbound')
送(提)货单 pl-delivery-slip-print.ts 补齐品牌;pl-delivery-slip-template.ts → expand(..., 'outbound')
分装单 pl-subpack-slip-template.ts → expand(..., 'outbound')

建议导出:

formatSlipProductNameWithBrand(productName: string, brandName?: string | null): string
expandPlanProductsForSlipPrint(
  products: PlanProduct[],
  qtyMode: 'inbound' | 'outbound'
): PlanProduct[]

验收要点

  1. 仅指定品牌「红四方」:三单产品名均为 片碱(红四方),数量仍为原行数量
  2. brandQtys 为红四方 10 + 君正 5:打印两行,名称分别带品牌,数量 10 / 5
  3. 无品牌:名称与数量与改前一致
  4. 空白单据:仍为空行,无产品名、无品牌拼接
  5. 送货单多卸合并同产品:品牌数量合并后正确拆行
  6. 合打多计划:各计划产品独立展开,slipPlanNo 不丢

自检

  • 无 TBD / 占位未决项
  • 与「有品牌名才拼 / 多品牌拆行 / 品牌 qty」决策一致
  • 范围限打印渲染,不扩散列表与后端 schema
  • 空白单、合打、送货段缺品牌字段均有覆盖