feat: 实现套餐管理模块,包含套餐系列、双状态管理、废弃模型清理
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m24s

- 新增套餐系列管理 (CRUD + 状态切换)
- 新增套餐管理 (CRUD + 启用/禁用 + 上架/下架双状态)
- 清理 8 个废弃分佣模型及对应数据库表
- Package 模型新增建议成本价、建议售价、上架状态字段
- 完整的 Store/Service/Handler 三层实现
- 包含单元测试和集成测试
- 归档 add-package-module change
- 新增多个 OpenSpec changes (订单支付、店铺套餐分配、一次性分佣、卡设备系列绑定)
This commit is contained in:
2026-01-27 19:55:47 +08:00
parent 30a0717316
commit 79c061b6fa
70 changed files with 7554 additions and 244 deletions

View File

@@ -0,0 +1,162 @@
-- 回滚: 删除 tb_package 表的新字段
ALTER TABLE tb_package DROP COLUMN IF EXISTS suggested_cost_price;
ALTER TABLE tb_package DROP COLUMN IF EXISTS suggested_retail_price;
ALTER TABLE tb_package DROP COLUMN IF EXISTS shelf_status;
-- 回滚: 重建废弃表结构(仅结构,不恢复数据)
-- 代理层级关系表
CREATE TABLE IF NOT EXISTS tb_agent_hierarchy (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
agent_id BIGINT NOT NULL,
parent_agent_id BIGINT,
level INT NOT NULL,
path VARCHAR(500)
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_hierarchy_agent ON tb_agent_hierarchy(agent_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_agent_hierarchy_parent ON tb_agent_hierarchy(parent_agent_id);
COMMENT ON TABLE tb_agent_hierarchy IS '代理层级关系表';
-- 分佣规则表
CREATE TABLE IF NOT EXISTS tb_commission_rule (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
agent_id BIGINT NOT NULL,
business_type VARCHAR(50) NOT NULL,
card_type VARCHAR(50) NOT NULL,
series_id BIGINT,
package_id BIGINT,
commission_type VARCHAR(50) NOT NULL,
commission_mode VARCHAR(20) NOT NULL,
commission_value BIGINT NOT NULL,
unfreeze_days INT DEFAULT 0,
min_activation_for_unfreeze INT DEFAULT 0,
approval_type VARCHAR(20) DEFAULT 'auto',
status INT DEFAULT 1 NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_commission_rule_agent ON tb_commission_rule(agent_id);
CREATE INDEX IF NOT EXISTS idx_commission_rule_series ON tb_commission_rule(series_id);
CREATE INDEX IF NOT EXISTS idx_commission_rule_package ON tb_commission_rule(package_id);
COMMENT ON TABLE tb_commission_rule IS '分佣规则表';
-- 阶梯分佣配置表
CREATE TABLE IF NOT EXISTS tb_commission_ladder (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
rule_id BIGINT NOT NULL,
ladder_type VARCHAR(50) NOT NULL,
threshold_value INT NOT NULL,
commission_mode VARCHAR(20) NOT NULL,
commission_value BIGINT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_commission_ladder_rule ON tb_commission_ladder(rule_id);
COMMENT ON TABLE tb_commission_ladder IS '阶梯分佣配置表';
-- 组合分佣条件表
CREATE TABLE IF NOT EXISTS tb_commission_combined_condition (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
rule_id BIGINT NOT NULL,
one_time_commission_mode VARCHAR(20),
one_time_commission_value BIGINT,
long_term_commission_mode VARCHAR(20),
long_term_commission_value BIGINT,
long_term_trigger_time_point TIMESTAMPTZ,
long_term_trigger_package_cycles INT,
long_term_trigger_network_months INT,
long_term_unfreeze_days INT DEFAULT 0,
long_term_min_activation INT DEFAULT 0
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_commission_combined_rule ON tb_commission_combined_condition(rule_id) WHERE deleted_at IS NULL;
COMMENT ON TABLE tb_commission_combined_condition IS '组合分佣条件表';
-- 分佣审批表
CREATE TABLE IF NOT EXISTS tb_commission_approval (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
commission_record_id BIGINT NOT NULL,
approver_id BIGINT,
status INT DEFAULT 1 NOT NULL,
reason TEXT
);
CREATE INDEX IF NOT EXISTS idx_commission_approval_record ON tb_commission_approval(commission_record_id);
CREATE INDEX IF NOT EXISTS idx_commission_approval_approver ON tb_commission_approval(approver_id);
COMMENT ON TABLE tb_commission_approval IS '分佣审批表';
-- 分佣模板表
CREATE TABLE IF NOT EXISTS tb_commission_template (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
template_name VARCHAR(255) NOT NULL,
business_type VARCHAR(50) NOT NULL,
card_type VARCHAR(50) NOT NULL,
commission_type VARCHAR(50) NOT NULL,
commission_mode VARCHAR(20) NOT NULL,
commission_value BIGINT NOT NULL,
unfreeze_days INT DEFAULT 0,
min_activation_for_unfreeze INT DEFAULT 0,
approval_type VARCHAR(20) DEFAULT 'auto'
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_commission_template_name ON tb_commission_template(template_name) WHERE deleted_at IS NULL;
COMMENT ON TABLE tb_commission_template IS '分佣模板表';
-- 运营商结算表
CREATE TABLE IF NOT EXISTS tb_carrier_settlement (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
commission_record_id BIGINT NOT NULL,
agent_id BIGINT NOT NULL,
settlement_month VARCHAR(20) NOT NULL,
settlement_amount BIGINT NOT NULL,
status INT DEFAULT 1 NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_carrier_settlement_record ON tb_carrier_settlement(commission_record_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_carrier_settlement_agent ON tb_carrier_settlement(agent_id);
COMMENT ON TABLE tb_carrier_settlement IS '运营商结算表';
-- 代理套餐分配表
CREATE TABLE IF NOT EXISTS tb_agent_package_allocation (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0,
updater BIGINT DEFAULT 0,
agent_id BIGINT NOT NULL,
package_id BIGINT NOT NULL,
cost_price BIGINT NOT NULL,
retail_price BIGINT NOT NULL,
status INT DEFAULT 1 NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_agent_package_allocation_agent ON tb_agent_package_allocation(agent_id);
CREATE INDEX IF NOT EXISTS idx_agent_package_allocation_package ON tb_agent_package_allocation(package_id);
COMMENT ON TABLE tb_agent_package_allocation IS '代理套餐分配表';

View File

@@ -0,0 +1,21 @@
-- 清理废弃的分佣相关表
-- 这些表从未在生产环境使用,可以直接删除
-- 删除废弃表
DROP TABLE IF EXISTS tb_agent_hierarchy;
DROP TABLE IF EXISTS tb_commission_rule;
DROP TABLE IF EXISTS tb_commission_ladder;
DROP TABLE IF EXISTS tb_commission_combined_condition;
DROP TABLE IF EXISTS tb_commission_approval;
DROP TABLE IF EXISTS tb_commission_template;
DROP TABLE IF EXISTS tb_carrier_settlement;
DROP TABLE IF EXISTS tb_agent_package_allocation;
-- 为 tb_package 表添加新字段
ALTER TABLE tb_package ADD COLUMN IF NOT EXISTS suggested_cost_price BIGINT DEFAULT 0;
ALTER TABLE tb_package ADD COLUMN IF NOT EXISTS suggested_retail_price BIGINT DEFAULT 0;
ALTER TABLE tb_package ADD COLUMN IF NOT EXISTS shelf_status INT DEFAULT 2 NOT NULL;
COMMENT ON COLUMN tb_package.suggested_cost_price IS '建议成本价(分为单位)';
COMMENT ON COLUMN tb_package.suggested_retail_price IS '建议售价(分为单位)';
COMMENT ON COLUMN tb_package.shelf_status IS '上架状态 1-上架 2-下架';