Files
junhong_cmp_fiber/migrations/000010_add_commission_model_changes.up.sql
huang 91c9bbfeb8
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m35s
feat: 实现账号与佣金管理模块
新增功能:
- 店铺佣金查询:店铺佣金统计、店铺佣金记录列表、店铺提现记录
- 佣金提现审批:提现申请列表、审批通过、审批拒绝
- 提现配置管理:配置列表、新增配置、获取当前生效配置
- 企业管理:企业列表、创建、更新、删除、获取详情
- 企业卡授权:授权列表、批量授权、批量取消授权、统计
- 客户账号管理:账号列表、创建、更新状态、重置密码
- 我的佣金:佣金统计、佣金记录、提现申请、提现记录

数据库变更:
- 扩展 tb_commission_withdrawal_request 新增提现单号等字段
- 扩展 tb_account 新增 is_primary 字段
- 扩展 tb_commission_record 新增 shop_id、balance_after
- 扩展 tb_commission_withdrawal_setting 新增每日提现次数限制
- 扩展 tb_iot_card、tb_device 新增 shop_id 冗余字段
- 新建 tb_enterprise_card_authorization 企业卡授权表
- 新建 tb_asset_allocation_record 资产分配记录表
- 数据迁移:owner_type 枚举值 agent 统一为 shop

测试:
- 新增 7 个单元测试文件覆盖各服务
- 修复集成测试 Redis 依赖问题
2026-01-21 18:20:44 +08:00

186 lines
9.0 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.
-- 迁移: 账号与佣金管理模块数据模型变更
-- 变更ID: add-commission-model-changes
-- 说明:
-- 1. 扩展现有表字段
-- 2. 创建企业卡授权表和资产分配记录表
-- 3. 统一 owner_type 枚举值 (agent -> shop)
-- ========================================
-- 1. 扩展现有表字段
-- ========================================
-- 1.1 tb_commission_withdrawal_request 佣金提现申请表新增字段
ALTER TABLE tb_commission_withdrawal_request
ADD COLUMN IF NOT EXISTS withdrawal_no VARCHAR(50),
ADD COLUMN IF NOT EXISTS applicant_id BIGINT,
ADD COLUMN IF NOT EXISTS shop_id BIGINT,
ADD COLUMN IF NOT EXISTS fee_rate BIGINT DEFAULT 0,
ADD COLUMN IF NOT EXISTS payment_type VARCHAR(20) DEFAULT 'manual',
ADD COLUMN IF NOT EXISTS processor_id BIGINT,
ADD COLUMN IF NOT EXISTS processed_at TIMESTAMP WITH TIME ZONE,
ADD COLUMN IF NOT EXISTS remark TEXT;
-- 添加唯一索引(提现单号)
CREATE UNIQUE INDEX IF NOT EXISTS uk_commission_withdrawal_no
ON tb_commission_withdrawal_request(withdrawal_no) WHERE deleted_at IS NULL AND withdrawal_no IS NOT NULL;
-- 添加字段注释
COMMENT ON COLUMN tb_commission_withdrawal_request.withdrawal_no IS '提现单号唯一格式W + 时间戳 + 随机数)';
COMMENT ON COLUMN tb_commission_withdrawal_request.applicant_id IS '申请人账号ID';
COMMENT ON COLUMN tb_commission_withdrawal_request.shop_id IS '店铺ID冗余字段';
COMMENT ON COLUMN tb_commission_withdrawal_request.fee_rate IS '手续费比率基点100=1%,快照)';
COMMENT ON COLUMN tb_commission_withdrawal_request.payment_type IS '放款类型manual=人工打款)';
COMMENT ON COLUMN tb_commission_withdrawal_request.processor_id IS '处理人ID';
COMMENT ON COLUMN tb_commission_withdrawal_request.processed_at IS '处理时间';
COMMENT ON COLUMN tb_commission_withdrawal_request.remark IS '备注';
-- 1.2 tb_account 账号表新增字段
ALTER TABLE tb_account
ADD COLUMN IF NOT EXISTS is_primary BOOLEAN DEFAULT FALSE;
COMMENT ON COLUMN tb_account.is_primary IS '是否为店铺主账号(默认 false';
-- 1.3 tb_commission_record 佣金记录表新增字段
ALTER TABLE tb_commission_record
ADD COLUMN IF NOT EXISTS shop_id BIGINT,
ADD COLUMN IF NOT EXISTS balance_after BIGINT DEFAULT 0;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_commission_record_shop_id ON tb_commission_record(shop_id);
COMMENT ON COLUMN tb_commission_record.shop_id IS '店铺ID佣金主要跟着店铺走';
COMMENT ON COLUMN tb_commission_record.balance_after IS '入账后佣金余额(分)';
-- 1.4 tb_commission_withdrawal_setting 提现设置表新增字段
ALTER TABLE tb_commission_withdrawal_setting
ADD COLUMN IF NOT EXISTS daily_withdrawal_limit INT DEFAULT 3;
COMMENT ON COLUMN tb_commission_withdrawal_setting.daily_withdrawal_limit IS '每日提现次数限制';
-- 1.5 tb_iot_card 物联网卡表新增字段
ALTER TABLE tb_iot_card
ADD COLUMN IF NOT EXISTS shop_id BIGINT;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_iot_card_shop_id ON tb_iot_card(shop_id);
COMMENT ON COLUMN tb_iot_card.shop_id IS '店铺ID冗余字段方便查询';
-- 1.6 tb_device 设备表新增字段
ALTER TABLE tb_device
ADD COLUMN IF NOT EXISTS shop_id BIGINT;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_device_shop_id ON tb_device(shop_id);
COMMENT ON COLUMN tb_device.shop_id IS '店铺ID冗余字段方便查询';
-- ========================================
-- 2. 创建新表
-- ========================================
-- 2.1 tb_enterprise_card_authorization 企业卡授权表
CREATE TABLE IF NOT EXISTS tb_enterprise_card_authorization (
id BIGSERIAL PRIMARY KEY,
enterprise_id BIGINT NOT NULL,
iot_card_id BIGINT NOT NULL,
shop_id BIGINT NOT NULL,
authorized_by BIGINT NOT NULL,
authorized_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
status INT 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 UNIQUE INDEX IF NOT EXISTS uk_enterprise_card
ON tb_enterprise_card_authorization(enterprise_id, iot_card_id) WHERE deleted_at IS NULL;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_enterprise_card_auth_enterprise_id ON tb_enterprise_card_authorization(enterprise_id);
CREATE INDEX IF NOT EXISTS idx_enterprise_card_auth_iot_card_id ON tb_enterprise_card_authorization(iot_card_id);
CREATE INDEX IF NOT EXISTS idx_enterprise_card_auth_shop_id ON tb_enterprise_card_authorization(shop_id);
CREATE INDEX IF NOT EXISTS idx_enterprise_card_auth_status ON tb_enterprise_card_authorization(status);
-- 添加表注释
COMMENT ON TABLE tb_enterprise_card_authorization IS '企业卡授权表,记录企业被授权可见的卡';
COMMENT ON COLUMN tb_enterprise_card_authorization.enterprise_id IS '企业ID';
COMMENT ON COLUMN tb_enterprise_card_authorization.iot_card_id IS 'IoT卡ID';
COMMENT ON COLUMN tb_enterprise_card_authorization.shop_id IS '店铺ID授权方';
COMMENT ON COLUMN tb_enterprise_card_authorization.authorized_by IS '授权人ID';
COMMENT ON COLUMN tb_enterprise_card_authorization.authorized_at IS '授权时间';
COMMENT ON COLUMN tb_enterprise_card_authorization.status IS '状态 1=有效 0=已回收';
COMMENT ON COLUMN tb_enterprise_card_authorization.creator IS '创建人ID';
COMMENT ON COLUMN tb_enterprise_card_authorization.updater IS '更新人ID';
-- 2.2 tb_asset_allocation_record 资产分配记录表
CREATE TABLE IF NOT EXISTS tb_asset_allocation_record (
id BIGSERIAL PRIMARY KEY,
allocation_no VARCHAR(50) NOT NULL,
allocation_type VARCHAR(20) NOT NULL,
asset_type VARCHAR(20) NOT NULL,
asset_id BIGINT NOT NULL,
asset_identifier VARCHAR(50) NOT NULL,
from_owner_type VARCHAR(20),
from_owner_id BIGINT,
to_owner_type VARCHAR(20) NOT NULL,
to_owner_id BIGINT NOT NULL,
related_device_id BIGINT,
related_card_ids JSONB,
operator_id BIGINT NOT NULL,
remark TEXT,
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 UNIQUE INDEX IF NOT EXISTS uk_asset_allocation_no
ON tb_asset_allocation_record(allocation_no) WHERE deleted_at IS NULL;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_asset_allocation_type ON tb_asset_allocation_record(allocation_type);
CREATE INDEX IF NOT EXISTS idx_asset_allocation_asset_type ON tb_asset_allocation_record(asset_type);
CREATE INDEX IF NOT EXISTS idx_asset_allocation_asset_id ON tb_asset_allocation_record(asset_id);
CREATE INDEX IF NOT EXISTS idx_asset_allocation_from_owner ON tb_asset_allocation_record(from_owner_type, from_owner_id);
CREATE INDEX IF NOT EXISTS idx_asset_allocation_to_owner ON tb_asset_allocation_record(to_owner_type, to_owner_id);
-- 添加表注释
COMMENT ON TABLE tb_asset_allocation_record IS '资产分配记录表,记录卡/设备在平台和代理商之间的流转历史';
COMMENT ON COLUMN tb_asset_allocation_record.allocation_no IS '分配单号(唯一)';
COMMENT ON COLUMN tb_asset_allocation_record.allocation_type IS '分配类型 allocate=分配 recall=回收';
COMMENT ON COLUMN tb_asset_allocation_record.asset_type IS '资产类型 iot_card=物联网卡 device=设备';
COMMENT ON COLUMN tb_asset_allocation_record.asset_id IS '资产ID';
COMMENT ON COLUMN tb_asset_allocation_record.asset_identifier IS '资产标识符ICCID或设备号';
COMMENT ON COLUMN tb_asset_allocation_record.from_owner_type IS '来源所有者类型';
COMMENT ON COLUMN tb_asset_allocation_record.from_owner_id IS '来源所有者ID';
COMMENT ON COLUMN tb_asset_allocation_record.to_owner_type IS '目标所有者类型';
COMMENT ON COLUMN tb_asset_allocation_record.to_owner_id IS '目标所有者ID';
COMMENT ON COLUMN tb_asset_allocation_record.related_device_id IS '关联设备ID';
COMMENT ON COLUMN tb_asset_allocation_record.related_card_ids IS '关联卡ID列表';
COMMENT ON COLUMN tb_asset_allocation_record.operator_id IS '操作人ID';
COMMENT ON COLUMN tb_asset_allocation_record.remark IS '备注';
COMMENT ON COLUMN tb_asset_allocation_record.creator IS '创建人ID';
COMMENT ON COLUMN tb_asset_allocation_record.updater IS '更新人ID';
-- ========================================
-- 3. 数据迁移 - owner_type 枚举统一
-- ========================================
-- 3.1 更新 tb_iot_card 表 owner_type='agent' 为 'shop'
UPDATE tb_iot_card SET owner_type = 'shop' WHERE owner_type = 'agent';
-- 3.2 更新 tb_device 表 owner_type='agent' 为 'shop'
UPDATE tb_device SET owner_type = 'shop' WHERE owner_type = 'agent';
-- 3.3 填充 tb_iot_card.shop_id 字段owner_type='shop' 时等于 owner_id
UPDATE tb_iot_card SET shop_id = owner_id WHERE owner_type = 'shop' AND shop_id IS NULL;
-- 3.4 填充 tb_device.shop_id 字段owner_type='shop' 时等于 owner_id
UPDATE tb_device SET shop_id = owner_id WHERE owner_type = 'shop' AND shop_id IS NULL;