Files
shanxia2.0/docs/superpowers/specs/2026-08-06-pl-plan-copy-design.md
T
2026-08-06 23:33:48 +08:00

5.3 KiB
Raw Blame History

运输计划「复制」:新增弹窗预填

日期: 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