“取消原因不能为空”看起来只是一个字段校验,实际却处在派车、车辆、司机和行程状态交汇的位置。
这里不讨论如何完成这一项改动,而是用它识别后续可沉淀的约束、提问框架与验证方法。
| 对象 | 正常演进 | 取消或完成后的变化 |
|---|---|---|
| 申请 | `DRAFT -> PROCESSING -> COMPLETED` | 取消回到 `CANCELLED` |
| 派车 | `DISPATCHED -> COMPLETED` | 取消变为 `CANCELLED` |
| 车辆 | `AVAILABLE -> RESERVED -> IN_USE` | 取消或行程完成后回到 `AVAILABLE` |
| 司机 | `AVAILABLE -> ON_TASK` | 行程完成后回到 `AVAILABLE` |
```text
取消按钮(仅 DISPATCHED 状态可见)
-> 取消弹窗(cancelReason 必填)
-> POST /official/vehicle/dispatch/cancel
-> Controller(权限 + 审计)
-> DispatchService.cancel
-> 派车状态 CANCELLED + 车辆状态 AVAILABLE
```
| 业务表达 | 可验证的技术表达 |
|---|---|
| 取消必须写原因 | `cancelReason` 不能是 `null`、空串或全空白 |
| 不允许无效取消 | 在读取派车记录、更新派车和释放车辆之前拒绝请求 |
| 不能影响正常取消 | 非空原因仍沿用原有状态更新与资源释放逻辑 |
| 不扩大改动 | 不改变权限、审计、页面交互、数据库字段或行程协议 |
可沉淀资产
Rule、Prompt、Skill、检查单和反例各自承接什么。