From 7ca8ad29faf9879b6204f77da9584ef3fa148b4a Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 6 Aug 2026 23:12:01 +0800 Subject: [PATCH] docs: add design for copying transport plans into new form dialog. Co-authored-by: Cursor --- .../specs/2026-08-06-pl-plan-copy-design.md | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 docs/superpowers/specs/2026-08-06-pl-plan-copy-design.md diff --git a/docs/superpowers/specs/2026-08-06-pl-plan-copy-design.md b/docs/superpowers/specs/2026-08-06-pl-plan-copy-design.md new file mode 100644 index 000000000..2c1e7d6dd --- /dev/null +++ b/docs/superpowers/specs/2026-08-06-pl-plan-copy-design.md @@ -0,0 +1,123 @@ +# 运输计划「复制」:新增弹窗预填 + +**日期:** 2026-08-06 +**状态:** 设计已确认 +**选定方案:** 方案 1 — 纯前端预填(打开「新增运输计划」弹窗,映射可复制字段;保存仍走现有 `createFull`) + +## 1. 目标 + +在运输计划列表(`/#/pl/plan-module/plan`)支持基于已有计划复制新建: + +1. 打开「新增运输计划」弹窗并预填可复制字段。 +2. 用户可修改日期、产品等后保存,才真正建单。 +3. 复制基础信息、产品信息、备注、运输物流信息;**不**复制车辆、承运商及运费相关信息。 + +## 2. 非目标 + +- 不新增后端复制/草稿 API +- 不直接一键落库(须用户确认保存) +- 不批量复制 +- 不改造小程序 / H5 +- 不改变现有编辑、安排运输、作废等逻辑 + +## 3. 交互 + +### 3.1 入口 + +| 位置 | 条件 | 行为 | +|------|------|------| +| 列表工具栏「复制」 | 恰好勾选 1 条 | 打开新增弹窗并按源计划预填 | +| 查看弹窗 `#hero-actions`「复制」 | 始终可点(含已作废、已归档) | 同上;与「编辑」一致,打开表单弹窗,**不**强制关闭查看弹窗 | + +- 按钮:`CopyDocument` 图标 +「复制」;工具栏用 `btn-ghost`(主行动仍为「新增计划」)。 +- 任意跟进状态 / 运输状态 / 归档状态均可作为复制源;复制**不**继承业务状态。 + +### 3.2 弹窗行为 + +1. `planId` 为空(新建模式),另传 `copyFromPlanId = 源计划 id`。 +2. 标题:**新增运输计划**(与普通新增一致)。 +3. 打开后 `planApi.get(copyFromPlanId)` → `loadPlanForCopy` 预填。 +4. 用户改字段后点「保存」或「保存并安排」→ 现有 `createFull` 路径。 +5. 成功后:新计划编号、跟进状态待安排、运输状态未安排;源计划不变。 + +### 3.3 日期与跟进人 + +| 字段 | 规则 | +|------|------| +| `createDate` | 设为**当天** | +| `planDate`、取货时间、送货时间 | **原样带入**,用户可改 | +| 跟进人 | **当前登录用户**(与普通新增一致) | + +复制模式下,关闭「计划日期变更自动同步取货/送货时间」的 watch,避免覆盖已带入的取送货时间。 + +## 4. 字段映射 + +### 4.1 复制(预填) + +| 区块 | 字段 | +|------|------| +| 合同快照 | `contractId`、合同号、甲乙方、客户/供应商/目的地、联系人电话、结算方式、`hasFreight` 等;加载合同详情失败时用计划字段拼快照(同编辑) | +| 基础信息 | `planDate`、`belongsCompany`、`planType`;`createDate`=当天;跟进人=当前用户 | +| 产品信息 | 产品行业务字段(含别名/品牌、计划数量 `quantity`、产品备注等);数量仅用计划数量 | +| 运输物流 | 取货/送货地址、经纬度、时间、联系方式、注意事项 | +| 备注 | `remark` | + +### 4.2 清空(不复制) + +| 区块 | 字段 | +|------|------| +| 车辆 | `vehicleId`、司机、人员摘要、车辆摘要条 | +| 承运商/运费 | `carrierId`、`distanceKm`、运费计价字段(重置为新增默认) | +| 执行态 | 计划编号、各业务状态、`transportId`/`transportNo`、安排结果与链接 | +| 产品执行结果 | `actualQty`、出入库实绩、归档品牌数量、危化证书 URL(`purchaseCertUrl` / `transportCertUrl` / `legalUseCertUrl`) | +| 产品行主键 | 不沿用源 `plan_product.id`(表单行用临时键,提交只带产品业务字段) | + +## 5. 组件与改动文件 + +| 文件 | 变更 | +|------|------| +| `web-admin/src/components/business/pl-plan-form-dialog/index.vue` | 新增 prop `copyFromPlanId`;实现 `loadPlanForCopy`;复制态禁用计划日期→取送货联动;产品映射去掉证书 URL / 源行 id | +| `web-admin/src/views/pl/plan/index.vue` | 工具栏与查看弹窗「复制」;`copyFromPlanId` 与 `editingPlanId` 互斥传入表单弹窗 | + +可选:若映射过长,抽出 `mapPlanToCopyForm` composable(非必须)。 + +**后端:** 无变更。 + +## 6. 数据流 + +``` +列表/查看 「复制」 + → formDialogVisible=true, planId='', copyFromPlanId=源id + → PlPlanFormDialog opened + → planApi.get(copyFromPlanId) + → loadPlanForCopy(裁剪车辆/承运商/运费/执行态) + → 用户编辑 + → createFull(同新增) + → success → 刷新列表;可选打开安排弹窗 +``` + +## 7. 错误处理 + +- 拉取源计划失败:`ElMessage.error`,关闭表单弹窗,不展示半成品表单。 +- 保存失败:与现有新增一致(校验滚动 + 接口错误提示)。 + +## 8. 验收 + +1. 勾选 1 条 →「复制」→ 标题为「新增运输计划」;`createDate` 为今天;跟进人为当前用户。 +2. 合同/基础/产品计划数量/备注/取送货已预填;车牌、承运商、运费为空。 +3. 修改后保存 → 产生新计划编号与待安排状态;源计划数据不变。 +4. 已作废、已归档计划也可复制。 +5. 未勾选或勾选多条时工具栏「复制」禁用;普通新增、编辑行为不变。 + +## 9. 决议摘要 + +| 议题 | 决议 | +|------|------| +| 交互 | 打开新增弹窗预填,保存才建单 | +| 计划/取送货日期 | 原样带入 | +| 承运商 | 不复制(与车辆一并清空) | +| 入口 | 列表工具栏(单选)+ 查看弹窗 | +| 可复制范围 | 任意状态 | +| 创建日期 | 当天 | +| 产品数量 | 仅计划 `quantity` | +| 实现 | 纯前端,复用 `createFull` |