docs: add transport plan supplier/demander free-product design and plan.
Capture agreed rules for dual-party customers, multi-contract sides, ProductSelector-only products, and no historical migration before implementation. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
90ae136f38
commit
ca6aca2b14
2 files changed
+475
No files matched your search
@@ -0,0 +1,195 @@
|
||||
# 运输计划:供方/需方 + 合同多选 + 产品自由选择
|
||||
|
||||
**日期:** 2026-08-08
|
||||
**状态:** 待评审
|
||||
**选定方案:** 方案 A — 主表存供方/需方客户;关联表存多侧多合同;产品走产品库 `ProductSelector`
|
||||
|
||||
## 1. 目标
|
||||
|
||||
改造运输计划新建/编辑(`/#/pl/plan-module/plan` →「新增计划」/「编辑」弹窗),使:
|
||||
|
||||
1. 明确维护 **供方信息**、**需方信息**(均从 CRM 客户选择,均必填)。
|
||||
2. 供方/需方可各自绑定 **多份合同**;合同是否必填取决于该侧客户是否为内置山峡/云栋。
|
||||
3. 产品明细 **完全按报价单方式** 从产品库自由添加;本期不做「从合同带入产品」。
|
||||
4. **归属公司** 继续手选,与供方/需方无关。
|
||||
5. 保存后的安排运输、等通知、打印、归档等 **后续流程保持现状**。
|
||||
|
||||
## 2. 非目标
|
||||
|
||||
- 不从合同产品预览/合同明细添加产品(可后续迭代)。
|
||||
- 不做历史数据自动迁移(旧合同、旧客户不预填到新字段)。
|
||||
- 不改造安排运输弹窗、司机/现场 H5、归档、运费结算核心流程。
|
||||
- 不改造小程序端运输计划。
|
||||
- 不改变「归属公司」枚举与手选交互。
|
||||
|
||||
## 3. 业务规则
|
||||
|
||||
### 3.1 客户
|
||||
|
||||
| 字段 | 规则 |
|
||||
|------|------|
|
||||
| 供方客户 | 必填;`CustomerSelector`(或等价客户选择组件)从 CRM 客户选择 |
|
||||
| 需方客户 | 必填;同上 |
|
||||
|
||||
内置内部客户(客户表已存在,按 **客户名称精确匹配** 判定):
|
||||
|
||||
- `安庆市山峡化工有限公司`
|
||||
- `安徽云栋化工有限公司`
|
||||
|
||||
### 3.2 合同(分侧、可多选)
|
||||
|
||||
对供方、需方 **分别** 应用:
|
||||
|
||||
| 该侧客户 | 合同 |
|
||||
|----------|------|
|
||||
| 是山峡或云栋 | 可不选(允许 0 份) |
|
||||
| 不是山峡/云栋 | **至少选 1 份**;可多选 |
|
||||
|
||||
组合示例:
|
||||
|
||||
| 供方 | 需方 | 供方合同 | 需方合同 |
|
||||
|------|------|----------|----------|
|
||||
| 外部 | 外部 | 必选(多) | 必选(多) |
|
||||
| 内部 | 外部 | 可选 | 必选(多) |
|
||||
| 外部 | 内部 | 必选(多) | 可选 |
|
||||
| 内部 | 内部 | 可选 | 可选 |
|
||||
|
||||
其它约束:
|
||||
|
||||
- 合同选择器按 **该侧已选客户** 过滤;未选客户时不可选合同。
|
||||
- 可选合同状态与现状一致:`approved` / `executing`(已审批、执行中)。
|
||||
- 更换客户时:清空该侧已选合同(避免串户)。
|
||||
|
||||
### 3.3 产品
|
||||
|
||||
- 交互对齐报价单:`添加产品` → `ProductSelector` → 确认加入明细。
|
||||
- 明细可改数量、备注、别名/品牌等(沿用现有计划产品行可编辑能力)。
|
||||
- 至少保留一条产品明细方可保存(与现状一致)。
|
||||
- **不**展示「合同产品预览 + 选择」入口(本期移除该路径)。
|
||||
|
||||
### 3.4 归属公司与其它基础字段
|
||||
|
||||
- `belongsCompany`:必填,手选(安庆山峡 / 安徽云栋),与供方/需方无关。
|
||||
- 创建日期、计划日期、单据类型、跟进人、运输信息等:保持现有语义;运输安排仍在列表「安排运输」完成。
|
||||
|
||||
### 3.5 历史数据
|
||||
|
||||
- 改造后打开旧计划编辑:供方客户、需方客户、两侧合同 **均显示为空**,不把旧 `contractId` / `customerName` 等映射进新 UI。
|
||||
- 业务后续手工补全;保存时按新规则校验。
|
||||
- 库内旧 `pl_plan.contract_id` / `contract_no` / `customer_*` 等字段可保留原值,但 **新读写以新模型为准**;新保存不再依赖「单一合同必填」。
|
||||
|
||||
## 4. 交互结构(新建/编辑弹窗)
|
||||
|
||||
建议区块顺序:
|
||||
|
||||
```
|
||||
供方信息
|
||||
├─ 选择客户(必填)
|
||||
└─ 选择合同(多选;按 3.2 必填/可选)
|
||||
需方信息
|
||||
├─ 选择客户(必填)
|
||||
└─ 选择合同(多选;按 3.2 必填/可选)
|
||||
基础信息
|
||||
└─ 创建日期 / 计划日期 / 归属公司 / 单据类型 / 跟进人 …
|
||||
产品信息
|
||||
└─ 添加产品(ProductSelector)+ 明细表
|
||||
运输信息
|
||||
└─ 与现状一致(车牌/承运商/取送货等)
|
||||
```
|
||||
|
||||
- 仍为单页长表单(非 `el-steps` 向导)。
|
||||
- 底部:取消 / 保存(及现有「保存并安排」若保留则行为不变:先按新规则校验保存,再打开安排弹窗)。
|
||||
|
||||
## 5. 数据模型
|
||||
|
||||
### 5.1 主表字段语义调整(`pl_plan`)
|
||||
|
||||
| 用途 | 字段 | 说明 |
|
||||
|------|------|------|
|
||||
| 供方客户 | `supplier_id` / `supplier_name` | 存 CRM 客户 ID/名称;新建编辑必填 |
|
||||
| 需方客户 | `customer_id` / `customer_name` | 复用现有客户字段表示需方;列表「客户名称」即需方 |
|
||||
| 兼容保留 | `destination_id` / `destination_name` | 本期可不作为需方主数据源;若需兼容 `determine_plan_type`,保存时可把需方名称同步到 `destination_name`(可选实现细节) |
|
||||
| 旧单合同 | `contract_id` / `contract_no` | **废弃为唯一合同源**;新保存可清空或不再更新;读取以关联表为准 |
|
||||
|
||||
> 说明:需方使用 `customer_*`,便于列表筛选「客户名称」自然对到需方,改动面较小。
|
||||
|
||||
### 5.2 新增关联表 `pl_plan_contract`
|
||||
|
||||
建议字段(满足 database-conventions 公共字段):
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `id` | VARCHAR(64) PK |
|
||||
| `plan_id` | 计划 ID |
|
||||
| `side` | `supplier` \| `demander` |
|
||||
| `contract_id` | CRM 合同 ID |
|
||||
| `contract_no` | 合同编号快照 |
|
||||
| `tenant_no` … `del_flag` | 公共字段 |
|
||||
|
||||
约束建议:
|
||||
|
||||
- 同一 `plan_id + side + contract_id` 在未删除下唯一。
|
||||
- 软删除;计划删除/更新时替换该侧关联集合。
|
||||
|
||||
### 5.3 API
|
||||
|
||||
- `createFull` / `updateFull`(或现有等价全量接口):
|
||||
- 入参增加:`supplierId`/`supplierName`、`customerId`/`customerName`(需方)、`supplierContractIds: string[]`、`demanderContractIds: string[]`(或结构化合同列表)。
|
||||
- **去掉**「`contractId` 必填」校验;改为分侧合同规则校验。
|
||||
- 产品:仍提交产品明细列表;**不再要求**产品必须属于某合同行。
|
||||
- 详情/列表:返回供方/需方客户;返回两侧合同列表(至少 id + no);列表可摘要展示合同编号(逗号拼接或「N 份」——实现时与 UI 对齐,默认详情完整、列表可摘要)。
|
||||
|
||||
### 5.4 内部客户判定(前后端一致)
|
||||
|
||||
常量(前后端各一份或后端为准、前端镜像):
|
||||
|
||||
```text
|
||||
安庆市山峡化工有限公司
|
||||
安徽云栋化工有限公司
|
||||
```
|
||||
|
||||
- 前端:控制合同多选是否 `required`、提示文案。
|
||||
- 后端:保存时强制校验,防止绕过。
|
||||
|
||||
## 6. 前端改动要点
|
||||
|
||||
| 区域 | 变更 |
|
||||
|------|------|
|
||||
| `pl-plan-form-dialog` | 去掉「选合同 → 合同产品预览选产品」主路径;改为供方/需方区块 + `ProductSelector` |
|
||||
| 客户选择 | 复用现有 `CustomerSelector`(报价单/合同已用) |
|
||||
| 合同多选 | 扩展或新建「按客户过滤的合同多选」组件;状态过滤同现状 |
|
||||
| 产品表 | 复用/对齐 `PlPlanFormProductTable` 的可编辑能力;增加「添加产品」工具按钮 |
|
||||
| 列表/查看 | 展示供方、需方;合同由单号改为两侧摘要;筛选「客户名称」继续筛需方 `customerName` |
|
||||
| 复制计划 | 复制供方/需方客户与两侧合同 ID、产品与现有可复制字段;仍不复制车辆/安排态 |
|
||||
|
||||
UI 规范:Fresh Mint;弹窗 `dialog-form-layout`;按钮带图标;状态 Tag 等既有约定不变。
|
||||
|
||||
## 7. 后端改动要点
|
||||
|
||||
| 区域 | 变更 |
|
||||
|------|------|
|
||||
| SQL | `docs/sql/` 增加 `pl_plan_contract`;同步基线说明 |
|
||||
| Model / Schema / CRUD / Service | 读写关联合同;`validate_create_full` 等改为分侧规则 |
|
||||
| 产品 | 创建计划产品不再依赖合同产品行匹配(若现有逻辑有强绑定则拆除) |
|
||||
|
||||
## 8. 验收标准
|
||||
|
||||
1. 新建:供方/需方客户必填;外部客户侧无合同不可保存;内部客户侧无合同可保存。
|
||||
2. 两侧均可选择多份合同并成功落库、再次编辑回显。
|
||||
3. 产品仅能通过产品库添加;无合同产品预览选择。
|
||||
4. 归属公司仍必填手选。
|
||||
5. 保存后安排运输等流程与改造前一致。
|
||||
6. 打开历史计划:供方/需方/新合同列表为空;补全前按新规则拦截保存。
|
||||
|
||||
## 9. 风险与后续
|
||||
|
||||
- 列表「客户名称」语义变为 **需方**;若业务仍想按供方筛,需另加筛选项(本期可不做)。
|
||||
- 旧 `contract_id` 残留可能被其它报表/脚本读取——若有依赖需盘点;本期以运输计划主流程为准。
|
||||
- 后续若要「从合同带入产品」,可在产品区增加第二入口,不阻塞本期。
|
||||
|
||||
## 10. 自检
|
||||
|
||||
- [x] 无 TBD/占位符未决项(实现细节如列表合同摘要文案可在实现计划中定)
|
||||
- [x] 与「产品自由选、合同分侧多选、历史留空」无矛盾
|
||||
- [x] 范围不含安排运输改造
|
||||
- [x] 方案 A 与用户确认一致
|
||||
Reference in new issue
Block a user