设计文档简化状态机

This commit is contained in:
2026-04-23 10:26:36 +08:00
parent 2aa0ae83c2
commit d5c1c1485c
2 changed files with 103 additions and 23 deletions

View File

@@ -19,7 +19,7 @@ CREATE TABLE gear_stock_io_order (
warehouse_id bigint(20) DEFAULT NULL COMMENT '主仓库ID',
from_warehouse_id bigint(20) DEFAULT NULL COMMENT '调出仓库ID',
to_warehouse_id bigint(20) DEFAULT NULL COMMENT '调入仓库ID',
status char(1) NOT NULL DEFAULT '0' COMMENT '单据状态0草稿 1已提交 2已审核 3已执行 4已作废 5已冲销',
status char(1) NOT NULL DEFAULT '0' COMMENT '单据状态0进行中 1已完成',
exec_flag char(1) NOT NULL DEFAULT '0' COMMENT '执行标志0未执行 1已执行',
reversal_flag char(1) NOT NULL DEFAULT '0' COMMENT '是否冲销单0否 1是',
reversal_order_id bigint(20) DEFAULT NULL COMMENT '对应原单据ID',

View File

@@ -14,8 +14,8 @@
## 2. 设计目标
1. 所有库存变动都先落单据
2. 单据必须支持草稿、提交、审核、执行、作废、冲销
3. 单据执行后自动生成实际出入库流水
2. 单据状态只保留“进行中”和“已完成”两个状态
3. 单据完成后自动生成实际出入库流水
4. 做错时通过反向单据回退,不直接改历史流水
5. 保留完整审计链路,方便追责和排查
@@ -34,19 +34,15 @@
- `biz_type`:业务类型,如 `purchase``sale``return``transfer``other`
- `source_type` / `source_no` / `source_order_id`:关联来源业务单
- `warehouse_id` / `from_warehouse_id` / `to_warehouse_id`:仓库维度信息
- `status`:单据状态
- `status`:单据状态0进行中 1已完成
- `exec_flag`:是否已执行
- `reversal_flag` / `reversal_order_id`:冲销标记与原单关联
- `source_io_id`:对应实际执行的出入库单
状态建议:
- `0` 草稿
- `1`提交
- `2` 已审核
- `3` 已执行
- `4` 已作废
- `5` 已冲销
- `0` 进行中
- `1`完成
### 3.2 单据明细表 `gear_stock_io_order_detail`
@@ -69,14 +65,14 @@
## 4. 错单、超量、回退怎么处理
### 4.1 未执行前发现错误
### 4.1 进行中发现错误
如果单据还没执行,处理方式最简单:
如果单据还没完成,处理方式最简单:
1. 撤回到草稿,修改明细
2.直接作废单据,重新建正确单据
1. 直接修改进行中的单据明细
2.者作废当前单据,重新建正确单据
这种场景不涉及库存回退,因为库存还没
这种场景不涉及库存回退,因为库存还没真正落地
### 4.2 已执行后发现多入/多出/录错
@@ -188,18 +184,15 @@
建议在代码里明确状态流转校验:
- 草稿 -> 提交
-提交 -> 审核
- 已审核 -> 执行
- 已执行 -> 冲销完成 / 已冲销
- 草稿/已提交/已审核 -> 作废(未执行时)
- 进行中 -> 已完成
-完成 -> 冲销完成 / 已冲销(通过反向单据实现)
禁止的操作:
-执行后直接修改明细
-执行后再次执行
- 作废单据再执行
-完成后直接修改明细
-完成后再次执行
- 冲销单再次冲销自己
- 通过 UI 做一个“取消”状态,但数据库不保留该状态
### 5.6 事务控制
@@ -249,6 +242,92 @@
- 影响物料
- 影响批次
### 5.10 负责人监管与延迟统计
这套设计**可以监管到负责人**,而且可以统计“货到了但没及时入库”“货提走了但没点完成”等延迟问题。关键是要把“负责人字段 + 节点时间 + 完成时间”都保存下来。
建议新增或在业务上补充以下维度:
- `responsible_id`责任人ID
- `responsible_name`:责任人姓名
- `plan_arrival_time`:预计到货时间
- `actual_arrival_time`:实际到货时间
- `plan_finish_time`:预计完成时间
- `actual_finish_time`:实际完成时间
- `delay_minutes`:延迟分钟数(可计算字段)
- `delay_reason`:延迟原因
- `delay_status`:是否超时/待处理/已处理
如果是仓库入库场景,可以分成两个监管点:
1. **到货未入库**
- 记录货到仓时间 `actual_arrival_time`
- 记录入库完成时间 `actual_finish_time`
- 通过两者差值统计“到货后未及时入库”的时长
2. **提货未完成**
- 记录提货/出库开始时间
- 记录完成点击时间 `actual_finish_time`
- 若超过 SLA 仍未完成,系统自动标记为超时
### 5.11 统计方式建议
建议新增一个任务或查询逻辑,用于统计超时单据:
- 按责任人统计未完成单据数
- 按责任人统计平均延迟时长
- 按仓库统计超时单据数
- 按业务类型统计超时率
- 按日期统计历史延迟趋势
统计口径建议:
- `actual_finish_time` 为空且当前时间 > `plan_finish_time`:视为超时未完成
- `actual_finish_time` 不为空且 `actual_finish_time - plan_finish_time > 0`:视为超时完成
- `actual_arrival_time` 不为空且 `actual_finish_time - actual_arrival_time > 0`:视为到货后入库延迟
### 5.12 后端实现建议
1. **单据主表增加责任人与时间字段**
- 在出入库单据创建时写入负责人
- 审核、执行、完成时分别回写对应时间
2. **完成动作单独做接口**
- 不要只靠“执行成功”代表完成
- 增加 `finishOrder(orderId)``completeOrder(orderId)`
- 这样才能区分“已提货但未完成”和“真正完成”
3. **超时扫描任务**
- 定时任务扫描 `plan_finish_time` 已超时但未完成的单据
- 自动更新超时状态
- 生成待办/消息通知给责任人和主管
4. **统计报表接口**
- 按责任人、仓库、业务类型、时间段查询
- 前端做排行榜、明细表、超时趋势图
5. **责任链闭环**
- 单据创建时指定责任人
- 单据执行时记录执行人
- 单据完成时记录完成人
- 超时时记录当前责任归属,避免“没人负责”
### 5.13 如果要落到 SQL 的建议字段
如果你希望这部分真正能统计,建议在 `gear_stock_io_order` 中补这些字段:
- `responsible_id`
- `responsible_name`
- `plan_finish_time`
- `actual_finish_time`
- `plan_arrival_time`
- `actual_arrival_time`
- `delay_minutes`
- `delay_reason`
- `delay_status`
这样数据库层就能直接支撑统计和报表。
---
## 6. 代码改造建议
@@ -275,6 +354,7 @@
4. 再把库存执行逻辑抽到统一方法
5. 再把原直接操作入口改成单据入口
6. 最后补冲销接口
7. 将前端状态显示简化为“进行中 / 已完成”
### 6.3 推荐接口拆分