All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m8s
- client_order: 新增 getOrCreateWallet 兜底,钱包不存在时自动创建 - device_import: 设备导入事务内同步创建设备钱包 - iot_card_import: IoT卡批量导入后批量创建卡钱包 - queue/handler: 传递 AssetWalletStore 给两个导入 handler - migration 000098: 为存量IoT卡和设备补建资产钱包
50 lines
2.8 KiB
Markdown
50 lines
2.8 KiB
Markdown
## ADDED Requirements
|
||
|
||
### Requirement: 退款后套餐失效
|
||
退款审批通过后,系统 SHALL 查找该订单关联资产(`iot_card_id` 或 `device_id`)的全部套餐使用记录(`status IN (0,1,2)` 待生效/生效中/已用完),批量更新为 `status=4`(已失效)。
|
||
|
||
#### Scenario: 失效单卡套餐
|
||
- **WHEN** 退款订单为单卡购买,关联 iot_card_id
|
||
- **THEN** 系统 SHALL 将该卡所有 `status IN (0,1,2)` 的套餐使用记录更新为 `status=4`
|
||
|
||
#### Scenario: 失效设备套餐
|
||
- **WHEN** 退款订单为设备购买,关联 device_id
|
||
- **THEN** 系统 SHALL 将该设备所有 `status IN (0,1,2)` 的套餐使用记录更新为 `status=4`
|
||
|
||
### Requirement: 退款后停机
|
||
套餐失效后,系统 SHALL 对资产执行停机操作。
|
||
|
||
#### Scenario: 单卡停机
|
||
- **WHEN** 退款订单为单卡购买
|
||
- **THEN** 系统 SHALL 调用 `StopResumeService.ManualStopCard(iccid)` 停机
|
||
|
||
#### Scenario: 设备停机(停所有绑定卡)
|
||
- **WHEN** 退款订单为设备购买
|
||
- **THEN** 系统 SHALL 调用 `DeviceService.StopDevice(deviceID)`,内部遍历所有绑定卡逐一停机
|
||
|
||
### Requirement: 退款后资产世代重置
|
||
停机后,系统 SHALL 对资产执行世代重置(参照换货模块 `exchange/service.go` 的重置逻辑),使资产回到可重新销售状态,一次性佣金可重新触发。
|
||
|
||
#### Scenario: 单卡世代重置
|
||
- **WHEN** 退款订单为单卡购买
|
||
- **THEN** 系统 SHALL 更新 IoT 卡:`generation+1`、`asset_status=1(在库)`、`accumulated_recharge=0`、`first_commission_paid=false`、清零系列充值和触发标记,清理个人客户绑定(`tb_personal_customer_device`),删除旧资产钱包并创建新空钱包
|
||
|
||
#### Scenario: 设备世代重置
|
||
- **WHEN** 退款订单为设备购买
|
||
- **THEN** 系统 SHALL 更新设备:`generation+1`、`asset_status=1(在库)`、`accumulated_recharge=0`、`first_commission_paid=false`、清零系列充值和触发标记,清理个人客户绑定,删除旧资产钱包并创建新空钱包
|
||
|
||
### Requirement: 退款后订单状态更新
|
||
资产处理完成后,系统 SHALL 将订单 `payment_status` 更新为 4(已退款)。
|
||
|
||
#### Scenario: 订单标记已退款
|
||
- **WHEN** 资产处理全部成功
|
||
- **THEN** 订单 `payment_status` SHALL 变为 4(已退款),退款单 `asset_reset` 标记为 `true`
|
||
|
||
### Requirement: 资产处理失败容错
|
||
资产处理 SHALL 在独立 Goroutine 中执行,失败不影响审批结果。
|
||
|
||
#### Scenario: 资产处理失败
|
||
- **WHEN** 套餐失效/停机/世代重置过程中发生错误
|
||
- **THEN** 审批结果 SHALL NOT 受影响(已通过),`asset_reset` 保持 `false`,记录 Error 日志(含 refund_id 和 error)
|
||
- **AND** 管理员可通过 `asset_reset=false` 筛选需手动处理的退款单
|