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

1716 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 强充系统和代购订单功能 - 并行执行计划
## TL;DR
> **Quick Summary**: 实现钱包充值系统、强充预检、代购订单和佣金计算修复功能。通过6个并行执行波次将96个任务从8-10小时压缩到4-5小时完成。
>
> **Deliverables**:
> - RechargeStore/Service/Handler 完整实现
> - 强充预检接口 (充值预检 + 购买预检)
> - 代购订单功能 (CreatePurchaseOnBehalf)
> - 佣金计算修复 (代购订单跳过一次性佣金和累计充值)
> - 数据库迁移 (Order.is_purchase_on_behalf, ShopSeriesAllocation 强充配置)
>
> **Estimated Effort**: Large (96 tasks, 4-5 hours with parallelization)
> **Parallel Execution**: YES - 6 waves
> **Critical Path**: Wave1 → Wave2 → Wave3(RechargeService) → Wave4(RechargeHandler) → Wave5 → Wave6
---
## Context
### Original Request
实施 OpenSpec change: **add-force-recharge-system**包含96个任务涉及
1. 钱包充值系统:个人客户直接充值钱包
2. 强充预检机制:提供预检接口告知用户强充要求
3. 代购订单功能:平台为代理代购套餐(线下支付)
4. 佣金计算修复:代购订单不触发一次性佣金
### 当前系统状态
**已有组件**
- `RechargeRecord` 模型已定义 (`internal/model/wallet.go:79-99`),但完全未使用
- `WalletStore``WalletTransactionStore` 已完整实现
- `OrderService` 已有 Create、HandlePaymentCallback、WalletPay 方法
- `CommissionCalculationService` 已实现差价佣金和一次性佣金
**缺失组件**
- `RechargeStore`:充值订单数据访问层
- `RechargeService`:充值业务逻辑层
- `RechargeHandler`:充值 HTTP 接口
- 强充预检接口
- `Order.is_purchase_on_behalf` 字段
- `ShopSeriesAllocation.enable_force_recharge`/`force_recharge_amount` 字段
### 项目约束
- **技术栈**Fiber + GORM + Viper + Zap + Asynq (禁止外键)
- **架构分层**Handler → Service → Store → Model
- **错误处理**Service 层禁止 `fmt.Errorf`,必须用 `errors.New/Wrap`
- **测试覆盖率**:核心业务逻辑 ≥ 90%
- **性能要求**:预检接口 < 100ms充值创建 < 200ms
---
## Task Dependency Graph
| Task Group | Tasks | Depends On | Reason |
|------------|-------|------------|--------|
| 1.x 数据库迁移 | 1.1-1.4 | None | 基础设施,首先执行 |
| 2.x 常量定义 | 2.1-2.5 | None | 纯代码添加 |
| 3.x 错误码定义 | 3.1-3.3 | None | 纯代码添加 |
| 4.x Model 修改 | 4.1-4.4 | None | 模型字段添加 |
| 5.x RechargeStore | 5.1-5.9 | 1.x, 2.x, 3.x, 4.x | 需要 Model、常量、错误码 |
| 6.x RechargeService | 6.1-6.11 | 5.x | 需要 RechargeStore |
| 7.x OrderService 修改 | 7.1-7.6 | 4.x, 5.x | 需要 Model 修改和 Store |
| 8.x CommissionCalculation | 8.1-8.5 | 4.x | 需要 Order.IsPurchaseOnBehalf |
| 9.x RechargeHandler | 9.1-9.7 | 6.x | 需要 RechargeService |
| 10.x OrderHandler 修改 | 10.1-10.4 | 7.x | 需要 OrderService 修改 |
| 11.x PaymentCallback | 11.1-11.3 | 6.x | 需要 RechargeService |
| 12.x Bootstrap | 12.1-12.4 | 5.x, 6.x, 9.x | 需要 Store/Service/Handler |
| 13.x 路由注册 | 13.1-13.3 | 12.x | 需要 Bootstrap 完成 |
| 14.x API 文档 | 14.1-14.4 | 12.x, 13.x | 需要 Handler 注册 |
| 15.x 集成测试 | 15.1-15.4 | 14.x | 需要完整集成 |
| 16.x 手动验证 | 16.1-16.4 | 15.x | 需要测试通过 |
| 17.x 数据库验证 | 17.1-17.6 | 15.x | 需要完整流程 |
| 18.x 文档更新 | 18.1-18.2 | 15.x | 功能完成后编写 |
| 19.x 代码规范 | 19.1-19.5 | 15.x | 所有代码完成后检查 |
| 20.x 完成验证 | 20.1-20.3 | 19.x | 最终验证 |
---
## Parallel Execution Graph
```
Wave 1 (Start immediately - 4 parallel groups):
├── Group A: 1.1-1.4 数据库迁移 (no dependencies)
├── Group B: 2.1-2.5 常量定义 (no dependencies)
├── Group C: 3.1-3.3 错误码定义 (no dependencies)
└── Group D: 4.1-4.4 Model 修改 (no dependencies)
Wave 2 (After Wave 1):
└── Group E: 5.1-5.9 RechargeStore (depends: 1.x, 2.x, 3.x, 4.x)
Wave 3 (After Wave 2 - 3 parallel groups):
├── Group F: 6.1-6.11 RechargeService (depends: 5.x)
├── Group G: 7.1-7.6 OrderService 修改 (depends: 4.x, 5.x)
└── Group H: 8.1-8.5 CommissionCalculation (depends: 4.x)
Wave 4 (After Wave 3 - 3 parallel groups):
├── Group I: 9.1-9.7 RechargeHandler (depends: 6.x)
├── Group J: 10.1-10.4 OrderHandler 修改 (depends: 7.x)
└── Group K: 11.1-11.3 PaymentCallback (depends: 6.x)
Wave 5 (After Wave 4 - sequential):
└── 12.x Bootstrap → 13.x 路由注册 → 14.x API 文档
Wave 6 (After Wave 5 - mixed):
├── 15.x 集成测试 (first, must complete before others)
├── 并行执行组 A (after 15.x):
│ ├── 16.x 功能手动验证
│ └── 17.x 数据库验证
├── 并行执行组 B (after 15.x, can run parallel with A):
│ ├── 18.x 文档更新
│ └── 19.x 代码规范检查
└── 20.x 完成验证 (last, after A and B)
Critical Path: 1.x → 5.x → 6.x → 9.x → 12.x → 13.x → 14.x → 15.x → 20.x
Estimated Parallel Speedup: ~50% (8-10h → 4-5h)
```
---
## Execution Strategy
### Agent Dispatch Summary
| Wave | Tasks | Parallel Agents | Estimated Time |
|------|-------|-----------------|----------------|
| 1 | 1.x, 2.x, 3.x, 4.x | 4 agents | 30 min |
| 2 | 5.x | 1 agent | 45 min |
| 3 | 6.x, 7.x, 8.x | 3 agents | 2 hours |
| 4 | 9.x, 10.x, 11.x | 3 agents | 1 hour |
| 5 | 12.x, 13.x, 14.x | 1 agent (sequential) | 30 min |
| 6 | 15.x-20.x | 2-3 agents | 2 hours |
| **Total** | 96 tasks | Max 4 concurrent | **~4-5 hours** |
---
## TODOs
### Wave 1: 基础设施 (无依赖,可并行)
#### Group A: 数据库迁移 (1.1-1.4)
- [ ] 1.1. 创建迁移文件tb_order 表新增 is_purchase_on_behalf 字段
**What to do**:
- 在 migrations/ 目录创建迁移文件 `XXXXXX_add_order_is_purchase_on_behalf.up.sql`
- SQL: `ALTER TABLE tb_order ADD COLUMN is_purchase_on_behalf BOOLEAN DEFAULT false;`
- 创建对应的 down 迁移文件
**Must NOT do**:
- 不要修改现有字段
- 不要添加外键约束
**Recommended Agent Profile**:
- **Category**: `quick`
- Reason: 简单 SQL DDL 语句
- **Skills**: [`db-migration`]
- `db-migration`: 迁移文件命名规范和执行流程
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1 (with 2.x, 3.x, 4.x)
- **Blocks**: 5.x, 7.x
- **Blocked By**: None
**References**:
- `migrations/` - 现有迁移文件格式参考
- `internal/model/order.go` - Order 模型定义
**Acceptance Criteria**:
- [ ] 迁移文件创建成功
- [ ] `source .env.local && migrate -path migrations -database "$JUNHONG_DATABASE_URL" up` 执行成功
- [ ] `SELECT column_name FROM information_schema.columns WHERE table_name='tb_order' AND column_name='is_purchase_on_behalf'` 返回 1 行
**Commit**: YES
- Message: `feat(order): 添加代购订单标识字段迁移`
- Files: `migrations/XXXXXX_add_order_is_purchase_on_behalf.up.sql`, `migrations/XXXXXX_add_order_is_purchase_on_behalf.down.sql`
---
- [ ] 1.2. 创建迁移文件tb_shop_series_allocation 表新增强充配置字段
**What to do**:
- 创建迁移文件添加 `enable_force_recharge BOOLEAN DEFAULT false`
- 创建迁移文件添加 `force_recharge_amount BIGINT DEFAULT 0`
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`db-migration`]
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1
- **Blocks**: 5.x
- **Blocked By**: None
**References**:
- `internal/model/shop_series_allocation.go` - 现有模型字段
**Acceptance Criteria**:
- [ ] 迁移文件创建成功
- [ ] 迁移执行成功,字段存在
**Commit**: YES (groups with 1.1)
---
- [ ] 1.3. 在测试环境执行迁移并验证字段添加成功
**What to do**:
- 执行迁移命令
- 验证字段存在
**Acceptance Criteria**:
- [ ] `migrate up` 无错误
- [ ] 两个新字段都存在于数据库
**Commit**: NO (grouped with 1.1)
---
- [ ] 1.4. 验证迁移:检查字段默认值和数据类型是否正确
**What to do**:
- 查询 information_schema 验证字段类型
- 验证默认值正确
**Acceptance Criteria**:
- [ ] `is_purchase_on_behalf` 类型为 boolean默认 false
- [ ] `enable_force_recharge` 类型为 boolean默认 false
- [ ] `force_recharge_amount` 类型为 bigint默认 0
**Commit**: NO
---
#### Group B: 常量定义 (2.1-2.5)
- [ ] 2.1. 在 pkg/constants/ 定义充值订单状态常量
**What to do**:
-`pkg/constants/recharge.go` 创建新文件
- 定义: RechargeStatusPending(1), RechargeStatusPaid(2), RechargeStatusCompleted(3), RechargeStatusClosed(4)
- 添加中文注释
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1
- **Blocks**: 5.x, 6.x
- **Blocked By**: None
**References**:
- `pkg/constants/constants.go` - 现有常量格式
- `internal/model/wallet.go:91` - RechargeRecord.Status 字段注释
**Acceptance Criteria**:
- [ ] 常量文件创建成功
- [ ] `go build ./...` 无错误
**Commit**: YES
- Message: `feat(constants): 添加充值订单状态和配置常量`
---
- [ ] 2.2. 定义充值订单号前缀常量RCH
**What to do**:
- 添加 `RechargeOrderPrefix = "RCH"` 常量
**Acceptance Criteria**:
- [ ] 常量定义成功
**Commit**: YES (groups with 2.1)
---
- [ ] 2.3. 定义线下支付方式常量offline
**What to do**:
- 添加 `PaymentMethodOffline = "offline"` 到支付方式常量
**References**:
- `internal/model/order.go:62-66` - 现有支付方式常量
**Acceptance Criteria**:
- [ ] 常量添加成功
**Commit**: YES (groups with 2.1)
---
- [ ] 2.4. 定义强充相关 Redis Key 生成函数(可选)
**What to do**:
- 如果需要缓存系列配置,添加 Redis Key 函数
- 函数格式: `RedisForceRechargeConfigKey(seriesID uint) string`
**References**:
- `pkg/constants/redis.go` - 现有 Redis Key 函数
**Acceptance Criteria**:
- [ ] 如需缓存,函数创建成功;否则跳过
**Commit**: YES (groups with 2.1)
---
- [ ] 2.5. 定义充值金额限制常量最小1元最大100000元
**What to do**:
- 添加 `RechargeMinAmount = 100` (分)
- 添加 `RechargeMaxAmount = 10000000` (分)
**Acceptance Criteria**:
- [ ] 常量定义成功
**Commit**: YES (groups with 2.1)
---
#### Group C: 错误码定义 (3.1-3.3)
- [ ] 3.1. 定义充值相关错误码
**What to do**:
-`pkg/errors/codes.go` 添加:
- `CodeRechargeAmountInvalid = 4401` // 充值金额不符合要求
- `CodeRechargeNotFound = 4402` // 充值订单不存在
- `CodeRechargeAlreadyPaid = 4403` // 充值订单已支付
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1
- **Blocks**: 5.x, 6.x
- **Blocked By**: None
**References**:
- `pkg/errors/codes.go` - 现有错误码格式和编号范围
**Acceptance Criteria**:
- [ ] 错误码添加成功
- [ ] 错误码编号不与现有冲突
**Commit**: YES
- Message: `feat(errors): 添加充值和代购相关错误码`
---
- [ ] 3.2. 定义代购相关错误码
**What to do**:
- `CodePurchaseOnBehalfForbidden = 4404` // 无权使用线下支付
- `CodePurchaseOnBehalfInvalidTarget = 4405` // 代购目标无效
**Acceptance Criteria**:
- [ ] 错误码添加成功
**Commit**: YES (groups with 3.1)
---
- [ ] 3.3. 定义强充验证错误码
**What to do**:
- `CodeForceRechargeRequired = 4406` // 必须充值指定金额
- `CodeForceRechargeAmountMismatch = 4407` // 强充金额不匹配
**Acceptance Criteria**:
- [ ] 错误码添加成功
**Commit**: YES (groups with 3.1)
---
#### Group D: Model 层修改 (4.1-4.4)
- [ ] 4.1. 修改 Order 模型:新增 IsPurchaseOnBehalf 字段
**What to do**:
-`internal/model/order.go` Order struct 添加:
```go
IsPurchaseOnBehalf bool `gorm:"column:is_purchase_on_behalf;type:boolean;default:false;comment:是否为代购订单" json:"is_purchase_on_behalf"`
```
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`model-standards`]
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 1
- **Blocks**: 5.x, 7.x, 8.x
- **Blocked By**: None
**References**:
- `internal/model/order.go` - Order 模型
- `openspec/changes/add-force-recharge-system/design.md:97-98` - 字段设计
**Acceptance Criteria**:
- [ ] 字段添加成功
- [ ] `go build ./...` 无错误
- [ ] GORM tag 包含 column, type, default, comment
**Commit**: YES
- Message: `feat(model): Order 新增代购订单标识字段`
---
- [ ] 4.2. 修改 ShopSeriesAllocation新增 EnableForceRecharge 字段
**What to do**:
- 在 `internal/model/shop_series_allocation.go` 添加:
```go
EnableForceRecharge bool `gorm:"column:enable_force_recharge;type:boolean;default:false;comment:是否启用强充(累计充值时可选)" json:"enable_force_recharge"`
```
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`model-standards`]
**References**:
- `internal/model/shop_series_allocation.go` - 现有模型
**Acceptance Criteria**:
- [ ] 字段添加成功
- [ ] `go build ./...` 无错误
**Commit**: YES
- Message: `feat(model): ShopSeriesAllocation 新增强充配置字段`
---
- [ ] 4.3. 修改 ShopSeriesAllocation新增 ForceRechargeAmount 字段
**What to do**:
- 添加:
```go
ForceRechargeAmount int64 `gorm:"column:force_recharge_amount;type:bigint;default:0;comment:强充金额(分,0表示使用阈值金额)" json:"force_recharge_amount"`
```
**Acceptance Criteria**:
- [ ] 字段添加成功
**Commit**: YES (groups with 4.2)
---
- [ ] 4.4. 验证 Model 修改:运行 lsp_diagnostics 检查类型错误
**What to do**:
- 运行 `go build ./...` 验证编译
- 检查 LSP 诊断无错误
**Acceptance Criteria**:
- [ ] 编译成功
- [ ] 无类型错误
**Commit**: NO
---
### Wave 2: 数据访问层 (依赖 Wave 1)
#### Group E: RechargeStore (5.1-5.9)
- [ ] 5.1. 创建 internal/store/postgres/recharge_store.go
**What to do**:
- 创建 `RechargeStore` struct
- 包含 `*gorm.DB` 和 `*redis.Client` 字段
- 实现 `NewRechargeStore` 构造函数
**Recommended Agent Profile**:
- **Category**: `unspecified-low`
- Reason: 标准 Store 层实现,遵循现有模式
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: NO (Wave 2 单独执行)
- **Parallel Group**: Wave 2
- **Blocks**: 6.x, 12.x
- **Blocked By**: 1.x, 2.x, 3.x, 4.x (Wave 1)
**References**:
- `internal/store/postgres/order_store.go` - Store 模式参考
- `internal/store/postgres/wallet_store.go` - 钱包相关 Store 参考
**Acceptance Criteria**:
- [ ] 文件创建成功
- [ ] 结构体定义正确
- [ ] 编译成功
**Commit**: YES
- Message: `feat(store): 新增 RechargeStore 充值订单数据访问层`
---
- [ ] 5.2. 实现 Create 方法:创建充值订单
**What to do**:
- 方法签名: `Create(ctx context.Context, record *model.RechargeRecord) error`
- 使用 GORM Create
**References**:
- `internal/store/postgres/order_store.go:Create` - Create 方法参考
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 自动填充 created_at, updated_at
**Commit**: YES (groups with 5.1)
---
- [ ] 5.3. 实现 GetByRechargeNo 方法
**What to do**:
- 方法签名: `GetByRechargeNo(ctx context.Context, rechargeNo string) (*model.RechargeRecord, error)`
- 根据充值单号查询,不存在返回 nil 和 nil
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 不存在时返回 nil, nil非 error
**Commit**: YES (groups with 5.1)
---
- [ ] 5.4. 实现 GetByID 方法
**What to do**:
- 方法签名: `GetByID(ctx context.Context, id uint) (*model.RechargeRecord, error)`
**Acceptance Criteria**:
- [ ] 方法实现成功
**Commit**: YES (groups with 5.1)
---
- [ ] 5.5. 实现 List 方法
**What to do**:
- 方法签名: `List(ctx context.Context, params *ListRechargeParams) ([]*model.RechargeRecord, int64, error)`
- 支持分页、状态筛选、时间范围筛选
- 定义 `ListRechargeParams` struct
**References**:
- `internal/store/postgres/order_store.go:List` - List 方法参考
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 支持分页和筛选
**Commit**: YES (groups with 5.1)
---
- [ ] 5.6. 实现 UpdateStatus 方法
**What to do**:
- 方法签名: `UpdateStatus(ctx context.Context, id uint, status int) error`
- 支持乐观锁检查(原状态 → 新状态)
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 支持状态流转检查
**Commit**: YES (groups with 5.1)
---
- [ ] 5.7. 实现 UpdatePaymentInfo 方法
**What to do**:
- 方法签名: `UpdatePaymentInfo(ctx context.Context, id uint, method string, transactionID string) error`
- 更新支付方式、支付时间、第三方交易号
**Acceptance Criteria**:
- [ ] 方法实现成功
**Commit**: YES (groups with 5.1)
---
- [ ] 5.8. 编写单元测试
**What to do**:
- 创建 `internal/store/postgres/recharge_store_test.go`
- 使用 testutils.NewTestTransaction
- 测试覆盖率 ≥ 90%
**References**:
- `internal/store/postgres/order_store_test.go` - 测试模式参考
- `docs/testing/test-connection-guide.md` - 测试连接管理
**Acceptance Criteria**:
- [ ] 测试文件创建
- [ ] `source .env.local && go test -v ./internal/store/postgres/... -run TestRecharge` 通过
- [ ] 覆盖率 ≥ 90%
**Commit**: YES (groups with 5.1)
---
- [ ] 5.9. 验证测试
**What to do**:
- 运行所有 RechargeStore 测试
- 确保全部通过
**Acceptance Criteria**:
- [ ] 所有测试通过
**Commit**: NO
---
### Wave 3: 业务逻辑层 (依赖 Wave 23 个并行组)
#### Group F: RechargeService (6.1-6.11)
- [ ] 6.1. 创建 internal/service/recharge/service.go
**What to do**:
- 创建 Service struct
- 依赖: DB, RechargeStore, WalletStore, IotCardStore, DeviceStore, ShopSeriesAllocationStore
- 实现 New 构造函数
**Recommended Agent Profile**:
- **Category**: `unspecified-high`
- Reason: 复杂业务逻辑,涉及多个模块交互
- **Skills**: [`db-validation`]
- `db-validation`: 涉及复杂数据库操作和业务逻辑验证
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 3 (with 7.x, 8.x)
- **Blocks**: 9.x, 11.x, 12.x
- **Blocked By**: 5.x (Wave 2)
**References**:
- `internal/service/order/service.go` - Service 模式参考
- `internal/bootstrap/services.go` - 依赖注入模式
**Acceptance Criteria**:
- [ ] 文件创建成功
- [ ] 依赖定义正确
- [ ] 编译成功
**Commit**: YES
- Message: `feat(service): 新增 RechargeService 充值业务逻辑层`
---
- [ ] 6.2. 实现 Create 方法:创建充值订单
**What to do**:
- 验证资源存在(卡/设备)
- 验证充值金额范围1元~100000元
- 检查强充要求并验证金额
- 生成充值单号RCH + 时间戳 + 随机数)
- 创建充值订单记录
**References**:
- `openspec/changes/add-force-recharge-system/design.md:171-206` - 强充验证逻辑
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 支持强充验证
- [ ] 生成正确的订单号格式
**Commit**: YES (groups with 6.1)
---
- [ ] 6.3. 实现 GetRechargeCheck 方法:充值预检
**What to do**:
- 查询资源(卡/设备)
- 查询系列分配配置
- 判断是否需要强充
- 返回: NeedForceRecharge, ForceRechargeAmount, TriggerType, MinAmount, MaxAmount, CurrentAccumulated, Threshold, Message
**References**:
- `openspec/changes/add-force-recharge-system/design.md:137-149` - 响应结构
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 返回完整的预检信息
**Commit**: YES (groups with 6.1)
---
- [ ] 6.4. 实现 GetByID 方法
**What to do**:
- 查询充值订单详情
- 应用数据权限过滤
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 数据权限正确过滤
**Commit**: YES (groups with 6.1)
---
- [ ] 6.5. 实现 List 方法
**What to do**:
- 查询充值订单列表
- 支持分页、筛选
- 应用数据权限过滤
**Acceptance Criteria**:
- [ ] 方法实现成功
**Commit**: YES (groups with 6.1)
---
- [ ] 6.6. 实现 HandlePaymentCallback 方法
**What to do**:
- 幂等性检查(检查订单状态)
- 使用数据库事务:
1. 更新订单状态
2. 增加钱包余额
3. 更新累计充值
4. 触发佣金判断
- 钱包余额更新使用乐观锁
**References**:
- `openspec/changes/add-force-recharge-system/design.md:360-378` - 回调处理流程
- `internal/service/order/service.go:HandlePaymentCallback` - 参考实现
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 幂等性保证
- [ ] 事务正确
**Commit**: YES (groups with 6.1)
---
- [ ] 6.7. 实现 updateAccumulatedRecharge 私有方法
**What to do**:
- 根据资源类型(卡/设备)更新对应的 accumulated_recharge 字段
- 使用原子操作 `gorm.Expr("accumulated_recharge + ?", amount)`
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 使用原子更新
**Commit**: YES (groups with 6.1)
---
- [ ] 6.8. 实现 triggerOneTimeCommissionIfNeeded 私有方法
**What to do**:
- 检查是否达到一次性佣金触发条件
- 如果达到,调用佣金计算服务
**References**:
- `internal/service/commission_calculation/service.go:TriggerOneTimeCommissionForCard` - 参考
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 正确触发佣金计算
**Commit**: YES (groups with 6.1)
---
- [ ] 6.9. 实现 checkForceRechargeRequirement 私有方法
**What to do**:
- 供创建订单时使用的强充验证
- 返回强充要求或 nil
**Acceptance Criteria**:
- [ ] 方法实现成功
**Commit**: YES (groups with 6.1)
---
- [ ] 6.10. 编写单元测试
**What to do**:
- 创建 `internal/service/recharge/service_test.go`
- 测试覆盖各种充值场景、强充验证、支付回调幂等性
- 测试覆盖率 ≥ 90%
**Acceptance Criteria**:
- [ ] 测试文件创建
- [ ] 测试通过
- [ ] 覆盖率 ≥ 90%
**Commit**: YES (groups with 6.1)
---
- [ ] 6.11. 验证测试
**What to do**:
- 运行所有 RechargeService 测试
**Acceptance Criteria**:
- [ ] 所有测试通过
**Commit**: NO
---
#### Group G: OrderService 修改 (7.1-7.6)
- [ ] 7.1. 修改 Create 方法增加强充验证
**What to do**:
- 在创建订单前调用预检逻辑
- 验证支付金额是否符合强充要求
- 不符合则返回错误
**Recommended Agent Profile**:
- **Category**: `unspecified-high`
- **Skills**: [`db-validation`]
- `db-validation`: 涉及复杂订单逻辑和数据库事务操作
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 3 (with 6.x, 8.x)
- **Blocks**: 10.x
- **Blocked By**: 4.x, 5.x
**References**:
- `internal/service/order/service.go` - 现有 OrderService
- `openspec/changes/add-force-recharge-system/design.md:286-309` - 代购订单逻辑
**Acceptance Criteria**:
- [ ] 强充验证逻辑添加成功
- [ ] 不符合要求时返回正确错误
**Commit**: YES
- Message: `feat(order): 订单创建增加强充验证和代购支持`
---
- [ ] 7.2. 新增 CreatePurchaseOnBehalf 方法
**What to do**:
- 验证权限(只有平台可以使用线下支付)
- 查询资源归属代理buyer_id
- 查询买家的成本价
- 创建订单is_purchase_on_behalf = true, payment_method = offline, payment_status = 2
- 自动激活套餐
- 触发佣金计算任务
**References**:
- `openspec/changes/add-force-recharge-system/design.md:265-284` - 代购流程
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 订单自动标记为已支付
- [ ] 套餐自动激活
**Commit**: YES (groups with 7.1)
---
- [ ] 7.3. 新增 GetPurchaseCheck 方法
**What to do**:
- 查询套餐总价
- 检查强充要求
- 计算实际支付金额和钱包到账金额
- 返回预检信息
**References**:
- `openspec/changes/add-force-recharge-system/design.md:151-167` - 预检响应结构
**Acceptance Criteria**:
- [ ] 方法实现成功
- [ ] 返回完整预检信息
**Commit**: YES (groups with 7.1)
---
- [ ] 7.4. 修改支付成功后的处理逻辑
**What to do**:
- 增加 is_purchase_on_behalf 判断
- 如果是代购订单,跳过钱包扣款
- 如果是普通订单,正常扣款
**Acceptance Criteria**:
- [ ] 逻辑修改成功
- [ ] 代购订单不扣款
**Commit**: YES (groups with 7.1)
---
- [ ] 7.5. 编写单元测试
**What to do**:
- 测试代购订单创建
- 测试强充验证
- 测试预检逻辑
**Acceptance Criteria**:
- [ ] 测试通过
**Commit**: YES (groups with 7.1)
---
- [ ] 7.6. 验证测试
**What to do**:
- 运行所有 OrderService 测试
**Acceptance Criteria**:
- [ ] 所有测试通过
**Commit**: NO
---
#### Group H: CommissionCalculationService 修改 (8.1-8.5)
- [ ] 8.1. 修改 CalculateCommission 方法增加代购订单判断
**What to do**:
- 差价佣金:所有订单都计算(包括代购)
- 累计充值更新:仅非代购订单更新
- 一次性佣金:仅非代购订单触发
**Recommended Agent Profile**:
- **Category**: `unspecified-low`
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 3 (with 6.x, 7.x)
- **Blocks**: 15.x
- **Blocked By**: 4.x
**References**:
- `internal/service/commission_calculation/service.go` - 现有实现
- `openspec/changes/add-force-recharge-system/design.md:322-358` - 佣金修复逻辑
**Acceptance Criteria**:
- [ ] 逻辑修改成功
- [ ] 代购订单不更新累计充值
- [ ] 代购订单不触发一次性佣金
**Commit**: YES
- Message: `fix(commission): 代购订单跳过一次性佣金和累计充值更新`
---
- [ ] 8.2. 修改 updateAccumulatedRecharge 方法
**What to do**:
- 增加代购订单检查
- 如果 is_purchase_on_behalf = true直接返回
**Acceptance Criteria**:
- [ ] 逻辑修改成功
**Commit**: YES (groups with 8.1)
---
- [ ] 8.3. 修改 triggerOneTimeCommission 方法
**What to do**:
- 增加代购订单检查
- 如果 is_purchase_on_behalf = true直接返回
**Acceptance Criteria**:
- [ ] 逻辑修改成功
**Commit**: YES (groups with 8.1)
---
- [ ] 8.4. 编写单元测试
**What to do**:
- 使用 table-driven tests
- 测试场景:普通订单、代购订单、充值订单
**References**:
- `openspec/changes/add-force-recharge-system/design.md:531-549` - 测试场景
**Acceptance Criteria**:
- [ ] 测试通过
- [ ] 覆盖所有场景
**Commit**: YES (groups with 8.1)
---
- [ ] 8.5. 验证测试
**Acceptance Criteria**:
- [ ] 所有测试通过
**Commit**: NO
---
### Wave 4: HTTP 接口层 (依赖 Wave 33 个并行组)
#### Group I: RechargeHandler (9.1-9.7)
- [ ] 9.1. 创建 internal/handler/h5/recharge.go
**What to do**:
- 创建 RechargeHandler struct
- 依赖 RechargeService
- 实现 NewRechargeHandler 构造函数
**Recommended Agent Profile**:
- **Category**: `unspecified-low`
- **Skills**: [`api-routing`, `dto-standards`]
- `api-routing`: 路由注册规范
- `dto-standards`: DTO 数据传输对象规范
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 4 (with 10.x, 11.x)
- **Blocks**: 12.x, 13.x
- **Blocked By**: 6.x
**References**:
- `internal/handler/h5/order.go` - H5 Handler 参考
- `internal/handler/admin/order.go` - Handler 模式参考
**Acceptance Criteria**:
- [ ] 文件创建成功
- [ ] 编译成功
**Commit**: YES
- Message: `feat(handler): 新增 RechargeHandler 充值 HTTP 接口`
---
- [ ] 9.2. 实现 POST /api/h5/wallets/recharge创建充值订单
**What to do**:
- 参数验证resource_type, resource_id, amount
- 调用 Service 创建充值订单
- 返回充值订单信息
**References**:
- 创建对应 DTO: `internal/model/dto/recharge_dto.go`
**Acceptance Criteria**:
- [ ] 接口实现成功
- [ ] DTO 创建成功
- [ ] 参数验证正确
**Commit**: YES (groups with 9.1)
---
- [ ] 9.3. 实现 GET /api/h5/wallets/recharge-check充值预检
**What to do**:
- 参数验证resource_type, resource_id
- 调用 Service 获取强充要求
- 返回预检信息
**Acceptance Criteria**:
- [ ] 接口实现成功
**Commit**: YES (groups with 9.1)
---
- [ ] 9.4. 实现 GET /api/h5/wallets/recharges查询列表
**What to do**:
- 支持分页参数page, page_size
- 支持状态筛选status
- 支持时间范围筛选
**Acceptance Criteria**:
- [ ] 接口实现成功
- [ ] 支持所有筛选参数
**Commit**: YES (groups with 9.1)
---
- [ ] 9.5. 实现 GET /api/h5/wallets/recharges/:id查询详情
**Acceptance Criteria**:
- [ ] 接口实现成功
**Commit**: YES (groups with 9.1)
---
- [ ] 9.6. 为所有接口添加中文注释
**What to do**:
- 路由路径注释
- 参数说明注释
- 响应说明注释
**Acceptance Criteria**:
- [ ] 所有接口有完整中文注释
**Commit**: YES (groups with 9.1)
---
- [ ] 9.7. 验证接口
**What to do**:
- 运行 `go build ./...`
- 检查 LSP 诊断
**Acceptance Criteria**:
- [ ] 编译成功
- [ ] 无类型错误
**Commit**: NO
---
#### Group J: OrderHandler 修改 (10.1-10.4)
- [ ] 10.1. 修改 Create 方法增加代购订单支持
**What to do**:
- 检查 payment_method = offline 时,验证用户类型为 Platform
- 如果是平台账号且线下支付,调用 CreatePurchaseOnBehalf
- 否则调用正常的 Create 方法
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`api-routing`]
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 4
- **Blocks**: 12.x
- **Blocked By**: 7.x
**References**:
- `internal/handler/admin/order.go` - 现有 Handler
- `openspec/changes/add-force-recharge-system/design.md:286-309` - 权限控制
**Acceptance Criteria**:
- [ ] 逻辑修改成功
- [ ] 权限验证正确
**Commit**: YES
- Message: `feat(handler): OrderHandler 支持代购订单创建`
---
- [ ] 10.2. 新增 POST /api/admin/orders/purchase-check 接口
**What to do**:
- 参数验证order_type, resource_id, package_ids
- 调用 Service 获取预检信息
**Acceptance Criteria**:
- [ ] 接口实现成功
**Commit**: YES (groups with 10.1)
---
- [ ] 10.3. 为新增接口添加中文注释
**Acceptance Criteria**:
- [ ] 注释添加完整
**Commit**: YES (groups with 10.1)
---
- [ ] 10.4. 验证接口
**Acceptance Criteria**:
- [ ] 编译成功
- [ ] 无错误
**Commit**: NO
---
#### Group K: PaymentCallback 修改 (11.1-11.3)
- [ ] 11.1. 修改 WechatPayCallback 增加充值订单判断
**What to do**:
- 根据订单号前缀判断类型RCH 开头 → 充值订单)
- 如果是充值订单,调用 RechargeService.HandlePaymentCallback
- 如果是套餐订单,调用 OrderService.HandlePaymentCallback
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: YES
- **Parallel Group**: Wave 4
- **Blocks**: 12.x
- **Blocked By**: 6.x
**References**:
- `internal/handler/callback/payment.go` - 现有回调 Handler
- `openspec/changes/add-force-recharge-system/design.md:239-253` - 回调路由逻辑
**Acceptance Criteria**:
- [ ] 逻辑修改成功
- [ ] 正确区分充值和套餐订单
**Commit**: YES
- Message: `feat(callback): 支付回调支持充值订单处理`
---
- [ ] 11.2. 修改 AlipayCallback 方法
**What to do**:
- 同 11.1 的逻辑
**Acceptance Criteria**:
- [ ] 逻辑修改成功
**Commit**: YES (groups with 11.1)
---
- [ ] 11.3. 验证修改
**Acceptance Criteria**:
- [ ] 编译成功
**Commit**: NO
---
### Wave 5: 集成层 (顺序执行)
#### Group L: Bootstrap 和路由 (12.x, 13.x, 14.x)
- [ ] 12.1. 修改 internal/bootstrap/stores.go注册 RechargeStore
**What to do**:
- 在 stores struct 添加 `Recharge *postgres.RechargeStore`
- 在 initStores 中初始化
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Can Run In Parallel**: NO (顺序执行)
- **Blocks**: 13.x
- **Blocked By**: 5.x, 6.x, 9.x, 10.x, 11.x (Wave 4)
**References**:
- `internal/bootstrap/stores.go` - 现有 stores 注册
**Acceptance Criteria**:
- [ ] Store 注册成功
**Commit**: YES
- Message: `feat(bootstrap): 注册充值相关 Store/Service/Handler`
---
- [ ] 12.2. 修改 internal/bootstrap/services.go注册 RechargeService
**What to do**:
- 在 services struct 添加 `Recharge *rechargeService.Service`
- 在 initServices 中初始化,传递正确的依赖
**References**:
- `internal/bootstrap/services.go` - 现有 services 注册
**Acceptance Criteria**:
- [ ] Service 注册成功
- [ ] 依赖注入正确
**Commit**: YES (groups with 12.1)
---
- [ ] 12.3. 修改 internal/bootstrap/handlers.go注册 RechargeHandler
**What to do**:
- 在 Handlers struct 添加 `H5Recharge *h5.RechargeHandler`
- 在 initHandlers 中初始化
**References**:
- `internal/bootstrap/handlers.go` - 现有 handlers 注册
**Acceptance Criteria**:
- [ ] Handler 注册成功
**Commit**: YES (groups with 12.1)
---
- [ ] 12.4. 验证依赖注入
**What to do**:
- `go build ./...` 验证编译
**Acceptance Criteria**:
- [ ] 编译成功
- [ ] 无依赖循环
**Commit**: NO
---
- [ ] 13.1. 修改 internal/router/h5.go注册充值相关路由
**What to do**:
- POST /api/h5/wallets/recharge
- GET /api/h5/wallets/recharge-check
- GET /api/h5/wallets/recharges
- GET /api/h5/wallets/recharges/:id
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`api-routing`]
**Parallelization**:
- **Blocks**: 14.x
- **Blocked By**: 12.x
**References**:
- `internal/router/h5.go` - 现有 H5 路由
- `docs/api-documentation-guide.md` - 路由注册规范
**Acceptance Criteria**:
- [ ] 路由注册成功
**Commit**: YES
- Message: `feat(router): 注册充值和代购预检路由`
---
- [ ] 13.2. 修改 internal/router/admin.go注册代购预检路由
**What to do**:
- POST /api/admin/orders/purchase-check
**References**:
- `internal/router/admin.go` - 现有 Admin 路由
**Acceptance Criteria**:
- [ ] 路由注册成功
**Commit**: YES (groups with 13.1)
---
- [ ] 13.3. 验证路由绑定
**What to do**:
- 确保所有路由正确绑定到 Handler 方法
**Acceptance Criteria**:
- [ ] 编译成功
- [ ] 路由绑定正确
**Commit**: NO
---
- [ ] 14.1. 修改 cmd/api/docs.go添加 RechargeHandler
**What to do**:
- 在 Handlers 初始化中添加 `H5Recharge: h5.NewRechargeHandler(nil)`
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Blocks**: 15.x
- **Blocked By**: 13.x
**References**:
- `cmd/api/docs.go` - 文档生成器
- `docs/api-documentation-guide.md` - 新增 Handler 检查清单
**Acceptance Criteria**:
- [ ] Handler 添加成功
**Commit**: YES
- Message: `docs(api): 更新文档生成器支持充值接口`
---
- [ ] 14.2. 修改 cmd/gendocs/main.go添加 RechargeHandler
**What to do**:
- 同 14.1
**Acceptance Criteria**:
- [ ] Handler 添加成功
**Commit**: YES (groups with 14.1)
---
- [ ] 14.3. 运行文档生成命令
**What to do**:
- `go run cmd/gendocs/main.go`
**Acceptance Criteria**:
- [ ] 命令执行成功
- [ ] 生成新的 OpenAPI 文档
**Commit**: YES (groups with 14.1)
---
- [ ] 14.4. 验证生成的 OpenAPI 文档
**What to do**:
- 检查充值和代购相关接口是否出现在文档中
**Acceptance Criteria**:
- [ ] 所有新接口出现在文档中
**Commit**: NO
---
### Wave 6: 测试和验证
#### Group M: 集成测试 (15.1-15.4)
- [ ] 15.1. 编写充值完整流程集成测试
**What to do**:
- 创建充值订单(无强充)
- 创建充值订单(首次强充验证)
- 创建充值订单(累计强充验证)
- 模拟支付回调
- 验证钱包余额增加
- 验证累计充值更新
- 验证一次性佣金触发
**Recommended Agent Profile**:
- **Category**: `unspecified-high`
- **Skills**: [`db-validation`]
**Parallelization**:
- **Can Run In Parallel**: NO (需要顺序验证)
- **Blocks**: 16.x, 17.x, 20.x
- **Blocked By**: 14.x
**References**:
- `tests/integration/` - 现有集成测试
- `docs/testing/test-connection-guide.md` - 测试规范
**Acceptance Criteria**:
- [ ] 测试文件创建
- [ ] 所有测试场景通过
**Commit**: YES
- Message: `test(integration): 添加充值和代购订单集成测试`
---
- [ ] 15.2. 编写代购订单完整流程集成测试
**What to do**:
- 平台创建代购订单
- 验证订单自动完成
- 验证套餐激活
- 验证差价佣金计算
- 验证一次性佣金不触发
- 验证累计充值不更新
**Acceptance Criteria**:
- [ ] 测试通过
**Commit**: YES (groups with 15.1)
---
- [ ] 15.3. 编写强充预检集成测试
**What to do**:
- 充值预检(各种强充场景)
- 套餐购买预检(各种强充场景)
**Acceptance Criteria**:
- [ ] 测试通过
**Commit**: YES (groups with 15.1)
---
- [ ] 15.4. 验证测试
**What to do**:
- 运行所有集成测试
**Acceptance Criteria**:
- [ ] 所有测试通过
**Commit**: NO
---
#### Group N: 验证和文档 (16.x-20.x)
- [ ] 16.1-16.4 功能手动验证
**What to do**:
- 验证充值预检接口
- 验证购买预检接口
- 验证充值订单创建
- 验证代购订单创建
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`db-validation`]
**Acceptance Criteria**:
- [ ] 所有功能验证通过
**Commit**: NO
---
- [ ] 17.1-17.6 数据库验证
**What to do**:
- 使用 PostgreSQL MCP 验证数据库字段
- 验证数据正确性
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: [`db-validation`]
**Acceptance Criteria**:
- [ ] 所有数据验证通过
**Commit**: NO
---
- [ ] 18.1-18.2 文档更新
**What to do**:
- 在 docs/ 创建功能总结文档
- 更新 README.md可选
**Recommended Agent Profile**:
- **Category**: `writing`
- **Skills**: []
**Acceptance Criteria**:
- [ ] 文档创建成功
**Commit**: YES
- Message: `docs: 添加强充系统和代购订单功能文档`
---
- [ ] 19.1-19.5 代码规范检查
**What to do**:
- 运行 lsp_diagnostics 检查所有修改的文件
- 运行代码规范检查脚本
- 确保所有注释使用中文
- 确保所有常量定义在 pkg/constants/
- 确保所有错误码定义在 pkg/errors/
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Acceptance Criteria**:
- [ ] 所有检查通过
**Commit**: NO
---
- [ ] 20.1-20.3 开发完成验证
**What to do**:
- 执行数据库迁移(开发环境)
- 运行完整测试套件
- 本地启动服务验证功能可用性
**Recommended Agent Profile**:
- **Category**: `quick`
- **Skills**: []
**Parallelization**:
- **Blocked By**: 19.x
**Acceptance Criteria**:
- [ ] 迁移成功
- [ ] 所有测试通过
- [ ] 服务正常启动
**Commit**: NO
---
## Commit Strategy
| After Task | Message | Files | Verification |
|------------|---------|-------|--------------|
| 1.1-1.4 | `feat(migration): 添加代购和强充配置字段迁移` | migrations/*.sql | migrate up |
| 2.1-2.5 | `feat(constants): 添加充值订单状态和配置常量` | pkg/constants/recharge.go | go build |
| 3.1-3.3 | `feat(errors): 添加充值和代购相关错误码` | pkg/errors/codes.go | go build |
| 4.1-4.4 | `feat(model): 添加代购和强充配置字段` | internal/model/*.go | go build |
| 5.1-5.9 | `feat(store): 新增 RechargeStore` | internal/store/postgres/recharge_store*.go | go test |
| 6.1-6.11 | `feat(service): 新增 RechargeService` | internal/service/recharge/*.go | go test |
| 7.1-7.6 | `feat(order): 支持代购订单和强充验证` | internal/service/order/*.go | go test |
| 8.1-8.5 | `fix(commission): 代购订单跳过一次性佣金` | internal/service/commission_calculation/*.go | go test |
| 9.1-9.7 | `feat(handler): 新增 RechargeHandler` | internal/handler/h5/recharge.go, internal/model/dto/recharge_dto.go | go build |
| 10.1-10.4 | `feat(handler): OrderHandler 支持代购` | internal/handler/admin/order.go | go build |
| 11.1-11.3 | `feat(callback): 支付回调支持充值订单` | internal/handler/callback/payment.go | go build |
| 12.1-12.4 | `feat(bootstrap): 注册充值相关依赖` | internal/bootstrap/*.go | go build |
| 13.1-13.3 | `feat(router): 注册充值和预检路由` | internal/router/*.go | go build |
| 14.1-14.4 | `docs(api): 更新文档生成器` | cmd/api/docs.go, cmd/gendocs/main.go | go run cmd/gendocs/main.go |
| 15.1-15.4 | `test(integration): 添加集成测试` | tests/integration/*.go | go test |
| 18.1-18.2 | `docs: 添加功能文档` | docs/*.md | - |
---
## Success Criteria
### Verification Commands
```bash
# 1. 编译验证
go build ./...
# 2. 单元测试
source .env.local && go test -v ./internal/store/postgres/... -run TestRecharge
source .env.local && go test -v ./internal/service/recharge/...
source .env.local && go test -v ./internal/service/order/... -run TestPurchaseOnBehalf
source .env.local && go test -v ./internal/service/commission_calculation/... -run TestPurchaseOnBehalf
# 3. 集成测试
source .env.local && go test -v ./tests/integration/... -run TestRecharge
source .env.local && go test -v ./tests/integration/... -run TestPurchaseOnBehalf
# 4. 文档生成
go run cmd/gendocs/main.go
# 5. 服务启动
source .env.local && go run cmd/api/main.go
```
### Final Checklist
- [ ] 所有数据库迁移执行成功
- [ ] 所有单元测试通过(覆盖率 ≥ 90%
- [ ] 所有集成测试通过
- [ ] OpenAPI 文档包含新接口
- [ ] 服务正常启动
- [ ] 充值预检接口返回正确的强充要求
- [ ] 代购订单创建成功且不触发一次性佣金
- [ ] 所有注释使用中文
- [ ] 所有常量在 pkg/constants/
- [ ] 所有错误码在 pkg/errors/
---
## Risk Mitigation
1. **数据库迁移**: 先在测试环境验证,再执行生产
2. **支付回调幂等性**: 使用状态检查和事务保证
3. **强充验证绕过**: 后端强制验证,不依赖前端
4. **佣金计算复杂度**: 使用 table-driven tests 覆盖所有场景
---
**Plan Created**: 2026-01-31
**Estimated Duration**: 4-5 hours (with parallelization)
**Original Estimate**: 8-10 hours (sequential)
**Speedup**: ~50%