Files
shanxia2.0/docs/superpowers/specs/2026-07-27-pl-plan-batch-print-merge-design.md
T

7.2 KiB
Raw Blame History

运输计划 · 多选合打打印单据 — 设计文档

日期: 2026-07-27
状态: 待实施
前置: docs/superpowers/specs/2026-07-26-pl-print-slip-dropdown-design.md;现网入库单 / 送(提)货单 / 分装单模版(pl-*-slip-template.ts)
Demo: docs/pl-plan-batch-print-merge-demo.html

目标

运输计划列表支持勾选 多条 计划,将所选计划的产品合打到 一张 单据上。单据类型仍为:入库单、送(提)货单、分装单。沿用现网模版样式,仅扩展物料表与备注数据。

已确认决策

# 决策 说明
D1 前端合打 复用三个打印弹窗;扩展为支持 planIds[];不新增后端合打 API
D2 入库单合打条件 所选计划 客户名称一致 且 计划日期一致,且均为入库类(planType=inbound)
D3 送(提)货单合打条件 客户名称一致且计划日期一致,且均为出库类(planType=outbound)
D4 分装单合打条件 不校验 客户名称、计划日期;所选须均可打分装单(出库类)
D5 物料行 分行列出,不合并同名产品数量;入库/送货「单据编号」列填各行所属 planNo;分装「序号」按合并后行序递增
D6 备注 多计划备注换行合并;格式 计划号:备注;空备注跳过
D7 收货联系方式 合打(及本期约定)留空
D8 车辆信息 不填入打印数据
D9 模版 三类单据沿用当前模版结构与样式,只增加物料表内容(及备注合并)
D10 入口范围 列表工具栏 支持多选合打;查看弹窗 / 安排成功底栏仍为单计划打印(行为不变)
D11 单选 勾选恰好 1 条时,行为与现网一致

非目标(本期不做)

  • 后端合打预览 / 持久化合打快照 API
  • 修改富文本模版 HTML 结构或列定义
  • 查看弹窗、安排运输成功栏的多选合打
  • 同名同规格产品数量自动合并
  • 合打时自动带入车辆、司机、收货联系方式

交互(列表工具栏)

  1. 用户勾选 N≥1 条运输计划。
  2. 「打印单据」下拉在 N≥1 时可点(现网为恰好 1 条才可点)。
  3. 菜单项启用规则:
    • 对当前勾选集合计算 canBatchPrint(command, plans);不满足则该项 disabled,title/点击提示说明原因。
  4. 选中可用项后打开对应打印弹窗,传入所选计划 id 列表(保持勾选顺序)。

编辑 / 安排运输 / 作废 / 删除等仍要求恰好 1 条,不变。


校验规则

抽纯函数(建议 web-admin/src/utils/pl-display.ts 或 pl-batch-print.ts):

canBatchPrintSlip(plans: Plan[], command: PlPrintSlipCommand): { ok: boolean; reason?: string }
command 规则
inbound plans.length≥1;全部 planType==='inbound';全部 customerName 相同(trim 后);全部 planDate 相同
delivery 全部 planType==='outbound';客户名称、计划日期同上
subpack 全部 canPrintSlipCommand(planType,'subpack')(即出库类);不校验客户/日期

客户名称比较字段:与列表「客户名称」一致,使用 customerName(trim);若个别历史数据空,视为不相等(合打入库/送货失败并提示)。

单条时等价于现有 canPrintSlipCommand(plan.planType, command)。


数据拼装(打印弹窗内)

打开方式

现有:open(planId: string)
扩展:open(planIdOrIds: string | string[])

  • 单 id:保持现逻辑
  • 多 id:并行 planApi.get(或等价详情接口),按传入顺序排列

虚拟「合打计划」视图(内存,不落库)

从多条 Plan 构造传给模版渲染的上下文:

字段 合打取值
物料 products 按计划顺序展开;每行带所属 planNo(入库/送货写入「单据编号」列)
planDate / 中文日期 取第一条(入库/送货时各条已相同;分装取第一条)
客户 / 送货单位 / 收货单位 取第一条的客户相关字段(入库/送货已一致)
remark plans.filter(有备注).map(p => \${p.planNo}:${p.remark.trim()}`).join('\n')`
收货联系方式 ''
车辆 / 车牌 / 司机等 不填(空或不传入模版占位)
分装单号等单据级字段 仍按现网单计划规则生成(基于第一条或现有逻辑),不因合打改号规则(若现网依赖单 planId,继续用第一条 id 触发取号)

模版 HTML 不改;仅 buildProductRows / 占位符替换的数据源改为合打结果。

产品行顺序

勾选顺序 → 计划顺序 → 各计划内原产品顺序。


主要改动文件

文件 职责
web-admin/src/utils/pl-batch-print.ts(新建)或扩展 pl-display.ts canBatchPrintSlip、备注合并、产品行展开 helper
web-admin/src/views/pl/plan/index.vue 工具栏:N≥1 可打开打印;菜单 disabled 绑合打校验;传入 ids
web-admin/src/components/business/pl-inbound-slip-print-dialog/index.vue open 支持多 id;合打渲染
web-admin/src/components/business/pl-delivery-slip-print-dialog/index.vue 同上;收货联系方式空
web-admin/src/components/business/pl-subpack-slip-print-dialog/index.vue 同上;序号递增
web-admin/src/utils/pl-inbound-slip-template.ts 等 尽量不改模版结构;若 buildProductRows 需按行 planNo 覆盖,做最小改动
单测(可选) canBatchPrintSlip、备注合并纯函数

查看弹窗 / pl-plan-arrange-dialog 打印入口:不改(仍 open(singleId))。


错误提示文案(建议)

  • 未勾选:按钮 disabled
  • 入库合打失败:合打入库单要求:客户名称一致且计划日期一致,且均为入库类计划
  • 送货合打失败:合打送(提)货单要求:客户名称一致且计划日期一致,且均为出库类计划
  • 分装失败:分装单仅支持出库类计划
  • 加载失败:保持现网「加载计划失败」类提示

验收标准

  1. 勾选 1 条:三类打印与改前一致。
  2. 勾选同客户、同计划日期的多条入库:可打开一张入库单,物料行为各计划产品拼接,单据编号列为各自计划号,备注为 计划号:备注 多行。
  3. 勾选客户或日期不一致的入库/出库:对应入库/送货菜单禁用或提示失败;分装在出库多选且跨客户/日期时仍可合打。
  4. 合打单据中收货联系方式为空;无车辆信息填入。
  5. 查看弹窗 / 安排成功栏打印仍为单计划。
  6. 模版视觉结构与现网单打一致(列、签字区、条款等不变)。

风险与兼容

  • 列表行可能只有摘要字段:合打打开时须 拉详情,以详情产品/备注为准。
  • 分装单号若按单计划生成,合打场景使用第一条计划触发,需在实现时与现网取号逻辑对齐并在自测中确认。
  • 大批量勾选导致详情请求过多:本期不做分页合打上限;若现场反馈再加上限(如 ≤20)。