init: 项目初始提交 - NeoZQYY Monorepo 完整代码

This commit is contained in:
Neo
2026-02-15 14:58:14 +08:00
commit ded6dfb9d8
769 changed files with 182616 additions and 0 deletions

View File

View 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;

View 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 等),
-- 不需要将包装层字段作为列添加。
--
-- 无需执行此文件。

View 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 $;

View 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;

View File

@@ -0,0 +1,23 @@
-- 迁移:删除 ODS 层两个冗余列
-- 日期2026-02-14
-- Prompt-IDP20260214-070000
-- 原因option_namestore_goods_sales_records和 able_site_transfermember_stored_value_cards
-- 在 API JSON 响应中不存在ODS 中全部为 NULL0 条非空数据),属于冗余列
-- 回滚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 查询确认列不存在

View 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;