4.2 KiB
4.2 KiB
238 Admin:档口入库码所有状态支持软删除与重复导入恢复
- 类型:需求
- 父级大工单:#14
- 所属 MVP / 版本:#224
- 状态:已完成
- 日期:2026-08-15
- Gitea 工单:#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.jsgit diff --check
- 结果:全部已执行检查通过;真实 MySQL 集成用例因未提供隔离的
_test数据库而按测试门禁跳过。 - 没验证到的部分:未在真实 MySQL 8.4 隔离测试库执行 v23→v24;未在浏览器点击全状态删除、重导恢复和并发回写;未部署或修改生产数据库。
相关提交
2aea22bfeat: 档口入库码支持软删除与重导恢复 (#238)