-- 文件：schema_ODS_doc.sql
-- 说明：ODS 层 DDL，表名与示例 JSON 前缀对应，用于本地回放/调试。
-- 编码：UTF-8
SET client_encoding TO "UTF8";

DROP SCHEMA IF EXISTS billiards_ods CASCADE;
CREATE SCHEMA IF NOT EXISTS billiards_ods;

CREATE TABLE IF NOT EXISTS billiards_ods.member_profiles (
    tenant_id                BIGINT,
    register_site_id         BIGINT,
    site_name                TEXT,
    id                       BIGINT PRIMARY KEY,
    system_member_id         BIGINT,
    member_card_grade_code   BIGINT,
    member_card_grade_name   TEXT,
    mobile                   TEXT,
    nickname                 TEXT,
    point                    NUMERIC(18,2),
    growth_value             NUMERIC(18,2),
    referrer_member_id       BIGINT,
    status                   INT,
    user_status              INT,
    create_time              TIMESTAMP,
    source_file              TEXT,
    source_endpoint          TEXT,
    fetched_at               TIMESTAMPTZ DEFAULT now(),
    payload                  JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.member_profiles IS '对应JSON字段：member_profiles.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 member_profiles-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_profiles.tenant_id IS '对应JSON字段：tenant_id，说明：：，示例值及对应分析：租户/品牌 ID。';
COMMENT ON COLUMN billiards_ods.member_profiles.register_site_id IS '对应JSON字段：register_site_id，说明：：，示例值及对应分析：会员的注册门店 ID。';
COMMENT ON COLUMN billiards_ods.member_profiles.site_name IS '对应JSON字段：site_name，说明：：，示例值及对应分析：注册门店名称，属于冗余字段，用于直接展示。';
COMMENT ON COLUMN billiards_ods.member_profiles.id IS '对应JSON字段：id，说明：：，示例值及对应分析：这是“租户内会员账户”的主键 ID。';
COMMENT ON COLUMN billiards_ods.member_profiles.system_member_id IS '对应JSON字段：system_member_id，说明：（结合其它文件）：，示例值及对应分析：这是“系统级会员 ID”，在全平台唯一，用来把一个会员在不同门店/不同卡类型下的账户统一到一个“人”的维度上。';
COMMENT ON COLUMN billiards_ods.member_profiles.member_card_grade_code IS '对应JSON字段：member_card_grade_code，说明：类型：int，示例值及对应分析：唯一值个数：4';
COMMENT ON COLUMN billiards_ods.member_profiles.member_card_grade_name IS '对应JSON字段：member_card_grade_name，说明：：，示例值及对应分析：这是“会员卡种类/等级”的定义字段。';
COMMENT ON COLUMN billiards_ods.member_profiles.mobile IS '对应JSON字段：mobile，说明：：，示例值及对应分析：会员绑定的手机号码。';
COMMENT ON COLUMN billiards_ods.member_profiles.nickname IS '对应JSON字段：nickname，说明：：，示例值及对应分析：会员在当前租户下的显示名称（可以是姓名，也可以是昵称）。';
COMMENT ON COLUMN billiards_ods.member_profiles.point IS '对应JSON字段：point，说明：：，示例值及对应分析：当前积分余额（这条会员账户的积分值）。';
COMMENT ON COLUMN billiards_ods.member_profiles.growth_value IS '对应JSON字段：growth_value，说明：（按常见会员体系设计）：，示例值及对应分析：成长值 / 经验值，用于会员等级晋升的累计指标。';
COMMENT ON COLUMN billiards_ods.member_profiles.referrer_member_id IS '对应JSON字段：referrer_member_id，说明：（按命名推断）：，示例值及对应分析：推荐人会员 ID，用于记录该会员是由哪位老会员推荐。';
COMMENT ON COLUMN billiards_ods.member_profiles.status IS '对应JSON字段：status，说明：（按命名推断）：，示例值及对应分析：帐户状态（偏“卡状态/档案状态”）。';
COMMENT ON COLUMN billiards_ods.member_profiles.user_status IS '对应JSON字段：user_status，说明：（结合行业惯例）：，示例值及对应分析：用户账号状态（偏“用户逻辑”层面的状态）。';
COMMENT ON COLUMN billiards_ods.member_profiles.create_time IS '对应JSON字段：create_time，说明：：，示例值及对应分析：会员账户的创建时间（即这条档案/这张卡在系统中被创建的时间）。';
COMMENT ON COLUMN billiards_ods.member_profiles.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_profiles.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_profiles.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_profiles.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.member_balance_changes (
    tenant_id             BIGINT,
    site_id               BIGINT,
    register_site_id      BIGINT,
    registerSiteName      TEXT,
    paySiteName           TEXT,
    id                    BIGINT PRIMARY KEY,
    tenant_member_id      BIGINT,
    tenant_member_card_id BIGINT,
    system_member_id      BIGINT,
    memberName            TEXT,
    memberMobile          TEXT,
    card_type_id          BIGINT,
    memberCardTypeName    TEXT,
    account_data          NUMERIC(18,2),
    before                NUMERIC(18,2),
    after                 NUMERIC(18,2),
    refund_amount         NUMERIC(18,2),
    from_type             INT,
    payment_method        INT,
    relate_id             BIGINT,
    remark                TEXT,
    operator_id           BIGINT,
    operator_name         TEXT,
    is_delete             INT,
    create_time           TIMESTAMP,
    source_file           TEXT,
    source_endpoint       TEXT,
    fetched_at            TIMESTAMPTZ DEFAULT now(),
    payload               JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.member_balance_changes IS '对应JSON字段：member_balance_changes.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/商户 ID，本数据中是固定值（同一品牌/商户）。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.site_id IS '对应JSON字段：site_id，说明：表示本次余额变动的发生门店，绝大多数也在“朗朗桌球”，少数特殊业务（活动抵用券结算）显示为 site_id=0、paySiteName 为空。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.register_site_id IS '对应JSON字段：register_site_id，说明：已在前文说明：办卡门店的 ID 与名称，所有记录一致，说明所有卡均在“朗朗桌球”注册。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.registerSiteName IS '对应JSON字段：registerSiteName，说明：已在前文说明：办卡门店的 ID 与名称，所有记录一致，说明所有卡均在“朗朗桌球”注册。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.paySiteName IS '对应JSON字段：paySiteName，说明：表示本次余额变动的发生门店，绝大多数也在“朗朗桌球”，少数特殊业务（活动抵用券结算）显示为 site_id=0、paySiteName 为空。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.id IS '对应JSON字段：id，说明：：余额变更记录的主键 ID，唯一标识这一条“账户余额变化事件”。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_member_id IS '对应JSON字段：tenant_member_id，说明：：商户维度的会员 ID（租户内会员主键）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_member_card_id IS '对应JSON字段：tenant_member_card_id，说明：：会员卡账户 ID，在租户内唯一标识某张卡。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.system_member_id IS '对应JSON字段：system_member_id，说明：：系统级（全局）会员 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberName IS '对应JSON字段：memberName，说明：：会员姓名或称呼（非昵称字段）。，示例值及对应分析：说明：例如“陈腾鑫”“胡先生”“江先生”等，多为中文姓名或带“先生”称呼。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberMobile IS '对应JSON字段：memberMobile，说明：：会员手机号。，示例值及对应分析：说明：字符型存储，完整手机号，用来识别会员与联系客户。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.card_type_id IS '对应JSON字段：card_type_id，说明：：卡种类型 ID，用于区分不同卡种。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberCardTypeName IS '对应JSON字段：memberCardTypeName，说明：：卡种名称，与 card_type_id 一一对应，是一个 卡种枚举名称。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.account_data IS '对应JSON字段：account_data，说明：：本次变动的金额（元），正数表示增加，负数表示减少。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.before IS '对应JSON字段：before，说明：：本次变动前，该卡账户的余额（元）。，示例值及对应分析：说明：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.after IS '对应JSON字段：after，说明：：本次变动后，该卡账户的余额（元）。，示例值及对应分析：重要关系：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.refund_amount IS '对应JSON字段：refund_amount，说明：（推测）：与退款业务相关的金额字段，但在当前这份导出中实际未使用：，示例值及对应分析：可能用于标记“其中有多少金额是以‘退款’形式回流的”，或区分“退回余额”和“原路退回”两种模式。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.from_type IS '对应JSON字段：from_type，说明：（根据金额符号与 remark 综合推断）：，示例值及对应分析：1：日常消费扣款';
COMMENT ON COLUMN billiards_ods.member_balance_changes.payment_method IS '对应JSON字段：payment_method，说明：类型：int，枚举，示例值及对应分析：值分布：';
COMMENT ON COLUMN billiards_ods.member_balance_changes.relate_id IS '对应JSON字段：relate_id，说明：（推测）：关联业务记录的 ID：，示例值及对应分析：例如某次充值记录的 ID、某张订单/结算单 ID、某次活动抵用券核销记录 ID 等。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.remark IS '对应JSON字段：remark，说明：：，示例值及对应分析：当为空时，说明这条变动没有额外备注说明。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.operator_id IS '对应JSON字段：operator_id，说明：：执行此次余额变更操作的员工 ID。，示例值及对应分析：?? member_balance_changes-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_balance_changes.operator_name IS '对应JSON字段：operator_name，说明：：操作员姓名（带职位前缀），是对 operator_id 的可读冗余字段。，示例值及对应分析：9. 状态字段与标志';
COMMENT ON COLUMN billiards_ods.member_balance_changes.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标记：，示例值及对应分析：0：正常；';
COMMENT ON COLUMN billiards_ods.member_balance_changes.create_time IS '对应JSON字段：create_time，说明：：本条余额变更记录的创建时间，通常接近交易发生时间。，示例值及对应分析：说明：可与订单、支付记录的时间做对齐，构造时序链路（但你现在不要求做时序分析，这里只说明结构）。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_balance_changes.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_balance_changes.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_balance_changes.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.member_stored_value_cards (
    tenant_id                         BIGINT,
    tenant_member_id                  BIGINT,
    system_member_id                  BIGINT,
    register_site_id                  BIGINT,
    site_name                         TEXT,
    id                                BIGINT PRIMARY KEY,
    member_card_grade_code            BIGINT,
    member_card_grade_code_name       TEXT,
    member_card_type_name             TEXT,
    member_name                       TEXT,
    member_mobile                     TEXT,
    card_type_id                      BIGINT,
    card_no                           TEXT,
    card_physics_type                 TEXT,
    balance                           NUMERIC(18,2),
    denomination                      NUMERIC(18,2),
    table_discount                    NUMERIC(10,4),
    goods_discount                    NUMERIC(10,4),
    assistant_discount                NUMERIC(10,4),
    assistant_reward_discount         NUMERIC(10,4),
    table_service_discount            NUMERIC(10,4),
    assistant_service_discount        NUMERIC(10,4),
    coupon_discount                   NUMERIC(10,4),
    goods_service_discount            NUMERIC(10,4),
    assistant_discount_sub_switch     INT,
    table_discount_sub_switch         INT,
    goods_discount_sub_switch         INT,
    assistant_reward_discount_sub_switch INT,
    table_service_deduct_radio        NUMERIC(10,4),
    assistant_service_deduct_radio    NUMERIC(10,4),
    goods_service_deduct_radio        NUMERIC(10,4),
    assistant_deduct_radio            NUMERIC(10,4),
    table_deduct_radio                NUMERIC(10,4),
    goods_deduct_radio                NUMERIC(10,4),
    coupon_deduct_radio               NUMERIC(10,4),
    assistant_reward_deduct_radio     NUMERIC(10,4),
    tableCardDeduct                   NUMERIC(18,2),
    tableServiceCardDeduct            NUMERIC(18,2),
    goodsCarDeduct                    NUMERIC(18,2),
    goodsServiceCardDeduct            NUMERIC(18,2),
    assistantCardDeduct               NUMERIC(18,2),
    assistantServiceCardDeduct        NUMERIC(18,2),
    assistantRewardCardDeduct         NUMERIC(18,2),
    cardSettleDeduct                  NUMERIC(18,2),
    couponCardDeduct                  NUMERIC(18,2),
    deliveryFeeDeduct                 NUMERIC(18,2),
    use_scene                         INT,
    able_cross_site                   INT,
    able_site_transfer                INT,
    is_allow_give                     INT,
    is_allow_order_deduct             INT,
    is_delete                         INT,
    bind_password                     TEXT,
    goods_discount_range_type         INT,
    goodsCategoryId                   BIGINT,
    tableAreaId                       BIGINT,
    effect_site_id                    BIGINT,
    start_time                        TIMESTAMP,
    end_time                          TIMESTAMP,
    disable_start_time                TIMESTAMP,
    disable_end_time                  TIMESTAMP,
    last_consume_time                 TIMESTAMP,
    create_time                       TIMESTAMP,
    status                            INT,
    sort                              INT,
    tenantAvatar                      TEXT,
    tenantName                        TEXT,
    pdAssisnatLevel                   TEXT,
    cxAssisnatLevel                   TEXT,
    source_file                       TEXT,
    source_endpoint                   TEXT,
    fetched_at                        TIMESTAMPTZ DEFAULT now(),
    payload                           JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.member_stored_value_cards IS '对应JSON字段：member_stored_value_cards.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID，与其他 JSON 中 tenant_id 一致。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenant_member_id IS '对应JSON字段：tenant_member_id，说明：：当前商户（品牌/租户）中会员的主键 ID。，示例值及对应分析：枚举特征：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.system_member_id IS '对应JSON字段：system_member_id，说明：：系统级会员 ID（跨门店统一主键）。，示例值及对应分析：枚举特征：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.register_site_id IS '对应JSON字段：register_site_id，说明：：卡首次办理的门店 ID。，示例值及对应分析：对应门店的 site_id；本数据中所有卡都是在同一家门店开卡。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.site_name IS '对应JSON字段：site_name，说明：：卡归属门店名称（视图中的展示字段）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.id IS '对应JSON字段：id，说明：?????? member_stored_value_cards-Analysis.md，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_card_grade_code IS '对应JSON字段：member_card_grade_code，说明：：卡等级/卡类代码，和下面两个名称字段一一对应。，示例值及对应分析：枚举：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_card_grade_code_name IS '对应JSON字段：member_card_grade_code_name，说明：：卡等级/卡类名称。，示例值及对应分析：枚举值（与上面 code 一一对应）：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_card_type_name IS '对应JSON字段：member_card_type_name，说明：：卡类型名称，实际与 member_card_grade_code_name 一致。，示例值及对应分析：枚举值同上。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_name IS '对应JSON字段：member_name，说明：：持卡会员姓名快照。，示例值及对应分析：特点：存在 null（20 张卡没有绑定会员名字）。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_mobile IS '对应JSON字段：member_mobile，说明：：持卡会员手机号快照。，示例值及对应分析：特点：与 member_name 对应，多数有值，少量为 null。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_type_id IS '对应JSON字段：card_type_id，说明：：卡种 ID（定义“这是哪一种卡”）。，示例值及对应分析：枚举（按数据分布）：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_no IS '对应JSON字段：card_no，说明：（推测）：实体卡物理卡号／条码号。当前这批卡看起来全部为“无物理卡号”（可能是全部虚拟卡或卡号隐藏不导出）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_physics_type IS '对应JSON字段：card_physics_type，说明：：物理卡类型。，示例值及对应分析：当前数据：全部为 1。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.balance IS '对应JSON字段：balance，说明：：当前卡内余额（主要针对储值卡、部分券卡）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.denomination IS '对应JSON字段：denomination，说明：（推测）：面额/初始储值额度。，示例值及对应分析：本页数据未填充此字段；可能在分类型卡（如次卡/券）中才有意义，或者另有配置表。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_discount IS '对应JSON字段：table_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount IS '对应JSON字段：goods_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_discount IS '对应JSON字段：assistant_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_discount IS '对应JSON字段：assistant_reward_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_service_discount IS '对应JSON字段：table_service_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_service_discount IS '对应JSON字段：assistant_service_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.coupon_discount IS '对应JSON字段：coupon_discount，说明：?????? member_stored_value_cards-Analysis.md，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_service_discount IS '对应JSON字段：goods_service_discount，说明：：，示例值及对应分析：采用“几折”的记法：10=不打折，9=九折，8=八折。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_discount_sub_switch IS '对应JSON字段：assistant_discount_sub_switch，说明：（推测）：“折扣是否叠加/替换其他折扣”的开关。，示例值及对应分析：可能枚举：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_discount_sub_switch IS '对应JSON字段：table_discount_sub_switch，说明：（推测）：“折扣是否叠加/替换其他折扣”的开关。，示例值及对应分析：可能枚举：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount_sub_switch IS '对应JSON字段：goods_discount_sub_switch，说明：（推测）：“折扣是否叠加/替换其他折扣”的开关。，示例值及对应分析：可能枚举：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_discount_sub_switch IS '对应JSON字段：assistant_reward_discount_sub_switch，说明：（推测）：“折扣是否叠加/替换其他折扣”的开关。，示例值及对应分析：可能枚举：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_service_deduct_radio IS '对应JSON字段：table_service_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_service_deduct_radio IS '对应JSON字段：assistant_service_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_service_deduct_radio IS '对应JSON字段：goods_service_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_deduct_radio IS '对应JSON字段：assistant_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_deduct_radio IS '对应JSON字段：table_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_deduct_radio IS '对应JSON字段：goods_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.coupon_deduct_radio IS '对应JSON字段：coupon_deduct_radio，说明：：允许从该卡余额中抵扣的比例（百分比）。，示例值及对应分析：100.0 表示允许 100% 用卡余额支付该类消费；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_deduct_radio IS '对应JSON字段：assistant_reward_deduct_radio，说明：?????? member_stored_value_cards-Analysis.md，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableCardDeduct IS '对应JSON字段：tableCardDeduct，说明：：针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。，示例值及对应分析：当前：所有为 0，说明在卡定义层面并没有指定固定扣卡金额，而是按照一般储值逻辑消费。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableServiceCardDeduct IS '对应JSON字段：tableServiceCardDeduct，说明：：如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。，示例值及对应分析：当前未启用。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsCarDeduct IS '对应JSON字段：goodsCarDeduct，说明：：针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。，示例值及对应分析：当前：所有为 0，说明在卡定义层面并没有指定固定扣卡金额，而是按照一般储值逻辑消费。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsServiceCardDeduct IS '对应JSON字段：goodsServiceCardDeduct，说明：：如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。，示例值及对应分析：当前未启用。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantCardDeduct IS '对应JSON字段：assistantCardDeduct，说明：：针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。，示例值及对应分析：当前：所有为 0，说明在卡定义层面并没有指定固定扣卡金额，而是按照一般储值逻辑消费。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantServiceCardDeduct IS '对应JSON字段：assistantServiceCardDeduct，说明：：如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。，示例值及对应分析：当前未启用。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantRewardCardDeduct IS '对应JSON字段：assistantRewardCardDeduct，说明：：助教奖励金方向扣款的配置。，示例值及对应分析：当前未启用。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.cardSettleDeduct IS '对应JSON字段：cardSettleDeduct，说明：已在扣卡规则部分说明，当前为 0。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.couponCardDeduct IS '对应JSON字段：couponCardDeduct，说明：：与卡绑定的“券额度扣除配置”。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.deliveryFeeDeduct IS '对应JSON字段：deliveryFeeDeduct，说明：：配送费可否/多少从卡中抵扣，目前无业务发生。，示例值及对应分析：综合来看：本门店的卡片在“规则配置层”预留了大量细粒度控制字段，但目前实际使用只体现在“balance”和“可用范围”，折扣和具体扣卡规则基本都未启用（全部保持默认值 10 折、100%比例、0 扣款），真正扣款逻辑在交易流水中体现。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.use_scene IS '对应JSON字段：use_scene，说明：：卡使用场景说明（比如“仅店内使用”“仅团建”等），本门店尚未使用此字段。，示例值及对应分析：2. 会员信息与关联字段';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.able_cross_site IS '对应JSON字段：able_cross_site，说明：：是否允许跨店使用。，示例值及对应分析：1：可以跨门店使用；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.able_site_transfer IS '对应JSON字段：able_site_transfer，说明：?????? member_stored_value_cards-Analysis.md，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_allow_give IS '对应JSON字段：is_allow_give，说明：：是否允许转赠/转让给其他会员。，示例值及对应分析：0：不允许；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_allow_order_deduct IS '对应JSON字段：is_allow_order_deduct，说明：：是否允许在“订单层面统一扣款”。，示例值及对应分析：0：不允许（仅按项目扣卡）；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：未删除；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.bind_password IS '对应JSON字段：bind_password，说明：：卡绑定密码，用于消费或查询验证（目前未启用）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount_range_type IS '对应JSON字段：goods_discount_range_type，说明：?????? member_stored_value_cards-Analysis.md，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsCategoryId IS '对应JSON字段：goodsCategoryId，说明：已上文说明：均为扩展限定维度，当前全部为空列表。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableAreaId IS '对应JSON字段：tableAreaId，说明：已上文说明：均为扩展限定维度，当前全部为空列表。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.effect_site_id IS '对应JSON字段：effect_site_id，说明：（推测）：卡片限定生效门店 ID。，示例值及对应分析：为 0 时，配合 able_cross_site=1，可解释为“所有门店可用”。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.start_time IS '对应JSON字段：start_time，说明：：卡片生效开始时间（有效期起始）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.end_time IS '对应JSON字段：end_time，说明：：卡片有效期结束时间。，示例值及对应分析：start_time / end_time 组合就是卡的有效期。不同卡种有效期配置不同，如储值卡长效、月卡固定一个月等。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.disable_start_time IS '对应JSON字段：disable_start_time，说明：：停用时间段（比如临时冻结卡的起止时间）。，示例值及对应分析：当前未启用，所有卡都是“未进入停用窗口”。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.disable_end_time IS '对应JSON字段：disable_end_time，说明：：停用时间段（比如临时冻结卡的起止时间）。，示例值及对应分析：当前未启用，所有卡都是“未进入停用窗口”。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.last_consume_time IS '对应JSON字段：last_consume_time，说明：：最近一次消费时间。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.create_time IS '对应JSON字段：create_time，说明：：卡片创建时间（开卡时间）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.status IS '对应JSON字段：status，说明：（推测）：，示例值及对应分析：1：正常可用；';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.sort IS '对应JSON字段：sort，说明：：在前端展示或某些列表中的排序权重。，示例值及对应分析：具体取值分布不重要，主要反映展示优先级。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenantAvatar IS '对应JSON字段：tenantAvatar，说明：：品牌头像 URL（未配置）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenantName IS '对应JSON字段：tenantName，说明：：租户/品牌名称（当前导出为空）。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.pdAssisnatLevel IS '对应JSON字段：pdAssisnatLevel，说明：已上文说明：均为扩展限定维度，当前全部为空列表。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.cxAssisnatLevel IS '对应JSON字段：cxAssisnatLevel，说明：已上文说明：均为扩展限定维度，当前全部为空列表。，示例值及对应分析：?? member_stored_value_cards-Analysis.md';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.recharge_settlements (
    id                    BIGINT PRIMARY KEY,
    tenantid              BIGINT,
    siteid                BIGINT,
    sitename              TEXT,
    balanceamount         NUMERIC(18,2),
    cardamount            NUMERIC(18,2),
    cashamount            NUMERIC(18,2),
    couponamount          NUMERIC(18,2),
    createtime            TIMESTAMPTZ,
    memberid              BIGINT,
    membername            TEXT,
    tenantmembercardid    BIGINT,
    membercardtypename    TEXT,
    memberphone           TEXT,
    tableid               BIGINT,
    consumemoney          NUMERIC(18,2),
    onlineamount          NUMERIC(18,2),
    operatorid            BIGINT,
    operatorname          TEXT,
    revokeorderid         BIGINT,
    revokeordername       TEXT,
    revoketime            TIMESTAMPTZ,
    payamount             NUMERIC(18,2),
    pointamount           NUMERIC(18,2),
    refundamount          NUMERIC(18,2),
    settlename            TEXT,
    settlerelateid        BIGINT,
    settlestatus          INT,
    settletype            INT,
    paytime               TIMESTAMPTZ,
    roundingamount        NUMERIC(18,2),
    paymentmethod         INT,
    adjustamount          NUMERIC(18,2),
    assistantcxmoney      NUMERIC(18,2),
    assistantpdmoney      NUMERIC(18,2),
    couponsaleamount      NUMERIC(18,2),
    memberdiscountamount  NUMERIC(18,2),
    tablechargemoney      NUMERIC(18,2),
    goodsmoney            NUMERIC(18,2),
    realgoodsmoney        NUMERIC(18,2),
    servicemoney          NUMERIC(18,2),
    prepaymoney           NUMERIC(18,2),
    salesmanname          TEXT,
    orderremark           TEXT,
    salesmanuserid        BIGINT,
    canberevoked          BOOLEAN,
    pointdiscountprice    NUMERIC(18,2),
    pointdiscountcost     NUMERIC(18,2),
    activitydiscount      NUMERIC(18,2),
    serialnumber          BIGINT,
    assistantmanualdiscount NUMERIC(18,2),
    allcoupondiscount     NUMERIC(18,2),
    goodspromotionmoney   NUMERIC(18,2),
    assistantpromotionmoney NUMERIC(18,2),
    isusecoupon           BOOLEAN,
    isusediscount         BOOLEAN,
    isactivity            BOOLEAN,
    isbindmember          BOOLEAN,
    isfirst               INT,
    rechargecardamount    NUMERIC(18,2),
    giftcardamount        NUMERIC(18,2),
    source_file           TEXT,
    source_endpoint       TEXT,
    fetched_at            TIMESTAMPTZ DEFAULT now(),
    payload               JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.recharge_settlements IS '对应JSON字段：recharge_settlements.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.id IS '对应JSON字段：id，说明：：本条充值结算记录的主键 ID（唯一标识一条充值/撤销记录）。，示例值及对应分析：唯一性：74 条记录全部不同。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tenantid IS '对应JSON字段：tenantid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.siteid IS '对应JSON字段：siteid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.sitename IS '对应JSON字段：sitename，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.balanceamount IS '对应JSON字段：balanceamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.cardamount IS '对应JSON字段：cardamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.cashamount IS '对应JSON字段：cashamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.couponamount IS '对应JSON字段：couponamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.createtime IS '对应JSON字段：createtime，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberid IS '对应JSON字段：memberid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.membername IS '对应JSON字段：membername，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tenantmembercardid IS '对应JSON字段：tenantmembercardid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.membercardtypename IS '对应JSON字段：membercardtypename，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberphone IS '对应JSON字段：memberphone，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tableid IS '对应JSON字段：tableid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.consumemoney IS '对应JSON字段：consumemoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.onlineamount IS '对应JSON字段：onlineamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.operatorid IS '对应JSON字段：operatorid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.operatorname IS '对应JSON字段：operatorname，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revokeorderid IS '对应JSON字段：revokeorderid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revokeordername IS '对应JSON字段：revokeordername，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revoketime IS '对应JSON字段：revoketime，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.payamount IS '对应JSON字段：payamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointamount IS '对应JSON字段：pointamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.refundamount IS '对应JSON字段：refundamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlename IS '对应JSON字段：settlename，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlerelateid IS '对应JSON字段：settlerelateid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlestatus IS '对应JSON字段：settlestatus，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settletype IS '对应JSON字段：settletype，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.paytime IS '对应JSON字段：paytime，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.roundingamount IS '对应JSON字段：roundingamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.paymentmethod IS '对应JSON字段：paymentmethod，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.adjustamount IS '对应JSON字段：adjustamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantcxmoney IS '对应JSON字段：assistantcxmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantpdmoney IS '对应JSON字段：assistantpdmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.couponsaleamount IS '对应JSON字段：couponsaleamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberdiscountamount IS '对应JSON字段：memberdiscountamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tablechargemoney IS '对应JSON字段：tablechargemoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.goodsmoney IS '对应JSON字段：goodsmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.realgoodsmoney IS '对应JSON字段：realgoodsmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.servicemoney IS '对应JSON字段：servicemoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.prepaymoney IS '对应JSON字段：prepaymoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.salesmanname IS '对应JSON字段：salesmanname，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.orderremark IS '对应JSON字段：orderremark，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.salesmanuserid IS '对应JSON字段：salesmanuserid，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.canberevoked IS '对应JSON字段：canberevoked，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointdiscountprice IS '对应JSON字段：pointdiscountprice，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointdiscountcost IS '对应JSON字段：pointdiscountcost，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.activitydiscount IS '对应JSON字段：activitydiscount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.serialnumber IS '对应JSON字段：serialnumber，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantmanualdiscount IS '对应JSON字段：assistantmanualdiscount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.allcoupondiscount IS '对应JSON字段：allcoupondiscount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.goodspromotionmoney IS '对应JSON字段：goodspromotionmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantpromotionmoney IS '对应JSON字段：assistantpromotionmoney，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isusecoupon IS '对应JSON字段：isusecoupon，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isusediscount IS '对应JSON字段：isusediscount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isactivity IS '对应JSON字段：isactivity，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isbindmember IS '对应JSON字段：isbindmember，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isfirst IS '对应JSON字段：isfirst，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.rechargecardamount IS '对应JSON字段：rechargecardamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.giftcardamount IS '对应JSON字段：giftcardamount，说明：?????? recharge_settlements-Analysis.md，示例值及对应分析：?? recharge_settlements-Analysis.md';
COMMENT ON COLUMN billiards_ods.recharge_settlements.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.recharge_settlements.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.recharge_settlements.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.recharge_settlements.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.settlement_records (
    id                    BIGINT PRIMARY KEY,
    tenantid              BIGINT,
    siteid                BIGINT,
    sitename              TEXT,
    balanceamount         NUMERIC(18,2),
    cardamount            NUMERIC(18,2),
    cashamount            NUMERIC(18,2),
    couponamount          NUMERIC(18,2),
    createtime            TIMESTAMPTZ,
    memberid              BIGINT,
    membername            TEXT,
    tenantmembercardid    BIGINT,
    membercardtypename    TEXT,
    memberphone           TEXT,
    tableid               BIGINT,
    consumemoney          NUMERIC(18,2),
    onlineamount          NUMERIC(18,2),
    operatorid            BIGINT,
    operatorname          TEXT,
    revokeorderid         BIGINT,
    revokeordername       TEXT,
    revoketime            TIMESTAMPTZ,
    payamount             NUMERIC(18,2),
    pointamount           NUMERIC(18,2),
    refundamount          NUMERIC(18,2),
    settlename            TEXT,
    settlerelateid        BIGINT,
    settlestatus          INT,
    settletype            INT,
    paytime               TIMESTAMPTZ,
    roundingamount        NUMERIC(18,2),
    paymentmethod         INT,
    adjustamount          NUMERIC(18,2),
    assistantcxmoney      NUMERIC(18,2),
    assistantpdmoney      NUMERIC(18,2),
    couponsaleamount      NUMERIC(18,2),
    memberdiscountamount  NUMERIC(18,2),
    tablechargemoney      NUMERIC(18,2),
    goodsmoney            NUMERIC(18,2),
    realgoodsmoney        NUMERIC(18,2),
    servicemoney          NUMERIC(18,2),
    prepaymoney           NUMERIC(18,2),
    salesmanname          TEXT,
    orderremark           TEXT,
    salesmanuserid        BIGINT,
    canberevoked          BOOLEAN,
    pointdiscountprice    NUMERIC(18,2),
    pointdiscountcost     NUMERIC(18,2),
    activitydiscount      NUMERIC(18,2),
    serialnumber          BIGINT,
    assistantmanualdiscount NUMERIC(18,2),
    allcoupondiscount     NUMERIC(18,2),
    goodspromotionmoney   NUMERIC(18,2),
    assistantpromotionmoney NUMERIC(18,2),
    isusecoupon           BOOLEAN,
    isusediscount         BOOLEAN,
    isactivity            BOOLEAN,
    isbindmember          BOOLEAN,
    isfirst               INT,
    rechargecardamount    NUMERIC(18,2),
    giftcardamount        NUMERIC(18,2),
    source_file           TEXT,
    source_endpoint       TEXT,
    fetched_at            TIMESTAMPTZ DEFAULT now(),
    payload               JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.settlement_records IS '对应JSON字段：settlement_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.id IS '对应JSON字段：id，说明：：结账记录主键 ID（订单结算 ID）。，示例值及对应分析：结构关联：';
COMMENT ON COLUMN billiards_ods.settlement_records.tenantid IS '对应JSON字段：tenantid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.siteid IS '对应JSON字段：siteid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.sitename IS '对应JSON字段：sitename，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.balanceamount IS '对应JSON字段：balanceamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.cardamount IS '对应JSON字段：cardamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.cashamount IS '对应JSON字段：cashamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.couponamount IS '对应JSON字段：couponamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.createtime IS '对应JSON字段：createtime，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.memberid IS '对应JSON字段：memberid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.membername IS '对应JSON字段：membername，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.tenantmembercardid IS '对应JSON字段：tenantmembercardid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.membercardtypename IS '对应JSON字段：membercardtypename，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.memberphone IS '对应JSON字段：memberphone，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.tableid IS '对应JSON字段：tableid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.consumemoney IS '对应JSON字段：consumemoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.onlineamount IS '对应JSON字段：onlineamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.operatorid IS '对应JSON字段：operatorid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.operatorname IS '对应JSON字段：operatorname，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.revokeorderid IS '对应JSON字段：revokeorderid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.revokeordername IS '对应JSON字段：revokeordername，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.revoketime IS '对应JSON字段：revoketime，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.payamount IS '对应JSON字段：payamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.pointamount IS '对应JSON字段：pointamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.refundamount IS '对应JSON字段：refundamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.settlename IS '对应JSON字段：settlename，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.settlerelateid IS '对应JSON字段：settlerelateid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.settlestatus IS '对应JSON字段：settlestatus，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.settletype IS '对应JSON字段：settletype，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.paytime IS '对应JSON字段：paytime，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.roundingamount IS '对应JSON字段：roundingamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.paymentmethod IS '对应JSON字段：paymentmethod，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.adjustamount IS '对应JSON字段：adjustamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantcxmoney IS '对应JSON字段：assistantcxmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantpdmoney IS '对应JSON字段：assistantpdmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.couponsaleamount IS '对应JSON字段：couponsaleamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.memberdiscountamount IS '对应JSON字段：memberdiscountamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.tablechargemoney IS '对应JSON字段：tablechargemoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.goodsmoney IS '对应JSON字段：goodsmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.realgoodsmoney IS '对应JSON字段：realgoodsmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.servicemoney IS '对应JSON字段：servicemoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.prepaymoney IS '对应JSON字段：prepaymoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.salesmanname IS '对应JSON字段：salesmanname，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.orderremark IS '对应JSON字段：orderremark，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.salesmanuserid IS '对应JSON字段：salesmanuserid，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.canberevoked IS '对应JSON字段：canberevoked，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.pointdiscountprice IS '对应JSON字段：pointdiscountprice，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.pointdiscountcost IS '对应JSON字段：pointdiscountcost，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.activitydiscount IS '对应JSON字段：activitydiscount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.serialnumber IS '对应JSON字段：serialnumber，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantmanualdiscount IS '对应JSON字段：assistantmanualdiscount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.allcoupondiscount IS '对应JSON字段：allcoupondiscount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.goodspromotionmoney IS '对应JSON字段：goodspromotionmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantpromotionmoney IS '对应JSON字段：assistantpromotionmoney，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.isusecoupon IS '对应JSON字段：isusecoupon，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.isusediscount IS '对应JSON字段：isusediscount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.isactivity IS '对应JSON字段：isactivity，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.isbindmember IS '对应JSON字段：isbindmember，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.isfirst IS '对应JSON字段：isfirst，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.rechargecardamount IS '对应JSON字段：rechargecardamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.giftcardamount IS '对应JSON字段：giftcardamount，说明：?????? settlement_records-Analysis.md，示例值及对应分析：?? settlement_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.assistant_cancellation_records (
    id                     BIGINT PRIMARY KEY,
    siteId                 BIGINT,
    siteProfile            JSONB,
    assistantName          TEXT,
    assistantAbolishAmount NUMERIC(18,2),
    assistantOn            INT,
    pdChargeMinutes        INT,
    tableAreaId            BIGINT,
    tableArea              TEXT,
    tableId                BIGINT,
    tableName              TEXT,
    trashReason            TEXT,
    createTime             TIMESTAMP,
    source_file            TEXT,
    source_endpoint        TEXT,
    fetched_at             TIMESTAMPTZ DEFAULT now(),
    payload                JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.assistant_cancellation_records IS '对应JSON字段：assistant_cancellation_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.id IS '对应JSON字段：id，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.siteId IS '对应JSON字段：siteId，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.siteProfile IS '对应JSON字段：siteProfile，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantName IS '对应JSON字段：assistantName，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantAbolishAmount IS '对应JSON字段：assistantAbolishAmount，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantOn IS '对应JSON字段：assistantOn，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.pdChargeMinutes IS '对应JSON字段：pdChargeMinutes，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableAreaId IS '对应JSON字段：tableAreaId，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableArea IS '对应JSON字段：tableArea，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableId IS '对应JSON字段：tableId，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableName IS '对应JSON字段：tableName，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.trashReason IS '对应JSON字段：trashReason，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.createTime IS '对应JSON字段：createTime，说明：?????? assistant_cancellation_records-Analysis.md，示例值及对应分析：?? assistant_cancellation_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.assistant_accounts_master (
    id                     BIGINT PRIMARY KEY,
    tenant_id              BIGINT,
    site_id                BIGINT,
    assistant_no           TEXT,
    nickname               TEXT,
    real_name              TEXT,
    mobile                 TEXT,
    team_id                BIGINT,
    team_name              TEXT,
    user_id                BIGINT,
    level                  TEXT,
    assistant_status       INT,
    work_status            INT,
    leave_status           INT,
    entry_time             TIMESTAMP,
    resign_time            TIMESTAMP,
    start_time             TIMESTAMP,
    end_time               TIMESTAMP,
    create_time            TIMESTAMP,
    update_time            TIMESTAMP,
    order_trade_no         TEXT,
    staff_id               BIGINT,
    staff_profile_id       BIGINT,
    system_role_id         BIGINT,
    avatar                 TEXT,
    gender                 INT,
    height                 NUMERIC(18,2),
    weight                 NUMERIC(18,2),
    job_num                TEXT,
    show_status            INT,
    show_sort              INT,
    sum_grade              NUMERIC(18,2),
    assistant_grade        NUMERIC(18,2),
    get_grade_times        INT,
    introduce              TEXT,
    video_introduction_url TEXT,
    group_id               BIGINT,
    group_name             TEXT,
    shop_name              TEXT,
    charge_way             INT,
    entry_type             INT,
    allow_cx               INT,
    is_guaranteed          INT,
    salary_grant_enabled   INT,
    light_status           INT,
    online_status          INT,
    is_delete              INT,
    cx_unit_price          NUMERIC(18,2),
    pd_unit_price          NUMERIC(18,2),
    last_table_id          BIGINT,
    last_table_name        TEXT,
    person_org_id          BIGINT,
    serial_number          BIGINT,
    is_team_leader         INT,
    criticism_status       INT,
    ding_talk_synced       INT,
    site_light_cfg_id      BIGINT,
    light_equipment_id     TEXT,
    entry_sign_status      INT,
    resign_sign_status     INT,
    source_file            TEXT,
    source_endpoint        TEXT,
    fetched_at             TIMESTAMPTZ DEFAULT now(),
    payload                JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.assistant_accounts_master IS '对应JSON字段：assistant_accounts_master.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.id IS '对应JSON字段：id，说明：：助教账号主键 ID，在“助教流水.json”中对应 site_assistant_id。，示例值及对应分析：作用：所有与助教相关的事实表（助教流水、助教排班等）都会通过这个 ID 关联到该维表。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.tenant_id IS '对应JSON字段：tenant_id，说明：：品牌/租户 ID，对应“非球科技”系统中该商户的唯一标识。，示例值及对应分析：用途：多门店时用来区分不同商户。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.site_id IS '对应JSON字段：site_id，说明：：门店 ID，对应本次数据的这家球房（朗朗桌球）。，示例值及对应分析：关联：与其它 JSON（台费流水、库存、销售等）中的 site_id 一致。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_no IS '对应JSON字段：assistant_no，说明：（结合字段名推测）：助教工号 / 编号，便于业务侧识别。，示例值及对应分析：关联：在“助教流水.json”中有 assistantNo，与此字段对应。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.nickname IS '对应JSON字段：nickname，说明：：助教在前台展示的昵称，如“佳怡”“周周”“球球”等。，示例值及对应分析：用途：与真实姓名区分，用于顾客侧展示。如在助教流水中 nickname 就是这个值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.real_name IS '对应JSON字段：real_name，说明：：助教真实姓名，如“何海婷”“梁婷婷”等。，示例值及对应分析：关联：在“助教流水.json”的 assistantName 与此一致。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.mobile IS '对应JSON字段：mobile，说明：：助教手机号，用于登录绑定、通知、钉钉同步等。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.team_id IS '对应JSON字段：team_id，说明：：助教所属团队 ID。，示例值及对应分析：关联：在“助教流水.json”中 assistant_team_id 与此一致。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.team_name IS '对应JSON字段：team_name，说明：：团队名称，展示用，和 team_id 一一对应。，示例值及对应分析：group_id';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.level IS '对应JSON字段：level，说明：（结合“助教流水中的 assistant_level / levelName 推测”）：，示例值及对应分析：8：助教管理/管理员（和流水里的 "助教管理" 对应）';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_status IS '对应JSON字段：assistant_status，说明：（推测）：账号启用状态：，示例值及对应分析：1：启用';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.work_status IS '对应JSON字段：work_status，说明：：，示例值及对应分析：1：在岗/可排班';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.leave_status IS '对应JSON字段：leave_status，说明：类型：int，枚举。，示例值及对应分析：观测：';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_time IS '对应JSON字段：entry_time，说明：：入职时间。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.resign_time IS '对应JSON字段：resign_time，说明：：离职日期；使用“远未来日期”作为“未离职”的占位。，示例值及对应分析：entry_type';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.start_time IS '对应JSON字段：start_time，说明：（推测）：当前配置生效的开始日期。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.end_time IS '对应JSON字段：end_time，说明：：当前配置生效的结束日期（例如一个周期性的排班/合同周期）。，示例值及对应分析：last_table_id';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.create_time IS '对应JSON字段：create_time，说明：：账号创建时间。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.update_time IS '对应JSON字段：update_time，说明：：账号最近一次被修改的时间（例如修改等级、昵称等）。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.order_trade_no IS '对应JSON字段：order_trade_no，说明：（推测）：该助教最近一次关联的订单号，用于快速跳转或回溯最近服务行为。，示例值及对应分析：9. 灯控、钉钉等系统集成相关字段';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.staff_id IS '对应JSON字段：staff_id，说明：（推测）：预留给“人事系统员工 ID”的字段，目前未接入或未启用。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.staff_profile_id IS '对应JSON字段：staff_profile_id，说明：（推测）：人事档案 ID，与第三方 HR 系统或内部员工档案集成使用，当前未启用。，示例值及对应分析：4. 等级、计费与薪资配置字段';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.system_role_id IS '对应JSON字段：system_role_id，说明：?????? assistant_accounts_master-Analysis.md，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.avatar IS '对应JSON字段：avatar，说明：：助教头像地址。，示例值及对应分析：introduce';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.gender IS '对应JSON字段：gender，说明：（结合常见约定与值分布推测）：，示例值及对应分析：0：未填/保密';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.show_status IS '对应JSON字段：show_status，说明：（推测）：前台展示状态：，示例值及对应分析：1：在助教选择界面展示。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.show_sort IS '对应JSON字段：show_sort，说明：：前台展示排序权重，值越小/越大对应不同的排序策略（当前看起来与 assistant_no 有一定对应关系）。，示例值及对应分析：online_status';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.sum_grade IS '对应JSON字段：sum_grade，说明：：评分总和，用于计算平均分（assistant_grade = sum_grade / get_grade_times），当前为 0。，示例值及对应分析：?? assistant_accounts_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.get_grade_times IS '对应JSON字段：get_grade_times，说明：：累计被评分次数。，示例值及对应分析：charge_way';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.video_introduction_url IS '对应JSON字段：video_introduction_url，说明：：助教个人视频介绍地址。，示例值及对应分析：height';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.user_id IS '对应JSON字段：user_id，说明：账号对应的用户 ID/员工 ID，用于跨表关联。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.height IS '对应JSON字段：height，说明：身高（数值），可空。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.weight IS '对应JSON字段：weight，说明：体重（数值），可空。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.job_num IS '对应JSON字段：job_num，说明：工号/岗位编号，保留原始取值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_grade IS '对应JSON字段：assistant_grade，说明：平均评分，通常 = sum_grade/get_grade_times。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.introduce IS '对应JSON字段：introduce，说明：个人简介/自我介绍，可空。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.group_id IS '对应JSON字段：group_id，说明：分组/自定义分组 ID。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.group_name IS '对应JSON字段：group_name，说明：分组名称。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.shop_name IS '对应JSON字段：shop_name，说明：门店名称冗余。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.charge_way IS '对应JSON字段：charge_way，说明：收费方式枚举，保留原值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_type IS '对应JSON字段：entry_type，说明：入职类型枚举，保留原值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.allow_cx IS '对应JSON字段：allow_cx，说明：是否允许超休/冲销（0/1）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_guaranteed IS '对应JSON字段：is_guaranteed，说明：是否保底（0/1）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.salary_grant_enabled IS '对应JSON字段：salary_grant_enabled，说明：薪资发放/补贴开关，枚举。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.light_status IS '对应JSON字段：light_status，说明：灯控状态/模式，保留原值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.online_status IS '对应JSON字段：online_status，说明：在线状态标记（0/1等）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_delete IS '对应JSON字段：is_delete，说明：逻辑删除标记（0=有效，1=删除）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.cx_unit_price IS '对应JSON字段：cx_unit_price，说明：超休单价/冲销单价，金额类。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.pd_unit_price IS '对应JSON字段：pd_unit_price，说明：排钟/点钟单价，金额类。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.last_table_id IS '对应JSON字段：last_table_id，说明：最近服务桌台 ID。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.last_table_name IS '对应JSON字段：last_table_name，说明：最近服务桌台名称。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.person_org_id IS '对应JSON字段：person_org_id，说明：人员组织 ID/部门 ID。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.serial_number IS '对应JSON字段：serial_number，说明：序列号/排序号，保留原值。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_team_leader IS '对应JSON字段：is_team_leader，说明：是否组长（0/1）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.criticism_status IS '对应JSON字段：criticism_status，说明：处罚/警告状态标记，枚举。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.ding_talk_synced IS '对应JSON字段：ding_talk_synced，说明：是否已同步钉钉（0/1）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.site_light_cfg_id IS '对应JSON字段：site_light_cfg_id，说明：门店灯控配置 ID。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.light_equipment_id IS '对应JSON字段：light_equipment_id，说明：灯控设备 ID/硬件编号。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_sign_status IS '对应JSON字段：entry_sign_status，说明：入职签署状态，枚举。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.resign_sign_status IS '对应JSON字段：resign_sign_status，说明：离职签署状态，枚举。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.assistant_service_records (
    id                       BIGINT PRIMARY KEY,
    tenant_id                BIGINT,
    site_id                  BIGINT,
    siteProfile              JSONB,
    site_table_id            BIGINT,
    order_settle_id          BIGINT,
    order_trade_no           TEXT,
    order_pay_id             BIGINT,
    order_assistant_id       BIGINT,
    order_assistant_type     INT,
    assistantName            TEXT,
    assistantNo              TEXT,
    assistant_level          TEXT,
    assistant_team_id        BIGINT,
    nickname                 TEXT,
    ledger_name              TEXT,
    ledger_group_name        TEXT,
    ledger_amount            NUMERIC(18,2),
    ledger_count             NUMERIC(18,4),
    ledger_unit_price        NUMERIC(18,4),
    ledger_status            INT,
    ledger_start_time        TIMESTAMP,
    ledger_end_time          TIMESTAMP,
    manual_discount_amount   NUMERIC(18,2),
    member_discount_amount   NUMERIC(18,2),
    coupon_deduct_money      NUMERIC(18,2),
    service_money            NUMERIC(18,2),
    projected_income         NUMERIC(18,2),
    real_use_seconds         INT,
    income_seconds           INT,
    start_use_time           TIMESTAMP,
    last_use_time            TIMESTAMP,
    create_time              TIMESTAMP,
    is_single_order          INT,
    is_delete                INT,
    is_trash                 INT,
    trash_reason             TEXT,
    trash_applicant_id       BIGINT,
    trash_applicant_name     TEXT,
    operator_id              BIGINT,
    operator_name            TEXT,
    salesman_name            TEXT,
    salesman_org_id          BIGINT,
    salesman_user_id         BIGINT,
    person_org_id            BIGINT,
    add_clock                INT,
    returns_clock            INT,
    composite_grade          NUMERIC(10,2),
    composite_grade_time     TIMESTAMP,
    skill_grade              NUMERIC(10,2),
    service_grade            NUMERIC(10,2),
    sum_grade                NUMERIC(10,2),
    grade_status             INT,
    get_grade_times          INT,
    is_not_responding        INT,
    is_confirm               INT,
    payload                  JSONB NOT NULL,
    source_file              TEXT,
    source_endpoint          TEXT,
    fetched_at               TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.assistant_service_records IS '对应JSON字段：assistant_service_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.id IS '对应JSON字段：id，说明：：本条助教流水记录的主键 ID（流水唯一标识）。，示例值及对应分析：作用：在系统内部唯一定位这一条助教服务记录。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID；你这份数据中是固定值（同一个商户）。，示例值及对应分析：关联：全库所有表都有，作为“商户维度”的过滤键。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.site_id IS '对应JSON字段：site_id，说明：：门店 ID，本数据中指“朗朗桌球”这一家门店。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.siteProfile IS '对应JSON字段：siteProfile，说明：：门店信息快照，包括 id、shop_name、address 等，和其他 JSON 里的 siteProfile 一致。，示例值及对应分析：作用：冗余门店信息，方便查看（而不是每次都联表看门店档案）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.site_table_id IS '对应JSON字段：site_table_id，说明：：球台 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_settle_id IS '对应JSON字段：order_settle_id，说明：：订单结算 ID，相当于“结账单号”的内部主键。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_trade_no IS '对应JSON字段：order_trade_no，说明：：订单交易号，整个订单层面的编号。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_pay_id IS '对应JSON字段：order_pay_id，说明：：关联到“支付记录”的主键 ID。，示例值及对应分析：作用：可以和支付记录中的 id / relate_id 等字段对应，找到这条助教服务对应的支付流水。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_assistant_id IS '对应JSON字段：order_assistant_id，说明：：订单中“助教项目明细”的内部 ID。，示例值及对应分析：作用：如果订单里有多条助教项目（比如换助教、多个时间段），此字段唯一标识这一条助教明细。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_assistant_type IS '对应JSON字段：order_assistant_type，说明：（推测）：，示例值及对应分析：1：常规助教服务（主课/基础课）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistantName IS '对应JSON字段：assistantName，说明：：助教姓名，如“何海婷”“胡敏”等。，示例值及对应分析：备注：和助教账号档案里的 real_name 一致。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistantNo IS '对应JSON字段：assistantNo，说明：：助教编号，例如 "27"。，示例值及对应分析：关联：在助教账号表里也有 assistant_no 字段，对应工号/编号。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistant_level IS '对应JSON字段：assistant_level，说明：：助教等级名称，与 assistant_level 一一对应（初级/中级/高级/助教管理）。，示例值及对应分析：备注：属于展示用的冗余字段。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistant_team_id IS '对应JSON字段：assistant_team_id，说明：：当前这条助教服务所对应的“课程/技能名称”。，示例值及对应分析：当 order_assistant_type = 1 时，多为“基础课”。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.nickname IS '对应JSON字段：nickname，说明：：助教对外昵称，如“佳怡”“周周”“球球”等。，示例值及对应分析：说明：从数据看，这个 nickname 是“助教昵称”，不是顾客昵称（容易混淆）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_name IS '对应JSON字段：ledger_name，说明：?????? assistant_service_records-Analysis.md，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_group_name IS '对应JSON字段：ledger_group_name，说明：（推测）：助教项目所属的“计费分组/套餐分组名称”，例如某种助教套餐或业务组名称。，示例值及对应分析：目前未被实际使用。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_amount IS '对应JSON字段：ledger_amount，说明：：按标准单价计算出来的应收金额（近似 = ledger_unit_price × income_seconds / 3600）。，示例值及对应分析：说明：从数据看，这个金额对应“按原价计费”的金额，未扣除各种优惠。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_count IS '对应JSON字段：ledger_count，说明：：台账记录的计时总秒数。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_unit_price IS '对应JSON字段：ledger_unit_price，说明：：助教服务 标准单价（通常是标价：每小时、每节课的单价）。，示例值及对应分析：特点：如 98.0、108.0、190.0 等。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_status IS '对应JSON字段：ledger_status，说明：（推测）：助教流水记录状态：，示例值及对应分析：1：正常有效。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_start_time IS '对应JSON字段：ledger_start_time，说明：：台账层面记录的开始时间。，示例值及对应分析：说明：与 start_use_time 在当前数据中完全一致，可以视为“计费起始时间”。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_end_time IS '对应JSON字段：ledger_end_time，说明：：台账层面的结束时间。，示例值及对应分析：说明：与 last_use_time 一致，可以视为“计费结束时间”。对于 real_use_seconds = 0 的记录，开始和结束时间相同，说明只是预约/录入，并未实际服务。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.manual_discount_amount IS '对应JSON字段：manual_discount_amount，说明：：收银员手动给予的减免金额（人工改价）。，示例值及对应分析：当前导出时间段内暂未出现手动打折的情况。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.member_discount_amount IS '对应JSON字段：member_discount_amount，说明：：由会员卡折扣产生的优惠金额。，示例值及对应分析：说明：尽管字段里是 0，但实际折扣可能已经体现在 projected_income 与 ledger_amount 的差额中，这里只是未单独拆出。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.coupon_deduct_money IS '对应JSON字段：coupon_deduct_money，说明：：由“优惠券/代金券/团购券”等 直接抵扣到这条助教服务上的金额。，示例值及对应分析：说明：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.service_money IS '对应JSON字段：service_money，说明：（推测）：用于记录与助教结算的金额（平台预留的“成本/分成”字段）。，示例值及对应分析：当前数据中未启用这个机制，所以全为 0。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.projected_income IS '对应JSON字段：projected_income，说明：：实际结算计入门店的金额（已经考虑折扣、卡权益、券等后的结果）。，示例值及对应分析：从数据：projected_income 明显低于 ledger_amount，说明中间有折扣，但折扣的明细并不全由下面几个字段体现（很多是卡权益内生折扣）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.real_use_seconds IS '对应JSON字段：real_use_seconds，说明：：实际使用时长（秒）。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.income_seconds IS '对应JSON字段：income_seconds，说明：：计费秒数 / 应计收入对应的时间。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.assistant_service_records.start_use_time IS '对应JSON字段：start_use_time，说明：：助教实际开始服务时间。，示例值及对应分析：特点：正常情况下与 ledger_start_time 相同。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.last_use_time IS '对应JSON字段：last_use_time，说明：：最后一次使用（实际服务）时间。，示例值及对应分析：特点：正常结束时与 ledger_end_time 相同；如果服务还未真正开始或立即结束，开始/结束时间可能相同。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.create_time IS '对应JSON字段：create_time，说明：：这条助教流水记录创建时间（一般接近结算/下单时间）。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_single_order IS '对应JSON字段：is_single_order，说明：（推测）：是否单独订单：，示例值及对应分析：1：本助教服务作为单独订单结算（或单独拆项）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：未删除；';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_trash IS '对应JSON字段：is_trash，说明：：是否已废除/作废：，示例值及对应分析：0：正常有效；';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_reason IS '对应JSON字段：trash_reason，说明：：废除原因（文本说明），例如“顾客取消”“录入错误”等。，示例值及对应分析：当前数据为空字符串，说明当前导出时间段没有被废除的助教流水记录。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_applicant_id IS '对应JSON字段：trash_applicant_id，说明：：提出废除申请的员工 ID（通常是操作员/管理员）。，示例值及对应分析：当前数据全为 0，因此短期内没有发生废除操作。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_applicant_name IS '对应JSON字段：trash_applicant_name，说明：：废除申请人姓名。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.operator_id IS '对应JSON字段：operator_id，说明：：操作员 ID（录入/结算这条助教服务的员工）。，示例值及对应分析：关联：可与员工/账号表对应（本次导出未单独给员工表，但其他 JSON 里多处出现该 ID）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.operator_name IS '对应JSON字段：operator_name，说明：：操作员姓名，与 operator_id 一起使用，便于直接阅读。，示例值及对应分析：user_id';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_name IS '对应JSON字段：salesman_name，说明：：关联的“营业员/销售员姓名”，用于提成归属。，示例值及对应分析：观测：本数据中多数为空字符串，说明助教流水没有配置单独的营业员。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_org_id IS '对应JSON字段：salesman_org_id，说明：：营业员所属组织/部门 ID。，示例值及对应分析：观测：多为 0。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_user_id IS '对应JSON字段：salesman_user_id，说明：：营业员用户 ID。，示例值及对应分析：观测：多为 0，代表未指定。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.person_org_id IS '对应JSON字段：person_org_id，说明：同样在上文说明：助教所属人事组织 ID。，示例值及对应分析：9. 作废 / 废除相关字段';
COMMENT ON COLUMN billiards_ods.assistant_service_records.add_clock IS '对应JSON字段：add_clock，说明：（推测）：加钟秒数，即在原有预约/服务基础上临时追加的时长。，示例值及对应分析：说明：值均为 60 的倍数（分钟级加钟），如 600 秒=10 分钟。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.returns_clock IS '对应JSON字段：returns_clock，说明：（推测）：退钟秒数（取消加钟或提前结束退回的时间）。，示例值及对应分析：当前数据里没有退钟场景，所以全为 0，但字段设计已经预留。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.composite_grade IS '对应JSON字段：composite_grade，说明：：综合评分（例如技能+服务加权后的平均分），当前数据没有实际评分。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.composite_grade_time IS '对应JSON字段：composite_grade_time，说明：（推测）：最近一次评价时间/综合评分更新时间。现在都是默认“无效时间”。，示例值及对应分析：3. 桌台 / 门店维度字段';
COMMENT ON COLUMN billiards_ods.assistant_service_records.skill_grade IS '对应JSON字段：skill_grade，说明：（推测）：顾客对“技能表现”的评分（整数或打分等级）。，示例值及对应分析：当前数据中还未产生评分记录，所以都是默认值 0。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.service_grade IS '对应JSON字段：service_grade，说明：（推测）：顾客对“服务态度”的评分。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.sum_grade IS '对应JSON字段：sum_grade，说明：：累计评分总和（可能用于计算平均分），当前为 0。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.grade_status IS '对应JSON字段：grade_status，说明：（推测）：评价状态，比如：，示例值及对应分析：1 = 未评价/正常；';
COMMENT ON COLUMN billiards_ods.assistant_service_records.get_grade_times IS '对应JSON字段：get_grade_times，说明：：该条记录对应的评价次数（或该助教被评价次数快照）。，示例值及对应分析：?? assistant_service_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_not_responding IS '对应JSON字段：is_not_responding，说明：（推测）：是否存在“爽约/未响应”情况：，示例值及对应分析：0：正常；';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_confirm IS '对应JSON字段：is_confirm，说明：（推测）：确认状态，例如：，示例值及对应分析：1：待确认；';
COMMENT ON COLUMN billiards_ods.assistant_service_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_service_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_service_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.assistant_service_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.site_tables_master (
    id                       BIGINT PRIMARY KEY,
    site_id                  BIGINT,
    siteName                 TEXT,
    "appletQrCodeUrl"        TEXT,
    areaName                 TEXT,
    audit_status             INT,
    charge_free              INT,
    create_time              TIMESTAMP,
    delay_lights_time        INT,
    is_online_reservation    INT,
    is_rest_area             INT,
    light_status             INT,
    only_allow_groupon       INT,
    order_delay_time         INT,
    self_table               INT,
    show_status              INT,
    site_table_area_id       BIGINT,
    tableStatusName          TEXT,
    table_cloth_use_Cycle    INT,
    table_cloth_use_time     TIMESTAMP,
    table_name               TEXT,
    table_price              NUMERIC(18,2),
    table_status             INT,
    temporary_light_second   INT,
    virtual_table            INT,
    source_file              TEXT,
    source_endpoint          TEXT,
    fetched_at               TIMESTAMPTZ DEFAULT now(),
    payload                  JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.site_tables_master IS '对应JSON字段：site_tables_master.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 site_tables_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.site_tables_master.id IS '对应JSON字段：id，说明：：台桌主键 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.site_tables_master.site_id IS '对应JSON字段：site_id，说明：：门店 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.site_tables_master.siteName IS '对应JSON字段：siteName，说明：：门店名称快照，冗余字段，配合 site_id 使用。，示例值及对应分析：?? site_tables_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.site_tables_master."appletQrCodeUrl" IS '对应JSON字段：appletQrCodeUrl，说明：：小程序二维码 URL。 一般用于：，示例值及对应分析：打印二维码贴在台上，顾客扫码可呼叫服务、查看账单或发起线上预约；';
COMMENT ON COLUMN billiards_ods.site_tables_master.areaName IS '对应JSON字段：areaName，说明：：区域名称，用于前台展示和区域维度管理。，示例值及对应分析：结构特征：';
COMMENT ON COLUMN billiards_ods.site_tables_master.audit_status IS '对应JSON字段：audit_status，说明：（结合命名惯例）：，示例值及对应分析：2：已审核/已启用；';
COMMENT ON COLUMN billiards_ods.site_tables_master.charge_free IS '对应JSON字段：charge_free，说明：（推测）：，示例值及对应分析：0：正常计费；';
COMMENT ON COLUMN billiards_ods.site_tables_master.create_time IS '对应JSON字段：create_time，说明：：台桌配置的创建时间或最近一次创建/复制时间。，示例值及对应分析：三、与其它 JSON 的字段级关联关系（结构视角）';
COMMENT ON COLUMN billiards_ods.site_tables_master.delay_lights_time IS '对应JSON字段：delay_lights_time，说明：（推测）：台灯熄灭延迟时间（单位多半是秒或分钟），用于结账后延时关灯。，示例值及对应分析：本门店未启用延迟关灯功能（全部为 0）。';
COMMENT ON COLUMN billiards_ods.site_tables_master.is_online_reservation IS '对应JSON字段：is_online_reservation，说明：（结合值分布推断）：，示例值及对应分析：1：允许线上预约（可在小程序/线上平台预约这张台）；';
COMMENT ON COLUMN billiards_ods.site_tables_master.is_rest_area IS '对应JSON字段：is_rest_area，说明：（推测）：，示例值及对应分析：0：正常计费区域；';
COMMENT ON COLUMN billiards_ods.site_tables_master.light_status IS '对应JSON字段：light_status，说明：（结合命名推断）：，示例值及对应分析：该字段是台灯/灯光状态开关位：';
COMMENT ON COLUMN billiards_ods.site_tables_master.only_allow_groupon IS '对应JSON字段：only_allow_groupon，说明：（结合命名推断）：，示例值及对应分析：1：仅允许团购/券预约使用（团购专用台）；';
COMMENT ON COLUMN billiards_ods.site_tables_master.order_delay_time IS '对应JSON字段：order_delay_time，说明：（推测）：订单层面允许的“自动延时时长”（例如到点后自动延长多少时间继续计费）。，示例值及对应分析：本门店未使用此功能。';
COMMENT ON COLUMN billiards_ods.site_tables_master.self_table IS '对应JSON字段：self_table，说明：（推测）：，示例值及对应分析：1：“本门店自有台”，非共享或外部配置；';
COMMENT ON COLUMN billiards_ods.site_tables_master.show_status IS '对应JSON字段：show_status，说明：（推测）：，示例值及对应分析：1：正常在前台“开台列表”中展示；';
COMMENT ON COLUMN billiards_ods.site_tables_master.site_table_area_id IS '对应JSON字段：site_table_area_id，说明：：门店维度的“台桌区域 ID”。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.site_tables_master.tableStatusName IS '对应JSON字段：tableStatusName，说明：：table_status 的中文名称，仅为展示用途。，示例值及对应分析：?? site_tables_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_cloth_use_Cycle IS '对应JSON字段：table_cloth_use_Cycle，说明：（推测）：，示例值及对应分析：台呢使用周期阈值，例如达到某个秒数后提醒更换；';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_cloth_use_time IS '对应JSON字段：table_cloth_use_time，说明：（结合命名和数值特征）：，示例值及对应分析：台呢使用累计时长，单位极大概率为“秒”：';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_name IS '对应JSON字段：table_name，说明：：台号/台名称，用于前台操作界面展示，也出现在小票和各种流水中的 ledger_name 或 tableName 字段。，示例值及对应分析：?? site_tables_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_price IS '对应JSON字段：table_price，说明：（结构角度）：，示例值及对应分析：设计上应为“台的基础单价”字段（例如按小时或按局单价）；';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_status IS '对应JSON字段：table_status，说明：：台当前运行状态，真实反映某一时刻台的占用/暂停情况。，示例值及对应分析：?? site_tables_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.site_tables_master.temporary_light_second IS '对应JSON字段：temporary_light_second，说明：（推测）：临时点灯时长（秒），例如手动临时开灯一段时间。，示例值及对应分析：本门店未使用。';
COMMENT ON COLUMN billiards_ods.site_tables_master.virtual_table IS '对应JSON字段：virtual_table，说明：（推测）：，示例值及对应分析：0：物理台（实体存在的桌）；';
COMMENT ON COLUMN billiards_ods.site_tables_master.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.site_tables_master.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.site_tables_master.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.site_tables_master.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.table_fee_discount_records (
    id                  BIGINT PRIMARY KEY,
    tenant_id           BIGINT,
    site_id             BIGINT,
    siteProfile         JSONB,
    site_table_id       BIGINT,
    tableProfile        JSONB,
    tenant_table_area_id BIGINT,
    adjust_type         INT,
    ledger_amount       NUMERIC(18,2),
    ledger_count        NUMERIC(18,4),
    ledger_name         TEXT,
    ledger_status       INT,
    applicant_id        BIGINT,
    applicant_name      TEXT,
    operator_id         BIGINT,
    operator_name       TEXT,
    order_settle_id     BIGINT,
    order_trade_no      TEXT,
    is_delete           INT,
    create_time         TIMESTAMP,
    source_file         TEXT,
    source_endpoint     TEXT,
    fetched_at          TIMESTAMPTZ DEFAULT now(),
    payload             JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.table_fee_discount_records IS '对应JSON字段：table_fee_discount_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 table_fee_discount_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.id IS '对应JSON字段：id，说明：：台费打折 / 调整流水主键 ID。，示例值及对应分析：作用：在“台费调账表”中唯一标识一条折扣/调账操作。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。，示例值及对应分析：作用：标识记录属于哪一个商户（同一个“非球科技”租户）。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.site_id IS '对应JSON字段：site_id，说明：：门店 ID，本批数据全部为同一家门店（朗朗桌球）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.siteProfile IS '对应JSON字段：siteProfile，说明：：门店信息快照，用于报表时直接读取，无需再联门店档案。，示例值及对应分析：?? table_fee_discount_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.site_table_id IS '对应JSON字段：site_table_id，说明：：台桌 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tableProfile IS '对应JSON字段：tableProfile，说明：：折扣发生时，对应台桌的配置信息快照。，示例值及对应分析：?? table_fee_discount_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tenant_table_area_id IS '对应JSON字段：tenant_table_area_id，说明：：租户维度的“台桌区域 ID”。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.adjust_type IS '对应JSON字段：adjust_type，说明：（根据文件含义 + 命名 + 数据）：，示例值及对应分析：文件名是“台费打折”，字段名为“调整类型”，当前所有记录都是 1，即“台费打折/台费减免”这一种调整类型。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_amount IS '对应JSON字段：ledger_amount，说明：（关键点）：，示例值及对应分析：通过与 台费流水.json 做对比，可以明确：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_count IS '对应JSON字段：ledger_count，说明：：，示例值及对应分析：这里不是“秒数”，而是“调整次数/条数”的量化，目前固定为 1，表示“一次调账事件”。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_name IS '对应JSON字段：ledger_name，说明：（推测）：，示例值及对应分析：设计上应该用于记录“调账项目名称”或“打折原因描述”（例如某种优惠规则名称），但当前门店并未使用该字段。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_status IS '对应JSON字段：ledger_status，说明：：，示例值及对应分析：1：生效调整（当前有效的台费打折 / 调账记录）；';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.applicant_id IS '对应JSON字段：applicant_id，说明：：打折/调账申请人 ID。，示例值及对应分析：作用：记录谁发起了这次台费调整。 本时段内所有调整均由同一位员工发起。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.applicant_name IS '对应JSON字段：applicant_name，说明：：申请人姓名（带角色描述），为 applicant_id 的冗余显示字段。，示例值及对应分析：?? table_fee_discount_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.operator_id IS '对应JSON字段：operator_id，说明：：实际执行调账操作的操作员 ID。，示例值及对应分析：说明：这段时间内，“申请人”和“操作员”是同一个人。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.operator_name IS '对应JSON字段：operator_name，说明：：操作员姓名。，示例值及对应分析：?? table_fee_discount_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.order_settle_id IS '对应JSON字段：order_settle_id，说明：：结算单/小票 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.order_trade_no IS '对应JSON字段：order_trade_no，说明：：订单交易号。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志：，示例值及对应分析：0：未删除（有效记录）；';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.create_time IS '对应JSON字段：create_time，说明：：台费调整记录的创建时间，即打折操作被执行的时间戳。，示例值及对应分析：说明：与台费流水中的 create_time（结算时间）相互配合，可以还原调整发生于结账之前还是之后。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.table_fee_transactions (
    id                       BIGINT PRIMARY KEY,
    tenant_id                BIGINT,
    site_id                  BIGINT,
    siteProfile              JSONB,
    site_table_id            BIGINT,
    site_table_area_id       BIGINT,
    site_table_area_name     TEXT,
    tenant_table_area_id     BIGINT,
    order_trade_no           TEXT,
    order_pay_id             BIGINT,
    order_settle_id          BIGINT,
    ledger_name              TEXT,
    ledger_amount            NUMERIC(18,2),
    ledger_count             NUMERIC(18,4),
    ledger_unit_price        NUMERIC(18,4),
    ledger_status            INT,
    ledger_start_time        TIMESTAMP,
    ledger_end_time          TIMESTAMP,
    start_use_time           TIMESTAMP,
    last_use_time            TIMESTAMP,
    real_table_use_seconds   INT,
    real_table_charge_money  NUMERIC(18,2),
    add_clock_seconds        INT,
    adjust_amount            NUMERIC(18,2),
    coupon_promotion_amount  NUMERIC(18,2),
    member_discount_amount   NUMERIC(18,2),
    used_card_amount         NUMERIC(18,2),
    mgmt_fee                 NUMERIC(18,2),
    service_money            NUMERIC(18,2),
    fee_total                NUMERIC(18,2),
    is_single_order          INT,
    is_delete                INT,
    member_id                BIGINT,
    operator_id              BIGINT,
    operator_name            TEXT,
    salesman_name            TEXT,
    salesman_org_id          BIGINT,
    salesman_user_id         BIGINT,
    create_time              TIMESTAMP,
    payload                  JSONB NOT NULL,
    source_file              TEXT,
    source_endpoint          TEXT,
    fetched_at               TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.table_fee_transactions IS '对应JSON字段：table_fee_transactions.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 table_fee_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.id IS '对应JSON字段：id，说明：：台费流水记录主键（事实表主键）。，示例值及对应分析：?? table_fee_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。本文件所有记录都属于同一租户。，示例值及对应分析：关联：与所有其它 JSON 中的 tenant_id 一致，用于跨表做“商户维度”的过滤。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_id IS '对应JSON字段：site_id，说明：：门店 ID，本次数据全部来自同一门店（朗朗桌球）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.siteProfile IS '对应JSON字段：siteProfile，说明：：当前门店的完整档案快照，冗余到流水表中，便于报表直接读取而无需再联表门店档案。，示例值及对应分析：三、与其它 JSON 的结构关联关系（从字段层面）';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_id IS '对应JSON字段：site_table_id，说明：：球台 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_area_id IS '对应JSON字段：site_table_area_id，说明：：门店内“台桌区域” ID（站在门店物理布局的角度）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_area_name IS '对应JSON字段：site_table_area_name，说明：：台桌区域的名称，用于门店表现和区域统计。，示例值及对应分析：4. 会员维度与相关字段';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.tenant_table_area_id IS '对应JSON字段：tenant_table_area_id，说明：：租户维度的台桌区域 ID（品牌层面的同一类区域）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_trade_no IS '对应JSON字段：order_trade_no，说明：：订单交易号，是整笔订单的主编号。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_pay_id IS '对应JSON字段：order_pay_id，说明：：订单支付记录 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_settle_id IS '对应JSON字段：order_settle_id，说明：：结算单号/结账 ID，对应一次结账操作。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_name IS '对应JSON字段：ledger_name，说明：：台号名称，实际展示给员工/顾客看的桌台编号。，示例值及对应分析：备注：与 site_table_id 一一对应，是桌台维表中的名称字段冗余到流水里的快照。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_amount IS '对应JSON字段：ledger_amount，说明：：按单价与计费时长计算出的原始应收台费金额。，示例值及对应分析：近似关系：ledger_amount ≈ ledger_unit_price × ledger_count / 3600，考虑到四舍五入会有小数差。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_count IS '对应JSON字段：ledger_count，说明：：台账记录的计费秒数，计费用秒数（应收时长）。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_unit_price IS '对应JSON字段：ledger_unit_price，说明：：台费结算时设置的 每小时单价/计费单价。，示例值及对应分析：用途：与 ledger_count 共同决定原始应收额。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_status IS '对应JSON字段：ledger_status，说明：（推测）：，示例值及对应分析：1：正常已结算台费；';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_start_time IS '对应JSON字段：ledger_start_time，说明：：台账上的计费起始时间。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_end_time IS '对应JSON字段：ledger_end_time，说明：：台账上的计费结束时间。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.start_use_time IS '对应JSON字段：start_use_time，说明：：台开始使用的时间（实际开台时间）。，示例值及对应分析：特点：在数据中，与 ledger_start_time 完全相同（见下）。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.last_use_time IS '对应JSON字段：last_use_time，说明：：最后使用/操作时间。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.real_table_use_seconds IS '对应JSON字段：real_table_use_seconds，说明：：实际使用的总秒数（系统真实统计的使用时长）。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.real_table_charge_money IS '对应JSON字段：real_table_charge_money，说明：：台费中实际向顾客收取的金额（现金/实付维度，未含券方承担或内部调账的那一部分）。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.add_clock_seconds IS '对应JSON字段：add_clock_seconds，说明：：加钟秒数，在原有使用基础上追加的时长。，示例值及对应分析：观测：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.adjust_amount IS '对应JSON字段：adjust_amount，说明：：调整金额/调账金额，用于将台费金额转移或冲减到其它项目，或手工调整。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.coupon_promotion_amount IS '对应JSON字段：coupon_promotion_amount，说明：：由优惠券/活动/团购（平台/门店促销）承担的优惠金额，直接抵扣在台费上。，示例值及对应分析：特点：当 real_table_charge_money = 0 且该字段为 ledger_amount 时，说明整笔台费是由券促销全额承担。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.member_discount_amount IS '对应JSON字段：member_discount_amount，说明：上文已说明，这里补充与金额的结构关系：，示例值及对应分析：功能：表示由会员折扣或会员权益承担的那部分金额。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.used_card_amount IS '对应JSON字段：used_card_amount，说明：：由储值卡、次卡等“卡内余额”抵扣的金额。，示例值及对应分析：说明：字段设计已预留，但本段时间内台费没有通过储值卡扣款，或者卡扣款在其他表体现。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.mgmt_fee IS '对应JSON字段：mgmt_fee，说明：（推测）：管理费字段，用于未来支持“台费附加管理费/服务费”的功能。，示例值及对应分析：当前未启用。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.service_money IS '对应JSON字段：service_money，说明：（推测）：门店用于记录“服务费/成本/分成金额”的字段，类似助教流水里的 service_money。，示例值及对应分析：说明：当前门店未启用此字段结算台费。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.fee_total IS '对应JSON字段：fee_total，说明：：各种附加费用（如管理费、服务费）合计值。，示例值及对应分析：说明：和 mgmt_fee 一样，目前作为预留字段，没有实际使用。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.is_single_order IS '对应JSON字段：is_single_order，说明：（推测）：，示例值及对应分析：1：该台费记录对应的是一个独立计费单元（单独结算的桌费）；';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志：，示例值及对应分析：0：未删除（有效记录）；';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.member_id IS '对应JSON字段：member_id，说明：：门店/租户内的会员 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.operator_id IS '对应JSON字段：operator_id，说明：：操作员 ID，负责开台/结账的员工账号 ID。，示例值及对应分析：关联：与员工/账号体系中的用户 ID 对应（与助教账号的 user_id 属于同一种 ID 体系）。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.operator_name IS '对应JSON字段：operator_name，说明：：操作员姓名（冗余字段），便于直接阅读，不必再联表员工档案。，示例值及对应分析：?? table_fee_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_name IS '对应JSON字段：salesman_name，说明：：业务员/营业员姓名，如果台费有单独提成员工，这里记录归属人。，示例值及对应分析：当前门店未启用该字段做提成归属。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_org_id IS '对应JSON字段：salesman_org_id，说明：：营业员所属机构/部门 ID。，示例值及对应分析：8. 状态 / 标记类字段';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_user_id IS '对应JSON字段：salesman_user_id，说明：：营业员的用户 ID（与 salesman_name 搭配）。，示例值及对应分析：?? table_fee_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.create_time IS '对应JSON字段：create_time，说明：：这条台费流水记录的创建时间，通常接近结账时间。，示例值及对应分析：?? table_fee_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.goods_stock_movements (
    siteGoodsStockId     BIGINT PRIMARY KEY,
    tenantId             BIGINT,
    siteId               BIGINT,
    siteGoodsId          BIGINT,
    goodsName            TEXT,
    goodsCategoryId      BIGINT,
    goodsSecondCategoryId BIGINT,
    unit                 TEXT,
    price                NUMERIC(18,4),
    stockType            INT,
    changeNum            NUMERIC(18,4),
    startNum             NUMERIC(18,4),
    endNum               NUMERIC(18,4),
    changeNumA           NUMERIC(18,4),
    startNumA            NUMERIC(18,4),
    endNumA              NUMERIC(18,4),
    remark               TEXT,
    operatorName         TEXT,
    createTime           TIMESTAMP,
    source_file          TEXT,
    source_endpoint      TEXT,
    fetched_at           TIMESTAMPTZ DEFAULT now(),
    payload              JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.goods_stock_movements IS '对应JSON字段：goods_stock_movements.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 goods_stock_movements-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteGoodsStockId IS '对应JSON字段：siteGoodsStockId，说明：：门店某个“商品库存记录”的主键 ID。，示例值及对应分析：特点：每条库存变动记录对应一个 siteGoodsStockId，同一个商品可能在不同库存记录中出现（例如不同仓位或不同批次）。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.tenantId IS '对应JSON字段：tenantId，说明：：租户/品牌 ID。，示例值及对应分析：观测：全部记录相同值，说明属于同一商户。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteId IS '对应JSON字段：siteId，说明：：门店 ID。，示例值及对应分析：观测：本文件中所有记录的 siteId 都相同，对应“朗朗桌球”这家门店。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteGoodsId IS '对应JSON字段：siteGoodsId，说明：：门店维度的商品 ID。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsName IS '对应JSON字段：goodsName，说明：：商品名称。，示例值及对应分析：示例值：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsCategoryId IS '对应JSON字段：goodsCategoryId，说明：：商品一级分类 ID。，示例值及对应分析：观测：当前 100 条样本中约有 5 个不同 ID，对应如“酒水类”“食品小吃类”“香烟类”等大类（仅从命名与商品名推断）。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsSecondCategoryId IS '对应JSON字段：goodsSecondCategoryId，说明：：商品二级分类 ID。，示例值及对应分析：观测：样本中约有 7 个不同 ID，如饮料中的“矿泉水/功能饮料/碳酸饮料”等。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.unit IS '对应JSON字段：unit，说明：：库存计量单位。，示例值及对应分析：说明：库存数量（startNum、endNum、changeNum）均以这里的单位计数。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.price IS '对应JSON字段：price，说明：：商品单价（单位金额）。，示例值及对应分析：观测特征：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.stockType IS '对应JSON字段：stockType，说明：（基于数据行为推断）：，示例值及对应分析：1：出库类变动 典型情况是销售出库，库存减少 1 或 2；例如顾客点了一瓶饮料，对应一条 stockType=1, changeNum=-1 的记录。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.changeNum IS '对应JSON字段：changeNum，说明：：本次库存数量变化值。，示例值及对应分析：特点及取值：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.startNum IS '对应JSON字段：startNum，说明：：变动前（这次出入库之前）的库存数量。，示例值及对应分析：示例： 如记录：startNum = 28, changeNum = -1, endNum = 27。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.endNum IS '对应JSON字段：endNum，说明：：变动后（出入库之后）的库存数量。，示例值及对应分析：结构关系：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.changeNumA IS '对应JSON字段：changeNumA，说明：：辅助单位的变化量（与 changeNum 对应的第二计量单位变化），当前未使用。，示例值及对应分析：结论： startNumA / endNumA / changeNumA 是为“一个商品有两种计量单位（如箱与瓶）”而设计的预留字段。 目前门店只在单一单位层面管理库存，故全部为 0。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.startNumA IS '对应JSON字段：startNumA，说明：（推测）：辅助计量单位的起始库存（例如件/箱等第二单位）。，示例值及对应分析：当前门店在样本时间段内没有启用多单位库存管理，因此全部为 0。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.endNumA IS '对应JSON字段：endNumA，说明：：辅助单位的变动后库存，同样未启用。，示例值及对应分析：?? goods_stock_movements-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.remark IS '对应JSON字段：remark，说明：：备注信息，用于手工记录本次变更的特殊原因说明（例如“盘点差异调整”“报损”）。，示例值及对应分析：当前样本中没有填入任何备注，但字段已预留，适用于盘点或手工调整场景。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.operatorName IS '对应JSON字段：operatorName，说明：：执行此次库存变动的操作人。，示例值及对应分析：观测值：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.createTime IS '对应JSON字段：createTime，说明：：这条库存变动记录的创建时间，即发生库存变更的时间点。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.stock_goods_category_tree (
    id                       BIGINT PRIMARY KEY,
    tenant_id                BIGINT,
    category_name            TEXT,
    alias_name               TEXT,
    pid                      BIGINT,
    business_name            TEXT,
    tenant_goods_business_id BIGINT,
    open_salesman            INT,
    categoryBoxes            JSONB,
    sort                     INT,
    is_warehousing           INT,
    source_file              TEXT,
    source_endpoint          TEXT,
    fetched_at               TIMESTAMPTZ DEFAULT now(),
    payload                  JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.stock_goods_category_tree IS '对应JSON字段：stock_goods_category_tree.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.id IS '对应JSON字段：id，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.tenant_id IS '对应JSON字段：tenant_id，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.category_name IS '对应JSON字段：category_name，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.alias_name IS '对应JSON字段：alias_name，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.pid IS '对应JSON字段：pid，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.business_name IS '对应JSON字段：business_name，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.tenant_goods_business_id IS '对应JSON字段：tenant_goods_business_id，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.open_salesman IS '对应JSON字段：open_salesman，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.categoryBoxes IS '对应JSON字段：categoryBoxes，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.sort IS '对应JSON字段：sort，说明：?????? stock_goods_category_tree-Analysis.md，示例值及对应分析：?? stock_goods_category_tree-Analysis.md';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.is_warehousing IS '对应JSON字段：is_warehousing，说明：：分类节点主键 ID（在商品分类维度中的唯一标识）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.goods_stock_summary (
    siteGoodsId           BIGINT PRIMARY KEY,
    goodsName             TEXT,
    goodsUnit             TEXT,
    goodsCategoryId       BIGINT,
    goodsCategorySecondId BIGINT,
    categoryName          TEXT,
    rangeStartStock       NUMERIC(18,4),
    rangeEndStock         NUMERIC(18,4),
    rangeIn               NUMERIC(18,4),
    rangeOut              NUMERIC(18,4),
    rangeSale             NUMERIC(18,4),
    rangeSaleMoney        NUMERIC(18,2),
    rangeInventory        NUMERIC(18,4),
    currentStock          NUMERIC(18,4),
    source_file           TEXT,
    source_endpoint       TEXT,
    fetched_at            TIMESTAMPTZ DEFAULT now(),
    payload               JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.goods_stock_summary IS '对应JSON字段：goods_stock_summary.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.siteGoodsId IS '对应JSON字段：siteGoodsId，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsName IS '对应JSON字段：goodsName，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsUnit IS '对应JSON字段：goodsUnit，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsCategoryId IS '对应JSON字段：goodsCategoryId，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsCategorySecondId IS '对应JSON字段：goodsCategorySecondId，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.categoryName IS '对应JSON字段：categoryName，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeStartStock IS '对应JSON字段：rangeStartStock，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeEndStock IS '对应JSON字段：rangeEndStock，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeIn IS '对应JSON字段：rangeIn，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeOut IS '对应JSON字段：rangeOut，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeSale IS '对应JSON字段：rangeSale，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeSaleMoney IS '对应JSON字段：rangeSaleMoney，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeInventory IS '对应JSON字段：rangeInventory，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.currentStock IS '对应JSON字段：currentStock，说明：?????? goods_stock_summary-Analysis.md，示例值及对应分析：?? goods_stock_summary-Analysis.md';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.payment_transactions (
    id                 BIGINT PRIMARY KEY,
    site_id            BIGINT,
    siteProfile        JSONB,
    relate_type        INT,
    relate_id          BIGINT,
    pay_amount         NUMERIC(18,2),
    pay_status         INT,
    pay_time           TIMESTAMP,
    create_time        TIMESTAMP,
    payment_method     INT,
    online_pay_channel INT,
    source_file        TEXT,
    source_endpoint    TEXT,
    fetched_at         TIMESTAMPTZ DEFAULT now(),
    payload            JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.payment_transactions IS '对应JSON字段：payment_transactions.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.id IS '对应JSON字段：id，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.site_id IS '对应JSON字段：site_id，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.siteProfile IS '对应JSON字段：siteProfile，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.relate_type IS '对应JSON字段：relate_type，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.relate_id IS '对应JSON字段：relate_id，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_amount IS '对应JSON字段：pay_amount，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_status IS '对应JSON字段：pay_status，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_time IS '对应JSON字段：pay_time，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.create_time IS '对应JSON字段：create_time，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.payment_method IS '对应JSON字段：payment_method，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.online_pay_channel IS '对应JSON字段：online_pay_channel，说明：?????? payment_transactions-Analysis.md，示例值及对应分析：?? payment_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.payment_transactions.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.payment_transactions.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.payment_transactions.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.payment_transactions.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.refund_transactions (
    id                   BIGINT PRIMARY KEY,
    tenant_id            BIGINT,
    tenantName           TEXT,
    site_id              BIGINT,
    siteProfile          JSONB,
    relate_type          INT,
    relate_id            BIGINT,
    pay_sn               TEXT,
    pay_amount           NUMERIC(18,2),
    refund_amount        NUMERIC(18,2),
    round_amount         NUMERIC(18,2),
    pay_status           INT,
    pay_time             TIMESTAMP,
    create_time          TIMESTAMP,
    payment_method       INT,
    pay_terminal         INT,
    pay_config_id        BIGINT,
    online_pay_channel   INT,
    online_pay_type      INT,
    channel_fee          NUMERIC(18,2),
    channel_payer_id     TEXT,
    channel_pay_no       TEXT,
    member_id            BIGINT,
    member_card_id       BIGINT,
    cashier_point_id     BIGINT,
    operator_id          BIGINT,
    action_type          INT,
    check_status         INT,
    is_revoke            INT,
    is_delete            INT,
    balance_frozen_amount NUMERIC(18,2),
    card_frozen_amount    NUMERIC(18,2),
    source_file          TEXT,
    source_endpoint      TEXT,
    fetched_at           TIMESTAMPTZ DEFAULT now(),
    payload              JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.refund_transactions IS '对应JSON字段：refund_transactions.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 refund_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.refund_transactions.id IS '对应JSON字段：id，说明：：本条 退款流水 的唯一 ID。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.refund_transactions.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID，全系统维度标识该商户。，示例值及对应分析：特点：本文件中所有记录相同。';
COMMENT ON COLUMN billiards_ods.refund_transactions.tenantName IS '对应JSON字段：tenantName，说明：：租户（商户）名称。，示例值及对应分析：特点：本文件中固定为“朗朗桌球”，完全冗余于 siteProfile.shop_name。';
COMMENT ON COLUMN billiards_ods.refund_transactions.site_id IS '对应JSON字段：site_id，说明：：门店 ID。，示例值及对应分析：特点：本文件中所有记录相同（单门店）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.siteProfile IS '对应JSON字段：siteProfile，说明：：门店信息快照，结构与其他 JSON 中的 siteProfile 完全一致。包含字段包括但不限于：，示例值及对应分析：id：门店 ID（= site_id）；';
COMMENT ON COLUMN billiards_ods.refund_transactions.relate_type IS '对应JSON字段：relate_type，说明：：本退款对应的“业务类型”。，示例值及对应分析：结合支付记录的 relate_type 推测：';
COMMENT ON COLUMN billiards_ods.refund_transactions.relate_id IS '对应JSON字段：relate_id，说明：：本次退款关联的业务 ID。，示例值及对应分析：对于 relate_type = 2：应该对应某个订单/结算的主键；';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_sn IS '对应JSON字段：pay_sn，说明：?????? refund_transactions-Analysis.md，示例值及对应分析：?? refund_transactions-Analysis.md';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_amount IS '对应JSON字段：pay_amount，说明：：本次退款的 资金变动金额。，示例值及对应分析：特征很重要：';
COMMENT ON COLUMN billiards_ods.refund_transactions.refund_amount IS '对应JSON字段：refund_amount，说明：（推测）：，示例值及对应分析：设计上本应显示“实际退款金额”（正数），与 pay_amount 配合使用；';
COMMENT ON COLUMN billiards_ods.refund_transactions.round_amount IS '对应JSON字段：round_amount，说明：（推测）：，示例值及对应分析：舍入金额/抹零金额；';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_status IS '对应JSON字段：pay_status，说明：（推测）：，示例值及对应分析：支付/退款状态枚举：';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_time IS '对应JSON字段：pay_time，说明：：退款在支付渠道层面实际发生的时间。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.refund_transactions.create_time IS '对应JSON字段：create_time，说明：：本条退款流水在系统内创建时间。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.refund_transactions.payment_method IS '对应JSON字段：payment_method，说明：（推测）：，示例值及对应分析：支付/退款的 方式类型：';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_terminal IS '对应JSON字段：pay_terminal，说明：（推测）：，示例值及对应分析：退款所使用的 终端类型：';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_config_id IS '对应JSON字段：pay_config_id，说明：（推测）：，示例值及对应分析：支付配置 ID，例如商户在“非球科技”内配置的某一条支付通道（某个微信商户号、银联通道）的主键。';
COMMENT ON COLUMN billiards_ods.refund_transactions.online_pay_channel IS '对应JSON字段：online_pay_channel，说明：（推测）：，示例值及对应分析：线上支付的 渠道编号，例如：';
COMMENT ON COLUMN billiards_ods.refund_transactions.online_pay_type IS '对应JSON字段：online_pay_type，说明：（推测）：，示例值及对应分析：在线退款的类型：';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_fee IS '对应JSON字段：channel_fee，说明：（推测）：，示例值及对应分析：第三方支付渠道对本次退款收取的手续费；';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_payer_id IS '对应JSON字段：channel_payer_id，说明：（推测）：，示例值及对应分析：支付渠道侧的 payer ID，例如微信 openid、银行卡号掩码等。';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_pay_no IS '对应JSON字段：channel_pay_no，说明：（推测）：，示例值及对应分析：第三方支付平台的交易号（如微信支付单号、支付宝交易号等）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.member_id IS '对应JSON字段：member_id，说明：：，示例值及对应分析：租户内部的会员 ID（对应会员档案中的某个主键）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.member_card_id IS '对应JSON字段：member_card_id，说明：：，示例值及对应分析：关联的会员卡账户 ID（对应“储值卡列表”或“会员档案”中的某一张卡）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.cashier_point_id IS '对应JSON字段：cashier_point_id，说明：（推测）：，示例值及对应分析：收银点 ID，例如前台 1、前台 2、自助机等。';
COMMENT ON COLUMN billiards_ods.refund_transactions.operator_id IS '对应JSON字段：operator_id，说明：：，示例值及对应分析：执行该退款操作的操作员 ID。';
COMMENT ON COLUMN billiards_ods.refund_transactions.action_type IS '对应JSON字段：action_type，说明：（推测）：，示例值及对应分析：行为类型：';
COMMENT ON COLUMN billiards_ods.refund_transactions.check_status IS '对应JSON字段：check_status，说明：（推测）：，示例值及对应分析：审核状态：';
COMMENT ON COLUMN billiards_ods.refund_transactions.is_revoke IS '对应JSON字段：is_revoke，说明：（推测）：，示例值及对应分析：是否撤销型退款/撤销原支付：';
COMMENT ON COLUMN billiards_ods.refund_transactions.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：未删除；';
COMMENT ON COLUMN billiards_ods.refund_transactions.balance_frozen_amount IS '对应JSON字段：balance_frozen_amount，说明：（推测）：，示例值及对应分析：涉及会员储值卡退款时，暂时冻结的余额金额；';
COMMENT ON COLUMN billiards_ods.refund_transactions.card_frozen_amount IS '对应JSON字段：card_frozen_amount，说明：：与上一个类似，偏向“某张卡的被冻结金额”，也与会员卡/储值账户相关。，示例值及对应分析：状态同上：本数据中未发生“卡冻结退款”。';
COMMENT ON COLUMN billiards_ods.refund_transactions.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.refund_transactions.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.refund_transactions.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.refund_transactions.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.platform_coupon_redemption_records (
    id                BIGINT PRIMARY KEY,
    verify_id         BIGINT,
    certificate_id    TEXT,
    coupon_code       TEXT,
    coupon_name       TEXT,
    coupon_channel    INT,
    groupon_type      INT,
    group_package_id  BIGINT,
    sale_price        NUMERIC(18,2),
    coupon_money      NUMERIC(18,2),
    coupon_free_time  NUMERIC(18,2),
    coupon_cover      TEXT,
    coupon_remark     TEXT,
    use_status        INT,
    consume_time      TIMESTAMP,
    create_time       TIMESTAMP,
    deal_id           TEXT,
    channel_deal_id   TEXT,
    site_id           BIGINT,
    site_order_id     BIGINT,
    table_id          BIGINT,
    tenant_id         BIGINT,
    operator_id       BIGINT,
    operator_name     TEXT,
    is_delete         INT,
    siteProfile       JSONB,
    source_file       TEXT,
    source_endpoint   TEXT,
    fetched_at        TIMESTAMPTZ DEFAULT now(),
    payload           JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.platform_coupon_redemption_records IS '对应JSON字段：platform_coupon_redemption_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.id IS '对应JSON字段：id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.verify_id IS '对应JSON字段：verify_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.certificate_id IS '对应JSON字段：certificate_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_code IS '对应JSON字段：coupon_code，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_name IS '对应JSON字段：coupon_name，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_channel IS '对应JSON字段：coupon_channel，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.groupon_type IS '对应JSON字段：groupon_type，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.group_package_id IS '对应JSON字段：group_package_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.sale_price IS '对应JSON字段：sale_price，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_money IS '对应JSON字段：coupon_money，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_free_time IS '对应JSON字段：coupon_free_time，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_cover IS '对应JSON字段：coupon_cover，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_remark IS '对应JSON字段：coupon_remark，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.use_status IS '对应JSON字段：use_status，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.consume_time IS '对应JSON字段：consume_time，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.create_time IS '对应JSON字段：create_time，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.deal_id IS '对应JSON字段：deal_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.channel_deal_id IS '对应JSON字段：channel_deal_id，说明：任意一个 ID 字段缺失时（如部分记录 deal_id=0），仍然可以通过其他字段（coupon_name + sale_price + coupon_money + channel_deal_id）唯一识别该产品。，示例值及对应分析：这种多字段冗余，结构上提升了抗“配置缺失”的能力。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.site_id IS '对应JSON字段：site_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.site_order_id IS '对应JSON字段：site_order_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.table_id IS '对应JSON字段：table_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.tenant_id IS '对应JSON字段：tenant_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.operator_id IS '对应JSON字段：operator_id，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.operator_name IS '对应JSON字段：operator_name，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.is_delete IS '对应JSON字段：is_delete，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.siteProfile IS '对应JSON字段：siteProfile，说明：?????? platform_coupon_redemption_records-Analysis.md，示例值及对应分析：?? platform_coupon_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.tenant_goods_master (
    id                      BIGINT PRIMARY KEY,
    tenant_id               BIGINT,
    goods_name              TEXT,
    goods_bar_code          TEXT,
    goods_category_id       BIGINT,
    goods_second_category_id BIGINT,
    categoryName            TEXT,
    unit                    TEXT,
    goods_number            TEXT,
    goods_state             INT,
    sale_channel            INT,
    able_discount           INT,
    able_site_transfer      INT,
    is_delete               INT,
    is_warehousing          INT,
    isInSite                INT,
    cost_price              NUMERIC(18,4),
    cost_price_type         INT,
    market_price            NUMERIC(18,4),
    min_discount_price      NUMERIC(18,4),
    common_sale_royalty     NUMERIC(18,4),
    point_sale_royalty      NUMERIC(18,4),
    pinyin_initial          TEXT,
    commodityCode           TEXT,
    commodity_code          TEXT,
    goods_cover             TEXT,
    supplier_id             BIGINT,
    remark_name             TEXT,
    create_time             TIMESTAMP,
    update_time             TIMESTAMP,
    payload                 JSONB NOT NULL,
    source_file             TEXT,
    source_endpoint         TEXT,
    fetched_at              TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.tenant_goods_master IS '对应JSON字段：tenant_goods_master.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 tenant_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.id IS '对应JSON字段：id，说明：：商品档案主键 ID，唯一标识一条商品。，示例值及对应分析：作用：作为其他业务表（销售明细、库存流水、门店商品表等）的外键，通常以 tenant_goods_id 或类似字段出现。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。，示例值及对应分析：作用：和其它 JSON 中的 tenant_id / tenantId 一致，用于区分不同商户（本次数据只包含同一租户）。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_name IS '对应JSON字段：goods_name，说明：：商品名称（前台展示名称）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_bar_code IS '对应JSON字段：goods_bar_code，说明：：商品条码（EAN 等），目前未维护。，示例值及对应分析：说明：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_category_id IS '对应JSON字段：goods_category_id，说明：：商品一级分类 ID。，示例值及对应分析：取值情况：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_second_category_id IS '对应JSON字段：goods_second_category_id，说明：：商品二级分类 ID。，示例值及对应分析：取值情况：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.categoryName IS '对应JSON字段：categoryName，说明：：商品一级分类名称（业务可读）。，示例值及对应分析：取值情况：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.unit IS '对应JSON字段：unit，说明：：计量单位。，示例值及对应分析：取值（共 12 种左右）：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_number IS '对应JSON字段：goods_number，说明：：商品内部编码（自定义货号/系统货号）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_state IS '对应JSON字段：goods_state，说明：（推测）：商品状态（上架/下架等）。，示例值及对应分析：1：正常/上架；';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.sale_channel IS '对应JSON字段：sale_channel，说明：（推测）：销售渠道类型，如“门店堂食/线下零售/线上小程序”等的一种编码。，示例值及对应分析：现有数据只有一个值，说明本门店目前仅通过一种渠道销售这些商品。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.able_discount IS '对应JSON字段：able_discount，说明：（推测）：是否允许参与折扣/打折。，示例值及对应分析：1：允许折扣；';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.able_site_transfer IS '对应JSON字段：able_site_transfer，说明：（推测）：，示例值及对应分析：字面意思是“是否允许门店间调拨/门店级操作”：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：未删除（有效商品）；';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.is_warehousing IS '对应JSON字段：is_warehousing，说明：（推测）：是否启用库存管理。，示例值及对应分析：1：该商品纳入库存管理；';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.isInSite IS '对应JSON字段：isInSite，说明：（从命名推测）：是否在当前门店启用/上架。，示例值及对应分析：现象：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.cost_price IS '对应JSON字段：cost_price，说明：：成本价格。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.cost_price_type IS '对应JSON字段：cost_price_type，说明：（推测）：，示例值及对应分析：不同的成本价格来源或计算方式，如：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.market_price IS '对应JSON字段：market_price，说明：：商品标价 / 售价（标准销售单价）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.min_discount_price IS '对应JSON字段：min_discount_price，说明：：该商品允许售卖的最低价格（底价）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.common_sale_royalty IS '对应JSON字段：common_sale_royalty，说明：（推测）：普通销售提成比例或提成金额的配置字段。，示例值及对应分析：当前门店未在商品档案上配置员工提成规则，全部为 0。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.point_sale_royalty IS '对应JSON字段：point_sale_royalty，说明：（推测）：积分销售提成/积分赠送规则相关配置。，示例值及对应分析：当前同样未启用。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.pinyin_initial IS '对应JSON字段：pinyin_initial，说明：：拼音首字母/助记码。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.commodityCode IS '对应JSON字段：commodityCode，说明：：，示例值及对应分析：与 commodity_code 是同一信息的数组形式（冗余存储），便于支持一个商品对应多个编码的场景。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.commodity_code IS '对应JSON字段：commodity_code，说明：：商品编码（通常为对外商品编码或条码）。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_cover IS '对应JSON字段：goods_cover，说明：：商品封面图片 URL 地址。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.supplier_id IS '对应JSON字段：supplier_id，说明：：供应商 ID，用于关联到供应商档案。，示例值及对应分析：当前所有商品都未挂接具体供应商（或门店未使用供应链管理模块）。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.remark_name IS '对应JSON字段：remark_name，说明：（从命名推断）：商品备注名/别名，通常用来配置简写或特殊显示名称。，示例值及对应分析：当前门店尚未使用该字段，字段设计为将来扩展预留。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.create_time IS '对应JSON字段：create_time，说明：：商品档案创建时间。，示例值及对应分析：特征：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.update_time IS '对应JSON字段：update_time，说明：：商品档案最近一次修改时间。，示例值及对应分析：分布：';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.group_buy_packages (
    id                          BIGINT PRIMARY KEY,
    package_id                  BIGINT,
    package_name                TEXT,
    selling_price               NUMERIC(18,2),
    coupon_money                NUMERIC(18,2),
    date_type                   INT,
    date_info                   TEXT,
    start_time                  TIMESTAMP,
    end_time                    TIMESTAMP,
    start_clock                 TEXT,
    end_clock                   TEXT,
    add_start_clock             TEXT,
    add_end_clock               TEXT,
    duration                    INT,
    usable_count                INT,
    usable_range                INT,
    table_area_id               BIGINT,
    table_area_name             TEXT,
    table_area_id_list          JSONB,
    tenant_table_area_id        BIGINT,
    tenant_table_area_id_list   JSONB,
    site_id                     BIGINT,
    site_name                   TEXT,
    tenant_id                   BIGINT,
    card_type_ids               JSONB,
    group_type                  INT,
    system_group_type           INT,
    type                        INT,
    effective_status            INT,
    is_enabled                  INT,
    is_delete                   INT,
    max_selectable_categories   INT,
    area_tag_type               INT,
    creator_name                TEXT,
    create_time                 TIMESTAMP,
    source_file                 TEXT,
    source_endpoint             TEXT,
    fetched_at                  TIMESTAMPTZ DEFAULT now(),
    payload                     JSONB NOT NULL
);

COMMENT ON TABLE billiards_ods.group_buy_packages IS '对应JSON字段：group_buy_packages.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 group_buy_packages-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_packages.id IS '对应JSON字段：id，说明：：门店侧套餐 ID，本文件内部的主键。，示例值及对应分析：特点：17 条记录中均为不同的大整数 ID。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.package_id IS '对应JSON字段：package_id，说明：：“上层套餐 ID” 或“总部/系统级套餐 ID”。，示例值及对应分析：特点：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.package_name IS '对应JSON字段：package_name，说明：：团购套餐名称，用于前台展示和核销界面。，示例值及对应分析：示例：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.selling_price IS '对应JSON字段：selling_price，说明：（结合字段命名）：，示例值及对应分析：语义上应该是“团购售卖价”（顾客在平台购买券时的成交价格）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.coupon_money IS '对应JSON字段：coupon_money，说明：：券面值或内部结算面值，表示该套餐在门店侧对应的金额额度。，示例值及对应分析：示例（对应套餐名称）：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.date_type IS '对应JSON字段：date_type，说明：（推测）：，示例值及对应分析：典型用法：区分“全部日期可用 / 工作日 / 周末 / 指定日期”等。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.date_info IS '对应JSON字段：date_info，说明：（推测）：，示例值及对应分析：预留字段，通常用来存储更细粒度的日期信息，如具体日期列表、节假日特殊规则（可能是 JSON 字符串或编码）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.start_time IS '对应JSON字段：start_time，说明：：套餐开始生效的日期时间。，示例值及对应分析：示例："2025-07-20 00:00:00" 等。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.end_time IS '对应JSON字段：end_time，说明：：套餐失效的日期时间（到这个时间点后不可使用）。，示例值及对应分析：示例：形如 "2025-11-30 23:59:59"，部分记录使用 9999-12-31 23:59:59 风格的极大日期表示长期有效（本数据中如有这种值，可解读为“长期有效”）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.start_clock IS '对应JSON字段：start_clock，说明：：每日可用起始时间点（第一段）。，示例值及对应分析：说明：配合 end_clock 使用，定义一个日内时段。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.end_clock IS '对应JSON字段：end_clock，说明：：每日可用的结束时间点（第一段）。，示例值及对应分析：结构说明：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.add_start_clock IS '对应JSON字段：add_start_clock，说明：（推测）：附加可用时间段的起始时间（第二段）。，示例值及对应分析：例如有的套餐可以在两个不连续的时段使用：早场 + 夜场，则可用第一段 start_clock / end_clock 和第二段 add_start_clock / add_end_clock 组合。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.add_end_clock IS '对应JSON字段：add_end_clock，说明：：附加时段结束时间，多数情况配合 "00:00:00" 或 "10:00:00" 使用。，示例值及对应分析：整体理解：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.duration IS '对应JSON字段：duration，说明：：套餐内包含的时长（秒）。，示例值及对应分析：与名称一致：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.usable_count IS '对应JSON字段：usable_count，说明：：可使用次数上限。，示例值及对应分析：数据特征说明：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.usable_range IS '对应JSON字段：usable_range，说明：吻合（A区中八/B区中八/斯诺克/KTV/包厢等）。，示例值及对应分析：通过该关联，系统在核销时可以校验：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_id IS '对应JSON字段：table_area_id，说明：（推测）：，示例值及对应分析：原始设计应为“单一台区 ID”，当套餐只限一个区域可以用这个字段存储。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_name IS '对应JSON字段：table_area_name，说明：：套餐适用的“门店台区名称”，用于显示和筛选。，示例值及对应分析：说明：这个字段是对区域 ID 维度的文字描述，便于直观理解。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_id_list IS '对应JSON字段：table_area_id_list，说明：（推测）：，示例值及对应分析：用来存放具体台区 ID 列表（例如 "1,2,3"），实现更细粒度的台桌限制。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.tenant_table_area_id IS '对应JSON字段：tenant_table_area_id，说明：（推测）：，示例值及对应分析：与 table_area_id 类似，是租户层级的台区 ID，原本用于单区选择。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.tenant_table_area_id_list IS '对应JSON字段：tenant_table_area_id_list，说明：（推测）：，示例值及对应分析：实际代表“台区集合 ID”或“租户台区配置 ID”，用来限制套餐可用的台区范围。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.site_id IS '对应JSON字段：site_id，说明：：门店 ID。，示例值及对应分析：特点：全表值相同，且与其他 JSON 文件中的 site_id 一致，对应“朗朗桌球”这家门店。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.site_name IS '对应JSON字段：site_name，说明：：门店名称。，示例值及对应分析：观测值：全部为 "朗朗桌球"。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.tenant_id IS '对应JSON字段：tenant_id，说明：：租户 ID（品牌/商户 ID）。，示例值及对应分析：特点：全表值相同，说明所有套餐定义属于同一商户（同一品牌）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.card_type_ids IS '对应JSON字段：card_type_ids，说明：（推测）：，示例值及对应分析：原意是“适用会员卡类型 ID 列表”，例如某套餐只允许某几种会员卡使用，可以在此配置。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.group_type IS '对应JSON字段：group_type，说明：（推测）：，示例值及对应分析：团购类型，例如：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.system_group_type IS '对应JSON字段：system_group_type，说明：（推测）：，示例值及对应分析：系统内对团购类型更底层的划分，比如：';
COMMENT ON COLUMN billiards_ods.group_buy_packages.type IS '对应JSON字段：type，说明：（推测）：，示例值及对应分析：内部业务子类型，具体含义需要结合系统文档；仅从数据无法确定是“台费类 vs 包厢类”还是“平台套餐 vs 自定义套餐”。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.effective_status IS '对应JSON字段：effective_status，说明：（结合命名和数据特征推断）：，示例值及对应分析：1：有效（在当前时间区间内、配置正常，可核销使用）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.is_enabled IS '对应JSON字段：is_enabled，说明：：启用状态。，示例值及对应分析：从其他表的统一风格来看，1 一般表示“启用 / 上架”，2 表示“停用 / 下架”。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：正常；';
COMMENT ON COLUMN billiards_ods.group_buy_packages.max_selectable_categories IS '对应JSON字段：max_selectable_categories，说明：?????? group_buy_packages-Analysis.md，示例值及对应分析：?? group_buy_packages-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_packages.area_tag_type IS '对应JSON字段：area_tag_type，说明：（推测）：区域标记类型：，示例值及对应分析：1 很可能代表“按台区标签限制”，例如 A区、中八区、包厢、KTV 等。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.creator_name IS '对应JSON字段：creator_name，说明：：创建人信息，一般包含“角色：姓名”。，示例值及对应分析：示例："管理员：郑丽珊"';
COMMENT ON COLUMN billiards_ods.group_buy_packages.create_time IS '对应JSON字段：create_time，说明：：该套餐在系统中创建的时间。，示例值及对应分析：特点：每条记录各不相同，覆盖了 2025-07 至 2025-10 的创建时间。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_packages.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_packages.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_packages.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.group_buy_redemption_records (
    id                              BIGINT PRIMARY KEY,
    tenant_id                       BIGINT,
    site_id                         BIGINT,
    siteName                        TEXT,
    table_id                        BIGINT,
    tableName                       TEXT,
    tableAreaName                   TEXT,
    tenant_table_area_id            BIGINT,
    order_trade_no                  TEXT,
    order_settle_id                 BIGINT,
    order_pay_id                    BIGINT,
    order_coupon_id                 BIGINT,
    order_coupon_channel            INT,
    coupon_code                     TEXT,
    coupon_money                    NUMERIC(18,2),
    coupon_origin_id                BIGINT,
    ledger_name                     TEXT,
    ledger_group_name               TEXT,
    ledger_amount                   NUMERIC(18,2),
    ledger_count                    NUMERIC(18,4),
    ledger_unit_price               NUMERIC(18,4),
    ledger_status                   INT,
    table_charge_seconds            INT,
    promotion_activity_id           BIGINT,
    promotion_coupon_id             BIGINT,
    promotion_seconds               INT,
    offer_type                      INT,
    assistant_promotion_money       NUMERIC(18,2),
    assistant_service_promotion_money NUMERIC(18,2),
    table_service_promotion_money   NUMERIC(18,2),
    goods_promotion_money           NUMERIC(18,2),
    recharge_promotion_money        NUMERIC(18,2),
    reward_promotion_money          NUMERIC(18,2),
    goodsOptionPrice                NUMERIC(18,2),
    salesman_name                   TEXT,
    sales_man_org_id                BIGINT,
    salesman_role_id                BIGINT,
    salesman_user_id                BIGINT,
    operator_id                     BIGINT,
    operator_name                   TEXT,
    is_single_order                 INT,
    is_delete                       INT,
    create_time                     TIMESTAMP,
    payload                         JSONB NOT NULL,
    source_file                     TEXT,
    source_endpoint                 TEXT,
    fetched_at                      TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.group_buy_redemption_records IS '对应JSON字段：group_buy_redemption_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 group_buy_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.id IS '对应JSON字段：id，说明：：本条“团购套餐流水”记录的 主键 ID。，示例值及对应分析：作用：唯一标识一条券使用到台费上的记录。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。，示例值及对应分析：特点：全表值相同，说明所有记录属于同一租户。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.site_id IS '对应JSON字段：site_id，说明：：门店 ID，与其它 JSON 中一致。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.siteName IS '对应JSON字段：siteName，说明：：门店名称，冗余展示用。，示例值及对应分析：?? group_buy_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_id IS '对应JSON字段：table_id，说明：：球台 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tableName IS '对应JSON字段：tableName，说明：：本次使用券所关联的 球台名称/台号。，示例值及对应分析：关联：对应台桌列表中的 table_name / table_no，通过 table_id 进一步关联。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tableAreaName IS '对应JSON字段：tableAreaName，说明：：该球台所属的 台区名称。，示例值及对应分析：关联：与台区配置中的 area_name 含义一致，与团购套餐定义中的 table_area_name 一致。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tenant_table_area_id IS '对应JSON字段：tenant_table_area_id，说明：：租户级台区分组 ID，表示当前使用券的台桌所属的区域组合。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_trade_no IS '对应JSON字段：order_trade_no，说明：：订单交易号，和其它消费明细（台费、商品、助教、团购）共用的订单主键。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_settle_id IS '对应JSON字段：order_settle_id，说明：：结算单 ID（小票结账主键）。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_pay_id IS '对应JSON字段：order_pay_id，说明：（推测）：，示例值及对应分析：指向支付记录表中的支付流水 ID。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_coupon_id IS '对应JSON字段：order_coupon_id，说明：：订单中“券使用记录”的 ID。，示例值及对应分析：结构特点：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_coupon_channel IS '对应JSON字段：order_coupon_channel，说明：（推测）：，示例值及对应分析：券渠道类型，例如：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_code IS '对应JSON字段：coupon_code，说明：：团购券券码，核销时扫描/录入的字符串。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_money IS '对应JSON字段：coupon_money，说明：：本次核销时，这张券在门店侧对应的金额额度（“可抵扣金额”）。，示例值及对应分析：结构关系：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_origin_id IS '对应JSON字段：coupon_origin_id，说明：（推测）：，示例值及对应分析：平台/上游系统中的券记录主键 ID，“券来源 ID”。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_name IS '对应JSON字段：ledger_name，说明：：台费侧关联的“团购项目名称”（记账名）。，示例值及对应分析：结构上通常来源于团购套餐定义的 package_name，或由系统在创建活动时生成。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_group_name IS '对应JSON字段：ledger_group_name，说明：（推测）：团购项目所属的“记账分组名称”（例如“团购台费”“团购包厢”等）。，示例值及对应分析：当前门店未对团购项目做进一步分组。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_amount IS '对应JSON字段：ledger_amount，说明：：本次券实际冲抵台费的金额。，示例值及对应分析：结构关系：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_count IS '对应JSON字段：ledger_count，说明：：按此次优惠实际计算的“核销秒数”。，示例值及对应分析：结构观察：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_unit_price IS '对应JSON字段：ledger_unit_price，说明：：对应台费的标准单价，单位元/小时（从数值来看是类似29.9/小时这种定价）。，示例值及对应分析：作用：配合 ledger_count 用于计算这一条券在台费层面对应的金额（理论上应接近 = 单价 × 秒数/3600）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_status IS '对应JSON字段：ledger_status，说明：（推测）：流水状态。，示例值及对应分析：1：正常有效；';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_charge_seconds IS '对应JSON字段：table_charge_seconds，说明：：本次结算中该球台总计计费的秒数（整台的台费计费时间）。，示例值及对应分析：结构特点：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_activity_id IS '对应JSON字段：promotion_activity_id，说明：（推测）：团购/促销活动 ID。，示例值及对应分析：对应平台或内部促销活动的主键，每个活动通常绑定一个或多个具体套餐（promotion_coupon_id）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_coupon_id IS '对应JSON字段：promotion_coupon_id，说明：：团购套餐定义 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_seconds IS '对应JSON字段：promotion_seconds，说明：：团购套餐定义的“标准时长”（券本身标称的可用时长）。，示例值及对应分析：结构关系：';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.offer_type IS '对应JSON字段：offer_type，说明：（推测）：优惠类型。，示例值及对应分析：在券适用多个优惠方式的系统中，一般用来区分“满减/折扣/代金券/套餐券”等。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.assistant_promotion_money IS '对应JSON字段：assistant_promotion_money，说明：：分摊到“助教服务”的促销金额。，示例值及对应分析：当前场景下，团购券只与台费相关，未涉及助教的金额抵扣。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.assistant_service_promotion_money IS '对应JSON字段：assistant_service_promotion_money，说明：：进一步细分助教服务的促销金额。，示例值及对应分析：当前未使用。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_service_promotion_money IS '对应JSON字段：table_service_promotion_money，说明：：本次券使用中，分摊到“台费服务费”部分的促销金额。，示例值及对应分析：当前样本中，促销金额都在 ledger_amount 中体现，该字段未单独拆出。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.goods_promotion_money IS '对应JSON字段：goods_promotion_money，说明：：本次券使用中，分摊到“商品”部分的促销金额。，示例值及对应分析：当前数据中，所有团购券都只用于抵扣台费，没有用来抵扣商品，因此该字段为 0。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.recharge_promotion_money IS '对应JSON字段：recharge_promotion_money，说明：：来自“充值类优惠”的分摊金额（例如储值赠送部分）。，示例值及对应分析：当前所有数据为 0，但结构上已经预留了“多来源促销金额分摊”的能力。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.reward_promotion_money IS '对应JSON字段：reward_promotion_money，说明：：本次促销中，属于“奖励金/积分抵扣”的金额。，示例值及对应分析：当前没有使用此维度的促销。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.goodsOptionPrice IS '对应JSON字段：goodsOptionPrice，说明：（按命名推测）：商品规格价格，用于商品类促销分摊时使用。，示例值及对应分析：当前在“团购套餐流水”中未被实际使用。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_name IS '对应JSON字段：salesman_name，说明：：营业员姓名。，示例值及对应分析：?? group_buy_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.sales_man_org_id IS '对应JSON字段：sales_man_org_id，说明：：营业员所属组织 ID。，示例值及对应分析：以上 4 个销售相关字段在当前门店的团购套餐使用中都未启用，仅作为结构预留。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_role_id IS '对应JSON字段：salesman_role_id，说明：：营业员角色 ID。，示例值及对应分析：?? group_buy_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_user_id IS '对应JSON字段：salesman_user_id，说明：：营业员/业务员用户 ID。，示例值及对应分析：当前所有团购套餐流水都未指定独立的营业员。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.operator_id IS '对应JSON字段：operator_id，说明：：执行本次核销/结算操作的 操作员 ID。，示例值及对应分析：关联：可以与员工档案表中的 id 对应（当前导出中员工表未单独给出，但风格和其它表一致）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.operator_name IS '对应JSON字段：operator_name，说明：：操作员名称（包含角色说明），与 operator_id 对应的冗余展示字段。，示例值及对应分析：?? group_buy_redemption_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.is_single_order IS '对应JSON字段：is_single_order，说明：（推测）：是否单独作为一条订单行。，示例值及对应分析：1：以独立条目方式进行结算（绝大部分记录如此）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志：，示例值及对应分析：0：正常；';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.create_time IS '对应JSON字段：create_time，说明：：本条团购套餐使用流水创建时间（即券核销时间，或与结账时间接近）。，示例值及对应分析：用法：可用于按时间范围过滤团购使用记录。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.settlement_ticket_details (
    orderSettleId         BIGINT PRIMARY KEY,
    actualPayment         NUMERIC(18,2),
    adjustAmount          NUMERIC(18,2),
    assistantManualDiscount NUMERIC(18,2),
    balanceAmount         NUMERIC(18,2),
    cashierName           TEXT,
    consumeMoney          NUMERIC(18,2),
    couponAmount          NUMERIC(18,2),
    deliveryAddress       TEXT,
    deliveryFee           NUMERIC(18,2),
    ledgerAmount          NUMERIC(18,2),
    memberDeductAmount    NUMERIC(18,2),
    memberOfferAmount     NUMERIC(18,2),
    onlineReturnAmount    NUMERIC(18,2),
    orderRemark           TEXT,
    orderSettleNumber     BIGINT,
    payMemberBalance      NUMERIC(18,2),
    payTime               TIMESTAMP,
    paymentMethod         INT,
    pointDiscountCost     NUMERIC(18,2),
    pointDiscountPrice    NUMERIC(18,2),
    prepayMoney           NUMERIC(18,2),
    refundAmount          NUMERIC(18,2),
    returnGoodsAmount     NUMERIC(18,2),
    rewardName            TEXT,
    settleType            TEXT,
    siteAddress           TEXT,
    siteBusinessTel       TEXT,
    siteId                BIGINT,
    siteName              TEXT,
    tenantId              BIGINT,
    tenantName            TEXT,
    ticketCustomContent   TEXT,
    ticketRemark          TEXT,
    voucherMoney          NUMERIC(18,2),
    memberProfile         JSONB,
    orderItem             JSONB,
    tenantMemberCardLogs  JSONB,
    payload               JSONB NOT NULL,
    source_file           TEXT,
    source_endpoint       TEXT,
    fetched_at            TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.settlement_ticket_details IS '对应JSON字段：settlement_ticket_details.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderSettleId IS '对应JSON字段：orderSettleId，说明：：同 data.data.orderSettleId，为结算单 ID 的冗余。，示例值及对应分析：orderType';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.actualPayment IS '对应JSON字段：actualPayment，说明：：本单实际支付金额总和（顾客本次实际付出：现金 + 线上 + 会员余额等）。，示例值及对应分析：一般应与支付记录中各支付流水金额汇总相匹配。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.adjustAmount IS '对应JSON字段：adjustAmount，说明：：台费层面的人工调价金额（仅台费部分）。，示例值及对应分析：memberDiscountAmount';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.assistantManualDiscount IS '对应JSON字段：assistantManualDiscount，说明：：针对“助教项目”的人工减免金额汇总（整单维度）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.balanceAmount IS '对应JSON字段：balanceAmount，说明：：本单通过“会员余额/储值卡”支付的金额（从余额中扣除的总额）。，示例值及对应分析：对应 结账记录.json 的同名字段。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.cashierName IS '对应JSON字段：cashierName，说明：：本单结算操作员名称（带角色前缀文字）。，示例值及对应分析：对应员工维表中的某个账号，便于小票上展示“收银员：XXX”。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.consumeMoney IS '对应JSON字段：consumeMoney，说明：：本单“消费金额总计”（原价层面），即台费 + 商品 + 助教 + 服务等消费项目的金额总和（未扣除各类优惠）。，示例值及对应分析：对应 结账记录.json 的 consumeMoney 字段。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.couponAmount IS '对应JSON字段：couponAmount，说明：：本单由优惠券抵扣的金额汇总。，示例值及对应分析：结构上：应与 orderCouponLedgers.discountAmount 的合计存在关系，但当前导出未填充。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.deliveryAddress IS '对应JSON字段：deliveryAddress，说明：：配送地址（若存在外送业务时使用）。，示例值及对应分析：对于球房场景，当前时间范围内未使用。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.deliveryFee IS '对应JSON字段：deliveryFee，说明：：配送费金额（如果支持外送业务）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ledgerAmount IS '对应JSON字段：ledgerAmount，说明：：按台账口径对应的金额，一般与 discountAmount 一致或有固定关系。，示例值及对应分析：rewardPromotionMoney';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberDeductAmount IS '对应JSON字段：memberDeductAmount，说明：（结构上）：会员抵扣的某种数量或金额（例如积分抵现金额、次卡次数抵扣等），当前数据未启用。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberOfferAmount IS '对应JSON字段：memberOfferAmount，说明：：由“会员权益/折扣”产生的优惠金额总计（整单维度）。，示例值及对应分析：与 memberProfile 以及台费/商品明细中的 memberDiscountAmount 有对应关系。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.onlineReturnAmount IS '对应JSON字段：onlineReturnAmount，说明：：本单通过线上支付渠道退回的金额（如微信/支付宝退款）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderRemark IS '对应JSON字段：orderRemark，说明：：订单备注，由收银员录入，用于记录与本单相关的特殊说明。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderSettleNumber IS '对应JSON字段：orderSettleNumber，说明：（推测）：结算单编号（与 ID 独立的一套编号体系，如流水号）。当前导出时间段内未启用。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payMemberBalance IS '对应JSON字段：payMemberBalance，说明：（结构上）：使用会员余额支付的金额，用于区分与 balanceAmount 的不同维度（如“本次支付使用余额部分”与“余额本身变化”等），当前未实际使用。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payTime IS '对应JSON字段：payTime，说明：：本单最终支付成功时间。，示例值及对应分析：和 结账记录.json 中的 payTime 对应，一般与 支付记录.create_time/pay_time 在同一时间段。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.paymentMethod IS '对应JSON字段：paymentMethod，说明：：结算主支付方式编码（汇总视角）。，示例值及对应分析：对应 结账记录.json 中的 paymentMethod 字段；';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.pointDiscountCost IS '对应JSON字段：pointDiscountCost，说明：：积分抵扣对应的成本金额（成本侧）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.pointDiscountPrice IS '对应JSON字段：pointDiscountPrice，说明：：积分抵扣对应的金额（售价侧）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.prepayMoney IS '对应JSON字段：prepayMoney，说明：：预付金/定金在本单中使用的金额。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.refundAmount IS '对应JSON字段：refundAmount，说明：：本单涉及的退款金额（汇总）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.returnGoodsAmount IS '对应JSON字段：returnGoodsAmount，说明：：本单涉及的退货金额汇总。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.rewardName IS '对应JSON字段：rewardName，说明：（结构上）：用于标识本单适用的激励方案名称，可能用于内部绩效或活动名称展示。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.settleType IS '对应JSON字段：settleType，说明：：结算类型字符串标识。，示例值及对应分析："SiteOrder"：店内消费订单结算。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteAddress IS '对应JSON字段：siteAddress，说明：：门店地址（详细地址）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteBusinessTel IS '对应JSON字段：siteBusinessTel，说明：：门店电话。，示例值及对应分析：用途：用于小票打印上的客服电话。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteId IS '对应JSON字段：siteId，说明：：门店 ID。，示例值及对应分析：关联：';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteName IS '对应JSON字段：siteName，说明：：门店名称，如“朗朗桌球”。，示例值及对应分析：用途：小票上展示门店名。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantId IS '对应JSON字段：tenantId，说明：：租户 / 商户 ID（品牌维度）。，示例值及对应分析：当前数据：恒定为同一值，表示所有记录都来自同一商户。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantName IS '对应JSON字段：tenantName，说明：：租户名称，如“朗朗桌球”。，示例值及对应分析：当前数据：全表统一一个值。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ticketCustomContent IS '对应JSON字段：ticketCustomContent，说明：：自定义小票内容，如商家自定义宣传语、条款等。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ticketRemark IS '对应JSON字段：ticketRemark，说明：：小票备注内容，可用于打印在小票底部或顶部（例如活动说明、特别提示）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.voucherMoney IS '对应JSON字段：voucherMoney，说明：：代金券类金额字段（可能用于某类“代金券余额”或“券面值”记录）。，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberProfile IS '对应JSON字段：memberProfile，说明：：，示例值及对应分析：不是会员卡主键，而是本次结账时的会员信息快照；';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderItem IS '对应JSON字段：orderItem，说明：：本次结算对应的“订单明细列表”，这部分是连接“台费流水 / 商品出库 / 券使用”等多个子领域的关键结构。，示例值及对应分析：下面专门展开 orderItem 及其子结构。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantMemberCardLogs IS '对应JSON字段：tenantMemberCardLogs，说明：?????? settlement_ticket_details-Analysis.md，示例值及对应分析：?? settlement_ticket_details-Analysis.md';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.store_goods_master (
    id                  BIGINT PRIMARY KEY,
    tenant_id           BIGINT,
    site_id             BIGINT,
    siteName            TEXT,
    tenant_goods_id     BIGINT,
    goods_name          TEXT,
    goods_bar_code      TEXT,
    goods_category_id   BIGINT,
    goods_second_category_id BIGINT,
    oneCategoryName     TEXT,
    twoCategoryName     TEXT,
    unit                TEXT,
    sale_price          NUMERIC(18,4),
    cost_price          NUMERIC(18,4),
    cost_price_type     INT,
    min_discount_price  NUMERIC(18,4),
    safe_stock          NUMERIC(18,4),
    stock               NUMERIC(18,4),
    stock_A             NUMERIC(18,4),
    sale_num            NUMERIC(18,4),
    total_purchase_cost NUMERIC(18,4),
    total_sales         NUMERIC(18,4),
    average_monthly_sales NUMERIC(18,4),
    enable_status       INT,
    audit_status        INT,
    goods_state         INT,
    is_delete           INT,
    is_warehousing      INT,
    able_discount       INT,
    able_site_transfer  INT,
    forbid_sell_status  INT,
    "freeze"            INT,
    send_state          INT,
    custom_label_type   INT,
    option_required     INT,
    sale_channel        INT,
    remark              TEXT,
    pinyin_initial      TEXT,
    goods_cover         TEXT,
    create_time         TIMESTAMP,
    update_time         TIMESTAMP,
    payload             JSONB NOT NULL,
    source_file         TEXT,
    source_endpoint     TEXT,
    fetched_at          TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.store_goods_master IS '对应JSON字段：store_goods_master.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 store_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_master.id IS '对应JSON字段：id，说明：：门店商品 ID，门店维度的商品主键。，示例值及对应分析：用途：在其它文件中经常以 site_goods_id 的名字出现，与这里的 id 一致，用来关联库存记录、销售记录等。';
COMMENT ON COLUMN billiards_ods.store_goods_master.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。同一品牌下多个门店共享一个 tenant_id。，示例值及对应分析：枚举情况：本文件中为单一固定值（同一品牌）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.site_id IS '对应JSON字段：site_id，说明：：门店 ID。，示例值及对应分析：枚举情况：本文件中为单一固定值（同一家门店“朗朗桌球”），和其它 JSON 中的 site_id 一致。';
COMMENT ON COLUMN billiards_ods.store_goods_master.siteName IS '对应JSON字段：siteName，说明：：门店名称，是对 site_id 的冗余展示，方便直接阅读，无需再去关联门店档案。，示例值及对应分析：2. 商品标识和分类维度';
COMMENT ON COLUMN billiards_ods.store_goods_master.tenant_goods_id IS '对应JSON字段：tenant_goods_id，说明：：租户/品牌维度的商品 ID，相当于“全局商品 ID”。，示例值及对应分析：用途：用于跨门店或与“商品档案（商品档案.json）”对齐时使用。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_name IS '对应JSON字段：goods_name，说明：：商品名称，例如“合味道泡面”“地道肠”“麻将房茶位费”等。，示例值及对应分析：用途：业务展示字段，历史流水里也会冗余存一份商品名。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_bar_code IS '对应JSON字段：goods_bar_code，说明：：商品条形码（如 EAN-13 编码），用于扫码销售。此字段设计为可填，但此店目前未配置。，示例值及对应分析：?? store_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_category_id IS '对应JSON字段：goods_category_id，说明：：商品一级分类 ID。，示例值及对应分析：用途：';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_second_category_id IS '对应JSON字段：goods_second_category_id，说明：：商品二级分类 ID。，示例值及对应分析：用途：';
COMMENT ON COLUMN billiards_ods.store_goods_master.oneCategoryName IS '对应JSON字段：oneCategoryName，说明：：一级分类名称，如“零食”“酒水”“服务费”等。，示例值及对应分析：说明：与 goods_category_id 一一对应，是易读文本字段。';
COMMENT ON COLUMN billiards_ods.store_goods_master.twoCategoryName IS '对应JSON字段：twoCategoryName，说明：：二级分类名称，如“面”“洋酒”“纸巾”等。，示例值及对应分析：说明：与 goods_second_category_id 对应。';
COMMENT ON COLUMN billiards_ods.store_goods_master.unit IS '对应JSON字段：unit，说明：：商品计量单位（销售单位）。，示例值及对应分析：?? store_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_price IS '对应JSON字段：sale_price，说明：：商品标准销售价（挂牌价），单位为元。，示例值及对应分析：说明：实际结算时可能会打折或用券抵扣，但这个字段表示“定价”。';
COMMENT ON COLUMN billiards_ods.store_goods_master.cost_price IS '对应JSON字段：cost_price，说明：：商品成本价（单件成本）。，示例值及对应分析：观察：';
COMMENT ON COLUMN billiards_ods.store_goods_master.cost_price_type IS '对应JSON字段：cost_price_type，说明：（结合成本字段推测）：，示例值及对应分析：1 代表使用“固定成本价”（手工维护的 cost_price），provisional_total_cost 按“数量 × cost_price”算。';
COMMENT ON COLUMN billiards_ods.store_goods_master.min_discount_price IS '对应JSON字段：min_discount_price，说明：：最低允许成交价（限价）。，示例值及对应分析：用法逻辑（推测）：';
COMMENT ON COLUMN billiards_ods.store_goods_master.safe_stock IS '对应JSON字段：safe_stock，说明：：安全库存量（阈值），低于该值时系统可以提示补货。，示例值及对应分析：当前门店尚未设置安全库存，所以全部为 0，仅起到结构占位作用。';
COMMENT ON COLUMN billiards_ods.store_goods_master.stock IS '对应JSON字段：stock，说明：：当前可用库存数量（以 unit 为单位）。，示例值及对应分析：特征：可以是 0（库存卖完），也可以非常大（例如纸巾、茶位费这种按“份”计的虚拟库存设定）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.stock_A IS '对应JSON字段：stock_A，说明：（系统设计）：副单位库存数量。如果商品存在双单位（例如箱/瓶），stock_A 通常用于记录副单位库存。当前门店没有启用副单位库存管理，因此为 0。，示例值及对应分析：batch_stock_quantity';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_num IS '对应JSON字段：sale_num，说明：：在当前统计口径下的销售数量（总销量，单位同 unit）。，示例值及对应分析：特征：和 total_sales 完全一致（当前导出时的统计口径下），说明两者是同一统计周期。';
COMMENT ON COLUMN billiards_ods.store_goods_master.total_purchase_cost IS '对应JSON字段：total_purchase_cost，说明：：总采购成本，单位为元。，示例值及对应分析：当前数据：与 provisional_total_cost 完全相等。';
COMMENT ON COLUMN billiards_ods.store_goods_master.total_sales IS '对应JSON字段：total_sales，说明：（从命名看）：累计销售数量。，示例值及对应分析：实际：当前数据中 total_sales == sale_num，说明此接口的统计区间 = “截至当前的全部历史”，因此数量一致。';
COMMENT ON COLUMN billiards_ods.store_goods_master.average_monthly_sales IS '对应JSON字段：average_monthly_sales，说明：：平均月销量（件/月），根据某个统计周期内的销售数据折算而来。，示例值及对应分析：结构特征：';
COMMENT ON COLUMN billiards_ods.store_goods_master.enable_status IS '对应JSON字段：enable_status，说明：（结合名称与常见编码）：，示例值及对应分析：1：启用。';
COMMENT ON COLUMN billiards_ods.store_goods_master.audit_status IS '对应JSON字段：audit_status，说明：（典型业务语义）：，示例值及对应分析：2：审核通过。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_state IS '对应JSON字段：goods_state，说明：类型：int，枚举，示例值及对应分析：观察值：';
COMMENT ON COLUMN billiards_ods.store_goods_master.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：未删除（有效档案）；';
COMMENT ON COLUMN billiards_ods.store_goods_master.is_warehousing IS '对应JSON字段：is_warehousing，说明：：是否纳入库存管理。，示例值及对应分析：1：启用库存管理（会有出入库流水）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.able_discount IS '对应JSON字段：able_discount，说明：（结合命名）：，示例值及对应分析：是否允许参与折扣。当前全部为 1，说明所有商品都允许打折。';
COMMENT ON COLUMN billiards_ods.store_goods_master.able_site_transfer IS '对应JSON字段：able_site_transfer，说明：（结合命名与值分布）：，示例值及对应分析：表示是否允许跨门店调拨或跨站点共享库存。';
COMMENT ON COLUMN billiards_ods.store_goods_master.forbid_sell_status IS '对应JSON字段：forbid_sell_status，说明：类型：int，枚举，示例值及对应分析：观察值：全部为 1。';
COMMENT ON COLUMN billiards_ods.store_goods_master."freeze" IS '对应JSON字段：freeze，说明：：冻结状态。，示例值及对应分析：0：未冻结；';
COMMENT ON COLUMN billiards_ods.store_goods_master.send_state IS '对应JSON字段：send_state，说明：（命名趋近“上架状态/可售状态”）：，示例值及对应分析：1：可销售/可下单。';
COMMENT ON COLUMN billiards_ods.store_goods_master.custom_label_type IS '对应JSON字段：custom_label_type，说明：（推测）：自定义标签类型。，示例值及对应分析：1：使用系统默认标签（未出现）；';
COMMENT ON COLUMN billiards_ods.store_goods_master.option_required IS '对应JSON字段：option_required，说明：（推测）：是否需要在销售时选择规格/选项。，示例值及对应分析：1：不要求额外选项（单规格商品）；';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_channel IS '对应JSON字段：sale_channel，说明：：销售渠道类型。，示例值及对应分析：常见模式：';
COMMENT ON COLUMN billiards_ods.store_goods_master.remark IS '对应JSON字段：remark，说明：：商品备注（可以写口味说明、供应商、注意事项等）。当前尚未使用。，示例值及对应分析：sort';
COMMENT ON COLUMN billiards_ods.store_goods_master.pinyin_initial IS '对应JSON字段：pinyin_initial，说明：：商品名称的拼音首字母缩写，有时多个别名用逗号分隔。，示例值及对应分析：作用：';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_cover IS '对应JSON字段：goods_cover，说明：：商品图片 URL（如 OSS 对象存储地址），用于前端展示商品图片。，示例值及对应分析：?? store_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_master.create_time IS '对应JSON字段：create_time，说明：：门店商品档案创建时间（商品在门店建立档案的时间点）。，示例值及对应分析：?? store_goods_master-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_master.update_time IS '对应JSON字段：update_time，说明：：最后一次修改该商品档案的时间（包括价格调整、状态变更等）。，示例值及对应分析：days_available';
COMMENT ON COLUMN billiards_ods.store_goods_master.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_master.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_master.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_master.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';

CREATE TABLE IF NOT EXISTS billiards_ods.store_goods_sales_records (
    id                         BIGINT PRIMARY KEY,
    tenant_id                  BIGINT,
    site_id                    BIGINT,
    site_goods_id              BIGINT,
    tenant_goods_id            BIGINT,
    order_settle_id            BIGINT,
    order_trade_no             TEXT,
    order_goods_id             BIGINT,
    order_pay_id               BIGINT,
    order_coupon_id            BIGINT,
    ledger_name                TEXT,
    ledger_group_name          TEXT,
    ledger_amount              NUMERIC(18,2),
    ledger_count               NUMERIC(18,4),
    ledger_unit_price          NUMERIC(18,4),
    ledger_status              INT,
    discount_money             NUMERIC(18,2),
    coupon_deduct_money        NUMERIC(18,2),
    member_discount_amount     NUMERIC(18,2),
    option_coupon_deduct_money NUMERIC(18,2),
    option_member_discount_money NUMERIC(18,2),
    point_discount_money       NUMERIC(18,2),
    point_discount_money_cost  NUMERIC(18,2),
    real_goods_money           NUMERIC(18,2),
    cost_money                 NUMERIC(18,2),
    push_money                 NUMERIC(18,2),
    sales_type                 INT,
    is_single_order            INT,
    is_delete                  INT,
    goods_remark               TEXT,
    option_price               NUMERIC(18,2),
    option_value_name          TEXT,
    option_name                TEXT,
    member_coupon_id           BIGINT,
    package_coupon_id          BIGINT,
    sales_man_org_id           BIGINT,
    salesman_name              TEXT,
    salesman_role_id           BIGINT,
    salesman_user_id           BIGINT,
    operator_id                BIGINT,
    operator_name              TEXT,
    openSalesman               TEXT,
    site_table_id              BIGINT,
    tenant_goods_business_id   BIGINT,
    tenant_goods_category_id   BIGINT,
    create_time                TIMESTAMP,
    payload                    JSONB NOT NULL,
    source_file                TEXT,
    source_endpoint            TEXT,
    fetched_at                 TIMESTAMPTZ DEFAULT now()
);

COMMENT ON TABLE billiards_ods.store_goods_sales_records IS '对应JSON字段：store_goods_sales_records.json，说明：ODS 原始明细表（保留payload），示例值及对应分析：详见 store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.id IS '对应JSON字段：id，说明：：本条「门店销售流水」记录的主键 ID。，示例值及对应分析：用途：在系统内部唯一标识这一条销售明细。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_id IS '对应JSON字段：tenant_id，说明：：租户/品牌 ID。，示例值及对应分析：特征：所有记录为同一个值，对应「非球科技系统中你的商户」。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_id IS '对应JSON字段：site_id，说明：：门店 ID（系统主键）。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_goods_id IS '对应JSON字段：site_goods_id，说明：：门店商品 ID。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_id IS '对应JSON字段：tenant_goods_id，说明：：租户（品牌）级商品 ID（全局商品 ID）。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_settle_id IS '对应JSON字段：order_settle_id，说明：与台费、助教、团购套餐流水等表共享，形成「订单主表（结算）– 多种明细表」的结构。，示例值及对应分析：如果结账记录表有数据，order_settle_id 对应那里的主键，create_time 与订单结束时间基本一致。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_trade_no IS '对应JSON字段：order_trade_no，说明：与台费、助教、团购套餐流水等表共享，形成「订单主表（结算）– 多种明细表」的结构。，示例值及对应分析：如果结账记录表有数据，order_settle_id 对应那里的主键，create_time 与订单结束时间基本一致。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_goods_id IS '对应JSON字段：order_goods_id，说明：：订单商品明细 ID（订单内部的商品行主键）。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_pay_id IS '对应JSON字段：order_pay_id，说明：连接到「支付记录」中的一条支付流水，再通过支付的 relate_type/relate_id 把支付和订单、充值等业务区分开。，示例值及对应分析：对于退款，则通过退款记录里的 relate_type/relate_id 反向关联到原来的订单或支付。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_coupon_id IS '对应JSON字段：order_coupon_id，说明：：订单级优惠券 ID。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_name IS '对应JSON字段：ledger_name，说明：：销售项目名称（商品名称），例如 “哇哈哈矿泉水”“地道肠”“东方树叶”等。，示例值及对应分析：说明：业务展示用字段，历史流水即使商品改名，这里会保留当时的名字。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_group_name IS '对应JSON字段：ledger_group_name，说明：：销售项目所属的「门店内部分组名称」，类似前台菜单分组或大类标签。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_amount IS '对应JSON字段：ledger_amount，说明：：原始应收金额，公式上接近 ledger_unit_price × ledger_count。，示例值及对应分析：说明：这是未考虑优惠前的金额基础，用于后续计算折扣和抵扣。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_count IS '对应JSON字段：ledger_count，说明：：销售数量（以 unit 为单位，unit 字段在门店商品档案中）。，示例值及对应分析：观测值：如 1, 2, 3, 6, 36 等。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_unit_price IS '对应JSON字段：ledger_unit_price，说明：：商品在该次销售中的「结算单价」（元/单位）。，示例值及对应分析：观测值示例：5.0, 8.0, 2.0, 10.0, 72.0 等。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_status IS '对应JSON字段：ledger_status，说明：：销售流水状态。，示例值及对应分析：1：正常有效。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.discount_money IS '对应JSON字段：discount_money，说明：：本条销售明细的「价格优惠金额」，即原价部分被减免掉的金额。，示例值及对应分析：典型关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.coupon_deduct_money IS '对应JSON字段：coupon_deduct_money，说明：：被优惠券 / 团购券直接抵扣到这条商品明细上的金额。，示例值及对应分析：说明：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.member_discount_amount IS '对应JSON字段：member_discount_amount，说明：：由会员身份（会员折扣）针对这一行商品产生的优惠金额。，示例值及对应分析：说明：尽管字段存在，但当前实际折扣可能合并反映在 discount_money 中，这个字段没有拆开体现。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_coupon_deduct_money IS '对应JSON字段：option_coupon_deduct_money，说明：：由优惠券抵扣“选项价格”的金额。，示例值及对应分析：上面这三个 option_* 字段，是为“主商品 + 选项”的更复杂计价方式预留的，本店当前所有记录都是单规格，选项体系未启用。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_member_discount_money IS '对应JSON字段：option_member_discount_money，说明：：由会员折扣作用在“选项价格”上的优惠金额。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.point_discount_money IS '对应JSON字段：point_discount_money，说明：：由积分抵扣的金额（顾客兑换积分抵现金额）。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.point_discount_money_cost IS '对应JSON字段：point_discount_money_cost，说明：：积分抵扣对应的“成本金额”（后台核算用），例如按积分成本来计提费用。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.real_goods_money IS '对应JSON字段：real_goods_money，说明：：商品实际入账金额（考虑折扣、可能还会考虑其它抵扣后的实际销售金额）。，示例值及对应分析：观测值：5.0, 10.0, 8.0, 6.0, 4.0 等。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.cost_money IS '对应JSON字段：cost_money，说明：：本条销售对应的成本金额（以元计）。，示例值及对应分析：观测示例：0.01, 0.00, 3.58, 1.79, 0.64 等。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.push_money IS '对应JSON字段：push_money，说明：：本条销售对应的提成金额（给营业员/促销员的提成）。，示例值及对应分析：在启用营业员体系时，这里才会出现正数。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.sales_type IS '对应JSON字段：sales_type，说明：：销售类型。，示例值及对应分析：1：正常销售；';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.is_single_order IS '对应JSON字段：is_single_order，说明：：是否单独订单标识。，示例值及对应分析：1：作为独立明细参与某个订单结算；';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.is_delete IS '对应JSON字段：is_delete，说明：：逻辑删除标志。，示例值及对应分析：0：正常有效；';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.goods_remark IS '对应JSON字段：goods_remark，说明：：商品备注/口味说明/特殊说明。，示例值及对应分析：用途：点单时如果需要额外说明，可以写在这里。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_price IS '对应JSON字段：option_price，说明：：商品选项（规格/加料）的附加价格。，示例值及对应分析：说明：如加冰、加料、升级大杯等产生附加费用时，理论上应该体现到这里。当前门店未使用此功能。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_value_name IS '对应JSON字段：option_value_name，说明：：商品选项名称（如规格、口味：大杯/小杯，不加冰等）。，示例值及对应分析：结构用途：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_name IS '对应JSON字段：option_name，说明：?????? store_goods_sales_records-Analysis.md，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.member_coupon_id IS '对应JSON字段：member_coupon_id，说明：：会员券 ID（比如会员专享优惠券）。，示例值及对应分析：当前数据未使用，属于为会员权益预留的字段。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.package_coupon_id IS '对应JSON字段：package_coupon_id，说明：：套餐券 ID。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.sales_man_org_id IS '对应JSON字段：sales_man_org_id，说明：：营业员所属组织/部门 ID。，示例值及对应分析：当前门店全部为 0，说明未启用这套销售员分组织的体系。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_name IS '对应JSON字段：salesman_name，说明：：营业员姓名（如果有为具体销售员记业绩，则在此填姓名）。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_role_id IS '对应JSON字段：salesman_role_id，说明：：营业员的系统角色 ID（例如某个角色代码表示“销售员”）。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_user_id IS '对应JSON字段：salesman_user_id，说明：：营业员用户 ID（系统账号 ID）。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.operator_id IS '对应JSON字段：operator_id，说明：：操作员 ID（录入这笔销售的员工）。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.operator_name IS '对应JSON字段：operator_name，说明：：操作员姓名，文字冗余。，示例值及对应分析：?? store_goods_sales_records-Analysis.md';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.openSalesman IS '对应JSON字段：openSalesman，说明：（结合系统其它文件推断）：，示例值及对应分析：1：启用“营业员/销售员”机制（要指定 salesman）；';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_table_id IS '对应JSON字段：site_table_id，说明：：球台 ID。，示例值及对应分析：非 0：销售记录关联到具体某张桌台（例如顾客在台上点饮料）。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_business_id IS '对应JSON字段：tenant_goods_business_id，说明：：租户级商品「业务大类」ID（例如“零食类”“酒水类”等更高维度）。，示例值及对应分析：2.2 门店 / 球台维度字段';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_category_id IS '对应JSON字段：tenant_goods_category_id，说明：：租户级商品一级分类 ID。，示例值及对应分析：关系：';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.create_time IS '对应JSON字段：create_time，说明：：销售记录创建时间，通常就是结账时间或录入时间。，示例值及对应分析：用途：用于按时间维度查询销售流水，与订单层的时间字段对齐。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.payload IS '对应JSON字段：payload，说明：完整原始 JSON 内容，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.source_file IS '对应JSON字段：source_file，说明：原始文件名（含时间戳后缀），示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.source_endpoint IS '对应JSON字段：source_endpoint，说明：抓取来源接口/URL 标识，示例值及对应分析：???????';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.fetched_at IS '对应JSON字段：fetched_at，说明：入库时间（ETL 拉取时间），示例值及对应分析：???????';
