Files
shanxia2.0/openspec/changes/transport-plan-management/design.md
T
2026-06-21 09:19:07 +08:00

258 lines
6.4 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.
# 运输计划管理系统 - 技术设计
## Context
### 项目背景
安庆山峡化工有限公司已建设 CRM 系统(线索/客户/商机/报价单/合同/产品管理)和地磅系统。现需建设**统一的运输计划管理系统**,将 CRM 合同与后续的运输、地磅、库存等环节串联,形成从合同→计划→运输→地磅→结算→归档的完整业务闭环。
### 技术栈
- **后端**:Python FastAPI + SQLAlchemy + MySQL
- **前端**:Vue 3 + Element Plus + TypeScript
- **对象存储**:MinIO(附件上传)
- **数据库**:MySQL 5.7+
### 约束条件
1. 按需求文档要求,所有计划相关表统一使用 `pl_` 前缀
2. 遵循 shanxia2.0 工程规范(见 `openspec/changes/zkxw-engineering-standards/`)
3. 遵循 UI 规范(Fresh Mint 风格)
4. 数据暂不按归属公司隔离
5. 地磅数据由现场人员手动填写,不对接硬件设备
### 利益相关者
- 计划专员A:发起计划
- 计划专员B:核对订单
- 计划专员C:运费结算确认
- 司机:扫码回传
- 现场工作人员:地磅确认
---
## Goals / Non-Goals
**Goals:**
1. 实现完整的计划管理流程:从合同发起→运输安排→状态流转→归档
2. 支持运输审批流程(会签审批)
3. 实现运费结算功能
4. 实现车辆和司机管理
5. 实现盘存统计和库存预警
6. 遵循工程规范和 UI 规范
**Non-Goals:**
1. 不对接地磅硬件设备(手动填写数据)
2. 不实现复杂的移动端功能(司机端仅扫码回传)
3. 不实现电子签名
4. 不实现多语言支持
5. 不实现操作日志(暂不考虑)
---
## Decisions
### Decision 1: 数据库表命名规范
**选择**:统一使用 `pl_` 前缀
**理由**:
- 与现有 `sys_*`、`biz_*`、`wf_*` 命名体系保持一致
- 便于识别和管理计划相关的表
- 需求文档明确要求
**备选方案**:
- `plan_*` - 与业务语义更贴近,但不符合统一前缀规范
- `transport_*` - 过于局限,无法覆盖库存等其他功能
---
### Decision 2: 审批流程实现方式
**选择**:自定义审批流程(不使用工作流引擎)
**理由**:
- 需求简单:仅支持会签审批(1-2级)
- 不走复杂的工作流引擎
- 审批规则灵活(用户选择审批人)
- 减少系统复杂度
**备选方案**:
- 使用 Warm-Flow 工作流引擎 - 过于复杂,不适合简单审批场景
- 使用独立审批服务 - 增加系统复杂度,当前阶段不必要
---
### Decision 3: 计划与运输的关系设计
**选择**:采用中间关联表实现 N:N 关系
**理由**:
- 需求明确支持:1:1、1:N、N:1 三种场景
- 中间表 `pl_plan_transport` 清晰表达关联关系
- 便于后续扩展和维护
**表结构**:
```
pl_plan_transport
├── plan_id (FK)
├── transport_id (FK)
├── create_time
└── del_flag
```
---
### Decision 4: 库存金额计算方式
**选择**:每批入库单独计算,不使用加权平均
**理由**:
- 需求明确要求:使用入库时的实际价格,每批单独计算
- 财务合规性:每批货物成本清晰可追溯
- 简化计算逻辑
---
### Decision 5: 二维码实现方式
**选择**:URL Scheme + 参数编码
**理由**:
- 简单可靠:二维码包含运输单ID和基本信息
- 无需复杂加密:运输单ID已足够定位
- 便于调试:可通过URL直接访问
**二维码内容**:
```
{base_url}/transport/scan/{transport_id}?code={verify_code}
```
---
### Decision 6: 证件过期提醒实现
**选择**:定时任务每日检查
**理由**:
- 需求明确:过期前30天提醒
- 定时任务简单可靠
- 避免实时检查性能开销
---
## Risks / Trade-offs
### Risk 1: 多系统数据同步
**风险**:CRM 合同变更可能导致已发起计划的数据不一致
**缓解措施**:
- 计划发起时冗余存储合同关键信息
- 明确告知用户:合同变更后需手动同步
- 在计划详情页显示合同信息快照
---
### Risk 2: 并发状态流转冲突
**风险**:多人同时操作同一计划可能导致状态不一致
**缓解措施**:
- 使用乐观锁(version_no 字段)
- 状态变更前检查当前状态
- 前端操作后及时刷新状态
---
### Risk 3: 大量数据统计性能
**风险**:盘存统计涉及大量数据汇总,可能影响性能
**缓解措施**:
- 归档后的数据不会频繁变更,考虑使用物化视图或定时统计表
- 限制查询时间范围
- 大数据量场景考虑分库分表(未来扩展)
---
## Migration Plan
### Phase 1: 数据库变更
1. 创建新表(按依赖顺序):
- `pl_vehicle`、`pl_driver`、`pl_carrier`(基础数据)
- `pl_plan`、`pl_plan_product`(计划主表)
- `pl_transport`、`pl_transport_approval`(运输相关)
- `pl_freight_settlement`(运费结算)
- `pl_inventory`、`pl_inventory_warning`(库存相关)
2. 初始化基础数据(车辆类型、承运商等)
### Phase 2: 后端 API 开发
1. 基础 CRUD API(车辆、司机、承运商)
2. 计划管理 API
3. 运输管理 API
4. 审批流程 API
5. 运费结算 API
6. 盘存统计 API
### Phase 3: 前端页面开发
1. 车辆管理页面
2. 司机管理页面
3. 计划管理页面
4. 运输管理页面
5. 运费结算页面
6. 盘存统计页面
7. 工作台(待办、预警)
### Phase 4: 定时任务
1. 证件过期提醒任务
2. 库存统计定时更新(如采用统计表方案)
### Rollback Strategy
- Phase 1:回滚数据库变更(DROP TABLE)
- Phase 2:删除新增的 API 路由
- Phase 3:删除新增的前端页面和组件
- Phase 4:禁用定时任务
---
## Open Questions
### Q1: 审批人权限控制
**问题**:审批人选择时是否需要过滤有审批权限的用户?
**建议**:暂不限制,所有用户都可被选择;后续按需细化权限
---
### Q2: 通知发送方式
**问题**:系统消息之外是否需要邮件/短信通知?
**建议**:暂仅使用系统消息;后续按需扩展
---
### Q3: 统计报表导出
**问题**:盘存统计报表是否需要导出功能?
**建议**:暂不实现;后续按需补充(见需求文档)
---
### Q4: 框架合同调价函关联
**问题**:框架合同调价后,已发起计划的价格是否需要同步更新?
**建议**:保持计划创建时的价格不变(价格快照);调价仅影响后续新建的计划