Files
junhong_cmp_fiber/openspec/changes/archive/2026-01-31-add-force-recharge-system/tasks.md
huang 62708892ec
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m2s
文档
2026-01-31 13:06:30 +08:00

11 KiB
Raw Blame History

1. 数据库迁移

  • 1.1 创建迁移文件tb_order 表新增 is_purchase_on_behalf 字段
  • 1.2 创建迁移文件tb_shop_series_allocation 表新增强充配置字段enable_force_recharge, force_recharge_amount
  • 1.3 在测试环境执行迁移并验证字段添加成功
  • 1.4 验证迁移:检查字段默认值和数据类型是否正确

2. 常量定义

  • 2.1 在 pkg/constants/ 定义充值订单状态常量(待支付、已支付、已完成、已关闭)
  • 2.2 在 pkg/constants/ 定义充值订单号前缀常量RCH
  • 2.3 在 pkg/constants/ 定义线下支付方式常量offline
  • 2.4 在 pkg/constants/ 定义强充相关 Redis Key 生成函数(可选,如缓存系列配置)
  • 2.5 在 pkg/constants/ 定义充值金额限制常量最小1元最大100000元

3. 错误码定义

  • 3.1 在 pkg/errors/ 定义充值相关错误码(充值金额不符、充值订单不存在等)
  • 3.2 在 pkg/errors/ 定义代购相关错误码(只有平台可使用线下支付、只能为下级代理代购等)
  • 3.3 在 pkg/errors/ 定义强充验证错误码必须充值X元等

4. Model 层修改

  • 4.1 修改 internal/model/order.go新增 IsPurchaseOnBehalf 字段bool, default false
  • 4.2 修改 internal/model/shop_series_allocation.go新增 EnableForceRecharge 字段bool, default false
  • 4.3 修改 internal/model/shop_series_allocation.go新增 ForceRechargeAmount 字段int64, default 0
  • 4.4 验证 Model 修改:运行 lsp_diagnostics 检查类型错误

5. RechargeStore 数据访问层

  • 5.1 创建 internal/store/postgres/recharge_store.go
  • 5.2 实现 Create 方法:创建充值订单
  • 5.3 实现 GetByRechargeNo 方法:根据充值单号查询
  • 5.4 实现 GetByID 方法根据ID查询充值订单详情
  • 5.5 实现 List 方法:分页查询充值订单列表,支持状态筛选、时间范围筛选
  • 5.6 实现 UpdateStatus 方法:更新充值订单状态(支付成功回调时使用)
  • 5.7 实现 UpdatePaymentInfo 方法:更新支付方式和支付时间
  • 5.8 编写单元测试:测试覆盖率 ≥ 90%
  • 5.9 验证测试:运行测试并确保全部通过

6. RechargeService 业务逻辑层

  • 6.1 创建 internal/service/recharge/service.go
  • 6.2 实现 Create 方法:创建充值订单
    • 验证资源存在(卡/设备)
    • 验证充值金额范围1元~100000元
    • 检查强充要求并验证金额
    • 生成充值单号RCH + 时间戳 + 随机数)
    • 创建充值订单记录
  • 6.3 实现 GetRechargeCheck 方法:充值预检
    • 查询资源(卡/设备)
    • 查询系列分配配置
    • 判断是否需要强充
    • 返回强充要求、允许金额范围、提示信息
  • 6.4 实现 GetByID 方法:查询充值订单详情(数据权限过滤)
  • 6.5 实现 List 方法:查询充值订单列表(分页、筛选、数据权限过滤)
  • 6.6 实现 HandlePaymentCallback 方法:处理支付回调
    • 幂等性检查(检查订单状态)
    • 使用数据库事务:更新订单状态 → 增加钱包余额 → 更新累计充值 → 触发佣金判断
    • 钱包余额更新使用原子操作
  • 6.7 实现 updateAccumulatedRecharge 私有方法:更新卡/设备的累计充值金额
  • 6.8 实现 triggerOneTimeCommissionIfNeeded 私有方法:检查并触发一次性佣金
  • 6.9 实现 checkForceRechargeRequirement 私有方法:检查强充要求(供创建订单时使用)
  • 6.10 编写单元测试:测试覆盖率 ≥ 90%(包含各种充值场景、强充验证、支付回调幂等性)
  • 6.11 验证测试:运行测试并确保全部通过

7. OrderService 修改(代购订单和强充验证)

  • 7.1 修改 internal/service/order/service.goCreate 方法增加强充验证
    • 调用预检逻辑获取强充要求
    • 验证支付金额是否符合强充要求
    • 不符合则返回错误
  • 7.2 新增 CreatePurchaseOnBehalf 方法:创建代购订单
    • 验证权限(只有平台可以使用线下支付)
    • 查询资源归属代理buyer_id
    • 查询买家的成本价
    • 创建订单is_purchase_on_behalf = true, payment_method = offline, payment_status = 2
    • 自动激活套餐(创建 PackageUsage
    • 触发佣金计算任务
  • 7.3 新增 GetPurchaseCheck 方法:套餐购买预检
    • 查询套餐总价
    • 检查强充要求
    • 计算实际支付金额和钱包到账金额
    • 返回预检信息(含提示消息)
  • 7.4 修改支付成功后的处理逻辑:增加 is_purchase_on_behalf 判断
    • 如果是代购订单,跳过钱包扣款
    • 如果是普通订单,正常扣款
  • 7.5 编写单元测试:测试代购订单创建、强充验证、预检逻辑
  • 7.6 验证测试:运行测试并确保全部通过

8. CommissionCalculationService 修改

  • 8.1 修改 internal/service/commission_calculation/service.goCalculateCommission 方法增加代购订单判断
    • 差价佣金:所有订单都计算(包括代购)
    • 累计充值更新仅非代购订单更新is_purchase_on_behalf = false
    • 一次性佣金仅非代购订单触发is_purchase_on_behalf = false
  • 8.2 修改 updateAccumulatedRecharge 方法:增加代购订单检查
    • 如果 is_purchase_on_behalf = true直接返回不更新累计充值
    • 如果 is_purchase_on_behalf = false正常更新累计充值
  • 8.3 修改 triggerOneTimeCommission 方法:增加代购订单检查
    • 如果 is_purchase_on_behalf = true直接返回不触发一次性佣金
    • 如果 is_purchase_on_behalf = false正常检查阈值并触发佣金
  • 8.4 编写单元测试:使用 table-driven tests 测试各种场景(普通订单、代购订单、充值订单)
  • 8.5 验证测试:运行测试并确保全部通过

9. RechargeHandler HTTP 接口层

  • 9.1 创建 internal/handler/h5/recharge.go
  • 9.2 实现 POST /api/h5/wallets/recharge创建充值订单
    • 参数验证resource_type, resource_id, amount
    • 调用 Service 创建充值订单
    • 返回充值订单信息
  • 9.3 实现 GET /api/h5/wallets/recharge-check充值预检
    • 参数验证resource_type, resource_id
    • 调用 Service 获取强充要求
    • 返回预检信息
  • 9.4 实现 GET /api/h5/wallets/recharges查询充值订单列表
    • 支持分页参数page, page_size
    • 支持状态筛选status
    • 支持时间范围筛选start_time, end_time
  • 9.5 实现 GET /api/h5/wallets/recharges/:id查询充值订单详情
  • 9.6 为所有接口添加中文注释(路由路径、参数说明、响应说明)
  • 9.7 验证接口:运行 lsp_diagnostics 检查类型错误

10. OrderHandler 修改(代购订单接口)

  • 10.1 修改 internal/handler/admin/order.goCreate 方法增加代购订单支持
    • 检查 payment_method = offline 时,验证用户类型为 Platform
    • 如果是平台账号且线下支付,调用 CreatePurchaseOnBehalf
    • 否则调用正常的 Create 方法
  • 10.2 新增 POST /api/admin/orders/purchase-check套餐购买预检
    • 参数验证order_type, resource_id, package_ids
    • 调用 Service 获取预检信息
    • 返回预检结果
  • 10.3 为新增接口添加中文注释
  • 10.4 验证接口:运行 lsp_diagnostics 检查类型错误

11. PaymentCallback 修改(充值订单回调)

  • 11.1 修改 internal/handler/callback/payment.goWechatPayCallback 方法增加充值订单判断
    • 根据订单号前缀判断类型RCH 开头 → 充值订单)
    • 如果是充值订单,调用 RechargeService.HandlePaymentCallback
    • 如果是套餐订单,调用 OrderService.HandlePaymentCallback
  • 11.2 修改 AlipayCallback 方法:增加充值订单判断(同上)
  • 11.3 验证修改:运行 lsp_diagnostics 检查类型错误

12. Bootstrap 依赖注入

  • 12.1 修改 internal/bootstrap/stores.go注册 RechargeStore
  • 12.2 修改 internal/bootstrap/services.go注册 RechargeService
  • 12.3 修改 internal/bootstrap/handlers.go注册 RechargeHandlerH5
  • 12.4 验证依赖注入:确保所有依赖正确传递

13. 路由注册

  • 13.1 修改 internal/router/h5.go注册充值相关路由
    • POST /api/h5/wallets/recharge
    • GET /api/h5/wallets/recharge-check
    • GET /api/h5/wallets/recharges
    • GET /api/h5/wallets/recharges/:id
  • 13.2 修改 internal/router/admin.go注册代购预检路由
    • POST /api/admin/orders/purchase-check
  • 13.3 验证路由:确保所有路由正确绑定到 Handler 方法

14. API 文档生成器更新

  • 14.1 修改 cmd/api/docs.go在 Handlers 初始化中添加 RechargeHandler
  • 14.2 修改 cmd/gendocs/main.go在 Handlers 初始化中添加 RechargeHandler
  • 14.3 运行文档生成命令go run cmd/gendocs/main.go
  • 14.4 验证生成的 OpenAPI 文档:检查充值和代购相关接口是否出现

15. 集成测试

  • 15.1 编写充值完整流程集成测试
    • 创建充值订单(无强充)
    • 创建充值订单(首次强充验证)
    • 创建充值订单(累计强充验证)
    • 模拟支付回调
    • 验证钱包余额增加
    • 验证累计充值更新
    • 验证一次性佣金触发
  • 15.2 编写代购订单完整流程集成测试
    • 平台创建代购订单
    • 验证订单自动完成
    • 验证套餐激活
    • 验证差价佣金计算
    • 验证一次性佣金不触发
    • 验证累计充值不更新
  • 15.3 编写强充预检集成测试
    • 充值预检(各种强充场景)
    • 套餐购买预检(各种强充场景)
  • 15.4 验证测试:运行所有集成测试并确保通过

16. 功能手动验证(开发环境)

  • 16.1 验证充值预检接口:调用接口确认返回正确的强充要求
  • 16.2 验证购买预检接口:调用接口确认实际支付金额计算正确
  • 16.3 验证充值订单创建:创建订单并确认数据库记录正确
  • 16.4 验证代购订单创建:创建代购订单并确认套餐自动激活

17. 数据库验证(使用 PostgreSQL MCP

  • 17.1 验证 tb_order 表字段:检查 is_purchase_on_behalf 字段及默认值
  • 17.2 验证 tb_shop_series_allocation 表字段:检查 enable_force_recharge 和 force_recharge_amount 字段
  • 17.3 验证充值订单创建:执行创建后查询数据库确认记录正确
  • 17.4 验证代购订单创建:执行创建后查询订单表和套餐使用表
  • 17.5 验证累计充值更新:执行充值/购买后查询卡/设备的 accumulated_recharge 字段
  • 17.6 验证佣金计算:执行订单后查询佣金记录表,确认代购订单不触发一次性佣金

18. 文档更新

  • 18.1 在 docs/ 目录创建功能总结文档(中文,简要说明业务规则和 API 接口)
  • 18.2 更新 README.md添加强充系统和代购订单功能说明可选

19. 代码规范检查

  • 19.1 运行 lsp_diagnostics 检查所有修改的文件
  • 19.2 运行代码规范检查脚本(如有)
  • 19.3 确保所有注释使用中文
  • 19.4 确保所有常量定义在 pkg/constants/
  • 19.5 确保所有错误码定义在 pkg/errors/

20. 开发完成验证

  • 20.1 执行数据库迁移(开发环境)
  • 20.2 运行完整测试套件并确保全部通过
  • 20.3 本地启动服务验证功能可用性