Admin:实现蝦皮商品软删除、恢复和批量选择修复 #205

Closed
opened 2026-08-13 10:20:15 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷 / 需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / 蝦皮目录维护
  • 阶段:蝦皮商品生命周期

要解决什么

蝦皮列表已经显示“删除”按钮并注册 POST 路由,但 Handler 固定返回 501“删除功能尚未实现”。同时列表复选框只归属 PDD 采集表单,即使实现 Handler,删除表单也收不到选中的 ids。直接硬删除还会级联删除 SKU、丢失 PDD 关联并破坏历史关系。

复现:蝦皮数据页勾选商品,点击删除并确认,页面返回“删除功能尚未实现”。

做什么 / 不做什么

  • 做:
    • 为蝦皮商品增加软删除字段和参数化 repository 操作。
    • 默认列表、详情和新业务入口排除已删除商品。
    • 增加“已删除”筛选及管理员恢复操作。
    • 删除保留 SKU、PDD 关联、规格映射和历史审计;SYB 同步不能自动复活。
    • 有进行中采集或采购任务的商品阻止删除并返回逐项原因。
    • 修复一个复选框同时供批量采集和批量删除使用的标准 HTML 表单结构。
    • 删除/恢复仅管理员可执行,POST + CSRF,二次确认显示数量和“可以恢复”。
  • 不做:
    • 不硬删除商品、SKU、PDD 商品、SYB 货运单、映射或任务。
    • 不因再次 SYB 同步静默恢复。
    • 不修改 Client 四接口。

怎么做

  • 使用实施时下一个未占用 MySQL 迁移版本增加 deleted_at、deleted_by_user_id、索引/外键和 schema 自检;迁移可重放。
  • repository 封装批量查询、软删除、恢复及依赖检查;service 负责管理员权限、去重、进行中任务门禁和结果统计。
  • 调整所有蝦皮商品业务查询:普通列表默认排除删除项,已删除筛选只供管理员;SYB 上下文、PDD 关联和批量采集不得把删除商品当有效商品。
  • 模板使用一个共享批量表单,通过标准 formaction 区分采集和删除,保证选中 ID 能提交;删除确认文案改为可恢复,错误提供恢复路径。
  • 恢复后重新出现在普通列表,原 SKU/PDD 关联/映射仍在。
  • 同步更新数据模型、UI 规范和权限测试。

验收标准

  • 管理员勾选商品后可以软删除,服务端实际收到准确、去重后的当前页 ID。
  • 采购员访问删除、已删除列表和恢复接口均被拒绝。
  • 删除确认明确显示数量和可恢复,不再显示“不可恢复”。
  • 已删除商品不出现在默认列表、详情、批量采集或 SYB 有效关联流程。
  • SKU、PDD 关联、映射、SYB 数据和历史任务在删除前后数量不变。
  • 有进行中采集或采购任务时拒绝删除,并说明具体商品。
  • 后续 SYB 同步不自动复活;管理员恢复后原关系全部可继续使用。
  • 软删除和恢复幂等,重复请求有明确统计且不报 500。
  • MySQL 8.4 _test 首建、上一版本升级、重复迁移和 schema 自检通过。
  • 固定 Go 1.23.0 的 build、test、vet、模板和 JavaScript 回归通过。

怎么验证

从 admin/ 使用固定 Go 1.23.0 执行全量 build/test/vet 和 node --check static/js/app.js;独立 MySQL 8.4 _test 验证迁移、事务和多表数量;管理员/采购员浏览器会话验证删除、筛选、恢复、确认文案和表单 ID。

风险和回退

  • 风险:遗漏查询过滤会让已删除商品继续参与业务。通过 repository 查询清单和跨模块回归覆盖。
  • 风险:进行中任务删除会让操作员失去上下文,因此服务端必须阻止。
  • 回退:关闭删除入口;软删除记录可由管理员恢复,不执行破坏性反迁移。
## 基本信息 - 类型:缺陷 / 需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / 蝦皮目录维护 - 阶段:蝦皮商品生命周期 ## 要解决什么 蝦皮列表已经显示“删除”按钮并注册 POST 路由,但 Handler 固定返回 501“删除功能尚未实现”。同时列表复选框只归属 PDD 采集表单,即使实现 Handler,删除表单也收不到选中的 `ids`。直接硬删除还会级联删除 SKU、丢失 PDD 关联并破坏历史关系。 复现:蝦皮数据页勾选商品,点击删除并确认,页面返回“删除功能尚未实现”。 ## 做什么 / 不做什么 - 做: - 为蝦皮商品增加软删除字段和参数化 repository 操作。 - 默认列表、详情和新业务入口排除已删除商品。 - 增加“已删除”筛选及管理员恢复操作。 - 删除保留 SKU、PDD 关联、规格映射和历史审计;SYB 同步不能自动复活。 - 有进行中采集或采购任务的商品阻止删除并返回逐项原因。 - 修复一个复选框同时供批量采集和批量删除使用的标准 HTML 表单结构。 - 删除/恢复仅管理员可执行,POST + CSRF,二次确认显示数量和“可以恢复”。 - 不做: - 不硬删除商品、SKU、PDD 商品、SYB 货运单、映射或任务。 - 不因再次 SYB 同步静默恢复。 - 不修改 Client 四接口。 ## 怎么做 - 使用实施时下一个未占用 MySQL 迁移版本增加 `deleted_at`、`deleted_by_user_id`、索引/外键和 schema 自检;迁移可重放。 - repository 封装批量查询、软删除、恢复及依赖检查;service 负责管理员权限、去重、进行中任务门禁和结果统计。 - 调整所有蝦皮商品业务查询:普通列表默认排除删除项,已删除筛选只供管理员;SYB 上下文、PDD 关联和批量采集不得把删除商品当有效商品。 - 模板使用一个共享批量表单,通过标准 `formaction` 区分采集和删除,保证选中 ID 能提交;删除确认文案改为可恢复,错误提供恢复路径。 - 恢复后重新出现在普通列表,原 SKU/PDD 关联/映射仍在。 - 同步更新数据模型、UI 规范和权限测试。 ## 验收标准 - [x] 管理员勾选商品后可以软删除,服务端实际收到准确、去重后的当前页 ID。 - [x] 采购员访问删除、已删除列表和恢复接口均被拒绝。 - [x] 删除确认明确显示数量和可恢复,不再显示“不可恢复”。 - [x] 已删除商品不出现在默认列表、详情、批量采集或 SYB 有效关联流程。 - [x] SKU、PDD 关联、映射、SYB 数据和历史任务在删除前后数量不变。 - [x] 有进行中采集或采购任务时拒绝删除,并说明具体商品。 - [x] 后续 SYB 同步不自动复活;管理员恢复后原关系全部可继续使用。 - [x] 软删除和恢复幂等,重复请求有明确统计且不报 500。 - [x] MySQL 8.4 `_test` 首建、上一版本升级、重复迁移和 schema 自检通过。 - [x] 固定 Go 1.23.0 的 build、test、vet、模板和 JavaScript 回归通过。 ## 怎么验证 从 `admin/` 使用固定 Go 1.23.0 执行全量 build/test/vet 和 `node --check static/js/app.js`;独立 MySQL 8.4 `_test` 验证迁移、事务和多表数量;管理员/采购员浏览器会话验证删除、筛选、恢复、确认文案和表单 ID。 ## 风险和回退 - 风险:遗漏查询过滤会让已删除商品继续参与业务。通过 repository 查询清单和跨模块回归覆盖。 - 风险:进行中任务删除会让操作员失去上下文,因此服务端必须阻止。 - 回退:关闭删除入口;软删除记录可由管理员恢复,不执行破坏性反迁移。
Author
Owner

实施完成,待验收

  • 实现提交:ad1ccc2
  • 归档提交:901b37a
  • 归档:docs/task/205-蝦皮商品软删除和恢复.md
  • 已实现:管理员软删除/恢复、进行中任务整批拦截、默认查询隔离、已删除筛选、共享批量表单和 MySQL v17。
  • 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 通过。
  • 未验证:现有 buy 对隔离库 autobuy_test 无权限,真实 MySQL 8.4 DDL 测试被阻止;浏览器人工验收待执行。
## 实施完成,待验收 - 实现提交:ad1ccc2 - 归档提交:901b37a - 归档:docs/task/205-蝦皮商品软删除和恢复.md - 已实现:管理员软删除/恢复、进行中任务整批拦截、默认查询隔离、已删除筛选、共享批量表单和 MySQL v17。 - 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 通过。 - 未验证:现有 buy 对隔离库 autobuy_test 无权限,真实 MySQL 8.4 DDL 测试被阻止;浏览器人工验收待执行。
Author
Owner

用户于 2026-08-14 明确验收通过。验收清单已确认,现关闭工单。

用户于 2026-08-14 明确验收通过。验收清单已确认,现关闭工单。
ila closed this issue 2026-08-14 09:20:49 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#205