fix: 资产钱包自动创建机制 — 修复C端购买时钱包不存在报错
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卡和设备补建资产钱包
This commit is contained in:
2026-03-30 11:37:41 +08:00
parent 40809d11c5
commit f339fb1987
36 changed files with 1811 additions and 26 deletions

View File

@@ -0,0 +1,32 @@
## Why
系统目前没有退款功能。当已支付的套餐购买订单需要退款时,只能线下处理,无法追踪退款状态,也无法自动回扣已发放的佣金、停掉已激活的套餐和资产。需要一套完整的退款审批流程:人工申请 → 审批/拒绝/退回 → 审批通过后自动停掉套餐和资产、全额回扣佣金、更新订单状态。
## What Changes
- **I-1 退款数据模型**:新建 `tb_refund_request`定义退款单的完整生命周期字段退款单号、关联订单、店铺ID、实收金额、申请退款金额、审批金额、状态流转、审批人/审批时间、佣金回扣标记、资产重置标记)。新建 `internal/model/refund.go` GORM Model。
- **I-2 退款接口设计**:新建完整的 Handler + Service + Store 三层实现,提供 7 个 API 接口发起申请、列表查询、详情查询、审批通过、审批拒绝、退回申请、重新提交。仅平台账号可操作。状态流转1(待审批) → 2(已通过)/3(已拒绝)/4(已退回)4(已退回) → 1(待审批)。创建时检查同一订单不能重复退款(已拒绝的除外)。
- **I-3 审批通过后的佣金全额回扣**:审批通过后,自动查找该订单产生的所有已入账佣金记录,全额从各代理的佣金钱包中扣减(允许余额为负),写入交易流水。
- **I-4 审批通过后的资产处理**审批通过后自动失效该资产所有套餐、停机单卡调停机接口、设备调停设备接口停所有绑定卡、世代重置generation+1、累计充值清零、asset_status 回到"在库"、清理客户绑定和资产钱包),参照换货模块逻辑。最后更新订单状态为已退款。
## Capabilities
### New Capabilities
- `refund-request`: 退款申请数据模型和状态流转
- `refund-api`: 退款审批流程的 7 个 API 接口(仅平台账号可操作)
- `refund-commission-deduct`: 退款审批通过后的佣金全额回扣机制
- `refund-asset-reset`: 退款审批通过后的资产处理(套餐失效 + 停机 + 世代重置 + 订单状态更新)
### Modified Capabilities
_无需修改现有能力的接口签名。需在 `package/activation_service.go` 中新增 `InvalidateAllPackagesByAsset` 方法。_
## Impact
- **新增文件**`internal/model/refund.go``internal/model/dto/refund_dto.go``internal/store/postgres/refund_store.go``internal/service/refund/service.go``internal/handler/admin/refund.go`、路由注册文件 `internal/routes/refund.go`
- **修改文件**`internal/bootstrap/stores.go``internal/bootstrap/services.go``internal/bootstrap/handlers.go``internal/routes/routes.go``cmd/api/docs.go``cmd/gendocs/main.go``internal/service/package/activation_service.go`(新增方法)
- **DB 迁移**:新建 `tb_refund_request`
- **新增常量**退款状态常量RefundStatusPending=1, Approved=2, Rejected=3, Returned=4、交易类型 `AgentTransactionTypeCommissionDeduct`、关联业务类型 `ReferenceTypeRefund`
- **跨模块依赖**:退款 Service 需注入 orderStore、commissionRecordStore、agentWalletStore、agentWalletTransactionStore、stopResumeService、deviceService、packageActivationService、iotCardStore、deviceStore、assetWalletStore参照换货模块的资产重置
- **前端影响**:管理端需新增退款管理页面;佣金明细需展示 `commission_deduct` 类型流水