docs: 归档任务 #238

This commit is contained in:
chengma
2026-08-15 10:50:01 +08:00
parent 2aea22b44d
commit 7b766f5c2a
@@ -0,0 +1,63 @@
# 238 Admin:档口入库码所有状态支持软删除与重复导入恢复
- 类型:需求
- 父级大工单:#14
- 所属 MVP / 版本:#224
- 状态:已完成
- 日期:2026-08-15
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/238
## 背景与目标
档口入库码页面原来没有删除能力。用户需要删除任意状态的错误或不再处理数据,同时又不能因为物理删除丢失远端回写审计;重复导入同一 Excel 时还应恢复原记录,而不是产生重复行或唯一键错误。
## 最终方案
- MySQL schema v24 为单表增加 `deleted_at`、`deleted_by_user_id`、查询索引和删除账号外键,原业务唯一键继续保留。
- 页面所有状态的记录都可勾选“删除已选”;确认框显示实际数量,并明确删除不会撤销顺运宝远端值,也不会取消在途回写。
- 批量删除在一个事务中写入删除时间和账号,不改变业务状态、规划或回写审计;任一 ID 已删除或不存在时整批回滚。
- 正常列表、统计、匹配目标、领取回写和新核对入口过滤软删除记录。
- 已进入 `applying` 的请求不因软删除中断;最终结果和 Admin 重启后的未知结果收敛仍可写入隐藏记录。
- 重新导入同一业务键时复用原主键并清除删除标记:
- `pending/ready/skipped/failed` 重置为 `pending`,清空旧规划和结果。
- `applying/updated/already_filled/needs_check` 保留状态、远端结果和审计。
- 后一组状态若导入的入库码发生变化,整批拒绝并提示人工核对。
- 导入结果新增“恢复”计数。
- 实际实现与建单方案一致;为避免已删除的普通待处理行继续占用匹配目标,匹配上下文只保留软删除的回写中、已完成和需核对记录。
## 改了哪些
- `admin/repository/mysql_db.go`、`admin/repository/mysql_db_integration_test.go`:追加 v24 迁移、自检和 v23→v24 测试。
- `admin/model/inner_code.go`、`admin/repository/inner_code.go`:增加删除审计字段、事务软删除、查询隔离、在途收尾和按状态恢复。
- `admin/service/inner_code_delete.go`、`admin/service/inner_code_import.go`:增加删除服务和恢复统计/冲突提示。
- `admin/handler/web/inner_code.go`、`admin/handler/web/web.go`:增加 POST 删除入口并保留筛选上下文。
- `admin/templates/inner_code/list.html`、`admin/static/js/app.js`:所有状态可选,增加带数量、危险说明和提交中反馈的批量删除操作。
- `admin/repository/inner_code_test.go`、`admin/inner_code_template_test.go`:覆盖全状态删除、整批回滚、隐藏记录后台收尾和界面契约。
- `docs/admin/03-data-model.md`:记录 v24 软删除和恢复规则。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 任意状态记录均可勾选并批量软删除,确认信息包含数量与远端不撤销说明 | 通过 |
| 删除后记录从列表、统计、匹配和新回写入口隐藏,并保存删除审计 | 通过 |
| 删除回写中记录不取消请求,最终结果仍写入同一隐藏记录 | 通过 |
| 重导相同业务键恢复原记录且计入恢复数量,不产生重复行 | 通过 |
| 未完成记录恢复后重置待匹配;完成/不确定记录保留审计 | 通过 |
| 完成/不确定记录换入库码时拒绝恢复 | 通过 |
| 固定 Go 1.23.0 build/test/vet 和 JavaScript 语法检查通过 | 通过 |
| MySQL v23→v24 和重复迁移测试代码已补充 | 通过(真实 MySQL 测试环境未启用) |
## 测试
- 执行的命令:
- `go test -count=1 ./repository ./service ./handler/web .`
- `$env:GOTOOLCHAIN='go1.23.0'; go build ./...; go test -count=1 ./...; go vet ./...`
- `node --check static/js/app.js`
- `git diff --check`
- 结果:全部已执行检查通过;真实 MySQL 集成用例因未提供隔离的 `_test` 数据库而按测试门禁跳过。
- **没验证到的部分**:未在真实 MySQL 8.4 隔离测试库执行 v23→v24;未在浏览器点击全状态删除、重导恢复和并发回写;未部署或修改生产数据库。
## 相关提交
- `2aea22b` feat: 档口入库码支持软删除与重导恢复 (#238)