feat: 实现一次性佣金功能
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m41s

- 新增佣金计算服务,支持一次性佣金和返佣计算
- 新增 ShopSeriesOneTimeCommissionTier 模型和存储层
- 新增两个数据库迁移:一次性佣金表和订单佣金字段
- 更新 Commission 模型,新增佣金来源和关联字段
- 更新 CommissionRecord 存储层,支持一次性佣金查询
- 更新 MyCommission 服务,集成一次性佣金计算逻辑
- 更新 ShopCommission 服务,支持一次性佣金统计
- 新增佣金计算异步任务处理器
- 更新 API 路由,新增一次性佣金相关端点
- 归档 OpenSpec 变更文档,同步规范到主规范库
This commit is contained in:
2026-01-29 09:36:12 +08:00
parent dfcf16f548
commit e87513541b
33 changed files with 1668 additions and 270 deletions

View File

@@ -0,0 +1,41 @@
-- 回滚迁移: 一次性佣金功能
-- ========================================
-- 1. 恢复 tb_commission_record 表结构
-- ========================================
-- 1.1 删除新字段
ALTER TABLE tb_commission_record
DROP COLUMN IF EXISTS commission_source,
DROP COLUMN IF EXISTS iot_card_id,
DROP COLUMN IF EXISTS device_id,
DROP COLUMN IF EXISTS remark;
-- 1.2 恢复旧字段
ALTER TABLE tb_commission_record
ADD COLUMN IF NOT EXISTS agent_id BIGINT,
ADD COLUMN IF NOT EXISTS rule_id BIGINT,
ADD COLUMN IF NOT EXISTS commission_type VARCHAR(50),
ADD COLUMN IF NOT EXISTS unfrozen_at TIMESTAMP WITH TIME ZONE;
-- 1.3 恢复索引
CREATE INDEX IF NOT EXISTS idx_commission_record_agent_id ON tb_commission_record(agent_id);
CREATE INDEX IF NOT EXISTS idx_commission_record_rule_id ON tb_commission_record(rule_id);
-- ========================================
-- 2. 删除 tb_shop_series_one_time_commission_tier 表
-- ========================================
DROP TABLE IF EXISTS tb_shop_series_one_time_commission_tier;
-- ========================================
-- 3. 删除 tb_shop_series_allocation 的一次性佣金字段
-- ========================================
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;

View File

@@ -0,0 +1,96 @@
-- 迁移: 一次性佣金功能
-- 变更ID: add-one-time-commission
-- 说明:
-- 1. 为 tb_shop_series_allocation 添加一次性佣金配置字段
-- 2. 创建 tb_shop_series_one_time_commission_tier 梯度配置表
-- 3. 简化 tb_commission_record 表结构(删除冻结字段,新增来源字段)
-- ========================================
-- 1. tb_shop_series_allocation 添加一次性佣金配置字段
-- ========================================
ALTER TABLE tb_shop_series_allocation
ADD COLUMN IF NOT EXISTS enable_one_time_commission BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS one_time_commission_type VARCHAR(20),
ADD COLUMN IF NOT EXISTS one_time_commission_trigger VARCHAR(30),
ADD COLUMN IF NOT EXISTS one_time_commission_threshold BIGINT DEFAULT 0,
ADD COLUMN IF NOT EXISTS one_time_commission_mode VARCHAR(20),
ADD COLUMN IF NOT EXISTS one_time_commission_value BIGINT DEFAULT 0;
-- 添加字段注释
COMMENT ON COLUMN tb_shop_series_allocation.enable_one_time_commission IS '是否启用一次性佣金';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_type IS '一次性佣金类型 fixed-固定 tiered-梯度';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_trigger IS '触发条件 single_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_mode IS '返佣模式 fixed-固定金额 percent-百分比';
COMMENT ON COLUMN tb_shop_series_allocation.one_time_commission_value IS '佣金金额(分)或比例(千分比)';
-- ========================================
-- 2. 创建 tb_shop_series_one_time_commission_tier 梯度配置表
-- ========================================
CREATE TABLE IF NOT EXISTS tb_shop_series_one_time_commission_tier (
id BIGSERIAL PRIMARY KEY,
allocation_id BIGINT NOT NULL,
tier_type VARCHAR(20) NOT NULL,
threshold_value BIGINT NOT NULL,
commission_mode VARCHAR(20) NOT NULL DEFAULT 'fixed',
commission_value BIGINT NOT NULL,
status INT NOT NULL DEFAULT 1,
creator BIGINT NOT NULL,
updater BIGINT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
deleted_at TIMESTAMP WITH TIME ZONE
);
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_one_time_tier_allocation_id ON tb_shop_series_one_time_commission_tier(allocation_id);
CREATE INDEX IF NOT EXISTS idx_one_time_tier_tier_type ON tb_shop_series_one_time_commission_tier(tier_type);
CREATE INDEX IF NOT EXISTS idx_one_time_tier_threshold ON tb_shop_series_one_time_commission_tier(threshold_value);
-- 添加表注释
COMMENT ON TABLE tb_shop_series_one_time_commission_tier IS '一次性佣金梯度配置表,基于销售业绩的一次性佣金档位';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.allocation_id IS '系列分配ID';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.tier_type IS '梯度类型 sales_count-销量 sales_amount-销售额';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.threshold_value IS '梯度阈值(销量或销售额分)';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.commission_mode IS '返佣模式 fixed-固定金额 percent-百分比';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.commission_value IS '返佣值(分或千分比)';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.status IS '状态 1-启用 2-停用';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.creator IS '创建人ID';
COMMENT ON COLUMN tb_shop_series_one_time_commission_tier.updater IS '更新人ID';
-- ========================================
-- 3. 修改 tb_commission_record 表结构
-- ========================================
-- 3.1 删除旧字段
ALTER TABLE tb_commission_record
DROP COLUMN IF EXISTS agent_id,
DROP COLUMN IF EXISTS rule_id,
DROP COLUMN IF EXISTS commission_type,
DROP COLUMN IF EXISTS unfrozen_at;
-- 3.2 添加新字段
ALTER TABLE tb_commission_record
ADD COLUMN IF NOT EXISTS commission_source VARCHAR(20) NOT NULL DEFAULT 'cost_diff',
ADD COLUMN IF NOT EXISTS iot_card_id BIGINT,
ADD COLUMN IF NOT EXISTS device_id BIGINT,
ADD COLUMN IF NOT EXISTS remark VARCHAR(500);
-- 3.3 添加索引
CREATE INDEX IF NOT EXISTS idx_commission_record_commission_source ON tb_commission_record(commission_source);
CREATE INDEX IF NOT EXISTS idx_commission_record_iot_card_id ON tb_commission_record(iot_card_id);
CREATE INDEX IF NOT EXISTS idx_commission_record_device_id ON tb_commission_record(device_id);
-- 3.4 更新字段注释
COMMENT ON COLUMN tb_commission_record.shop_id IS '店铺ID佣金归属';
COMMENT ON COLUMN tb_commission_record.order_id IS '订单ID';
COMMENT ON COLUMN tb_commission_record.commission_source IS '佣金来源 cost_diff-成本价差 one_time-一次性佣金 tier_bonus-梯度奖励';
COMMENT ON COLUMN tb_commission_record.iot_card_id IS '关联卡ID可空';
COMMENT ON COLUMN tb_commission_record.device_id IS '关联设备ID可空';
COMMENT ON COLUMN tb_commission_record.amount IS '佣金金额(分)';
COMMENT ON COLUMN tb_commission_record.balance_after IS '入账后钱包余额(分)';
COMMENT ON COLUMN tb_commission_record.status IS '状态 1-已入账 2-已失效';
COMMENT ON COLUMN tb_commission_record.released_at IS '入账时间';
COMMENT ON COLUMN tb_commission_record.remark IS '备注';

View File

@@ -0,0 +1,6 @@
-- 回滚: 删除 Order 表的佣金计算字段
ALTER TABLE tb_order
DROP COLUMN IF EXISTS seller_shop_id,
DROP COLUMN IF EXISTS seller_cost_price,
DROP COLUMN IF EXISTS series_id;

View File

@@ -0,0 +1,19 @@
-- 迁移: 为 Order 表添加佣金计算所需字段
-- 说明:
-- 1. 添加 seller_shop_id 字段销售店铺ID用于成本价差计算
-- 2. 添加 seller_cost_price 字段(销售成本价,用于计算利润)
-- 3. 添加 series_id 字段系列ID用于查询分配配置
ALTER TABLE tb_order
ADD COLUMN IF NOT EXISTS seller_shop_id BIGINT,
ADD COLUMN IF NOT EXISTS seller_cost_price BIGINT DEFAULT 0,
ADD COLUMN IF NOT EXISTS series_id BIGINT;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_order_seller_shop_id ON tb_order(seller_shop_id);
CREATE INDEX IF NOT EXISTS idx_order_series_id ON tb_order(series_id);
-- 添加字段注释
COMMENT ON COLUMN tb_order.seller_shop_id IS '销售店铺ID用于成本价差佣金计算';
COMMENT ON COLUMN tb_order.seller_cost_price IS '销售成本价(分,用于计算利润)';
COMMENT ON COLUMN tb_order.series_id IS '系列ID用于查询分配配置';