Files
junhong_cmp_fiber/openspec/changes/archive/2026-09-14-add-exchange-data-migration-status/tasks.md
break 93e072e1e2
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 11m42s
feat(换货): AUG26-005 换货业务数据迁移状态与失败恢复
- 新增成对迁移 000222:tb_exchange_order 增加非空 migration_status 与
  migration_failure_reason,按既有 migrate_data/migration_completed 回填历史,
  并加四值 CHECK 约束,不新增索引
- 模型与常量定义四种迁移状态及中文名称,保留既有布尔字段兼容语义
- 物流换货创建恒 not_migrated,发货按请求落 pending/not_migrated,
  完成成功写 migrated/not_migrated 并清空失败原因、同步兼容字段
- 直接换货创建即完成,任一步失败整体回滚,不持久化换货单、不产生 failed
- 迁移失败回滚全部业务修改后,在独立短事务内条件更新 failed 与安全失败原因
  并写失败审计,RowsAffected 为 0 时跳过状态写入但仍写审计
- failed 物流单重试仅限超级管理员或平台用户,授权以锁内 FOR UPDATE 判定为准,
  重试从钱包余额起整表重跑;非 failed 单沿用既有完成门禁
- 列表与详情返回迁移状态与中文名称,仅 failed 返回失败原因;既有三字段保持兼容
- 换货导出在「状态」列后新增中文「迁移状态」列,不导出失败原因
- 同步 order-refund-exchange 主 spec 与验证证据,归档本 Change
- 登记 KNOWN-ISSUE-001:既有标签复制 OnConflict 未声明部分索引谓词(42P10),
  旧资产带标签时迁移最后一步失败,待另立变更修复
2026-09-14 18:32:26 +08:00

2.7 KiB
Raw Blame History

1. 数据契约

  • 1.1 新增成对迁移 migrations/000222_add_exchange_migration_status.up.sql / .down.sql,为 tb_exchange_order 添加迁移状态和失败原因字段ADD COLUMN带默认值→ 按既有 migrate_datamigration_completed 回填历史记录 → 添加 chk_exchange_order_migration_status 约束;实施时按 migrations/ 根目录最大编号复核,保持 up/down 成对。
  • 1.2 在换货模型和常量中定义四种迁移状态及中文名称,保留现有布尔字段的兼容语义。
  • 1.3 扩展换货列表、详情 DTO 及两个读侧投影,返回迁移状态、中文名称及仅失败时的安全失败原因。
  • 1.4 在 internal/exporter/exchange_scene.go 最小改动表头、SQL Select、行结构与行拼接四处在「状态」列之后新增一列迁移状态并使用中文名称不导出失败原因。

2. 换货完成与恢复

  • 2.1 在创建、发货和成功完成的写路径维护不迁移、待迁移和已迁移状态,并在成功后清除失败原因。
  • 2.2 保持完整换货和业务数据迁移在同一 GORM 事务;迁移失败时回滚全部业务修改,再在同一个回滚后短事务内保存物流换货单的失败状态、安全化失败原因和审计事实。该短事务不与已回滚的主事务共用连接或事务,条件为「换货单仍处于可确认完成状态」,RowsAffected 为 0 时跳过状态写入但仍写审计;失败原因只拼接 AppError 链上的中文 Message、丢弃非 AppError 的 cause、按 rune 截断至不超过 500 字符,基础设施错误降级为固定安全摘要;符合 ENG-TX-001 例外条件。
  • 2.3 限制迁移失败的物流换货重试仅由超级管理员或平台用户发起,授权以 FOR UPDATE 锁定后读到的 migration_status 为准(事务外预读只做快速拒绝);重试须重新执行全套迁移、禁止只重试子项,并防止并发重复完成;非 failed 单沿用既有完成门禁,不削弱代理既有权限。
  • 2.4 保持直接换货失败时整体回滚且不持久化失败换货单,确认迁移范围不包含手机号—资产关联。

3. 文档与验证

  • 3.1 更新换货接口 OpenAPI 描述并运行 go run cmd/gendocs/main.go,核对状态枚举及失败原因的响应契约。
  • 3.2 在隔离数据库按 scripts/migrate.sh 使用显式 DB_* 参数验证新迁移 up/down/up、历史状态映射及回滚后的 Schema。
  • 3.3 运行 gofmt -w(变更 Go 文件)、go build ./cmd/api ./cmd/workeropenspec validate add-exchange-data-migration-status --strictopenspec doctor --json;自动化测试按项目决策为 N/A。