refactor: 一次性佣金配置从套餐级别提升到系列级别
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m29s

主要变更:
- 新增 tb_shop_series_allocation 表,存储系列级别的一次性佣金配置
- ShopPackageAllocation 移除 one_time_commission_amount 字段
- PackageSeries 新增 enable_one_time_commission 字段控制是否启用一次性佣金
- 新增 /api/admin/shop-series-allocations CRUD 接口
- 佣金计算逻辑改为从 ShopSeriesAllocation 获取一次性佣金金额
- 删除废弃的 ShopSeriesOneTimeCommissionTier 模型
- OpenAPI Tag '系列分配' 和 '单套餐分配' 合并为 '套餐分配'

迁移脚本:
- 000042: 重构佣金套餐模型
- 000043: 简化佣金分配
- 000044: 一次性佣金分配重构
- 000045: PackageSeries 添加 enable_one_time_commission 字段

测试:
- 新增验收测试 (shop_series_allocation, commission_calculation)
- 新增流程测试 (one_time_commission_chain)
- 删除过时的单元测试(已被验收测试覆盖)
This commit is contained in:
2026-02-04 14:28:44 +08:00
parent fba8e9e76b
commit b18ecfeb55
106 changed files with 9899 additions and 6608 deletions

View File

@@ -0,0 +1,126 @@
-- 套餐与佣金模型重构
-- 重构说明:
-- 1. Package 表:移除废弃字段,新增虚流量开关
-- 2. ShopPackageAllocation 表:新增一次性佣金金额字段
-- 3. IoTCard/Device 表:新增按系列追踪的累计充值和首充状态字段
-- 4. PackageSeries 表:新增一次性佣金规则配置字段
-- 5. ShopSeriesOneTimeCommissionTier 表:新增统计范围字段
-- 6. ShopSeriesAllocation 表:移除完整一次性佣金配置,改为只存金额
-- ============================================
-- 1. Package 表调整
-- ============================================
-- 移除废弃字段
ALTER TABLE tb_package
DROP COLUMN IF EXISTS price,
DROP COLUMN IF EXISTS data_type,
DROP COLUMN IF EXISTS data_amount_mb;
-- 新增虚流量开关字段
ALTER TABLE tb_package
ADD COLUMN IF NOT EXISTS enable_virtual_data BOOLEAN DEFAULT false NOT NULL;
COMMENT ON COLUMN tb_package.enable_virtual_data IS '是否启用虚流量';
-- 重命名 suggested_cost_price 为 cost_price如果存在的话通过 RENAME 实现)
-- 注意PostgreSQL 不支持条件性重命名,此处直接重命名
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'tb_package' AND column_name = 'suggested_cost_price'
) THEN
ALTER TABLE tb_package RENAME COLUMN suggested_cost_price TO cost_price;
END IF;
END $$;
COMMENT ON COLUMN tb_package.cost_price IS '成本价(分为单位)';
-- ============================================
-- 2. ShopPackageAllocation 表新增字段
-- ============================================
ALTER TABLE tb_shop_package_allocation
ADD COLUMN IF NOT EXISTS one_time_commission_amount BIGINT DEFAULT 0 NOT NULL;
COMMENT ON COLUMN tb_shop_package_allocation.one_time_commission_amount IS '该代理能拿到的一次性佣金(分)';
-- ============================================
-- 3. IoTCard 表新增追踪字段
-- ============================================
-- 新增按系列追踪的累计充值字段JSON Map: series_id -> amount
ALTER TABLE tb_iot_card
ADD COLUMN IF NOT EXISTS accumulated_recharge_by_series JSONB DEFAULT '{}';
-- 新增按系列追踪的首充触发状态JSON Map: series_id -> bool
ALTER TABLE tb_iot_card
ADD COLUMN IF NOT EXISTS first_recharge_triggered_by_series JSONB DEFAULT '{}';
COMMENT ON COLUMN tb_iot_card.accumulated_recharge_by_series IS '按套餐系列追踪的累计充值金额JSON Map: series_id -> amount 分)';
COMMENT ON COLUMN tb_iot_card.first_recharge_triggered_by_series IS '按套餐系列追踪的首充触发状态JSON Map: series_id -> bool';
-- ============================================
-- 4. Device 表新增追踪字段
-- ============================================
-- 新增按系列追踪的累计充值字段
ALTER TABLE tb_device
ADD COLUMN IF NOT EXISTS accumulated_recharge_by_series JSONB DEFAULT '{}';
-- 新增按系列追踪的首充触发状态
ALTER TABLE tb_device
ADD COLUMN IF NOT EXISTS first_recharge_triggered_by_series JSONB DEFAULT '{}';
COMMENT ON COLUMN tb_device.accumulated_recharge_by_series IS '按套餐系列追踪的累计充值金额JSON Map: series_id -> amount 分)';
COMMENT ON COLUMN tb_device.first_recharge_triggered_by_series IS '按套餐系列追踪的首充触发状态JSON Map: series_id -> bool';
-- ============================================
-- 5. PackageSeries 表新增一次性佣金规则配置
-- ============================================
ALTER TABLE tb_package_series
ADD COLUMN IF NOT EXISTS one_time_commission_config JSONB;
COMMENT ON COLUMN tb_package_series.one_time_commission_config IS '一次性佣金规则配置JSONenable, trigger_type, threshold, commission_type, commission_amount, validity_type 等)';
-- ============================================
-- 6. ShopSeriesOneTimeCommissionTier 表新增统计范围
-- ============================================
-- 检查表是否存在,存在则添加字段
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_name = 'tb_shop_series_one_time_commission_tier'
) THEN
ALTER TABLE tb_shop_series_one_time_commission_tier
ADD COLUMN IF NOT EXISTS stat_scope VARCHAR(20) DEFAULT 'self' NOT NULL;
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.stat_scope IS '统计范围 self-仅自己 self_and_sub-自己+下级';
END IF;
END $$;
-- ============================================
-- 7. ShopSeriesAllocation 表移除废弃字段,新增新字段
-- ============================================
-- 移除一次性佣金完整配置字段
ALTER TABLE tb_shop_series_allocation
DROP COLUMN IF EXISTS enable_one_time_commission,
DROP COLUMN IF EXISTS one_time_commission_type,
DROP COLUMN IF EXISTS one_time_commission_trigger,
DROP COLUMN IF EXISTS one_time_commission_threshold,
DROP COLUMN IF EXISTS one_time_commission_mode,
DROP COLUMN IF EXISTS one_time_commission_value,
DROP COLUMN IF EXISTS enable_force_recharge,
DROP COLUMN IF EXISTS force_recharge_amount,
DROP COLUMN IF EXISTS force_recharge_trigger_type;
-- 新增一次性佣金金额字段
ALTER TABLE tb_shop_series_allocation
ADD COLUMN IF NOT EXISTS one_time_commission_amount BIGINT DEFAULT 0 NOT NULL;
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_amount IS '给被分配店铺的一次性佣金金额(分)';