# 套餐与佣金模型重构任务列表 > **注意**:当前处于开发阶段,无需数据迁移,直接修改表结构和代码。 ## 1. 数据库迁移 - [x] 1.1 创建迁移文件:Package 表移除 `price`/`data_type`/`data_amount_mb` 字段,新增 `enable_virtual_data` 字段 - [x] 1.2 创建迁移文件:ShopPackageAllocation 表新增 `one_time_commission_amount` 字段 - [x] 1.3 创建迁移文件:IoTCard 表新增 `accumulated_recharge_by_series` 和 `first_recharge_triggered_by_series` 字段(jsonb) - [x] 1.4 创建迁移文件:Device 表新增 `accumulated_recharge_by_series` 和 `first_recharge_triggered_by_series` 字段(jsonb) - [x] 1.5 创建迁移文件:PackageSeries 表新增 `one_time_commission_config` 字段(jsonb) - [x] 1.6 创建迁移文件:ShopSeriesOneTimeCommissionTier 表新增 `stat_scope` 字段 - [x] 1.7 创建迁移文件:ShopSeriesAllocation 表移除一次性佣金配置字段,新增 `one_time_commission_amount` 字段 - [x] 1.8 执行迁移并验证 ## 2. Model 层更新 - [x] 2.1 更新 Package 模型:移除 `Price`/`DataType`/`DataAmountMB` 字段,新增 `EnableVirtualData` 字段 - [x] 2.2 更新 ShopPackageAllocation 模型:新增 `OneTimeCommissionAmount` 字段 - [x] 2.3 更新 IoTCard 模型:新增 `AccumulatedRechargeBySeriesJSON` 和 `FirstRechargeTriggeredBySeriesJSON` 字段 - [x] 2.4 更新 Device 模型:新增 `AccumulatedRechargeBySeriesJSON` 和 `FirstRechargeTriggeredBySeriesJSON` 字段 - [x] 2.5 更新 PackageSeries 模型:新增 `OneTimeCommissionConfigJSON` 字段 - [x] 2.6 创建 OneTimeCommissionConfig 结构体(含 Enable, TriggerType, Threshold, CommissionType, ValidityType 等字段) - [x] 2.7 更新 ShopSeriesOneTimeCommissionTier 模型:新增 `StatScope` 字段 - [x] 2.8 更新 ShopSeriesAllocation 模型:移除一次性佣金配置字段,新增 `OneTimeCommissionAmount` 字段 - [x] 2.9 为 IoTCard/Device 添加累计充值和首充状态的 getter/setter 辅助方法 - [x] 2.10 运行 `lsp_diagnostics` 验证 Model 层无编译错误 ## 3. DTO 层更新 - [x] 3.1 更新 CreatePackageRequest:移除 `price`/`data_type`/`data_amount_mb`,新增 `enable_virtual_data` - [x] 3.2 更新 UpdatePackageRequest:同上调整字段 - [x] 3.3 更新 PackageResponse:移除废弃字段,新增 `enable_virtual_data`、`one_time_commission_amount` - [x] 3.4 更新 CreateShopPackageAllocationRequest:新增 `one_time_commission_amount` 字段 - [x] 3.5 更新 ShopPackageAllocationResponse:新增 `one_time_commission_amount` 字段 - [x] 3.6 更新 CreatePackageSeriesRequest:新增 `one_time_commission_config` 嵌套结构 - [x] 3.7 更新 PackageSeriesResponse:返回一次性佣金规则配置 - [x] 3.8 简化 CreateShopSeriesAllocationRequest:移除完整一次性佣金配置字段,改为 `one_time_commission_amount` - [x] 3.9 简化 ShopSeriesAllocationResponse:移除完整一次性佣金配置字段 - [x] 3.10 运行 `lsp_diagnostics` 验证 DTO 层无编译错误 ## 4. Store 层更新 - [x] 4.1 更新 PackageStore:适配新字段的 CRUD 操作(GORM Save 自动处理) - [x] 4.2 更新 ShopPackageAllocationStore:支持 `one_time_commission_amount` 字段(GORM Save 自动处理) - [x] 4.3 更新 PackageSeriesStore:支持 `one_time_commission_config` JSON 字段的读写(GORM Save 自动处理) - [x] 4.4 更新 ShopSeriesAllocationStore:移除完整一次性佣金配置字段的处理(Model 层已移除字段) - [x] 4.5 新增 IoTCardStore 方法:UpdateRechargeTrackingFields - [x] 4.6 新增 IoTCardStore 方法:(通过 Model 层 getter/setter 辅助方法实现) - [x] 4.7 新增 IoTCardStore 方法:(通过 Model 层 getter/setter 辅助方法实现) - [x] 4.8 新增 DeviceStore 方法:UpdateRechargeTrackingFields - [x] 4.9 运行 `lsp_diagnostics` 验证 Store 层无编译错误 ## 5. Service 层更新 - 套餐管理 - [x] 5.1 更新 PackageService.Create:校验虚流量配置(启用时必填且 ≤ 真流量) - [x] 5.2 更新 PackageService.Update:同上校验逻辑 - [x] 5.3 更新 PackageService.List:根据用户类型返回不同视角的成本价和一次性佣金金额 - [x] 5.4 新增辅助方法:获取代理的套餐分配关系并填充视角数据 - [x] 5.5 编写 PackageService 单元测试:虚流量配置校验场景 - [ ] 5.6 编写 PackageService 单元测试:代理视角套餐列表场景(需要完整测试环境) ## 6. Service 层更新 - 套餐分配 - [x] 6.1 更新 ShopPackageAllocationService.Create:支持设置一次性佣金金额 - [x] 6.2 新增校验逻辑:一次性佣金金额 ≤ 上级能拿到的金额 - [x] 6.3 新增校验逻辑:一次性佣金金额 ≥ 0 - [x] 6.4 更新 ShopPackageAllocationService.Update:支持修改一次性佣金金额 - [x] 6.5 编写 ShopPackageAllocationService 单元测试:一次性佣金金额校验场景 ## 7. Service 层更新 - 系列管理与分配 - [x] 7.1 更新 PackageSeriesService:支持一次性佣金规则配置的 CRUD - [x] 7.2 简化 ShopSeriesAllocationService.Create:移除完整一次性佣金配置的处理 - [x] 7.3 简化 ShopSeriesAllocationService.Update:同上 - [x] 7.4 更新验证逻辑:从套餐系列获取一次性佣金规则进行校验 - [ ] 7.5 编写单元测试 ## 8. Service 层更新 - 佣金计算 - [x] 8.1 重构一次性佣金触发逻辑:支持按系列追踪首充和累计充值状态 - [x] 8.2 实现链式分配计算逻辑:沿代理链向上计算各级代理分得的佣金 - [x] 8.3 更新累计充值逻辑:只有充值操作累计,直接购买不累计 - [x] 8.4 更新首充判断逻辑:从 `single_recharge` 改为 `first_recharge` - [x] 8.5 实现一次性佣金时效检查:过期规则不触发返佣 - [x] 8.6 更新梯度佣金计算:支持 `stat_scope` 配置 - [x] 8.7 编写佣金计算 Service 单元测试:链式分配场景 - [x] 8.8 编写佣金计算 Service 单元测试:首充/累计充值场景 - [x] 8.9 编写佣金计算 Service 单元测试:梯度升级场景(已实现时效检查测试) ## 9. Service 层更新 - 强充检查 - [x] 9.1 更新首充强充金额计算:max(首充要求, 套餐售价) - [x] 9.2 新增累计充值强充金额计算:支持固定/动态两种模式 - [x] 9.3 更新强充流程:支持累计充值的累计逻辑 - [ ] 9.4 编写强充检查 Service 单元测试 ## 10. Handler 层更新 - [x] 10.1 更新 PackageHandler:适配新 DTO 结构 - [x] 10.2 更新 PackageSeriesHandler:支持一次性佣金规则配置 - [x] 10.3 更新 ShopPackageAllocationHandler:支持一次性佣金金额 - [x] 10.4 更新 ShopSeriesAllocationHandler:简化请求/响应结构 - [x] 10.5 更新文档生成器 cmd/api/docs.go 和 cmd/gendocs/main.go - [x] 10.6 运行 `lsp_diagnostics` 验证 Handler 层无编译错误 ## 11. 集成测试 - [ ] 11.1 编写套餐 CRUD 集成测试:验证虚流量配置 - [ ] 11.2 编写套餐分配集成测试:验证一次性佣金金额 - [ ] 11.3 编写系列分配集成测试:验证简化后的配置 - [ ] 11.4 编写代理视角套餐列表集成测试 - [ ] 11.5 编写一次性佣金触发集成测试:首充场景 - [ ] 11.6 编写一次性佣金触发集成测试:累计充值场景 - [ ] 11.7 编写链式佣金分配集成测试 - [x] 11.8 运行全部测试确保通过 ## 12. 验收 - [x] 12.1 运行完整测试套件,确保全部通过 - [x] 12.2 运行 `go build` 确保编译通过 - [ ] 12.3 本地环境功能验证:套餐创建/修改流程 - [ ] 12.4 本地环境功能验证:套餐分配流程 - [ ] 12.5 本地环境功能验证:一次性佣金触发流程 - [ ] 12.6 更新 OpenAPI 文档确认变更已反映