Files
junhong_cmp_fiber/migrations/000042_refactor_commission_package_model.up.sql
huang b18ecfeb55
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m29s
refactor: 一次性佣金配置从套餐级别提升到系列级别
主要变更:
- 新增 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)
- 删除过时的单元测试(已被验收测试覆盖)
2026-02-04 14:28:44 +08:00

127 lines
5.3 KiB
SQL
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.
-- 套餐与佣金模型重构
-- 重构说明:
-- 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 '给被分配店铺的一次性佣金金额(分)';