Files
junhong_cmp_fiber/openspec/specs/refund-asset-reset/spec.md
huang f339fb1987
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m8s
fix: 资产钱包自动创建机制 — 修复C端购买时钱包不存在报错
- client_order: 新增 getOrCreateWallet 兜底,钱包不存在时自动创建
- device_import: 设备导入事务内同步创建设备钱包
- iot_card_import: IoT卡批量导入后批量创建卡钱包
- queue/handler: 传递 AssetWalletStore 给两个导入 handler
- migration 000098: 为存量IoT卡和设备补建资产钱包
2026-03-30 11:37:41 +08:00

2.8 KiB
Raw Blame History

ADDED Requirements

Requirement: 退款后套餐失效

退款审批通过后,系统 SHALL 查找该订单关联资产(iot_card_iddevice_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+1asset_status=1在库accumulated_recharge=0first_commission_paid=false、清零系列充值和触发标记,清理个人客户绑定(tb_personal_customer_device),删除旧资产钱包并创建新空钱包

Scenario: 设备世代重置

  • WHEN 退款订单为设备购买
  • THEN 系统 SHALL 更新设备:generation+1asset_status=1在库accumulated_recharge=0first_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 筛选需手动处理的退款单