From 7b766f5c2a42c4a32d65c07aa6c338a41069f2c9 Mon Sep 17 00:00:00 2001 From: chengma Date: Sat, 15 Aug 2026 10:50:01 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#238?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/238-档口入库码软删除与重导恢复.md | 63 +++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/task/238-档口入库码软删除与重导恢复.md diff --git a/docs/task/238-档口入库码软删除与重导恢复.md b/docs/task/238-档口入库码软删除与重导恢复.md new file mode 100644 index 0000000..978f661 --- /dev/null +++ b/docs/task/238-档口入库码软删除与重导恢复.md @@ -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)