init: 项目初始提交 - NeoZQYY Monorepo 完整代码
This commit is contained in:
0
db/etl_feiqiu/migrations/.gitkeep
Normal file
0
db/etl_feiqiu/migrations/.gitkeep
Normal file
144
db/etl_feiqiu/migrations/20260208_relation_index_manual_ml.sql
Normal file
144
db/etl_feiqiu/migrations/20260208_relation_index_manual_ml.sql
Normal file
@@ -0,0 +1,144 @@
|
||||
-- =============================================================================
|
||||
-- 关系指数与 ML 人工台账迁移脚本
|
||||
-- 版本: 2026-02-08
|
||||
-- AI_CHANGELOG [2026-02-13] 移除 INSERT 中的 source_mode 参数(ML 仅用人工台账)
|
||||
-- 说明:
|
||||
-- 1) 新增关系指数结果表 dws_member_assistant_relation_index
|
||||
-- 2) 新增 ML 人工台账宽表/窄表
|
||||
-- 3) 补充 RS/OS/MS/ML 参数并下线 INTIMACY
|
||||
-- =============================================================================
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 1) 关系指数结果表
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS billiards_dws.dws_member_assistant_relation_index (
|
||||
relation_id BIGSERIAL PRIMARY KEY,
|
||||
site_id BIGINT NOT NULL,
|
||||
tenant_id BIGINT NOT NULL,
|
||||
member_id BIGINT NOT NULL,
|
||||
assistant_id BIGINT NOT NULL,
|
||||
session_count INTEGER NOT NULL DEFAULT 0,
|
||||
total_duration_minutes INTEGER NOT NULL DEFAULT 0,
|
||||
basic_session_count INTEGER NOT NULL DEFAULT 0,
|
||||
incentive_session_count INTEGER NOT NULL DEFAULT 0,
|
||||
days_since_last_session INTEGER,
|
||||
rs_f NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
rs_d NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
rs_r NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
rs_raw NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
rs_display NUMERIC(4,2) NOT NULL DEFAULT 0,
|
||||
os_share NUMERIC(10,6) NOT NULL DEFAULT 0,
|
||||
os_label VARCHAR(20) NOT NULL DEFAULT 'POOL',
|
||||
os_rank INTEGER,
|
||||
ms_f_short NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
ms_f_long NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
ms_raw NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
ms_display NUMERIC(4,2) NOT NULL DEFAULT 0,
|
||||
ml_order_count INTEGER NOT NULL DEFAULT 0,
|
||||
ml_allocated_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
|
||||
ml_raw NUMERIC(14,6) NOT NULL DEFAULT 0,
|
||||
ml_display NUMERIC(4,2) NOT NULL DEFAULT 0,
|
||||
calc_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uk_dws_member_assistant_relation_index UNIQUE (site_id, member_id, assistant_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_relation_member
|
||||
ON billiards_dws.dws_member_assistant_relation_index (site_id, member_id, os_share DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_relation_assistant
|
||||
ON billiards_dws.dws_member_assistant_relation_index (site_id, assistant_id, rs_display DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_relation_calc_time
|
||||
ON billiards_dws.dws_member_assistant_relation_index (calc_time);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 2) ML 人工台账宽表
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS billiards_dws.dws_ml_manual_order_source (
|
||||
source_id BIGSERIAL PRIMARY KEY,
|
||||
site_id BIGINT NOT NULL,
|
||||
biz_date DATE NOT NULL,
|
||||
external_id VARCHAR(128) NOT NULL,
|
||||
member_id BIGINT NOT NULL DEFAULT 0,
|
||||
pay_time TIMESTAMPTZ NOT NULL,
|
||||
order_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
|
||||
currency VARCHAR(16) NOT NULL DEFAULT 'CNY',
|
||||
assistant_id_1 BIGINT,
|
||||
assistant_name_1 VARCHAR(128),
|
||||
assistant_id_2 BIGINT,
|
||||
assistant_name_2 VARCHAR(128),
|
||||
assistant_id_3 BIGINT,
|
||||
assistant_name_3 VARCHAR(128),
|
||||
assistant_id_4 BIGINT,
|
||||
assistant_name_4 VARCHAR(128),
|
||||
assistant_id_5 BIGINT,
|
||||
assistant_name_5 VARCHAR(128),
|
||||
import_batch_no VARCHAR(64) NOT NULL,
|
||||
import_file_name VARCHAR(255) NOT NULL,
|
||||
import_scope_key VARCHAR(128) NOT NULL,
|
||||
import_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
import_user VARCHAR(64),
|
||||
row_no INTEGER NOT NULL,
|
||||
remark TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uk_dws_ml_manual_order_source UNIQUE (site_id, external_id, import_scope_key, row_no)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_ml_source_scope
|
||||
ON billiards_dws.dws_ml_manual_order_source (site_id, biz_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_ml_source_external
|
||||
ON billiards_dws.dws_ml_manual_order_source (site_id, external_id);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 3) ML 人工台账窄表
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS billiards_dws.dws_ml_manual_order_alloc (
|
||||
alloc_id BIGSERIAL PRIMARY KEY,
|
||||
site_id BIGINT NOT NULL,
|
||||
biz_date DATE NOT NULL,
|
||||
external_id VARCHAR(128) NOT NULL,
|
||||
member_id BIGINT NOT NULL DEFAULT 0,
|
||||
pay_time TIMESTAMPTZ NOT NULL,
|
||||
order_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
|
||||
assistant_id BIGINT NOT NULL,
|
||||
assistant_name VARCHAR(128),
|
||||
share_ratio NUMERIC(14,8) NOT NULL DEFAULT 0,
|
||||
allocated_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
|
||||
currency VARCHAR(16) NOT NULL DEFAULT 'CNY',
|
||||
import_scope_key VARCHAR(128) NOT NULL,
|
||||
import_batch_no VARCHAR(64) NOT NULL,
|
||||
import_file_name VARCHAR(255) NOT NULL,
|
||||
import_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
import_user VARCHAR(64),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uk_dws_ml_manual_order_alloc UNIQUE (site_id, external_id, assistant_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_ml_alloc_scope
|
||||
ON billiards_dws.dws_ml_manual_order_alloc (site_id, biz_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_dws_ml_alloc_member_assistant
|
||||
ON billiards_dws.dws_ml_manual_order_alloc (site_id, member_id, assistant_id);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 4) 参数切换
|
||||
-- -----------------------------------------------------------------------------
|
||||
UPDATE billiards_dws.cfg_index_parameters
|
||||
SET effective_to = DATE '2025-12-31',
|
||||
updated_at = NOW()
|
||||
WHERE index_type = 'INTIMACY'
|
||||
AND (effective_to IS NULL OR effective_to > DATE '2025-12-31');
|
||||
|
||||
INSERT INTO billiards_dws.cfg_index_parameters
|
||||
(index_type, param_name, param_value, description, effective_from)
|
||||
VALUES
|
||||
('OS', 'ownership_gap_threshold', 0.150000, '主责与次席份额差阈值', DATE '2026-01-01')
|
||||
ON CONFLICT (index_type, param_name, effective_from) DO UPDATE SET
|
||||
param_value = EXCLUDED.param_value,
|
||||
description = EXCLUDED.description,
|
||||
updated_at = NOW();
|
||||
|
||||
COMMIT;
|
||||
14
db/etl_feiqiu/migrations/20260213_align_ods_with_api.sql
Normal file
14
db/etl_feiqiu/migrations/20260213_align_ods_with_api.sql
Normal file
@@ -0,0 +1,14 @@
|
||||
-- ============================================================
|
||||
-- ODS 表与 API JSON 字段对齐迁移
|
||||
-- 自动生成于 2026-02-13
|
||||
-- 基于: docs/api-reference/ 文档 vs billiards_ods 实际表结构
|
||||
-- 比对逻辑: camelCase → snake_case 归一化后再比较
|
||||
-- ============================================================
|
||||
--
|
||||
-- 结论: 22 张 ODS 表全部与 API JSON 字段对齐,无需任何 ALTER 操作。
|
||||
--
|
||||
-- stock_goods_category_tree 的 goodsCategoryList/total 为响应包装层字段,
|
||||
-- ODS 表已正确展开存储数组内的记录级字段(id, category_name, pid 等),
|
||||
-- 不需要将包装层字段作为列添加。
|
||||
--
|
||||
-- 无需执行此文件。
|
||||
72
db/etl_feiqiu/migrations/20260213_remove_legacy_index.sql
Normal file
72
db/etl_feiqiu/migrations/20260213_remove_legacy_index.sql
Normal file
@@ -0,0 +1,72 @@
|
||||
-- =============================================================================
|
||||
-- 迁移:移除旧版指数(RECALL / INTIMACY)及 ML last-touch 备用参数
|
||||
-- 日期: 2026-02-13
|
||||
-- AI_CHANGELOG [2026-02-13] 新建迁移:DROP recall/intimacy 表,DELETE 旧版参数/分位点/调度任务
|
||||
-- 原因: 旧版 RecallIndexTask / IntimacyIndexTask 已被 WBI+NCI / RelationIndexTask 替代
|
||||
-- ML 仅使用人工台账,不再需要 last-touch 备用路径
|
||||
-- =============================================================================
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- 1. 删除旧版指数参数
|
||||
DELETE FROM billiards_dws.cfg_index_parameters
|
||||
WHERE index_type IN ('RECALL', 'INTIMACY');
|
||||
|
||||
-- 2. 删除 ML 已废弃参数
|
||||
DELETE FROM billiards_dws.cfg_index_parameters
|
||||
WHERE index_type = 'ML'
|
||||
AND param_name IN ('source_mode', 'recharge_attribute_hours');
|
||||
|
||||
-- 3. 删除旧版指数分位点历史
|
||||
DELETE FROM billiards_dws.cfg_index_percentile_history
|
||||
WHERE index_type IN ('RECALL', 'INTIMACY');
|
||||
|
||||
-- 4. 删除调度器中的旧版任务
|
||||
DELETE FROM etl_admin.etl_task
|
||||
WHERE task_code IN ('DWS_RECALL_INDEX', 'DWS_INTIMACY_INDEX');
|
||||
|
||||
-- 5. 删除旧版 recall 表(数据已由 WBI+NCI 替代)
|
||||
DROP TABLE IF EXISTS billiards_dws.dws_member_recall_index CASCADE;
|
||||
|
||||
-- 6. 删除旧版 intimacy 表(数据已由 RelationIndexTask 替代)
|
||||
DROP TABLE IF EXISTS billiards_dws.dws_member_assistant_intimacy CASCADE;
|
||||
|
||||
COMMIT;
|
||||
|
||||
-- =============================================================================
|
||||
-- 验证
|
||||
-- =============================================================================
|
||||
DO $
|
||||
DECLARE
|
||||
recall_params INTEGER;
|
||||
intimacy_params INTEGER;
|
||||
ml_legacy INTEGER;
|
||||
recall_table BOOLEAN;
|
||||
intimacy_table BOOLEAN;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO recall_params
|
||||
FROM billiards_dws.cfg_index_parameters WHERE index_type = 'RECALL';
|
||||
|
||||
SELECT COUNT(*) INTO intimacy_params
|
||||
FROM billiards_dws.cfg_index_parameters WHERE index_type = 'INTIMACY';
|
||||
|
||||
SELECT COUNT(*) INTO ml_legacy
|
||||
FROM billiards_dws.cfg_index_parameters
|
||||
WHERE index_type = 'ML' AND param_name IN ('source_mode', 'recharge_attribute_hours');
|
||||
|
||||
SELECT EXISTS(
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'billiards_dws' AND table_name = 'dws_member_recall_index'
|
||||
) INTO recall_table;
|
||||
|
||||
SELECT EXISTS(
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'billiards_dws' AND table_name = 'dws_member_assistant_intimacy'
|
||||
) INTO intimacy_table;
|
||||
|
||||
RAISE NOTICE 'RECALL 参数残留: % (应为 0)', recall_params;
|
||||
RAISE NOTICE 'INTIMACY 参数残留: % (应为 0)', intimacy_params;
|
||||
RAISE NOTICE 'ML 废弃参数残留: % (应为 0)', ml_legacy;
|
||||
RAISE NOTICE 'recall 表存在: % (应为 false)', recall_table;
|
||||
RAISE NOTICE 'intimacy 表存在: % (应为 false)', intimacy_table;
|
||||
END $;
|
||||
12
db/etl_feiqiu/migrations/20260214_drop_dwd_settle_list.sql
Normal file
12
db/etl_feiqiu/migrations/20260214_drop_dwd_settle_list.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
-- 迁移:删除 DWD 层 dwd_settlement_head_ex 的 settle_list 列
|
||||
-- 原因:settle_list 存储结算明细 JSON,与 ODS 层 payload 中的 settleList 完全重复
|
||||
-- ODS 层 settlelist 列已在 20260214_drop_ods_settlelist.sql 中删除
|
||||
-- DWD 层该列同样冗余,结算明细可随时从 ODS payload 提取
|
||||
-- 回滚:ALTER TABLE billiards_dwd.dwd_settlement_head_ex ADD COLUMN settle_list JSONB;
|
||||
-- UPDATE billiards_dwd.dwd_settlement_head_ex e
|
||||
-- SET settle_list = o.payload->'settleList'
|
||||
-- FROM billiards_ods.settlement_records o
|
||||
-- WHERE e.order_settle_id = o.id;
|
||||
-- Prompt: P20260214-040000
|
||||
|
||||
ALTER TABLE billiards_dwd.dwd_settlement_head_ex DROP COLUMN IF EXISTS settle_list;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- 迁移:删除 ODS 层两个冗余列
|
||||
-- 日期:2026-02-14
|
||||
-- Prompt-ID:P20260214-070000
|
||||
-- 原因:option_name(store_goods_sales_records)和 able_site_transfer(member_stored_value_cards)
|
||||
-- 在 API JSON 响应中不存在,ODS 中全部为 NULL(0 条非空数据),属于冗余列
|
||||
-- 回滚:ALTER TABLE billiards_ods.store_goods_sales_records ADD COLUMN option_name TEXT;
|
||||
-- ALTER TABLE billiards_ods.member_stored_value_cards ADD COLUMN able_site_transfer INTEGER;
|
||||
|
||||
-- CHANGE: intent=删除 API 中不存在的冗余 ODS 列; assumptions=两列全 NULL 无数据丢失风险; Prompt=P20260214-070000
|
||||
|
||||
BEGIN;
|
||||
|
||||
ALTER TABLE billiards_ods.store_goods_sales_records DROP COLUMN IF EXISTS option_name;
|
||||
ALTER TABLE billiards_ods.member_stored_value_cards DROP COLUMN IF EXISTS able_site_transfer;
|
||||
|
||||
COMMIT;
|
||||
|
||||
-- AI_CHANGELOG:
|
||||
-- - 日期: 2026-02-14
|
||||
-- - Prompt: P20260214-070000 — ODS 清理与文档标注(5 项任务)
|
||||
-- - 直接原因: option_name 和 able_site_transfer 在 API JSON 中不存在,ODS 全 NULL,需删除冗余列
|
||||
-- - 变更摘要: 新建迁移脚本,DROP COLUMN 两张表各一列
|
||||
-- - 风险与验证: 已执行成功;验证:information_schema 查询确认列不存在
|
||||
34
db/etl_feiqiu/migrations/20260214_drop_ods_settlelist.sql
Normal file
34
db/etl_feiqiu/migrations/20260214_drop_ods_settlelist.sql
Normal file
@@ -0,0 +1,34 @@
|
||||
-- 迁移:删除 ODS 层 settlement_records / recharge_settlements 的 settlelist jsonb 列
|
||||
-- 原因:settlelist 与 payload 列数据重复(payload 存储完整 API 响应 JSON,已包含 settleList 对象)
|
||||
-- 日期:2026-02-14
|
||||
-- Prompt-ID: P20260214-023000
|
||||
--
|
||||
-- 前置条件:确认 DWD 加载逻辑已修改为从 payload 提取 settleList(而非直接读 settlelist 列)
|
||||
-- 回滚:见文件末尾 ROLLBACK 部分
|
||||
|
||||
-- CHANGE: intent=删除冗余 settlelist 列,减少存储浪费
|
||||
-- assumptions=payload 列已包含完整 settleList 数据,DWD 加载已改为从 payload 提取
|
||||
-- edge_cases=历史数据中 payload 为 NULL 的行将丢失 settleList 信息
|
||||
-- prompt=P20260214-023000
|
||||
|
||||
-- 1) settlement_records
|
||||
ALTER TABLE billiards_ods.settlement_records DROP COLUMN IF EXISTS settlelist;
|
||||
|
||||
-- 2) recharge_settlements
|
||||
ALTER TABLE billiards_ods.recharge_settlements DROP COLUMN IF EXISTS settlelist;
|
||||
|
||||
-- 验证 SQL
|
||||
-- SELECT column_name FROM information_schema.columns
|
||||
-- WHERE table_schema = 'billiards_ods'
|
||||
-- AND table_name IN ('settlement_records', 'recharge_settlements')
|
||||
-- AND column_name = 'settlelist';
|
||||
-- 预期结果:0 行
|
||||
|
||||
-- ============================================================
|
||||
-- ROLLBACK(回滚)
|
||||
-- ============================================================
|
||||
-- ALTER TABLE billiards_ods.settlement_records ADD COLUMN settlelist jsonb;
|
||||
-- ALTER TABLE billiards_ods.recharge_settlements ADD COLUMN settlelist jsonb;
|
||||
-- 注意:回滚后列数据为 NULL,需从 payload 中重新提取:
|
||||
-- UPDATE billiards_ods.settlement_records SET settlelist = payload->'settleList' WHERE payload IS NOT NULL;
|
||||
-- UPDATE billiards_ods.recharge_settlements SET settlelist = payload->'settleList' WHERE payload IS NOT NULL;
|
||||
Reference in New Issue
Block a user