All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 11m42s
- 新增成对迁移 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), 旧资产带标签时迁移最后一步失败,待另立变更修复
2.7 KiB
2.7 KiB
1. 数据契约
- 1.1 新增成对迁移
migrations/000222_add_exchange_migration_status.up.sql/.down.sql,为tb_exchange_order添加迁移状态和失败原因字段:ADD COLUMN(带默认值)→ 按既有migrate_data、migration_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/worker、openspec validate add-exchange-data-migration-status --strict和openspec doctor --json;自动化测试按项目决策为 N/A。