5.5 KiB
5.5 KiB
运输计划 · 打印单据产品名称附带品牌 — 设计文档
日期: 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) > 0String(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:
stopProductToPlanProduct拷贝brandQtys- 用计划级
plan.products按planProductId/productId回填brandMode/brandId/brandName;若段上无brandQtys则回填计划级brandQtys 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[]
验收要点
- 仅指定品牌「红四方」:三单产品名均为
片碱(红四方),数量仍为原行数量 brandQtys为红四方 10 + 君正 5:打印两行,名称分别带品牌,数量 10 / 5- 无品牌:名称与数量与改前一致
- 空白单据:仍为空行,无产品名、无品牌拼接
- 送货单多卸合并同产品:品牌数量合并后正确拆行
- 合打多计划:各计划产品独立展开,
slipPlanNo不丢
自检
- 无 TBD / 占位未决项
- 与「有品牌名才拼 / 多品牌拆行 / 品牌 qty」决策一致
- 范围限打印渲染,不扩散列表与后端 schema
- 空白单、合打、送货段缺品牌字段均有覆盖