Admin:档口入库码导入自动替换安全旧快照 #306

Open
opened 2026-08-26 14:28:19 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:需求 / 交互优化
  • 父级大工单:#14
  • 所属 MVP / 版本:#224 / 档口入库码回写 MVP
  • 阶段:阶段 15:同日安全旧快照自动替换
  • 依赖:#304
  • 状态:待验收

要解决什么

#304 为同日最新版 Excel 增加了“替换当日已删除旧数据”复选框和专门确认框。实际业务规则已经明确:采购员上传的文件就是当前要采用的完整数据,手工选择替换模式属于重复操作。目标是移除该控件,由 Admin 每次导入时自动判断同日旧快照能否安全替换,同时保留 #304 的全部后端保护。

做什么 / 不做什么

做什么

  • 移除复选框、危险样式和专门确认逻辑。
  • 每次导入解析成功后,在事务内锁定同一业务日期的完整旧快照。
  • 只有旧快照非空,且每条记录都已软删除、状态精确为 pending、没有匹配/采购/远端/逐件规划/回写批次/应用审计字段时,才自动物理删除旧快照并导入当前文件。
  • 成功反馈显示“自动替换旧数据 N 条”。
  • 没有旧快照,或存在未删除/已处理记录时,不执行物理替换,继续原有组成码归属检查和幂等 upsert。
  • 并发导致删除数量变化时整批回滚并返回可恢复错误。
  • 更新自动化测试、数据模型和界面基线。

不做什么

  • 不取消同日入库码唯一约束。
  • 不物理删除未删除、已匹配、已排队、回写中、已回写或待核对记录。
  • 不根据文件名猜测新旧版本,不新增文件版本、哈希或导入批次表。
  • 不修改数据库结构、Client 接口或顺运宝远端数据。
  • 本工单不部署生产,不自动导入用户 Excel。

怎么做

  1. service 移除页面传入的危险选项,普通导入入口统一执行自动安全判定。
  2. 事务开始后锁定同日完整快照:非空且全部安全则删除并核对行数;其他情况调用现有组成码归属校验并执行原有 upsert。
  3. 保留并发快照变化错误分类,Handler 返回 409,明确本次无删除、无导入。
  4. Handler 不再读取 replace_unprocessed_snapshot;仅在实际替换数量大于 0 时显示统计。
  5. 模板、JavaScript、CSS 删除复选框和专门确认,保留文件选择、CSRF、上传限制和“导入中…”反馈。
  6. 测试覆盖空快照、安全快照、混合/未删除/已处理快照、普通导入和并发回滚。
  7. 更新数据模型与界面基线。

预计修改:

  • admin/service/inner_code_import.go
  • admin/service/inner_code_import_test.go
  • admin/handler/web/inner_code.go
  • admin/handler/web/inner_code_test.go
  • admin/templates/inner_code/list.html
  • admin/inner_code_template_test.go
  • admin/static/js/app.js
  • admin/static/css/app.css
  • docs/admin/03-data-model.md
  • docs/admin/05-ui-specification.md
  • docs/task/306-档口入库码自动替换安全旧快照.md

数据库结构:不变。
Admin/Client HTTP 接口:Client 接口不变;浏览器表单移除可选字段。

验收标准

  • 页面不再显示或提交 replace_unprocessed_snapshot,不再显示专门替换确认框。
  • 普通上传仍显示“导入中…”并防止重复提交。
  • 没有同日旧记录时按原有规则导入,替换数量为 0。
  • 同日旧记录全部已删除、为 pending 且无处理证据时自动原子替换。
  • 自动替换成功反馈显示实际替换旧记录数量。
  • 任一旧记录未删除、不是 pending 或存在处理证据时不物理删除,继续原有普通导入规则。
  • 普通导入的组成码跨业务键冲突、文件校验和幂等恢复行为保持不变。
  • 自动替换删除数量变化或后续写入失败时事务整体回滚。
  • CSRF、xlsx 扩展名、魔数、10MB 和临时文件清理保持不变。
  • 用户样本只读解析仍为 123 个源行、122 条业务记录、合并 1 行。
  • Go 1.23.0 全量 test、build、vet 和 JavaScript 语法检查通过。
  • 完成实施记录、提交和本地归档。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN = "go1.23.0"
go test ./service ./repository ./handler/web . -run InnerCode -count=1
go test ./... -count=1
go build ./...
go vet ./...
node --check static/js/app.js
Remove-Item Env:GOTOOLCHAIN

另使用不提交 Git 的 Shopee_mapping_20260826 (3).xlsx 做只读解析检查;不得连接生产数据库执行自动替换。

风险和回退

  • 风险:上传旧文件时系统无法判断它是不是最新版。控制:自动替换只触及已经由用户软删除且从未处理的整日快照,导入按钮仍是明确写操作,成功反馈显示替换数量。
  • 风险:混合安全与已处理记录被误删。控制:只有整日旧快照全部通过门禁才物理删除,一条不满足即退回普通导入。
  • 风险:并发导入。控制:按业务日期锁定完整快照、核对删除影响行数并保留数据库唯一索引。
  • 回退:回退本工单代码即可恢复 #304 的手工复选框;无 schema 迁移。

实施记录(2026-08-26)

  • 已移除“替换当日已删除旧数据”复选框、专门确认逻辑和表单参数。
  • 导入服务现在自动锁定同日完整快照;仅当旧快照非空且全部通过安全门禁时,才在同一事务内删除旧快照并导入新文件。
  • 不安全或混合快照继续执行原有组成码归属检查与幂等 upsert,不会物理删除旧记录。
  • 成功提示会显示实际“自动替换旧数据 N 条”;并发删除数量变化时整批回滚。
  • 用户样本只读解析结果:业务日期 2026-08-26,源数据 123 行,合并 1 行,最终 122 条。
  • 验证通过:Go 1.23.0 下 go build ./...、go test ./... -count=1、go vet ./...;node --check static/js/app.js。
  • 实现提交:429ecf3。
  • 归档提交:a9fce78。
  • 本地归档:docs/task/306-档口入库码自动替换安全旧快照.md。
  • 未验证:独立 MySQL 8 行锁并发用例、登录态浏览器人工视觉验收、生产部署和生产数据替换。本工单未部署生产。
## 基本信息 - 类型:需求 / 交互优化 - 父级大工单:#14 - 所属 MVP / 版本:#224 / 档口入库码回写 MVP - 阶段:阶段 15:同日安全旧快照自动替换 - 依赖:#304 - 状态:待验收 ## 要解决什么 #304 为同日最新版 Excel 增加了“替换当日已删除旧数据”复选框和专门确认框。实际业务规则已经明确:采购员上传的文件就是当前要采用的完整数据,手工选择替换模式属于重复操作。目标是移除该控件,由 Admin 每次导入时自动判断同日旧快照能否安全替换,同时保留 #304 的全部后端保护。 ## 做什么 / 不做什么 ### 做什么 - 移除复选框、危险样式和专门确认逻辑。 - 每次导入解析成功后,在事务内锁定同一业务日期的完整旧快照。 - 只有旧快照非空,且每条记录都已软删除、状态精确为 `pending`、没有匹配/采购/远端/逐件规划/回写批次/应用审计字段时,才自动物理删除旧快照并导入当前文件。 - 成功反馈显示“自动替换旧数据 N 条”。 - 没有旧快照,或存在未删除/已处理记录时,不执行物理替换,继续原有组成码归属检查和幂等 upsert。 - 并发导致删除数量变化时整批回滚并返回可恢复错误。 - 更新自动化测试、数据模型和界面基线。 ### 不做什么 - 不取消同日入库码唯一约束。 - 不物理删除未删除、已匹配、已排队、回写中、已回写或待核对记录。 - 不根据文件名猜测新旧版本,不新增文件版本、哈希或导入批次表。 - 不修改数据库结构、Client 接口或顺运宝远端数据。 - 本工单不部署生产,不自动导入用户 Excel。 ## 怎么做 1. service 移除页面传入的危险选项,普通导入入口统一执行自动安全判定。 2. 事务开始后锁定同日完整快照:非空且全部安全则删除并核对行数;其他情况调用现有组成码归属校验并执行原有 upsert。 3. 保留并发快照变化错误分类,Handler 返回 409,明确本次无删除、无导入。 4. Handler 不再读取 `replace_unprocessed_snapshot`;仅在实际替换数量大于 0 时显示统计。 5. 模板、JavaScript、CSS 删除复选框和专门确认,保留文件选择、CSRF、上传限制和“导入中…”反馈。 6. 测试覆盖空快照、安全快照、混合/未删除/已处理快照、普通导入和并发回滚。 7. 更新数据模型与界面基线。 预计修改: - `admin/service/inner_code_import.go` - `admin/service/inner_code_import_test.go` - `admin/handler/web/inner_code.go` - `admin/handler/web/inner_code_test.go` - `admin/templates/inner_code/list.html` - `admin/inner_code_template_test.go` - `admin/static/js/app.js` - `admin/static/css/app.css` - `docs/admin/03-data-model.md` - `docs/admin/05-ui-specification.md` - `docs/task/306-档口入库码自动替换安全旧快照.md` 数据库结构:不变。 Admin/Client HTTP 接口:Client 接口不变;浏览器表单移除可选字段。 ## 验收标准 - [x] 页面不再显示或提交 `replace_unprocessed_snapshot`,不再显示专门替换确认框。 - [x] 普通上传仍显示“导入中…”并防止重复提交。 - [x] 没有同日旧记录时按原有规则导入,替换数量为 0。 - [x] 同日旧记录全部已删除、为 `pending` 且无处理证据时自动原子替换。 - [x] 自动替换成功反馈显示实际替换旧记录数量。 - [x] 任一旧记录未删除、不是 `pending` 或存在处理证据时不物理删除,继续原有普通导入规则。 - [x] 普通导入的组成码跨业务键冲突、文件校验和幂等恢复行为保持不变。 - [x] 自动替换删除数量变化或后续写入失败时事务整体回滚。 - [x] CSRF、xlsx 扩展名、魔数、10MB 和临时文件清理保持不变。 - [x] 用户样本只读解析仍为 123 个源行、122 条业务记录、合并 1 行。 - [x] Go 1.23.0 全量 test、build、vet 和 JavaScript 语法检查通过。 - [x] 完成实施记录、提交和本地归档。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN = "go1.23.0" go test ./service ./repository ./handler/web . -run InnerCode -count=1 go test ./... -count=1 go build ./... go vet ./... node --check static/js/app.js Remove-Item Env:GOTOOLCHAIN ``` 另使用不提交 Git 的 `Shopee_mapping_20260826 (3).xlsx` 做只读解析检查;不得连接生产数据库执行自动替换。 ## 风险和回退 - 风险:上传旧文件时系统无法判断它是不是最新版。控制:自动替换只触及已经由用户软删除且从未处理的整日快照,导入按钮仍是明确写操作,成功反馈显示替换数量。 - 风险:混合安全与已处理记录被误删。控制:只有整日旧快照全部通过门禁才物理删除,一条不满足即退回普通导入。 - 风险:并发导入。控制:按业务日期锁定完整快照、核对删除影响行数并保留数据库唯一索引。 - 回退:回退本工单代码即可恢复 #304 的手工复选框;无 schema 迁移。 ## 实施记录(2026-08-26) - 已移除“替换当日已删除旧数据”复选框、专门确认逻辑和表单参数。 - 导入服务现在自动锁定同日完整快照;仅当旧快照非空且全部通过安全门禁时,才在同一事务内删除旧快照并导入新文件。 - 不安全或混合快照继续执行原有组成码归属检查与幂等 upsert,不会物理删除旧记录。 - 成功提示会显示实际“自动替换旧数据 N 条”;并发删除数量变化时整批回滚。 - 用户样本只读解析结果:业务日期 2026-08-26,源数据 123 行,合并 1 行,最终 122 条。 - 验证通过:Go 1.23.0 下 `go build ./...`、`go test ./... -count=1`、`go vet ./...`;`node --check static/js/app.js`。 - 实现提交:`429ecf3`。 - 归档提交:`a9fce78`。 - 本地归档:`docs/task/306-档口入库码自动替换安全旧快照.md`。 - 未验证:独立 MySQL 8 行锁并发用例、登录态浏览器人工视觉验收、生产部署和生产数据替换。本工单未部署生产。
ila referenced this issue from a commit 2026-08-26 14:35:49 +08:00
Author
Owner

生产部署工单 #307 已完成:线上稳定链接和进程均已切换到 a9fce78,公网静态资源确认已移除旧复选框与专门确认逻辑,并保留“导入中…”反馈。#306 继续保持待用户验收。

生产部署工单 #307 已完成:线上稳定链接和进程均已切换到 `a9fce78`,公网静态资源确认已移除旧复选框与专门确认逻辑,并保留“导入中…”反馈。#306 继续保持待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/cmautobuy#306