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

124 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 运输计划「复制」:新增弹窗预填
**日期:** 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` |