Kaynağa Gözat

docs: add CRM plan management design spec (2026-05-05)

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 5 ay önce
ebeveyn
işleme
0b8264ef94

+ 300 - 0
docs/superpowers/specs/2026-05-05-crm-plan-management-design.md

@@ -0,0 +1,300 @@
+# CRM 计划管理模块 — 设计规格
+
+**版本:** 1.0  
+**日期:** 2026-05-05  
+**状态:** 待评审  
+**依据:** `plan/计划需求.md`、`plan/sx.sql`(库表对齐参考)、`plan/vehicle_management.sql`(车辆字段参考)
+
+---
+
+## 1. 背景与范围
+
+### 1.1 现状
+
+- 管理端前端:`crm/web`(Vue 3)
+- 生产后端:`crm/backend`(RuoYi-Vue-Plus / Spring Boot)
+- Python 重构后端:`crm/py-backend`(未纳入本规格交付范围)
+
+### 1.2 本规格覆盖
+
+在 CRM 内新增 **计划管理** 子系统,包含:
+
+- 计划管理(含与合同、调价函、证照门禁、运输与二维码、地磅与现场、核对与归档)
+- 自有车辆信息维护
+- 运输公司及车辆信息维护
+- 运输任务 / 运输信息
+- 库存相关能力与 **盘存统计分析**(口径见 §8)
+- **运输结算**(列表、多选生成结算单、审核、开票与汇款信息登记)
+
+### 1.3 边界声明(已确认)
+
+| 项目 | 结论 |
+|------|------|
+| **财务报销子系统(bx)** | **本阶段不对接。** 不向 bx 推送单据、不拉取报销状态、不共用 bx 审批实例。 |
+| **结算与票款** | 运输结算单、审核、通知开票、发票附件、汇款凭证均在 **CRM 库表与页面** 内完成记录与状态流转。 |
+| **用户与权限** | 复用 CRM **用户管理、角色管理**;计划相关权限使用独立权限标识(如 `crm:plan:*`,具体前缀以实现时 RuoYi 约定为准)。 |
+
+### 1.4 非目标(当前版本)
+
+- 与 bx 报销系统的接口、单点登录扩展、数据同步
+- 将计划模块完整迁移到 `crm/py-backend`(可作为远期选项,不阻塞 Java 交付)
+
+---
+
+## 2. 目标与成功标准
+
+### 2.1 业务目标
+
+1. 从 **合同** 发起计划,支持一单多产品;框架合同价格可通过 **调价函** 调整并保留 **版本历史**。
+2. 产品维度支持 **易制毒 / 易制爆**;命中时计划行必须先具备 **购买证、运输证** 才可进入运输安排。
+3. 运输支持 **自有车辆** 与 **承运商车辆**;生成可分享的 **二维码** 供司机 / 现场使用;待入库、待出库任务需 **通知现场**。
+4. 按规则识别 **待入库 / 待出库**,自动生成 **地磅单** 信息并在计划中可见;现场确认并上传地磅单与出入库附件。
+5. 司机扫码回传运输单据与数量等信息。
+6. **专员 B** 整单核对、**专员 C** 确认运费后 **归档**。
+7. 运输历史总览、多选生成 **运输结算单** 并经 **审核** 后完成开票通知、票据与汇款信息登记。
+8. **盘存统计分析** 可按约定口径输出报表或图表。
+
+### 2.2 成功标准(验收锚点)
+
+- 端到端流程在测试环境可演示:合同 → 计划 →(证照)→ 运输与二维码 → 地磅/现场 → 司机回传 → 核对 → 费用确认 → 归档。
+- 所有业务表名 **`plan_` 前缀**,与 `plan/sx.sql` 同库建模时可合并迁移脚本。
+- 权限仅使用 CRM 既有账号体系,无独立登录入口。
+
+---
+
+## 3. 角色与权限(对应需求中的 A / B / C)
+
+需求中的「计划专员 A / B / C」映射为 **可配置角色或数据权限 + 菜单权限**,建议:
+
+| 角色含义 | 典型职责 | 权限要点 |
+|----------|----------|----------|
+| 专员 A | 发起与安排运输、生成二维码、线下分发 | 计划编辑、运输安排、二维码生成、现场通知 |
+| 专员 B | 运输完成后的整单核对 | 核对通过/退回 |
+| 专员 C | 运输费用确认、归档 | 费用确认、归档 |
+| 现场人员 | 待入/待出相关地磅与附件 | 地磅确认、附件上传、仅可见指派任务 |
+
+具体 `Sa-Token` 权限码在实现阶段按 RuoYi 模块命名规范批量定义(如 `crm:plan:transport:arrange`)。
+
+---
+
+## 4. 核心业务过程(七步)与状态
+
+### 4.1 跟进状态(字典,与需求一致)
+
+`待采购`、`等客户通知`、`待安排`、`计划取消`、`待发货`、`已发货`、`待入库`、`已入库`、`待出库`、`已出库`。
+
+### 4.2 完成状态
+
+`是` / `否`(建议字典 `crm_plan_finished`:`1` / `0`)。
+
+### 4.3 单据类别
+
+`直销单`、`入库单`、`出库单`、`云栋单`。
+
+### 4.4 流程与状态关系(逻辑约束)
+
+- **步骤 1**:从合同生成计划头与多行;行上带入合同单价(可后改);框架合同取当前生效 **调价版本** 对应价格。
+- **步骤 2**:若行关联产品为易制毒或易制爆,则必须存在有效 **购买证、运输证** 附件记录后,才允许进入步骤 3。
+- **步骤 3**:创建或关联运输记录,选择自有或承运商车辆,生成 **二维码**;若为 **待入库/待出库**,向现场人员发送 **系统内待办/任务**(初版默认站内消息 + 列表筛选;短信/企微为可选扩展,见 §10)。
+- **步骤 4**:满足 §5 规则时进入 **待入库** 或 **待出库**,自动生成 **地磅单** 主记录;现场上传地磅单及出入库附件后更新状态。
+- **步骤 5**:司机通过扫码入口提交回传数据(见 §7)。
+- **步骤 6**:专员 B 核对通过。
+- **步骤 7**:专员 C 确认运费,计划置 **归档**,完成状态为 **是**。
+
+状态迁移须在后端用 **显式校验**(禁止仅靠前端禁用按钮)。
+
+---
+
+## 5. 待入库 / 待出库 / 地磅规则
+
+**判定公司名称集合(可配置,禁止写死在代码):**
+
+- `安庆市山峡化工有限公司`
+- `安徽云栋化工有限公司`
+
+**规则(与需求一致):**
+
+- 若 **目的地** 为上述任一公司 → 业务类型为 **待入库**(并触发地磅与现场流程)。
+- 若 **供应商名称** 为上述任一公司 → 业务类型为 **待出库**(并触发地磅与现场流程)。
+
+**地磅单:** 满足上述条件时 **自动生成** 地磅单主数据;计划列表 / 详情需展示关联地磅摘要信息。
+
+---
+
+## 6. 合同侧改造:框架合同调价函
+
+### 6.1 要求
+
+- 框架合同下商品价格可多次调整。
+- 每次调整必须对应一份 **调价函**(附件 + 元数据)。
+- 保留 **全版本历史**(版本号、生效时间、操作人、关联附件)。
+
+### 6.2 数据归属
+
+- 调价函实体建议落在 CRM 合同域(表名可与现有 `crm_contract_*` 命名一致),计划模块通过 **合同 ID + 版本 ID** 解析行价格。
+- 若现有合同表无「框架合同」标志,需增加 **合同类型** 或布尔字段以区分框架合同。
+
+### 6.3 计划取价
+
+- 新建计划行时:**默认价** = 合同行当前生效版本单价;允许用户在计划内再次改价(与调价函历史分离,仅记录计划行上的成交价即可)。
+
+---
+
+## 7. 产品主数据扩展
+
+在 CRM **产品** 上增加:
+
+- `是否易制毒`(布尔或字典)
+- `是否易制爆`(布尔或字典)
+
+计划行通过产品 ID 继承属性并触发证照校验。
+
+---
+
+## 8. 库存与盘存统计
+
+需求仅描述「库存管理」「盘存统计分析」。本规格约定:
+
+- **库存管理(初版):** 以 **计划行上的入库数 / 出库数 / 预估数** 及确认后的单据为准,是否落 **独立库存台账表** 由实现阶段根据现有 CRM 是否已有库存模块决定;若无,则 **`plan_inventory_ledger`(示例名)** 由确认后的出入库事件回写,避免双录。
+- **盘存统计分析:** 基于 `plan_*` 事实表 + 台账(若有)按物料、周期、仓库/公司维度汇总;具体报表字段在开发前列清单评审。
+
+---
+
+## 9. 运输与二维码
+
+### 9.1 运输编号
+
+格式:`SXYS` + 7 位数字序号(示例 `SXYS0000001`),序号 **全局递增**,并发下由服务端生成。
+
+### 9.2 运输信息字段(与需求对齐)
+
+运输编号、车牌号、运输公司、所属公司、运输介质、运输起点、运输终点、运输公里数、单位(吨/趟;需求原文「吨/躺」视为笔误)、运输费用、创建人、是否开票、备注。
+
+### 9.3 二维码
+
+- **载荷:** 建议为 **HTTPS 一次性令牌 URL**(token 绑定运输任务 ID、过期时间、可选 nonce),服务端校验后进入司机填报页(H5 或内置页面)。
+- **安全:** Token 有时效、可撤销;敏感操作需校验运输任务状态。
+
+---
+
+## 10. 现场通知(初版默认)
+
+- **默认:** CRM 内 **待办任务列表** + 计划/运输详情上的「现场任务」标记;权限限定现场角色。
+- **不阻塞交付的扩展:** 企业微信 / 短信 / 邮件,需单独接配置与模板,不写入本阶段必交付范围。
+
+---
+
+## 11. 运输结算(CRM 内闭环)
+
+### 11.1 功能
+
+- 运输情况 **历史总览**(列表 + 筛选)。
+- **多选** 运输记录生成 **运输结算单**。
+- 结算单 **提交审核**(推荐接入 RuoYi 已集成的 **Warm-Flow** 工作流,审批配置在系统内完成)。
+- 审核通过后:**通知对方开票**(系统内状态 + 可选备注)、上传 **发票**、登记 **汇款** 与 **汇款单据附件**。
+
+### 11.2 运费计算模式
+
+| 模式 | 规则 |
+|------|------|
+| 按重量 | 默认 `运输数量 × 运输单价`,结果 **允许人工调整** |
+| 按趟次 | **不自动计算**,以 **手填金额** 为准 |
+
+### 11.3 与报销系统
+
+**不向 bx 同步**;汇款与票据仅为 CRM 业务记录,后续若对接 bx,可通过 **新规格** 定义映射。
+
+---
+
+## 12. 通知信息模板
+
+按需求固定模板生成文本(字段来自计划头 / 行):
+
+```
+计划号:{planNo}
+企业名称:{enterpriseName}
+提货单位:{pickupCompany}
+到货时间:{arrivalDate}
+药品名称:{productName}
+到货吨位:【{tonnage}吨】
+备注:{remark}
+```
+
+服务端提供「复制到剪贴板」所需纯文本或前端拼装。
+
+---
+
+## 13. 数据模型草案(表名均为 `plan_` 前缀)
+
+以下为逻辑实体,物理表名在实现时可微调但须保持前缀与职责清晰。
+
+| 逻辑实体 | 说明 |
+|----------|------|
+| `plan_order` | 计划头:计划日期、计划订单编号、单据类别、跟进状态、完成状态、供应商/目的地、销售合同 ID、跟进人、通知文本、审计字段等 |
+| `plan_order_line` | 计划行:物料、规格、包装、单位、入出库数量与价格、磅差、金额、与合同行/产品引用 |
+| `plan_line_cert` | 计划行证照:购买证/运输证附件及有效期(如需要) |
+| `plan_transport` | 运输任务:运输编号、车辆、承运商、路线、费用、单位、开票标志等 |
+| `plan_transport_token` | 二维码 token:关联运输任务、过期时间、是否已使用 |
+| `plan_driver_feedback` | 司机扫码回传:附件、数量、时间 |
+| `plan_weighbridge` | 地磅单:关联计划行或运输任务、磅值、状态 |
+| `plan_site_attachment` | 现场上传:地磅单/出入库附件 |
+| `plan_carrier` / `plan_carrier_vehicle` | 运输公司及车辆(字段参考 `vehicle_management.sql` 的 `vehicles`、车头车尾等) |
+| `plan_own_vehicle` | 自有车辆档案 |
+| `plan_settlement` / `plan_settlement_item` | 运输结算单头行 |
+| `plan_settlement_payment` | 发票与汇款登记(票据路径、金额、时间) |
+| `plan_sequence` | 计划订单号、运输号等序列(按业务类型分桶) |
+
+**编号生成:** `SXDDH` + `yyyyMMdd` + **6 位**日序号(与需求示例一致);与运输编号分表维护序列,避免并发冲突。
+
+自有车辆与承运商车辆字段深度参考 **`plan/vehicle_management.sql`**(如车头 `vehicle_heads`、车尾 `vehicle_tails`、`vehicles` 组合关系、证件 `certificates` 等),映射到 `plan_*` 表时按 RuoYi 惯例改为雪花 ID、租户、逻辑删除等。
+
+---
+
+## 14. 技术栈与模块位置
+
+| 层级 | 路径约定 |
+|------|----------|
+| 后端 | `crm/backend` 下新建业务模块(如 `ruoyi-crm-plan` 或并入现有 `ruoyi-crm`,以前者为宜便于边界清晰) |
+| 前端 | `crm/web`:`api/crm/plan/*`、`views/crm/plan/*`(具体目录以实现时统一) |
+| 数据库 | 与现有 CRM 同一库;脚本纳入 `crm/sql` 或模块自带 `sql`,并与 **`plan/sx.sql`** 合并策略一致 |
+
+---
+
+## 15. 错误处理与审计
+
+- 状态非法迁移:返回明确业务码与中文说明。
+- 价格、数量、金额:`Decimal` 精度与数据库字段一致;金额由服务端重算防篡改。
+- 关键操作:`@Log` 记录;附件上传走统一 OSS/文件服务(与现有 CRM 一致)。
+
+---
+
+## 16. 测试要点
+
+- 编号生成:同日高并发下无重复单号。
+- 易制毒/易制爆:缺证时无法安排运输。
+- 待入/待出:配置公司与名称匹配规则(见 §5)。
+- 结算:按重量/按趟次两种模式金额正确;审核通过后状态封闭。
+- 二维码:过期、重复使用、错误 token 拒绝。
+
+---
+
+## 17. 未决项(本规格已给默认,上线前可再确认)
+
+| 项 | 默认假设 |
+|----|----------|
+| 司机端形态 | 独立 H5 页面(与 CRM 同域或子路径),免登录靠 token |
+| 工作流 | 使用已有 Warm-Flow |
+| 公司名称匹配 | 可配置表 + 去空格全等匹配;简称需求再增加别名表 |
+
+---
+
+## 18. 规格自检(2026-05-05)
+
+- [x] 无「TBD」占位;开放项集中在 §17 并带默认。
+- [x] 与「不对接报销」无矛盾;结算在 CRM 内闭环。
+- [x] 七步流程、字典、编号、地磅规则与需求文档一致。
+- [x] 范围可支撑单独 **implementation plan** 拆分(合同改造 / 主数据 / 计划核心 / 运输与扫码 / 结算与报表)。
+
+---
+
+**下一步:** 评审通过后,使用 `writing-plans` 技能生成 `docs/superpowers/plans/2026-05-05-crm-plan-management-implementation.md`(或按子模块拆分为多份计划)。