feat: 实现门店套餐分配功能并统一测试基础设施
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m30s

新增功能:
- 门店套餐分配管理(shop_package_allocation):支持门店套餐库存管理
- 门店套餐系列分配管理(shop_series_allocation):支持套餐系列分配和佣金层级设置
- 我的套餐查询(my_package):支持门店查询自己的套餐分配情况

测试改进:
- 统一集成测试基础设施,新增 testutils.NewIntegrationTestEnv
- 重构所有集成测试使用新的测试环境设置
- 移除旧的测试辅助函数和冗余测试文件
- 新增 test_helpers_test.go 统一任务测试辅助

技术细节:
- 新增数据库迁移 000025_create_shop_allocation_tables
- 新增 3 个 Handler、Service、Store 和对应的单元测试
- 更新 OpenAPI 文档和文档生成器
- 测试覆盖率:Service 层 > 90%

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-28 10:45:16 +08:00
parent 5fefe9d0cb
commit 23eb0307bb
73 changed files with 8716 additions and 4558 deletions

View File

@@ -0,0 +1,8 @@
-- 删除店铺单套餐分配表
DROP TABLE IF EXISTS tb_shop_package_allocation;
-- 删除梯度佣金配置表
DROP TABLE IF EXISTS tb_shop_series_commission_tier;
-- 删除店铺套餐系列分配表
DROP TABLE IF EXISTS tb_shop_series_allocation;

View File

@@ -0,0 +1,89 @@
-- 创建店铺套餐系列分配表
CREATE TABLE IF NOT EXISTS tb_shop_series_allocation (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0 NOT NULL,
updater BIGINT DEFAULT 0 NOT NULL,
shop_id BIGINT NOT NULL,
series_id BIGINT NOT NULL,
allocator_shop_id BIGINT NOT NULL,
pricing_mode VARCHAR(20) NOT NULL,
pricing_value BIGINT NOT NULL,
one_time_commission_trigger VARCHAR(30),
one_time_commission_threshold BIGINT DEFAULT 0,
one_time_commission_amount BIGINT DEFAULT 0,
status INT DEFAULT 1 NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_shop_series_allocation_shop_id ON tb_shop_series_allocation(shop_id);
CREATE INDEX IF NOT EXISTS idx_shop_series_allocation_series_id ON tb_shop_series_allocation(series_id);
CREATE INDEX IF NOT EXISTS idx_shop_series_allocation_allocator_shop_id ON tb_shop_series_allocation(allocator_shop_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_shop_series_allocation_shop_series ON tb_shop_series_allocation(shop_id, series_id) WHERE deleted_at IS NULL;
COMMENT ON TABLE tb_shop_series_allocation IS '店铺套餐系列分配表';
COMMENT ON COLUMN tb_shop_series_allocation.shop_id IS '被分配的店铺ID';
COMMENT ON COLUMN tb_shop_series_allocation.series_id IS '套餐系列ID';
COMMENT ON COLUMN tb_shop_series_allocation.allocator_shop_id IS '分配者店铺ID上级';
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 '一次性佣金金额(分)';
COMMENT ON COLUMN tb_shop_series_allocation.status IS '状态 1-启用 2-禁用';
-- 创建梯度佣金配置表
CREATE TABLE IF NOT EXISTS tb_shop_series_commission_tier (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0 NOT NULL,
updater BIGINT DEFAULT 0 NOT NULL,
allocation_id BIGINT NOT NULL,
tier_type VARCHAR(20) NOT NULL,
period_type VARCHAR(20) NOT NULL,
period_start_date TIMESTAMPTZ,
period_end_date TIMESTAMPTZ,
threshold_value BIGINT NOT NULL,
commission_amount BIGINT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_shop_series_commission_tier_allocation_id ON tb_shop_series_commission_tier(allocation_id);
COMMENT ON TABLE tb_shop_series_commission_tier IS '梯度佣金配置表';
COMMENT ON COLUMN tb_shop_series_commission_tier.allocation_id IS '关联的分配ID';
COMMENT ON COLUMN tb_shop_series_commission_tier.tier_type IS '梯度类型 sales_count-销量 sales_amount-销售额';
COMMENT ON COLUMN tb_shop_series_commission_tier.period_type IS '周期类型 monthly-月度 quarterly-季度 yearly-年度 custom-自定义';
COMMENT ON COLUMN tb_shop_series_commission_tier.period_start_date IS '自定义周期开始日期';
COMMENT ON COLUMN tb_shop_series_commission_tier.period_end_date IS '自定义周期结束日期';
COMMENT ON COLUMN tb_shop_series_commission_tier.threshold_value IS '阈值(销量或金额分)';
COMMENT ON COLUMN tb_shop_series_commission_tier.commission_amount IS '佣金金额(分)';
-- 创建店铺单套餐分配表
CREATE TABLE IF NOT EXISTS tb_shop_package_allocation (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ,
creator BIGINT DEFAULT 0 NOT NULL,
updater BIGINT DEFAULT 0 NOT NULL,
shop_id BIGINT NOT NULL,
package_id BIGINT NOT NULL,
allocation_id BIGINT NOT NULL,
cost_price BIGINT NOT NULL,
status INT DEFAULT 1 NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_shop_package_allocation_shop_id ON tb_shop_package_allocation(shop_id);
CREATE INDEX IF NOT EXISTS idx_shop_package_allocation_package_id ON tb_shop_package_allocation(package_id);
CREATE INDEX IF NOT EXISTS idx_shop_package_allocation_allocation_id ON tb_shop_package_allocation(allocation_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_shop_package_allocation_shop_package ON tb_shop_package_allocation(shop_id, package_id) WHERE deleted_at IS NULL;
COMMENT ON TABLE tb_shop_package_allocation IS '店铺单套餐分配表';
COMMENT ON COLUMN tb_shop_package_allocation.shop_id IS '被分配的店铺ID';
COMMENT ON COLUMN tb_shop_package_allocation.package_id IS '套餐ID';
COMMENT ON COLUMN tb_shop_package_allocation.allocation_id IS '关联的系列分配ID';
COMMENT ON COLUMN tb_shop_package_allocation.cost_price IS '覆盖的成本价(分)';
COMMENT ON COLUMN tb_shop_package_allocation.status IS '状态 1-启用 2-禁用';