重构: 店铺套餐分配系统从加价模式改为返佣模式
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,62 @@
-- 回滚重构套餐分配和佣金系统的迁移
-- ============================================================
-- 6. 删除额外索引
-- ============================================================
DROP INDEX IF EXISTS idx_package_allocation_shop_pkg;
-- ============================================================
-- 5. 删除 tb_shop_series_commission_stats 表
-- ============================================================
DROP TABLE IF EXISTS tb_shop_series_commission_stats;
-- ============================================================
-- 4. 删除 tb_shop_package_allocation_price_history 表
-- ============================================================
DROP TABLE IF EXISTS tb_shop_package_allocation_price_history;
-- ============================================================
-- 3. 删除 tb_shop_series_allocation_config 表
-- ============================================================
DROP TABLE IF EXISTS tb_shop_series_allocation_config;
-- ============================================================
-- 2. 回滚 tb_shop_series_commission_tier 表修改
-- ============================================================
-- 回滚字段重命名
ALTER TABLE tb_shop_series_commission_tier
RENAME COLUMN commission_value TO commission_amount;
-- 删除新增字段
ALTER TABLE tb_shop_series_commission_tier
DROP COLUMN IF EXISTS commission_mode;
-- ============================================================
-- 1. 回滚 tb_shop_series_allocation 表修改
-- ============================================================
-- 删除新增字段
ALTER TABLE tb_shop_series_allocation
DROP COLUMN IF EXISTS base_commission_mode,
DROP COLUMN IF EXISTS base_commission_value,
DROP COLUMN IF EXISTS enable_tier_commission;
-- 恢复旧字段
ALTER TABLE tb_shop_series_allocation
ADD COLUMN pricing_mode VARCHAR(20),
ADD COLUMN pricing_value BIGINT,
ADD COLUMN one_time_commission_trigger VARCHAR(30),
ADD COLUMN one_time_commission_threshold BIGINT DEFAULT 0,
ADD COLUMN one_time_commission_amount BIGINT DEFAULT 0;
-- 恢复字段注释
COMMENT ON COLUMN tb_shop_series_allocation.pricing_mode IS '加价模式 fixed-固定金额 percent-百分比';
COMMENT ON COLUMN tb_shop_series_allocation.pricing_value IS '加价值(分或千分比)';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_trigger IS '一次性佣金触发类型 one_time_recharge-单次充值 accumulated_recharge-累计充值';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_threshold IS '一次性佣金触发阈值(分)';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_amount IS '一次性佣金金额(分)';

View File

@@ -0,0 +1,153 @@
-- 重构套餐分配和佣金系统
-- 1. 删除自动加价机制pricing_mode, pricing_value
-- 2. 重构返佣配置(新增 base_commission_mode, base_commission_value, enable_tier_commission
-- 3. 修正梯度佣金逻辑commission_tier 新增 commission_mode
-- 4. 新增配置版本管理、成本价历史、统计缓存表
-- ============================================================
-- 1. 修改 tb_shop_series_allocation 表
-- ============================================================
-- 删除旧字段
ALTER TABLE tb_shop_series_allocation
DROP COLUMN IF EXISTS pricing_mode,
DROP COLUMN IF EXISTS pricing_value,
DROP COLUMN IF EXISTS one_time_commission_trigger,
DROP COLUMN IF EXISTS one_time_commission_threshold,
DROP COLUMN IF EXISTS one_time_commission_amount;
-- 新增新字段
ALTER TABLE tb_shop_series_allocation
ADD COLUMN base_commission_mode VARCHAR(20) NOT NULL DEFAULT 'percent',
ADD COLUMN base_commission_value BIGINT NOT NULL DEFAULT 0,
ADD COLUMN enable_tier_commission BOOLEAN NOT NULL DEFAULT FALSE;
-- 添加字段注释
COMMENT ON COLUMN tb_shop_series_allocation.base_commission_mode IS '基础返佣模式 fixed-固定金额 percent-百分比';
COMMENT ON COLUMN tb_shop_series_allocation.base_commission_value IS '基础返佣值分或千分比如200=20%';
COMMENT ON COLUMN tb_shop_series_allocation.enable_tier_commission IS '是否启用梯度返佣';
-- ============================================================
-- 2. 修改 tb_shop_series_commission_tier 表
-- ============================================================
-- 新增 commission_mode 字段
ALTER TABLE tb_shop_series_commission_tier
ADD COLUMN commission_mode VARCHAR(20) NOT NULL DEFAULT 'percent';
-- 添加字段注释
COMMENT ON COLUMN tb_shop_series_commission_tier.commission_mode IS '达标后返佣模式 fixed-固定金额 percent-百分比';
-- 删除旧字段 commission_amount重命名为更语义化的 commission_value
ALTER TABLE tb_shop_series_commission_tier
RENAME COLUMN commission_amount TO commission_value;
-- 更新字段注释
COMMENT ON COLUMN tb_shop_series_commission_tier.commission_value IS '达标后返佣值(分或千分比)';
-- ============================================================
-- 3. 创建 tb_shop_series_allocation_config 表(配置版本表)
-- ============================================================
CREATE TABLE IF NOT EXISTS tb_shop_series_allocation_config (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
allocation_id BIGINT NOT NULL,
version INT NOT NULL,
base_commission_mode VARCHAR(20) NOT NULL,
base_commission_value BIGINT NOT NULL,
enable_tier_commission BOOLEAN NOT NULL,
effective_from TIMESTAMPTZ NOT NULL,
effective_to TIMESTAMPTZ
);
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_allocation_config_allocation_id ON tb_shop_series_allocation_config(allocation_id);
CREATE INDEX IF NOT EXISTS idx_allocation_config_effective ON tb_shop_series_allocation_config(allocation_id, effective_to);
-- 添加表和字段注释
COMMENT ON TABLE tb_shop_series_allocation_config IS '套餐系列分配配置版本表';
COMMENT ON COLUMN tb_shop_series_allocation_config.allocation_id IS '关联的分配ID';
COMMENT ON COLUMN tb_shop_series_allocation_config.version IS '配置版本号';
COMMENT ON COLUMN tb_shop_series_allocation_config.base_commission_mode IS '基础返佣模式(配置快照)';
COMMENT ON COLUMN tb_shop_series_allocation_config.base_commission_value IS '基础返佣值(配置快照)';
COMMENT ON COLUMN tb_shop_series_allocation_config.enable_tier_commission IS '是否启用梯度返佣(配置快照)';
COMMENT ON COLUMN tb_shop_series_allocation_config.effective_from IS '生效开始时间';
COMMENT ON COLUMN tb_shop_series_allocation_config.effective_to IS '生效结束时间NULL表示当前生效';
-- ============================================================
-- 4. 创建 tb_shop_package_allocation_price_history 表(成本价历史表)
-- ============================================================
CREATE TABLE IF NOT EXISTS tb_shop_package_allocation_price_history (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
allocation_id BIGINT NOT NULL,
old_cost_price BIGINT NOT NULL,
new_cost_price BIGINT NOT NULL,
change_reason VARCHAR(255),
changed_by BIGINT NOT NULL,
effective_from TIMESTAMPTZ NOT NULL
);
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_price_history_allocation ON tb_shop_package_allocation_price_history(allocation_id, effective_from);
-- 添加表和字段注释
COMMENT ON TABLE tb_shop_package_allocation_price_history IS '套餐成本价变更历史表';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.allocation_id IS '关联的套餐分配IDtb_shop_package_allocation.id';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.old_cost_price IS '原成本价(分)';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.new_cost_price IS '新成本价(分)';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.change_reason IS '变更原因';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.changed_by IS '变更人ID';
COMMENT ON COLUMN tb_shop_package_allocation_price_history.effective_from IS '生效时间';
-- ============================================================
-- 5. 创建 tb_shop_series_commission_stats 表(统计缓存表)
-- ============================================================
CREATE TABLE IF NOT EXISTS tb_shop_series_commission_stats (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
allocation_id BIGINT NOT NULL,
period_type VARCHAR(20) NOT NULL,
period_start TIMESTAMPTZ NOT NULL,
period_end TIMESTAMPTZ NOT NULL,
total_sales_count BIGINT DEFAULT 0 NOT NULL,
total_sales_amount BIGINT DEFAULT 0 NOT NULL,
current_tier_id BIGINT,
last_updated_at TIMESTAMPTZ NOT NULL,
version INT DEFAULT 0 NOT NULL,
status VARCHAR(20) DEFAULT 'active' NOT NULL
);
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_commission_stats_allocation_id ON tb_shop_series_commission_stats(allocation_id);
CREATE INDEX IF NOT EXISTS idx_commission_stats_period ON tb_shop_series_commission_stats(allocation_id, period_start, period_end);
CREATE UNIQUE INDEX IF NOT EXISTS idx_commission_stats_unique ON tb_shop_series_commission_stats(allocation_id, period_type, period_start) WHERE deleted_at IS NULL;
-- 添加表和字段注释
COMMENT ON TABLE tb_shop_series_commission_stats IS '梯度佣金统计缓存表';
COMMENT ON COLUMN tb_shop_series_commission_stats.allocation_id IS '关联的分配ID';
COMMENT ON COLUMN tb_shop_series_commission_stats.period_type IS '周期类型 monthly-月度 quarterly-季度 yearly-年度';
COMMENT ON COLUMN tb_shop_series_commission_stats.period_start IS '周期开始时间';
COMMENT ON COLUMN tb_shop_series_commission_stats.period_end IS '周期结束时间';
COMMENT ON COLUMN tb_shop_series_commission_stats.total_sales_count IS '总销售数量';
COMMENT ON COLUMN tb_shop_series_commission_stats.total_sales_amount IS '总销售金额(分)';
COMMENT ON COLUMN tb_shop_series_commission_stats.current_tier_id IS '当前匹配的梯度ID';
COMMENT ON COLUMN tb_shop_series_commission_stats.last_updated_at IS '最后更新时间';
COMMENT ON COLUMN tb_shop_series_commission_stats.version IS '版本号(乐观锁)';
COMMENT ON COLUMN tb_shop_series_commission_stats.status IS '状态 active-活跃 completed-已完成 cancelled-已取消';
-- ============================================================
-- 6. 创建额外索引(性能优化)
-- ============================================================
-- tb_shop_package_allocation 表新增复合索引(用于代理权限过滤)
CREATE INDEX IF NOT EXISTS idx_package_allocation_shop_pkg ON tb_shop_package_allocation(shop_id, package_id, status);