From 8d76c6bec6fb540ab4d4eb013c03994bd4fa3f8a Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Mon, 27 Jul 2026 20:39:39 +0800 Subject: [PATCH] =?UTF-8?q?docs(pl):=20=E8=BF=90=E8=BE=93=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=A4=9A=E9=80=89=E5=90=88=E6=89=93=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E4=B8=8E=E4=BA=A4=E4=BA=92=20Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- docs/pl-plan-batch-print-merge-demo.html | 881 ++++++++++++++++++ ...-07-27-pl-plan-batch-print-merge-design.md | 144 +++ web-admin/graphify-out/.rebuild.lock | 1 - 3 files changed, 1025 insertions(+), 1 deletion(-) create mode 100644 docs/pl-plan-batch-print-merge-demo.html create mode 100644 docs/superpowers/specs/2026-07-27-pl-plan-batch-print-merge-design.md delete mode 100644 web-admin/graphify-out/.rebuild.lock diff --git a/docs/pl-plan-batch-print-merge-demo.html b/docs/pl-plan-batch-print-merge-demo.html new file mode 100644 index 000000000..26ef8f53a --- /dev/null +++ b/docs/pl-plan-batch-print-merge-demo.html @@ -0,0 +1,881 @@ + + + + + + 运输计划 · 多选合打单据 Demo + + + +
+

运输计划 · 多选合打单据 Demo

+

+ 勾选多条计划 →「打印单据」→ 按规则校验 → 右侧预览「产品合并到一张单据」。 + 本页仅演示交互与合打规则,非最终生产版式。 +

+ +
+

合打规则(客户确认稿)

+
+
+ 入库单 + 勾选计划的客户名称一致且计划日期一致才可合打;产品行合并到一张入库单。 +
+
+ 送(提)货单 + 同入库单:客户名称 + 计划日期均须一致。 +
+
+ 分装单 + 不校验客户名称、计划日期;勾选即可合打产品到一张分装单。 +
+
+

+ 合打策略:沿用现网三类单据模版,只合并物料表格行(分行列出,不合并数量); + 入库/送货「单据编号」= 各计划号;分装「序号」递增。 + 表头:客户/日期取共有值(入库、送货须一致);备注= 各计划备注换行拼接(一行一计划); + 收货联系方式留空;不填车辆信息。 +

+
+ +
+
+

运输计划列表(多选)

+
+ 已选 0 项 + + +
+ + + + + + + + + + + + + +
计划号计划日期客户名称类型产品摘要
+
+
+ +
+

合打预览

+
+
勾选计划并选择打印类型后,在此预览合并产品明细
+
+
+
+
+ + + + diff --git a/docs/superpowers/specs/2026-07-27-pl-plan-batch-print-merge-design.md b/docs/superpowers/specs/2026-07-27-pl-plan-batch-print-merge-design.md new file mode 100644 index 000000000..24859a0f0 --- /dev/null +++ b/docs/superpowers/specs/2026-07-27-pl-plan-batch-print-merge-design.md @@ -0,0 +1,144 @@ +# 运输计划 · 多选合打打印单据 — 设计文档 + +> **日期**: 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`): + +```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)。 diff --git a/web-admin/graphify-out/.rebuild.lock b/web-admin/graphify-out/.rebuild.lock deleted file mode 100644 index 7b9c7d539..000000000 --- a/web-admin/graphify-out/.rebuild.lock +++ /dev/null @@ -1 +0,0 @@ -25748