# 运输计划「复制」:新增弹窗预填 **日期:** 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` |