82 lines
4.5 KiB
Markdown
82 lines
4.5 KiB
Markdown
---
|
||
id: T-243
|
||
title: 允许货运删除清理未完成采购需求草稿
|
||
phase: 2
|
||
deps:
|
||
- T-242
|
||
status: TODO
|
||
created: 2026-07-29
|
||
context_ref: e5f403f
|
||
work_branch: null
|
||
write_paths:
|
||
- docs/tasks/T-243.md
|
||
- docs/current-state.md
|
||
- backend-api/internal/usecase/**
|
||
- backend-api/internal/repository/sqlite/freight_*
|
||
- backend-api/internal/transport/httpapi/**
|
||
- backend-api/internal/transport/webui/**
|
||
---
|
||
|
||
## Bug / 背景
|
||
|
||
T-242 把任意 `procurement_requests` 记录都视为“已进入采购流程”。采购人员点击“创建采购
|
||
需求”后,系统会先生成 `NEEDS_IMAGE` 需求,但只有上传参考图并显式生成后才会出现
|
||
`purchase_tasks`。因此无参考图、无任务的需求既不会显示在采购任务列表,又会阻止货运删除,
|
||
用户无法从界面完成清理。
|
||
|
||
这不是采购任务列表漏查:任务列表应继续只展示真实 `purchase_tasks`。Bug 是删除保护边界把
|
||
采购准备草稿和不可丢失的参考图/采购任务混为一谈,且冲突提示没有说明实际阻止原因。
|
||
|
||
## 修订契约
|
||
|
||
- `reference_asset_id IS NULL` 且 `purchase_task_id IS NULL` 的采购需求属于可清理草稿。
|
||
- 可清理草稿只允许处于 `BLOCKED`、`NEEDS_IMAGE` 或 `SOURCE_CHANGED`;删除货运单时在同一
|
||
事务内一并删除。
|
||
- 任一需求已绑定参考图但尚未生成任务时,整单禁止删除并返回
|
||
`FREIGHT_ORDER_HAS_REFERENCE`。
|
||
- 任一需求已生成采购任务时,整单禁止删除并优先返回
|
||
`FREIGHT_ORDER_HAS_PURCHASE_TASK`。
|
||
- 货运详情把 `NEEDS_IMAGE` 显示为“需要参考图,尚未生成任务”,避免与采购任务列表混淆。
|
||
|
||
## 方案
|
||
|
||
1. 用两个来源中立仓储错误替换过宽的 `ErrFreightOrderInUse`,由 usecase 映射为两个稳定
|
||
`409` 错误码;若同单同时存在参考图和任务,优先报告采购任务。
|
||
2. SQLite immediate transaction 先检查全部历史商品关联:任何非空 `purchase_task_id`
|
||
立即回滚;其次任何非空 `reference_asset_id` 立即回滚。
|
||
3. 无保护性关联时,删除该订单商品下状态为 `BLOCKED`、`NEEDS_IMAGE`、`SOURCE_CHANGED`
|
||
且两个关联 ID 均为空的采购需求,再沿用 T-242 的图片键收集、商品和订单删除。
|
||
4. 不依赖状态字符串来放宽保护:无法归类、数据不一致或未来新增状态的需求保持 fail-closed,
|
||
由剩余外键阻止删除并映射内部错误。
|
||
5. SSR 对两类冲突使用独立提示;确认弹窗明确未绑定参考图的草稿需求会一并删除,已有参考图
|
||
或任务时系统拒绝。API 保持相同 DELETE 路由和幂等 204。
|
||
6. 仓储、usecase、API 与 Web 测试覆盖草稿删除、参考图保护、任务保护、优先级、事务不变性
|
||
和现有无需求删除;真实响应式 smoke 使用脱敏隔离数据,不操作线上 ERP。
|
||
|
||
## 验收要点
|
||
|
||
- [ ] 仅含 `NEEDS_IMAGE` 且无参考图/任务的货运单可删除,草稿需求、商品和订单同事务消失。
|
||
- [ ] `BLOCKED` 及无参考图的 `SOURCE_CHANGED` 草稿遵守相同删除规则。
|
||
- [ ] 已绑定参考图但未生成任务返回 409 `FREIGHT_ORDER_HAS_REFERENCE`,全部记录不变化。
|
||
- [ ] 已生成采购任务返回 409 `FREIGHT_ORDER_HAS_PURCHASE_TASK`,全部采购链路不变化。
|
||
- [ ] 同单同时存在两类保护关联时优先报告已生成采购任务。
|
||
- [ ] 未知或不一致需求不能被静默删除。
|
||
- [ ] 采购任务列表仍只展示 `purchase_tasks`;货运详情准确说明需求尚未生成任务。
|
||
- [ ] Web 成功、参考图冲突和任务冲突反馈明确,CSRF、确认和响应式交互不回归。
|
||
- [ ] 删除不影响 ERP、同步历史、水位和 T-242 图片文件清理。
|
||
- [ ] 标准 Go 测试、race、vet 和三个入口构建通过。
|
||
|
||
## 边界
|
||
|
||
- 不把采购需求加入采购任务列表,不新增第二套采购列表。
|
||
- 不删除已绑定参考图、采购任务、执行、候选、授权、下单或支付记录。
|
||
- 不增加采购需求单独撤销、批量删除、回收站或归档。
|
||
- 不修改顺运宝 ERP,不回退同步水位。
|
||
- 不在文档、测试、日志或提交中写入真实订单、商品、店铺或图片。
|
||
|
||
## 执行记录
|
||
|
||
- 2026-07-29:根据真实本地状态审计确认,删除冲突来自 `NEEDS_IMAGE` 采购需求,且其
|
||
`reference_asset_id`、`purchase_task_id` 均为空;采购任务列表只查 `purchase_tasks`
|
||
的行为正确。本任务修复保护边界和反馈,不改变任务列表定义。
|