From 15948cbd64b8d6f7105b69fc5f7000b6b4f29107 Mon Sep 17 00:00:00 2001 From: Neo Date: Wed, 4 Feb 2026 21:19:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=84=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etl_billiards/database/seed_dws_config.sql | 347 +++++++++++++++++++++ etl_billiards/scripts/show_level_price.py | 39 +++ 2 files changed, 386 insertions(+) create mode 100644 etl_billiards/database/seed_dws_config.sql create mode 100644 etl_billiards/scripts/show_level_price.py diff --git a/etl_billiards/database/seed_dws_config.sql b/etl_billiards/database/seed_dws_config.sql new file mode 100644 index 0000000..b5f3b17 --- /dev/null +++ b/etl_billiards/database/seed_dws_config.sql @@ -0,0 +1,347 @@ +-- ============================================================================= +-- DWS 配置表初始数据 +-- 版本: v3.0 +-- 创建日期: 2026-02-01 +-- 描述: 初始化配置表数据,包含绩效档位、等级定价、奖金规则、区域分类、技能映射 +-- ============================================================================= + +-- ============================================================================= +-- 1. cfg_performance_tier - 绩效档位配置(6档 + 新入职) +-- 数据来源:DWS 数据库处理需求.md 第35-41行 +-- 档位原因考虑 总业绩小时数阈值 专业课抽成(元/小时) 打赏课抽成 次月休假(天) +-- 0档 淘汰压力 H <100 28 50% 3 +-- 1档 及格档(重点激励) 100≤ H <130 18 40% 4 +-- 2档 良好档(重点激励) 130≤ H <160 15 38% 4 +-- 3档 优秀档 160≤ H <190 13 35% 5 +-- 4档 卓越加速档(高端人才倾斜) 190≤ H <220 10 33% 6 +-- 5档 冠军加速档(高端人才倾斜) H ≥220 8 30% 休假自由 +-- ============================================================================= +TRUNCATE TABLE billiards_dws.cfg_performance_tier RESTART IDENTITY CASCADE; + +INSERT INTO billiards_dws.cfg_performance_tier ( + tier_code, tier_name, tier_level, + min_hours, max_hours, + base_deduction, bonus_deduction_ratio, vacation_days, vacation_unlimited, + is_new_hire_tier, effective_from, effective_to, description +) VALUES +-- 0档 淘汰压力: H<100, 专业课抽成28元/小时, 打赏课抽成50%, 休假3天 +('T0', '0档-淘汰压力', 0, + 0, 100, + 28.00, 0.50, 3, FALSE, + FALSE, '2000-01-01', '9999-12-31', + '淘汰压力档:H<100,专业课抽成28元/小时,打赏课抽成50%,休假3天'), + +-- 1档 及格档: 100≤H<130, 专业课抽成18元/小时, 打赏课抽成40%, 休假4天 +('T1', '1档-及格档', 1, + 100, 130, + 18.00, 0.40, 4, FALSE, + FALSE, '2000-01-01', '9999-12-31', + '及格档(重点激励):100≤H<130,专业课抽成18元/小时,打赏课抽成40%,休假4天'), + +-- 2档 良好档: 130≤H<160, 专业课抽成15元/小时, 打赏课抽成38%, 休假4天 +('T2', '2档-良好档', 2, + 130, 160, + 15.00, 0.38, 4, FALSE, + FALSE, '2000-01-01', '9999-12-31', + '良好档(重点激励):130≤H<160,专业课抽成15元/小时,打赏课抽成38%,休假4天'), + +-- 3档 优秀档: 160≤H<190, 专业课抽成13元/小时, 打赏课抽成35%, 休假5天 +('T3', '3档-优秀档', 3, + 160, 190, + 13.00, 0.35, 5, FALSE, + FALSE, '2000-01-01', '9999-12-31', + '优秀档:160≤H<190,专业课抽成13元/小时,打赏课抽成35%,休假5天'), + +-- 4档 卓越加速档: 190≤H<220, 专业课抽成10元/小时, 打赏课抽成33%, 休假6天 +('T4', '4档-卓越加速档', 4, + 190, 220, + 10.00, 0.33, 6, FALSE, + FALSE, '2000-01-01', '9999-12-31', + '卓越加速档(高端人才倾斜):190≤H<220,专业课抽成10元/小时,打赏课抽成33%,休假6天'), + +-- 5档 冠军加速档: H≥220, 专业课抽成8元/小时, 打赏课抽成30%, 休假自由 +('T5', '5档-冠军加速档', 5, + 220, NULL, + 8.00, 0.30, 0, TRUE, + FALSE, '2000-01-01', '9999-12-31', + '冠军加速档(高端人才倾斜):H≥220,专业课抽成8元/小时,打赏课抽成30%,休假自由'), + +-- 新入职档位: 首月特殊处理(按1档标准,但不参与排名) +('NEW', '新入职档位', -1, + 0, NULL, + 18.00, 0.40, 4, FALSE, + TRUE, '2000-01-01', '9999-12-31', + '新入职:月1日0点后入职者首月使用,按1档抽成标准,不参与排名奖金'); + + +-- ============================================================================= +-- 2. cfg_assistant_level_price - 助教等级定价 +-- 说明: +-- - level_code 来自 dim_assistant.assistant_level +-- - 8=助教管理, 10=初级, 20=中级, 30=高级, 40=星级 +-- - 价格为客户支付价格(对外价格),助教收入=客户支付-档位抽成 +-- - 数据来源:DWS 数据库处理需求.md +-- ============================================================================= +TRUNCATE TABLE billiards_dws.cfg_assistant_level_price RESTART IDENTITY CASCADE; + +INSERT INTO billiards_dws.cfg_assistant_level_price ( + level_code, level_name, + base_course_price, bonus_course_price, + effective_from, effective_to, description +) VALUES +-- 初级助教:基础课对客户收费98元/小时 +(10, '初级', + 98.00, 190.00, + '2000-01-01', '9999-12-31', + '初级助教:基础课98元/时,附加课190元/时(客户支付价格)'), + +-- 中级助教:基础课对客户收费108元/小时 +(20, '中级', + 108.00, 190.00, + '2000-01-01', '9999-12-31', + '中级助教:基础课108元/时,附加课190元/时(客户支付价格)'), + +-- 高级助教:基础课对客户收费118元/小时 +(30, '高级', + 118.00, 190.00, + '2000-01-01', '9999-12-31', + '高级助教:基础课118元/时,附加课190元/时(客户支付价格)'), + +-- 星级助教:基础课对客户收费138元/小时 +(40, '星级', + 138.00, 190.00, + '2000-01-01', '9999-12-31', + '星级助教:基础课138元/时,附加课190元/时(客户支付价格)'), + +-- 助教管理:level_code=8,通常不参与客户服务计费,此处设置默认值 +(8, '助教管理', + 98.00, 190.00, + '2000-01-01', '9999-12-31', + '助教管理:不参与客户服务计费,默认按初级价格'); + + +-- ============================================================================= +-- 3. cfg_bonus_rules - 奖金规则配置 +-- 说明: +-- - SPRINT: 冲刺奖金,按业绩小时数阈值,不累计取最高档 +-- - TOP_RANK: Top3排名奖金,按有效业绩排名,并列都算 +-- ============================================================================= +TRUNCATE TABLE billiards_dws.cfg_bonus_rules RESTART IDENTITY CASCADE; + +INSERT INTO billiards_dws.cfg_bonus_rules ( + rule_type, rule_code, rule_name, + threshold_hours, rank_position, bonus_amount, + is_cumulative, priority, + effective_from, effective_to, description +) VALUES +-- 冲刺奖金: H>=190 得300元 +('SPRINT', 'SPRINT_190', '冲刺奖金190', + 190.00, NULL, 300.00, + FALSE, 1, + '2000-01-01', '9999-12-31', + '业绩≥190小时,获得300元冲刺奖金(不累计)'), + +-- 冲刺奖金: H>=220 得800元(优先级更高,覆盖190档) +('SPRINT', 'SPRINT_220', '冲刺奖金220', + 220.00, NULL, 800.00, + FALSE, 2, + '2000-01-01', '9999-12-31', + '业绩≥220小时,获得800元冲刺奖金(覆盖190档)'), + +-- Top1排名奖金: 1000元 +('TOP_RANK', 'TOP_1', 'Top1排名奖金', + NULL, 1, 1000.00, + FALSE, 0, + '2000-01-01', '9999-12-31', + '月度排名第一,获得1000元(并列都算)'), + +-- Top2排名奖金: 600元 +('TOP_RANK', 'TOP_2', 'Top2排名奖金', + NULL, 2, 600.00, + FALSE, 0, + '2000-01-01', '9999-12-31', + '月度排名第二,获得600元(并列都算)'), + +-- Top3排名奖金: 400元 +('TOP_RANK', 'TOP_3', 'Top3排名奖金', + NULL, 3, 400.00, + FALSE, 0, + '2000-01-01', '9999-12-31', + '月度排名第三,获得400元(并列都算)'); + + +-- ============================================================================= +-- 4. cfg_area_category - 台区分类映射 +-- 说明: +-- - 将 dim_table.site_table_area_name 映射到财务报表区域分类 +-- - 映射规则: 精确匹配 > 模糊匹配 > 默认兜底 +-- - 数据来源: BD_manual_dim_table.md 中的 site_table_area_name 实际分布 +-- 分类设计: +-- - BILLIARD: 台球散台(A区/B区/C区/TV台) +-- - BILLIARD_VIP: 台球VIP包厢 +-- - SNOOKER: 斯诺克区 +-- - MAHJONG: 麻将区 +-- - KTV: K歌/KTV +-- - SPECIAL: 特殊(补时长等) +-- - OTHER: 其他 +-- ============================================================================= +TRUNCATE TABLE billiards_dws.cfg_area_category RESTART IDENTITY CASCADE; + +INSERT INTO billiards_dws.cfg_area_category ( + source_area_name, category_code, category_name, + match_type, match_priority, is_active, description +) VALUES +-- ============ 台球散台区(精确匹配)============ +('A区', 'BILLIARD', '台球散台', + 'EXACT', 10, TRUE, '台球散台:A区(18台)- 中八/追分'), +('B区', 'BILLIARD', '台球散台', + 'EXACT', 10, TRUE, '台球散台:B区(15台)- 中八/追分'), +('C区', 'BILLIARD', '台球散台', + 'EXACT', 10, TRUE, '台球散台:C区(6台)- 中八/追分'), +('TV台', 'BILLIARD', '台球散台', + 'EXACT', 10, TRUE, '台球散台:TV台(1台)- 中八/追分'), + +-- ============ 台球VIP包厢(精确匹配)============ +('VIP包厢', 'BILLIARD_VIP', '台球VIP', + 'EXACT', 10, TRUE, '台球VIP:VIP包厢(4台)- V1-V4中八, V5斯诺克'), + +-- ============ 斯诺克区(精确匹配)============ +('斯诺克区', 'SNOOKER', '斯诺克', + 'EXACT', 10, TRUE, '斯诺克:斯诺克区(4台)'), + +-- ============ 麻将区(精确匹配)============ +('麻将房', 'MAHJONG', '麻将棋牌', + 'EXACT', 10, TRUE, '麻将棋牌:麻将房(5台)'), +('M7', 'MAHJONG', '麻将棋牌', + 'EXACT', 10, TRUE, '麻将棋牌:M7(2台)'), +('M8', 'MAHJONG', '麻将棋牌', + 'EXACT', 10, TRUE, '麻将棋牌:M8(1台)'), +('666', 'MAHJONG', '麻将棋牌', + 'EXACT', 10, TRUE, '麻将棋牌:666(2台)'), +('发财', 'MAHJONG', '麻将棋牌', + 'EXACT', 10, TRUE, '麻将棋牌:发财(1台)'), + +-- ============ KTV/K包(精确匹配)============ +('K包', 'KTV', 'K歌娱乐', + 'EXACT', 10, TRUE, 'K歌娱乐:K包(4台)'), +('k包活动区', 'KTV', 'K歌娱乐', + 'EXACT', 10, TRUE, 'K歌娱乐:k包活动区(2台)'), +('幸会158', 'KTV', 'K歌娱乐', + 'EXACT', 10, TRUE, 'K歌娱乐:幸会158(2台)'), + +-- ============ 特殊区域(精确匹配)============ +('补时长', 'SPECIAL', '补时长', + 'EXACT', 10, TRUE, '特殊:补时长(7台)- 用于时长补录'), + +-- ============ 模糊匹配规则(优先级较低)============ +('%VIP%', 'BILLIARD_VIP', '台球VIP', + 'LIKE', 50, TRUE, '模糊匹配:包含"VIP"的区域'), +('%斯诺克%', 'SNOOKER', '斯诺克', + 'LIKE', 50, TRUE, '模糊匹配:包含"斯诺克"的区域'), +('%麻将%', 'MAHJONG', '麻将棋牌', + 'LIKE', 50, TRUE, '模糊匹配:包含"麻将"的区域'), +('%K包%', 'KTV', 'K歌娱乐', + 'LIKE', 50, TRUE, '模糊匹配:包含"K包"的区域'), +('%KTV%', 'KTV', 'K歌娱乐', + 'LIKE', 50, TRUE, '模糊匹配:包含"KTV"的区域'), + +-- ============ 默认兜底(优先级最低)============ +('DEFAULT', 'OTHER', '其他', + 'DEFAULT', 999, TRUE, '兜底规则:无法匹配的区域归入其他'); + + +-- ============================================================================= +-- 5. cfg_skill_type - 技能→课程类型映射 +-- 说明: +-- - 将 skill_id 映射到课程类型 +-- - 基础课/陪打: skill_id = 2791903611396869 +-- - 附加课/超休: skill_id = 2807440316432197 +-- - 避免依赖 skill_name 文本匹配 +-- ============================================================================= +TRUNCATE TABLE billiards_dws.cfg_skill_type RESTART IDENTITY CASCADE; + +INSERT INTO billiards_dws.cfg_skill_type ( + skill_id, skill_name, + course_type_code, course_type_name, + is_active, description +) VALUES +-- 基础课/陪打 +(2791903611396869, '台球基础陪打', + 'BASE', '基础课', + TRUE, '基础课:陪打服务,按助教等级计价'), + +-- 附加课/超休 +(2807440316432197, '台球超休服务', + 'BONUS', '附加课', + TRUE, '附加课:超休/激励课,固定50元/小时'), + +-- 包厢课(如有) +(2807440316432198, '包厢服务', + 'BASE', '基础课', + TRUE, '包厢服务:归入基础课统计'); + + +-- ============================================================================= +-- 6. 优惠类型配置(用于财务优惠明细分析) +-- 说明: 定义各类优惠的代码和名称,便于后续分析 +-- ============================================================================= +-- 此配置作为代码常量使用,不单独建表 +-- GROUPBUY - 团购优惠 +-- VIP - 会员折扣 +-- GIFT_CARD - 赠送卡抵扣 +-- MANUAL - 手动调整 +-- ROUNDING - 抹零 +-- BIG_CUSTOMER - 大客户优惠(待抽样分析确认) +-- OTHER - 其他优惠 + + +-- ============================================================================= +-- 7. 支出类型配置(用于Excel导入) +-- 说明: 定义各类支出的代码和名称 +-- ============================================================================= +-- 此配置作为代码常量使用,不单独建表 +-- RENT - 房租 +-- UTILITY - 水电费 +-- PROPERTY - 物业费 +-- SALARY - 工资 +-- REIMBURSE - 报销 +-- PLATFORM_FEE - 平台服务费 +-- OTHER - 其他支出 + + +-- ============================================================================= +-- 8. 平台类型配置(用于Excel导入) +-- 说明: 定义各平台的代码和名称 +-- ============================================================================= +-- 此配置作为代码常量使用,不单独建表 +-- MEITUAN - 美团 +-- DOUYIN - 抖音 +-- DIANPING - 大众点评 +-- OTHER - 其他平台 + + +-- ============================================================================= +-- 验证数据插入 +-- ============================================================================= +DO $$ +DECLARE + v_tier_count INTEGER; + v_price_count INTEGER; + v_bonus_count INTEGER; + v_area_count INTEGER; + v_skill_count INTEGER; +BEGIN + SELECT COUNT(*) INTO v_tier_count FROM billiards_dws.cfg_performance_tier; + SELECT COUNT(*) INTO v_price_count FROM billiards_dws.cfg_assistant_level_price; + SELECT COUNT(*) INTO v_bonus_count FROM billiards_dws.cfg_bonus_rules; + SELECT COUNT(*) INTO v_area_count FROM billiards_dws.cfg_area_category; + SELECT COUNT(*) INTO v_skill_count FROM billiards_dws.cfg_skill_type; + + RAISE NOTICE '配置数据初始化完成:'; + RAISE NOTICE ' - cfg_performance_tier: % 条', v_tier_count; + RAISE NOTICE ' - cfg_assistant_level_price: % 条', v_price_count; + RAISE NOTICE ' - cfg_bonus_rules: % 条', v_bonus_count; + RAISE NOTICE ' - cfg_area_category: % 条', v_area_count; + RAISE NOTICE ' - cfg_skill_type: % 条', v_skill_count; +END; +$$; diff --git a/etl_billiards/scripts/show_level_price.py b/etl_billiards/scripts/show_level_price.py new file mode 100644 index 0000000..8410121 --- /dev/null +++ b/etl_billiards/scripts/show_level_price.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +"""显示助教等级定价数据""" + +import os +from pathlib import Path +from dotenv import load_dotenv +import psycopg2 + +def main(): + load_dotenv(Path(__file__).parent.parent / ".env") + dsn = os.getenv("PG_DSN") + conn = psycopg2.connect(dsn) + + print("cfg_assistant_level_price 数据内容:") + print("-" * 80) + print(f"{'level_code':<12} {'level_name':<12} {'base_course_price':<18} {'bonus_course_price':<18}") + print("-" * 80) + + with conn.cursor() as cur: + cur.execute(""" + SELECT level_code, level_name, base_course_price, bonus_course_price, description + FROM billiards_dws.cfg_assistant_level_price + ORDER BY level_code + """) + for row in cur.fetchall(): + print(f"{row[0]:<12} {row[1]:<12} {row[2]:<18} {row[3]:<18}") + + print("-" * 80) + print("\n数据来源依据: DWS 数据库处理需求.md") + print("- 初级 98元/小时") + print("- 中级 108元/小时") + print("- 高级 118元/小时") + print("- 星级 138元/小时") + print("- 附加课统一 190元/小时") + + conn.close() + +if __name__ == "__main__": + main()