重构: 店铺套餐分配系统从加价模式改为返佣模式
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m18s

主要变更:
- 重构分配模型:从加价模式(pricing_mode/pricing_value)改为返佣模式(base_commission + tier_commission)
- 删除独立的 my_package 接口,统一到 /api/admin/packages(通过数据权限自动过滤)
- 新增批量分配和批量调价功能,支持事务和性能优化
- 新增配置版本管理,订单创建时锁定返佣配置
- 新增成本价历史记录,支持审计和纠纷处理
- 新增统计缓存系统(Redis + 异步任务),优化梯度返佣计算性能
- 删除冗余的梯度佣金独立 CRUD 接口(合并到分配配置中)
- 归档 3 个已完成的 OpenSpec changes 并同步 8 个新 capabilities 到 main specs

技术细节:
- 数据库迁移:000026_refactor_shop_package_allocation
- 新增 Store:AllocationConfigStore, PriceHistoryStore, CommissionStatsStore
- 新增 Service:BatchAllocationService, BatchPricingService, CommissionStatsService
- 新增异步任务:统计更新、定时同步、周期归档
- 测试覆盖:批量操作集成测试、梯度佣金 CRUD 清理验证

影响:
- API 变更:删除 4 个梯度 CRUD 接口(POST/GET/PUT/DELETE /:id/tiers)
- API 新增:批量分配、批量调价接口
- 数据模型:重构 shop_series_allocation 表结构
- 性能优化:批量操作使用 CreateInBatches,统计使用 Redis 缓存

相关文档:
- openspec/changes/archive/2026-01-28-refactor-shop-package-allocation/
- openspec/specs/agent-available-packages/
- openspec/specs/allocation-config-versioning/
- 等 8 个新 capability specs
This commit is contained in:
2026-01-28 17:11:55 +08:00
parent 23eb0307bb
commit 1da680a790
97 changed files with 6810 additions and 3622 deletions

View File

@@ -0,0 +1,107 @@
# Capability: 店铺套餐批量分配
## Purpose
本 capability 定义代理如何批量为下级店铺分配套餐系列下的所有套餐,支持批量加价和返佣配置,使用事务确保原子性。
## Requirements
### Requirement: 代理为下级店铺批量分配套餐系列
系统 SHALL 允许代理通过指定套餐系列,批量为下级店铺分配该系列下的所有套餐。分配时 MUST 支持可选的批量加价配置(固定金额或百分比)和返佣配置(固定金额或百分比)。
#### Scenario: 成功批量分配套餐系列
- **WHEN** 代理为直属下级店铺分配套餐系列A系列包含10个套餐
- **THEN** 系统创建1条系列分配记录和10条套餐分配记录
#### Scenario: 批量分配时应用百分比加价
- **WHEN** 代理分配时设置百分比加价10%上级成本价为100元的套餐
- **THEN** 下级的成本价为110元100 × 1.1
#### Scenario: 批量分配时应用固定金额加价
- **WHEN** 代理分配时设置固定金额加价1000分10元上级成本价为100元的套餐
- **THEN** 下级的成本价为110元100 + 10
#### Scenario: 批量分配时不加价
- **WHEN** 代理分配时不提供加价配置上级成本价为100元的套餐
- **THEN** 下级的成本价为100元与上级相同
#### Scenario: 尝试分配未拥有的系列
- **WHEN** 代理尝试分配自己未被分配的套餐系列
- **THEN** 系统返回错误 "您没有该套餐系列的分配权限"
#### Scenario: 尝试分配给非直属下级
- **WHEN** 代理尝试分配给非直属下级店铺
- **THEN** 系统返回错误 "只能为直属下级分配套餐"
#### Scenario: 重复分配同一系列
- **WHEN** 代理尝试为同一下级店铺重复分配同一套餐系列
- **THEN** 系统返回错误 "该店铺已分配此套餐系列"
---
### Requirement: 配置基础返佣(固定金额或百分比)
批量分配时 MUST 配置基础返佣,支持固定金额和百分比两种模式。基础返佣作为梯度返佣的起始值,未达标时使用基础返佣,达标后使用梯度返佣。
#### Scenario: 配置固定金额返佣
- **WHEN** 代理设置基础返佣为固定金额2000分20元
- **THEN** 下级客户充值100元时返佣20元固定
#### Scenario: 配置百分比返佣
- **WHEN** 代理设置基础返佣为百分比20020%
- **THEN** 下级客户充值100元时返佣20元100 × 20%
#### Scenario: 配置百分比返佣(不同充值金额)
- **WHEN** 代理设置基础返佣为百分比20020%
- **THEN** 下级客户充值200元时返佣40元200 × 20%
---
### Requirement: 配置梯度返佣
批量分配时 MAY 配置梯度返佣。梯度返佣 MUST 包含统计周期(月度/季度/年度)、梯度类型(销量/销售额)、阈值和达标后的返佣配置(固定金额或百分比)。一个系列分配 MAY 配置多个梯度档位。
#### Scenario: 配置月度销量梯度返佣
- **WHEN** 代理配置月度销量梯度销量达100件返佣提升到30%
- **THEN** 下级店铺月销量达到100件后后续充值按30%返佣
#### Scenario: 配置多个梯度档位
- **WHEN** 代理配置3个梯度档位100件30%200件40%500件50%
- **THEN** 系统创建3条梯度配置记录
#### Scenario: 配置季度销售额梯度返佣
- **WHEN** 代理配置季度销售额梯度销售额达100000分1000元返佣提升到固定3000分30元
- **THEN** 下级店铺季度销售额达到1000元后后续充值返佣固定30元
#### Scenario: 不配置梯度返佣
- **WHEN** 代理分配时设置 enable_tier_commission = false
- **THEN** 系统不创建梯度配置,所有充值按基础返佣计算
---
### Requirement: 批量分配使用事务保证原子性
批量分配操作 MUST 在单个数据库事务中完成,确保要么全部成功,要么全部失败。
#### Scenario: 部分套餐分配失败时回滚
- **WHEN** 批量分配100个套餐时第50个套餐因唯一约束冲突失败
- **THEN** 系统回滚所有已创建的分配记录,返回错误信息
#### Scenario: 成功分配后提交事务
- **WHEN** 批量分配100个套餐全部成功
- **THEN** 系统提交事务,所有分配记录持久化
---
### Requirement: 批量分配使用 CreateInBatches 优化性能
批量创建套餐分配记录时 MUST 使用 GORM 的 CreateInBatches 方法每批不超过500条避免单次插入过多数据。
#### Scenario: 分配1000个套餐时分批插入
- **WHEN** 批量分配1000个套餐
- **THEN** 系统分为2批插入500 + 500
#### Scenario: 分配200个套餐时单批插入
- **WHEN** 批量分配200个套餐
- **THEN** 系统使用单批插入