feat(换货): AUG26-005 换货业务数据迁移状态与失败恢复
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 11m42s
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), 旧资产带标签时迁移最后一步失败,待另立变更修复
This commit is contained in:
@@ -283,6 +283,70 @@
|
||||
- **WHEN** 系统解析并返回这两个展示字段
|
||||
- **THEN** 退款金额校验、冻结实收金额、套餐失效、接续下一套餐、停机评估与佣金回溯行为均不发生变化
|
||||
|
||||
### Requirement: 换货业务数据迁移状态与失败恢复
|
||||
|
||||
系统 SHALL 为每张已持久化的物流换货单返回业务数据迁移状态 `not_migrated`(不迁移)、`pending`(待迁移)、`migrated`(已迁移)或 `failed`(迁移失败),以及对应的中文状态名称。未选择业务数据迁移的换货单状态 MUST 为 `not_migrated`;选择迁移但尚未成功完成的换货单状态 MUST 为 `pending`;完整迁移成功后状态 MUST 为 `migrated`;迁移执行失败后状态 MUST 为 `failed`,并保存最近一次可安全展示的失败原因。
|
||||
|
||||
换货列表和详情 SHALL 返回迁移状态及中文名称;仅当状态为 `failed` 时返回最近一次失败原因。既有 `migrate_data`、`migration_completed` 和迁移余额字段 SHALL 保持兼容,但客户端不得再通过它们推断迁移结果。直接换货创建失败继续按既有原子性整体回滚,不产生可查询的失败换货单。
|
||||
|
||||
#### Scenario: 不迁移的换货单
|
||||
|
||||
- **WHEN** 创建或发货时未选择业务数据迁移
|
||||
- **THEN** 换货列表和详情返回 `not_migrated` 及“不迁移”,且不返回迁移失败原因
|
||||
|
||||
#### Scenario: 待迁移的换货单
|
||||
|
||||
- **WHEN** 换货单已选择业务数据迁移但尚未成功完成换货
|
||||
- **THEN** 换货列表和详情返回 `pending` 及“待迁移”
|
||||
|
||||
#### Scenario: 成功完成业务数据迁移
|
||||
|
||||
- **WHEN** 换货完成时全部业务数据迁移成功
|
||||
- **THEN** 系统原子完成换货及业务数据迁移,列表和详情返回 `migrated` 及“已迁移”,并清除最近一次失败原因
|
||||
|
||||
#### Scenario: 迁移失败后保留可恢复事实
|
||||
|
||||
- **WHEN** 换货完成时任一业务数据迁移步骤失败
|
||||
- **THEN** 系统不得提交本次换货完成及任何部分迁移结果,换货单保持可确认完成状态,返回迁移失败,并在独立持久化事实中将迁移状态更新为 `failed` 和最近一次失败原因
|
||||
|
||||
#### Scenario: 管理员重试失败迁移
|
||||
|
||||
- **WHEN** 超级管理员或平台用户对处于可确认完成状态且迁移状态为 `failed` 的换货单再次确认完成
|
||||
- **THEN** 系统重新原子执行完整业务数据迁移;成功后将状态更新为 `migrated`,再次失败则保留 `failed` 并覆盖为最近一次失败原因
|
||||
|
||||
#### Scenario: 非平台账号重试失败迁移
|
||||
|
||||
- **WHEN** 非超级管理员且非平台用户尝试再次确认迁移状态为 `failed` 的换货单
|
||||
- **THEN** 系统拒绝该操作,换货单及迁移状态不变
|
||||
|
||||
### Requirement: 换货业务数据迁移范围
|
||||
|
||||
系统 SHALL 仅在选择业务数据迁移的换货完成中迁移旧资产的钱包余额、有效套餐使用记录、累计充值字段和资产标签。资产归属与个人客户—资产绑定 SHALL 继续作为换货完成固有动作,不受业务数据迁移选项控制;手机号—资产关联 MUST NOT 随换货或业务数据迁移转移,新资产首次访问时按其适用的手机号绑定规则处理。
|
||||
|
||||
#### Scenario: 选择业务数据迁移完成换货
|
||||
|
||||
- **WHEN** 换货单选择业务数据迁移并成功确认完成
|
||||
- **THEN** 系统迁移钱包余额、有效套餐使用记录、累计充值字段和资产标签,且不迁移手机号—资产关联
|
||||
|
||||
#### Scenario: 不选择业务数据迁移完成换货
|
||||
|
||||
- **WHEN** 换货单未选择业务数据迁移并确认完成
|
||||
- **THEN** 系统仍完成资产归属与个人客户—资产绑定的固有换货动作,但不迁移钱包余额、套餐使用记录、累计充值字段或资产标签
|
||||
|
||||
### Requirement: 换货导出业务数据迁移状态
|
||||
|
||||
换货导出 SHALL 包含业务数据迁移状态,取值使用中文状态名称(不迁移、待迁移、已迁移、迁移失败),并 MUST NOT 导出迁移失败原因。该列 MUST 仅用于展示与追溯,MUST NOT 改变换货完成、业务数据迁移、失败恢复或数据访问范围任何规则。
|
||||
|
||||
#### Scenario: 导出包含迁移状态
|
||||
|
||||
- **WHEN** 调用方导出换货记录
|
||||
- **THEN** 每行在「状态」之后返回该记录对应的中文迁移状态
|
||||
|
||||
#### Scenario: 迁移失败的记录被导出
|
||||
|
||||
- **WHEN** 换货记录的迁移状态为 `failed`,且该记录保存了最近一次失败原因
|
||||
- **THEN** 导出行的迁移状态为“迁移失败”,且导出不输出该失败原因
|
||||
|
||||
## 可达操作索引
|
||||
|
||||
本节只用于入口导航,不是行为 Requirement;业务义务以上述 Requirements 为准。
|
||||
|
||||
Reference in New Issue
Block a user