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 'ODS 原始明细表：会员档案/会员账户信息。来源：export/test-json-doc/member_profiles.json；分析：member_profiles-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.member_profiles.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.member_profiles.register_site_id IS '【说明】会员的注册门店 ID。     【示例】2790685415443269（用于会员的注册门店 ID）。          【JSON字段】register_site_id。';
COMMENT ON COLUMN billiards_ods.member_profiles.site_name IS '【说明】注册门店名称，属于冗余字段，用于直接展示。     【示例】朗朗桌球（注册门店名称，属于冗余字段，用于直接展示）。          【JSON字段】site_name。';
COMMENT ON COLUMN billiards_ods.member_profiles.id IS '【说明】这是“租户内会员账户”的主键 ID。     【示例】2955204541320325（用于这是“租户内会员账户”的主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.member_profiles.system_member_id IS '【说明】这是“系统级会员 ID”，在全平台唯一，用来把一个会员在不同门店/不同卡类型下的账户统一到一个“人”的维度上。     【示例】2955204540009605（用于这是“系统级会员 ID”，在全平台唯一，用来把一个会员在不同门店/不同卡类型下的账户统一到一个“人”的维度上）。          【JSON字段】system_member_id。';
COMMENT ON COLUMN billiards_ods.member_profiles.member_card_grade_code IS '【说明】这两个字段是成对出现的：一个数值码，一个中文名称。     【示例】2790683528022853（用于这两个字段是成对出现的：一个数值码，一个中文名称）。          【JSON字段】member_card_grade_code。';
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 '【说明】会员绑定的手机号码。     【示例】18620043391（用于会员绑定的手机号码）。          【JSON字段】mobile。';
COMMENT ON COLUMN billiards_ods.member_profiles.nickname IS '【说明】会员在当前租户下的显示名称（可以是姓名，也可以是昵称）。     【示例】胡先生（用于会员在当前租户下的显示名称（可以是姓名，也可以是昵称））。          【JSON字段】nickname。';
COMMENT ON COLUMN billiards_ods.member_profiles.point IS '【说明】当前积分余额（这条会员账户的积分值）。     【示例】0.0（用于当前积分余额（这条会员账户的积分值））。          【JSON字段】point。';
COMMENT ON COLUMN billiards_ods.member_profiles.growth_value IS '【说明】成长值 / 经验值，用于会员等级晋升的累计指标。     【示例】0.0（成长值 / 经验值，用于会员等级晋升的累计指标）。          【JSON字段】growth_value。';
COMMENT ON COLUMN billiards_ods.member_profiles.referrer_member_id IS '【说明】推荐人会员 ID，用于记录该会员是由哪位老会员推荐。     【示例】0（推荐人会员 ID，用于记录该会员是由哪位老会员推荐）。          【JSON字段】referrer_member_id。';
COMMENT ON COLUMN billiards_ods.member_profiles.status IS '【说明】帐户状态（偏“卡状态/档案状态”）。     【示例】1（用于帐户状态（偏“卡状态/档案状态”））。          【JSON字段】status。';
COMMENT ON COLUMN billiards_ods.member_profiles.user_status IS '【说明】用户账号状态（偏“用户逻辑”层面的状态）。     【示例】1（用于用户账号状态（偏“用户逻辑”层面的状态））。          【JSON字段】user_status。';
COMMENT ON COLUMN billiards_ods.member_profiles.create_time IS '【说明】会员账户的创建时间（即这条档案/这张卡在系统中被创建的时间）。     【示例】2025-11-08 01:29:33（用于会员账户的创建时间（即这条档案/这张卡在系统中被创建的时间））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.member_profiles.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】member_profiles.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_profiles.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/member_profiles.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_profiles.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_profiles.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：会员余额变更流水。来源：export/test-json-doc/member_balance_changes.json；分析：member_balance_changes-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_id IS '【说明】租户/商户 ID，本数据中是固定值（同一品牌/商户）。     【示例】2790683160709957（用于租户/商户 ID，本数据中是固定值（同一品牌/商户））。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.site_id IS '【说明】非 0：记录所属的具体门店 ID（与其他 JSON 内的 site_id 一致）。     【示例】2790685415443269（用于非 0：记录所属的具体门店 ID（与其他 JSON 内的 site_id 一致））。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.register_site_id IS '【说明】会员卡的“注册门店 ID”，即办卡所在门店。     【示例】2790685415443269（用于会员卡的“注册门店 ID”，即办卡所在门店）。          【JSON字段】register_site_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.registerSiteName IS '【说明】卡片的注册门店名称（办卡地点），和 register_site_id 配套。     【示例】朗朗桌球（用于卡片的注册门店名称（办卡地点），和 register_site_id 配套）。          【JSON字段】registerSiteName。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.paySiteName IS '【说明】发生本次余额变更的门店名称（即本次消费/充值所在门店）。     【示例】朗朗桌球（用于发生本次余额变更的门店名称（即本次消费/充值所在门店））。          【JSON字段】paySiteName。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.id IS '【说明】余额变更记录的主键 ID，唯一标识这一条“账户余额变化事件”。     【示例】2957881605869253（用于余额变更记录的主键 ID，唯一标识这一条“账户余额变化事件”）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_member_id IS '【说明】商户维度的会员 ID（租户内会员主键）。     【示例】2799212845565701（用于商户维度的会员 ID（租户内会员主键））。          【JSON字段】tenant_member_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.tenant_member_card_id IS '【说明】会员卡账户 ID，在租户内唯一标识某张卡。     【示例】2799219999295237（用于会员卡账户 ID，在租户内唯一标识某张卡）。          【JSON字段】tenant_member_card_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.system_member_id IS '【说明】系统级（全局）会员 ID。     【示例】2799212844549893（用于系统级（全局）会员 ID）。          【JSON字段】system_member_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberName IS '【说明】会员姓名或称呼（非昵称字段）。     【示例】曾丹烨（用于会员姓名或称呼（非昵称字段））。          【JSON字段】memberName。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberMobile IS '【说明】会员手机号。     【示例】13922213242（用于会员手机号）。          【JSON字段】memberMobile。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.card_type_id IS '【说明】卡种类型 ID，用于区分不同卡种。     【示例】2793249295533893（卡种类型 ID，用于区分不同卡种）。          【JSON字段】card_type_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.memberCardTypeName IS '【说明】卡种名称，与 card_type_id 一一对应，是一个 卡种枚举名称。     【示例】储值卡（用于卡种名称，与 card_type_id 一一对应，是一个 卡种枚举名称）。          【JSON字段】memberCardTypeName。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.account_data IS '【说明】本次变动的金额（元），正数表示增加，负数表示减少。     【示例】-120.0（用于本次变动的金额（元），正数表示增加，负数表示减少）。          【JSON字段】account_data。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.before IS '【说明】本次变动前，该卡账户的余额（元）。     【示例】816.3（用于本次变动前，该卡账户的余额（元））。          【JSON字段】before。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.after IS '【说明】本次变动后，该卡账户的余额（元）。     【示例】696.3（用于本次变动后，该卡账户的余额（元））。          【JSON字段】after。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.refund_amount IS '【说明】可能用于标记“其中有多少金额是以‘退款’形式回流的”，或区分“退回余额”和“原路退回”两种模式。     【示例】0.0（可能用于标记“其中有多少金额是以‘退款’形式回流的”，或区分“退回余额”和“原路退回”两种模式）。          【JSON字段】refund_amount。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.from_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】from_type。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.payment_method IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】0（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】payment_method。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.relate_id IS '【说明】例如某次充值记录的 ID、某张订单/结算单 ID、某次活动抵用券核销记录 ID 等。     【示例】2957881518788421（用于例如某次充值记录的 ID、某张订单/结算单 ID、某次活动抵用券核销记录 ID 等）。          【JSON字段】relate_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.remark IS '【说明】当为空时，说明这条变动没有额外备注说明。     【示例】充值退款（用于当为空时，说明这条变动没有额外备注说明）。          【JSON字段】remark。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.operator_id IS '【说明】执行此次余额变更操作的员工 ID。     【示例】2790687322443013（用于执行此次余额变更操作的员工 ID）。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.operator_name IS '【说明】操作员姓名（带职位前缀），是对 operator_id 的可读冗余字段。     【示例】收银员:郑丽珊（用于操作员姓名（带职位前缀），是对 operator_id 的可读冗余字段）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.is_delete IS '【说明】逻辑删除标记（0=否，1=是）。。     【示例】0（用于逻辑删除标记（0=否，1=是））。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.create_time IS '【说明】本条余额变更记录的创建时间，通常接近交易发生时间。     【示例】2025-11-09 22:52:48（用于本条余额变更记录的创建时间，通常接近交易发生时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】member_balance_changes.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/member_balance_changes.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_balance_changes.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：会员储值/卡券账户列表。来源：export/test-json-doc/member_stored_value_cards.json；分析：member_stored_value_cards-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenant_id IS '【说明】租户/品牌 ID，与其他 JSON 中 tenant_id 一致。     【示例】2790683160709957（用于租户/品牌 ID，与其他 JSON 中 tenant_id 一致）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenant_member_id IS '【说明】当前商户（品牌/租户）中会员的主键 ID。     【示例】2955204541320325（用于当前商户（品牌/租户）中会员的主键 ID）。          【JSON字段】tenant_member_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.system_member_id IS '【说明】系统级会员 ID（跨门店统一主键）。     【示例】2955204540009605（用于系统级会员 ID（跨门店统一主键））。          【JSON字段】system_member_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.register_site_id IS '【说明】卡首次办理的门店 ID。     【示例】2790685415443269（用于卡首次办理的门店 ID）。          【JSON字段】register_site_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.site_name IS '【说明】卡归属门店名称（视图中的展示字段）。     【示例】朗朗桌球（用于卡归属门店名称（视图中的展示字段））。          【JSON字段】site_name。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.id IS '【说明】本表主键 ID，用于唯一标识一条记录。     【示例】2955206162843781（本表主键 ID，用于唯一标识一条记录）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_card_grade_code IS '【说明】卡等级/卡类代码，和下面两个名称字段一一对应。     【示例】2790683528022856（用于卡等级/卡类代码，和下面两个名称字段一一对应）。          【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。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_card_type_name IS '【说明】卡类型名称，实际与 member_card_grade_code_name 一致。     【示例】活动抵用券（用于卡类型名称，实际与 member_card_grade_code_name 一致）。          【JSON字段】member_card_type_name。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_name IS '【说明】持卡会员姓名快照。     【示例】胡先生（用于持卡会员姓名快照）。          【JSON字段】member_name。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.member_mobile IS '【说明】持卡会员手机号快照。     【示例】18620043391（用于持卡会员手机号快照）。          【JSON字段】member_mobile。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_type_id IS '【说明】卡种 ID（定义“这是哪一种卡”）。     【示例】2793266846533445（用于卡种 ID（定义“这是哪一种卡”））。          【JSON字段】card_type_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_no IS '【说明】实体卡物理卡号／条码号。     【示例】NULL（用于实体卡物理卡号／条码号）。          【JSON字段】card_no。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.card_physics_type IS '【说明】物理卡类型。     【示例】1（用于物理卡类型）。          【JSON字段】card_physics_type。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.balance IS '【说明】当前卡内余额（主要针对储值卡、部分券卡）。     【示例】0.0（用于当前卡内余额（主要针对储值卡、部分券卡））。          【JSON字段】balance。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.denomination IS '【说明】采用“几折”的记法：10=不打折，9=九折，8=八折。     【示例】0.0（用于采用“几折”的记法：10=不打折，9=九折，8=八折）。          【JSON字段】denomination。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】table_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】goods_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】assistant_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】assistant_reward_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_service_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】table_service_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_service_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】assistant_service_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.coupon_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】coupon_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_service_discount IS '【说明】数量/时长字段，用于统计与计量。     【示例】10.0（数量/时长字段，用于统计与计量）。          【JSON字段】goods_service_discount。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_discount_sub_switch IS '【说明】数量/时长字段，用于统计与计量。     【示例】2（数量/时长字段，用于统计与计量）。          【JSON字段】assistant_discount_sub_switch。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_discount_sub_switch IS '【说明】数量/时长字段，用于统计与计量。     【示例】2（数量/时长字段，用于统计与计量）。          【JSON字段】table_discount_sub_switch。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount_sub_switch IS '【说明】数量/时长字段，用于统计与计量。     【示例】2（数量/时长字段，用于统计与计量）。          【JSON字段】goods_discount_sub_switch。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_discount_sub_switch IS '【说明】数量/时长字段，用于统计与计量。     【示例】2（数量/时长字段，用于统计与计量）。          【JSON字段】assistant_reward_discount_sub_switch。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_service_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】table_service_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_service_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistant_service_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_service_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goods_service_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistant_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.table_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】table_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goods_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.coupon_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】coupon_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistant_reward_deduct_radio IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】100.0（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistant_reward_deduct_radio。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableCardDeduct IS '【说明】针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。     【示例】0.0（用于针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则））。          【JSON字段】tableCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableServiceCardDeduct IS '【说明】如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。     【示例】0.0（用于如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置）。          【JSON字段】tableServiceCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsCarDeduct IS '【说明】针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。     【示例】0.0（用于针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则））。          【JSON字段】goodsCarDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsServiceCardDeduct IS '【说明】如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。     【示例】0.0（用于如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置）。          【JSON字段】goodsServiceCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantCardDeduct IS '【说明】针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则）。     【示例】0.0（用于针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则））。          【JSON字段】assistantCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantServiceCardDeduct IS '【说明】如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置。     【示例】0.0（用于如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置）。          【JSON字段】assistantServiceCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.assistantRewardCardDeduct IS '【说明】助教奖励金方向扣款的配置。     【示例】0.0（用于助教奖励金方向扣款的配置）。          【JSON字段】assistantRewardCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.cardSettleDeduct IS '【说明】结算时从卡中扣除的金额上限/规则配置（视图级。     【示例】0.0（用于结算时从卡中扣除的金额上限/规则配置（视图级）。          【JSON字段】cardSettleDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.couponCardDeduct IS '【说明】与卡绑定的“券额度扣除配置”。     【示例】0.0（用于与卡绑定的“券额度扣除配置”）。          【JSON字段】couponCardDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.deliveryFeeDeduct IS '【说明】配送费可否/多少从卡中抵扣，目前无业务发生。     【示例】0.0（用于配送费可否/多少从卡中抵扣，目前无业务发生）。          【JSON字段】deliveryFeeDeduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.use_scene IS '【说明】卡使用场景说明（比如“仅店内使用”“仅团建”等），本门店尚未使用此字段。     【示例】NULL（用于卡使用场景说明（比如“仅店内使用”“仅团建”等），本门店尚未使用此字段）。          【JSON字段】use_scene。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.able_cross_site IS '【说明】是否允许跨店使用。     【示例】1（用于是否允许跨店使用）。          【JSON字段】able_cross_site。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.able_site_transfer IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。     【示例】NULL（布尔/开关字段，用于表示权限、可用性或状态开关）。          【JSON字段】able_site_transfer。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_allow_give IS '【说明】是否允许转赠/转让给其他会员。     【示例】0（用于是否允许转赠/转让给其他会员）。          【JSON字段】is_allow_give。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_allow_order_deduct IS '【说明】是否允许在“订单层面统一扣款”。     【示例】0（用于是否允许在“订单层面统一扣款”）。          【JSON字段】is_allow_order_deduct。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.bind_password IS '【说明】卡绑定密码，用于消费或查询验证（目前未启用）。     【示例】NULL（卡绑定密码，用于消费或查询验证（目前未启用））。          【JSON字段】bind_password。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goods_discount_range_type IS '【说明】数量/时长字段，用于统计与计量。     【示例】1（数量/时长字段，用于统计与计量）。          【JSON字段】goods_discount_range_type。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.goodsCategoryId IS '【说明】可用的商品分类 ID 列表。     【示例】[]（用于可用的商品分类 ID 列表）。          【JSON字段】goodsCategoryId。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tableAreaId IS '【说明】限定可使用的台区 ID 列表。     【示例】[]（用于限定可使用的台区 ID 列表）。          【JSON字段】tableAreaId。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.effect_site_id IS '【说明】卡片限定生效门店 ID。     【示例】0（用于卡片限定生效门店 ID）。          【JSON字段】effect_site_id。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.start_time IS '【说明】卡片生效开始时间（有效期起始）。     【示例】2025-11-08 01:31:12（用于卡片生效开始时间（有效期起始））。          【JSON字段】start_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.end_time IS '【说明】卡片有效期结束时间。     【示例】2225-01-01 00:00:00（用于卡片有效期结束时间）。          【JSON字段】end_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.disable_start_time IS '【说明】停用时间段（比如临时冻结卡的起止时间）。     【示例】0001-01-01 00:00:00（用于停用时间段（比如临时冻结卡的起止时间））。          【JSON字段】disable_start_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.disable_end_time IS '【说明】停用时间段（比如临时冻结卡的起止时间）。     【示例】0001-01-01 00:00:00（用于停用时间段（比如临时冻结卡的起止时间））。          【JSON字段】disable_end_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.last_consume_time IS '【说明】最近一次消费时间。     【示例】2025-11-09 07:48:23（用于最近一次消费时间）。          【JSON字段】last_consume_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.create_time IS '【说明】卡片创建时间（开卡时间）。     【示例】2025-11-08 01:31:12（用于卡片创建时间（开卡时间））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.status IS '【说明】状态枚举，用于标识记录当前业务状态。。     【示例】1（状态枚举，用于标识记录当前业务状态。）。          【JSON字段】status。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.sort IS '【说明】在前端展示或某些列表中的排序权重。     【示例】1（用于在前端展示或某些列表中的排序权重）。          【JSON字段】sort。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenantAvatar IS '【说明】品牌头像 URL（未配置）。     【示例】NULL（用于品牌头像 URL（未配置））。          【JSON字段】tenantAvatar。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.tenantName IS '【说明】租户/品牌名称（当前导出为空）。     【示例】NULL（用于租户/品牌名称（当前导出为空））。          【JSON字段】tenantName。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.pdAssisnatLevel IS '【说明】允许使用的“陪打/助教等级”列表。     【示例】[]（用于允许使用的“陪打/助教等级”列表）。          【JSON字段】pdAssisnatLevel。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.cxAssisnatLevel IS '【说明】可能是“促销活动中的助教等级限制”（命名中 cx 多为“促销”缩写）。     【示例】[]（用于可能是“促销活动中的助教等级限制”（命名中 cx 多为“促销”缩写））。          【JSON字段】cxAssisnatLevel。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】member_stored_value_cards.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/member_stored_value_cards.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.member_stored_value_cards.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：充值结算记录。来源：export/test-json-doc/recharge_settlements.json；分析：recharge_settlements-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.id IS '【说明】门店 ID。     【示例】NULL（用于门店 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tenantid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tenantid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.siteid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】siteid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.sitename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】sitename。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.balanceamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】balanceamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.cardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】cardamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.cashamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】cashamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.couponamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】couponamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.createtime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】createtime。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】memberid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.membername IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】membername。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tenantmembercardid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tenantmembercardid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.membercardtypename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】membercardtypename。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberphone IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】memberphone。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tableid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tableid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.consumemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】consumemoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.onlineamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】onlineamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.operatorid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】operatorid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.operatorname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】operatorname。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revokeorderid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】revokeorderid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revokeordername IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】revokeordername。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.revoketime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】revoketime。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.payamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】payamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.refundamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】refundamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】settlename。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlerelateid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settlerelateid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settlestatus IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settlestatus。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.settletype IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settletype。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.paytime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】paytime。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.roundingamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】roundingamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.paymentmethod IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】paymentmethod。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.adjustamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】adjustamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantcxmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantcxmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantpdmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantpdmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.couponsaleamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】couponsaleamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.memberdiscountamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】memberdiscountamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.tablechargemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】tablechargemoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.goodsmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goodsmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.realgoodsmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】realgoodsmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.servicemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】servicemoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.prepaymoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】prepaymoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.salesmanname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】salesmanname。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.orderremark IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】orderremark。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.salesmanuserid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】salesmanuserid。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.canberevoked IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】canberevoked。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointdiscountprice IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointdiscountprice。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.pointdiscountcost IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointdiscountcost。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.activitydiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】activitydiscount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.serialnumber IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】serialnumber。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantmanualdiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】assistantmanualdiscount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.allcoupondiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】allcoupondiscount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.goodspromotionmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goodspromotionmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.assistantpromotionmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantpromotionmoney。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isusecoupon IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isusecoupon。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isusediscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】isusediscount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isactivity IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isactivity。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isbindmember IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isbindmember。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.isfirst IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isfirst。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.rechargecardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】rechargecardamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.giftcardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】giftcardamount。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】recharge_settlements.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/recharge_settlements.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.recharge_settlements.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：结账/结算记录。来源：export/test-json-doc/settlement_records.json；分析：settlement_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.settlement_records.id IS '【说明】结账记录主键 ID（订单结算 ID）。     【示例】NULL（用于结账记录主键 ID（订单结算 ID））。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.settlement_records.tenantid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tenantid。';
COMMENT ON COLUMN billiards_ods.settlement_records.siteid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】siteid。';
COMMENT ON COLUMN billiards_ods.settlement_records.sitename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】sitename。';
COMMENT ON COLUMN billiards_ods.settlement_records.balanceamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】balanceamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.cardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】cardamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.cashamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】cashamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.couponamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】couponamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.createtime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】createtime。';
COMMENT ON COLUMN billiards_ods.settlement_records.memberid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】memberid。';
COMMENT ON COLUMN billiards_ods.settlement_records.membername IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】membername。';
COMMENT ON COLUMN billiards_ods.settlement_records.tenantmembercardid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tenantmembercardid。';
COMMENT ON COLUMN billiards_ods.settlement_records.membercardtypename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】membercardtypename。';
COMMENT ON COLUMN billiards_ods.settlement_records.memberphone IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】memberphone。';
COMMENT ON COLUMN billiards_ods.settlement_records.tableid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tableid。';
COMMENT ON COLUMN billiards_ods.settlement_records.consumemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】consumemoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.onlineamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】onlineamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.operatorid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】operatorid。';
COMMENT ON COLUMN billiards_ods.settlement_records.operatorname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】operatorname。';
COMMENT ON COLUMN billiards_ods.settlement_records.revokeorderid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】revokeorderid。';
COMMENT ON COLUMN billiards_ods.settlement_records.revokeordername IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】revokeordername。';
COMMENT ON COLUMN billiards_ods.settlement_records.revoketime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】revoketime。';
COMMENT ON COLUMN billiards_ods.settlement_records.payamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】payamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.pointamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.refundamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】refundamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.settlename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】settlename。';
COMMENT ON COLUMN billiards_ods.settlement_records.settlerelateid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settlerelateid。';
COMMENT ON COLUMN billiards_ods.settlement_records.settlestatus IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settlestatus。';
COMMENT ON COLUMN billiards_ods.settlement_records.settletype IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】settletype。';
COMMENT ON COLUMN billiards_ods.settlement_records.paytime IS '【说明】时间字段，用于记录业务时间点/发生时间。     【示例】NULL（时间字段，用于记录业务时间点/发生时间）。          【JSON字段】paytime。';
COMMENT ON COLUMN billiards_ods.settlement_records.roundingamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】roundingamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.paymentmethod IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】paymentmethod。';
COMMENT ON COLUMN billiards_ods.settlement_records.adjustamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】adjustamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantcxmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantcxmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantpdmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantpdmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.couponsaleamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】couponsaleamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.memberdiscountamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】memberdiscountamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.tablechargemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】tablechargemoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.goodsmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goodsmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.realgoodsmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】realgoodsmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.servicemoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】servicemoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.prepaymoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】prepaymoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.salesmanname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】salesmanname。';
COMMENT ON COLUMN billiards_ods.settlement_records.orderremark IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】orderremark。';
COMMENT ON COLUMN billiards_ods.settlement_records.salesmanuserid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】salesmanuserid。';
COMMENT ON COLUMN billiards_ods.settlement_records.canberevoked IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】canberevoked。';
COMMENT ON COLUMN billiards_ods.settlement_records.pointdiscountprice IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointdiscountprice。';
COMMENT ON COLUMN billiards_ods.settlement_records.pointdiscountcost IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】pointdiscountcost。';
COMMENT ON COLUMN billiards_ods.settlement_records.activitydiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】activitydiscount。';
COMMENT ON COLUMN billiards_ods.settlement_records.serialnumber IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】serialnumber。';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantmanualdiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】assistantmanualdiscount。';
COMMENT ON COLUMN billiards_ods.settlement_records.allcoupondiscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】allcoupondiscount。';
COMMENT ON COLUMN billiards_ods.settlement_records.goodspromotionmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】goodspromotionmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.assistantpromotionmoney IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】assistantpromotionmoney。';
COMMENT ON COLUMN billiards_ods.settlement_records.isusecoupon IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isusecoupon。';
COMMENT ON COLUMN billiards_ods.settlement_records.isusediscount IS '【说明】数量/时长字段，用于统计与计量。     【示例】NULL（数量/时长字段，用于统计与计量）。          【JSON字段】isusediscount。';
COMMENT ON COLUMN billiards_ods.settlement_records.isactivity IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isactivity。';
COMMENT ON COLUMN billiards_ods.settlement_records.isbindmember IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isbindmember。';
COMMENT ON COLUMN billiards_ods.settlement_records.isfirst IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】isfirst。';
COMMENT ON COLUMN billiards_ods.settlement_records.rechargecardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】rechargecardamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.giftcardamount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。     【示例】NULL（金额字段，用于计费/结算/分摊等金额计算）。          【JSON字段】giftcardamount。';
COMMENT ON COLUMN billiards_ods.settlement_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】settlement_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.settlement_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/settlement_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.settlement_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.settlement_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：助教作废/取消记录。来源：export/test-json-doc/assistant_cancellation_records.json；分析：assistant_cancellation_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.id IS '【说明】本表主键 ID，用于唯一标识一条记录。     【示例】2957675849518789（本表主键 ID，用于唯一标识一条记录）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.siteId IS '【说明】门店 ID，即该废除记录所在门店。     【示例】2790685415443269（用于门店 ID，即该废除记录所在门店）。          【JSON字段】siteId。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.siteProfile IS '【说明】门店信息快照。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（用于门店信息快照）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantName IS '【说明】助教姓名/对外展示名称。     【示例】泡芙（用于助教姓名/对外展示名称）。          【JSON字段】assistantName。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantAbolishAmount IS '【说明】与“助教废除”关联的金额字段。     【示例】5.83（用于与“助教废除”关联的金额字段）。          【JSON字段】assistantAbolishAmount。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.assistantOn IS '【说明】助教编号（工号/序号）。     【示例】27（用于助教编号（工号/序号））。          【JSON字段】assistantOn。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.pdChargeMinutes IS '【说明】“已发生的计费时长（分钟）”，即这次助教服务在被废除前已经累计了多少分钟。     【示例】214（用于“已发生的计费时长（分钟）”，即这次助教服务在被废除前已经累计了多少分钟）。          【JSON字段】pdChargeMinutes。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableAreaId IS '【说明】台桌所在区域 ID。     【示例】2791963816579205（用于台桌所在区域 ID）。          【JSON字段】tableAreaId。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableArea IS '【说明】台桌所属区域名称。     【示例】C区（用于台桌所属区域名称）。          【JSON字段】tableArea。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableId IS '【说明】球台/桌子的 ID。     【示例】2793016660660357（用于球台/桌子的 ID）。          【JSON字段】tableId。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.tableName IS '【说明】台桌名称/编号，供人阅读。     【示例】C1（用于台桌名称/编号，供人阅读）。          【JSON字段】tableName。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.trashReason IS '【说明】用于记录“废除原因”的文本描述，例如“顾客临时有事取消”“录入错误”“更换助教”等。     【示例】NULL（用于记录“废除原因”的文本描述，例如“顾客临时有事取消”“录入错误”“更换助教”等）。          【JSON字段】trashReason。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.createTime IS '【说明】这条“助教废除记录”被创建的时间，即系统正式记录“废除”操作的时刻。     【示例】2025-11-09 19:23:29（用于这条“助教废除记录”被创建的时间，即系统正式记录“废除”操作的时刻）。          【JSON字段】createTime。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】assistant_cancellation_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/assistant_cancellation_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_cancellation_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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,
    birth_date             TIMESTAMP,
    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,
    last_update_name       TEXT,
    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 'ODS 原始明细表：助教档案主数据。来源：export/test-json-doc/assistant_accounts_master.json；分析：assistant_accounts_master-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.id IS '【说明】助教账号主键 ID，在“助教流水.json”中对应 site_assistant_id。     【示例】2947562271297029（用于助教账号主键 ID，在“助教流水.json”中对应 site_assistant_id）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.tenant_id IS '【说明】品牌/租户 ID，对应“非球科技”系统中该商户的唯一标识。     【示例】2790683160709957（用于品牌/租户 ID，对应“非球科技”系统中该商户的唯一标识）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.site_id IS '【说明】门店 ID，对应本次数据的这家球房（朗朗桌球）。     【示例】2790685415443269（用于门店 ID，对应本次数据的这家球房（朗朗桌球））。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_no IS '【说明】助教工号 / 编号，便于业务侧识别。     【示例】31（用于助教工号 / 编号，便于业务侧识别）。          【JSON字段】assistant_no。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.nickname IS '【说明】助教在前台展示的昵称，如“佳怡”“周周”“球球”等。     【示例】小然（用于助教在前台展示的昵称，如“佳怡”“周周”“球球”等）。          【JSON字段】nickname。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.real_name IS '【说明】助教真实姓名，如“何海婷”“梁婷婷”等。     【示例】张静然（用于助教真实姓名，如“何海婷”“梁婷婷”等）。          【JSON字段】real_name。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.mobile IS '【说明】助教手机号，用于登录绑定、通知、钉钉同步等。     【示例】15119679931（助教手机号，用于登录绑定、通知、钉钉同步等）。          【JSON字段】mobile。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.team_id IS '【说明】助教所属团队 ID。     【示例】2792011585884037（用于助教所属团队 ID）。          【JSON字段】team_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.team_name IS '【说明】团队名称，展示用，和 team_id 一一对应。     【示例】1组（用于团队名称，展示用，和 team_id 一一对应）。          【JSON字段】team_name。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.user_id IS '【说明】系统级“用户账号 ID”，通常对应登录账号。     【示例】2947562270838277（用于系统级“用户账号 ID”，通常对应登录账号）。          【JSON字段】user_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.level IS '【说明】10 × 24。     【示例】20（用于10 × 24）。          【JSON字段】level。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_status IS '【说明】1 × 48。     【示例】1（用于1 × 48）。          【JSON字段】assistant_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.work_status IS '【说明】当 leave_status = 0 时，work_status = 1。     【示例】2（用于当 leave_status = 0 时，work_status = 1）。          【JSON字段】work_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.leave_status IS '【说明】0 × 21。     【示例】1（用于0 × 21）。          【JSON字段】leave_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_time IS '【说明】入职时间。     【示例】2025-11-02 08:00:00（用于入职时间）。          【JSON字段】entry_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.resign_time IS '【说明】离职日期。     【示例】2025-11-03 08:00:00（用于离职日期）。          【JSON字段】resign_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.start_time IS '【说明】当前配置生效的开始日期。     【示例】2025-11-01 08:00:00（用于当前配置生效的开始日期）。          【JSON字段】start_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.end_time IS '【说明】当前配置生效的结束日期（例如一个周期性的排班/合同周期）。     【示例】2025-12-01 08:00:00（用于当前配置生效的结束日期（例如一个周期性的排班/合同周期））。          【JSON字段】end_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.create_time IS '【说明】账号创建时间。     【示例】2025-11-02 15:55:26（用于账号创建时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.update_time IS '【说明】账号最近一次被修改的时间（例如修改等级、昵称等）。     【示例】2025-11-03 18:32:07（用于账号最近一次被修改的时间（例如修改等级、昵称等））。          【JSON字段】update_time。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.order_trade_no IS '【说明】该助教最近一次关联的订单号，用于快速跳转或回溯最近服务行为。     【示例】0（该助教最近一次关联的订单号，用于快速跳转或回溯最近服务行为）。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.staff_id IS '【说明】预留给“人事系统员工 ID”的字段，目前未接入或未启用。     【示例】0（用于预留给“人事系统员工 ID”的字段，目前未接入或未启用）。          【JSON字段】staff_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.staff_profile_id IS '【说明】人事档案 ID，与第三方 HR 系统或内部员工档案集成使用，当前未启用。     【示例】0（用于人事档案 ID，与第三方 HR 系统或内部员工档案集成使用，当前未启用）。          【JSON字段】staff_profile_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.system_role_id IS '【说明】标识类 ID 字段，用于关联/定位相关实体。     【示例】10（标识类 ID 字段，用于关联/定位相关实体）。          【JSON字段】system_role_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.avatar IS '【说明】助教头像地址。     【示例】https://oss.ficoo.vip/maUiImages/images/defaultAvatar.png（用于助教头像地址）。          【JSON字段】avatar。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.birth_date IS '【说明】助教出生日期。     【示例】0001-01-01 00:00:00（用于助教出生日期）。          【JSON字段】birth_date。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.gender IS '【说明】0 × 40。     【示例】0（用于0 × 40）。          【JSON字段】gender。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.height IS '【说明】身高（单位：厘米）。     【示例】0.0（用于身高（单位：厘米））。          【JSON字段】height。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.weight IS '【说明】体重（单位：公斤）。     【示例】0.0（用于体重（单位：公斤））。          【JSON字段】weight。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.job_num IS '【说明】备用工号字段，目前未在该门店启用。     【示例】NULL（用于备用工号字段，目前未在该门店启用）。          【JSON字段】job_num。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.show_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】show_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.show_sort IS '【说明】前台展示排序权重，值越小/越大对应不同的排序策略（当前看起来与 assistant_no 有一定对应关系）。     【示例】31（用于前台展示排序权重，值越小/越大对应不同的排序策略（当前看起来与 assistant_no 有一定对应关系））。          【JSON字段】show_sort。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.sum_grade IS '【说明】评分总和，用于计算平均分（assistant_grade = sum_grade / get_grade_times），当前为 0。     【示例】0.0（评分总和，用于计算平均分（assistant_grade = sum_grade / get_grade_times），当前为 0）。          【JSON字段】sum_grade。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.assistant_grade IS '【说明】助教综合评分（员工维度的平均分 snapshot），当前尚未启用评分。     【示例】0.0（用于助教综合评分（员工维度的平均分 snapshot），当前尚未启用评分）。          【JSON字段】assistant_grade。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.get_grade_times IS '【说明】累计被评分次数。     【示例】0（用于累计被评分次数）。          【JSON字段】get_grade_times。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.introduce IS '【说明】个人简介文案，预留给助教自我介绍使用。     【示例】NULL（用于个人简介文案，预留给助教自我介绍使用）。          【JSON字段】introduce。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.video_introduction_url IS '【说明】助教个人视频介绍地址。     【示例】https://oss.ficoo.vip/cbb/userVideo/1753096246308/175309624630830.mp4（用于助教个人视频介绍地址）。          【JSON字段】video_introduction_url。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.group_id IS '【说明】上层“分组 ID”预留字段（例如集团/事业部），本门店未使用。     【示例】0（用于上层“分组 ID”预留字段（例如集团/事业部），本门店未使用）。          【JSON字段】group_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.group_name IS '【说明】group_id 对应的名称，目前为空。     【示例】NULL（用于group_id 对应的名称，目前为空）。          【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 '【说明】2 代表当前门店为“计时收费”，其他值（1、3 等）可能对应按局、按课时等，当前未出现。     【示例】2（用于2 代表当前门店为“计时收费”，其他值（1、3 等）可能对应按局、按课时等，当前未出现）。          【JSON字段】charge_way。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】entry_type。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.allow_cx IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】allow_cx。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_guaranteed IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】1（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_guaranteed。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.salary_grant_enabled IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】2（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】salary_grant_enabled。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.light_status IS '【说明】灯光控制状态，如 1=启用控制、2=不启用 或相反。     【示例】2（用于灯光控制状态，如 1=启用控制、2=不启用 或相反）。          【JSON字段】light_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.online_status IS '【说明】在线状态。     【示例】1（用于在线状态）。          【JSON字段】online_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_delete IS '【说明】逻辑删除标记（0=否，1=是）。。     【示例】0（用于逻辑删除标记（0=否，1=是））。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.cx_unit_price IS '【说明】促销时段的单价，本门店未在账号表层面设置。     【示例】0.0（用于促销时段的单价，本门店未在账号表层面设置）。          【JSON字段】cx_unit_price。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.pd_unit_price IS '【说明】某种标准单价（例如“普通时段单价”），这里未在账号上配置（实际单价在助教商品或套餐配置中）。     【示例】0.0（用于某种标准单价（例如“普通时段单价”），这里未在账号上配置（实际单价在助教商品或套餐配置中））。          【JSON字段】pd_unit_price。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.last_table_id IS '【说明】该助教最近一次服务的球台 ID。     【示例】0（用于该助教最近一次服务的球台 ID）。          【JSON字段】last_table_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.last_table_name IS '【说明】最近服务球台名称（展示用）。     【示例】TV（用于最近服务球台名称（展示用））。          【JSON字段】last_table_name。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.person_org_id IS '【说明】人事组织 ID，通常表示“某某门店-助教部-某小组”等层级组织。     【示例】2947562271215109（用于人事组织 ID，通常表示“某某门店-助教部-某小组”等层级组织）。          【JSON字段】person_org_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.serial_number IS '【说明】系统内部生成的序列号或排序标识，用于全局排序或迁移。     【示例】0（系统内部生成的序列号或排序标识，用于全局排序或迁移）。          【JSON字段】serial_number。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.is_team_leader IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】0（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_team_leader。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.criticism_status IS '【说明】1 × 49。     【示例】1（用于1 × 49）。          【JSON字段】criticism_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.last_update_name IS '【说明】最近修改该账号配置的管理员名称。     【示例】管理员：郑丽珊（用于最近修改该账号配置的管理员名称）。          【JSON字段】last_update_name。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.ding_talk_synced IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】ding_talk_synced。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.site_light_cfg_id IS '【说明】门店灯控配置 ID，本门店未在助教账号维度启用。     【示例】0（用于门店灯控配置 ID，本门店未在助教账号维度启用）。          【JSON字段】site_light_cfg_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.light_equipment_id IS '【说明】灯控设备 ID，如果开启“助教开台自动控制灯”，会通过该字段关联到灯控硬件。     【示例】NULL（用于灯控设备 ID，如果开启“助教开台自动控制灯”，会通过该字段关联到灯控硬件）。          【JSON字段】light_equipment_id。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.entry_sign_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】0（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】entry_sign_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.resign_sign_status IS '【说明】离职协议签署状态，类似上面。     【示例】0（用于离职协议签署状态，类似上面）。          【JSON字段】resign_sign_status。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】assistant_accounts_master.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/assistant_accounts_master.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_accounts_master.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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,
    levelname                TEXT,
    site_assistant_id        BIGINT,
    skill_id                 BIGINT,
    skillname                TEXT,
    system_member_id         BIGINT,
    tablename                TEXT,
    tenant_member_id         BIGINT,
    user_id                  BIGINT,
    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 'ODS 原始明细表：助教服务流水。来源：export/test-json-doc/assistant_service_records.json；分析：assistant_service_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.id IS '【说明】本条助教流水记录的主键 ID（流水唯一标识）。     【示例】2957913441292165（用于本条助教流水记录的主键 ID（流水唯一标识））。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.site_id IS '【说明】门店 ID，本数据中指“朗朗桌球”这一家门店。     【示例】2790685415443269（用于门店 ID，本数据中指“朗朗桌球”这一家门店）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.siteProfile IS '【说明】门店信息快照，包括 id、shop_name、address 等，和其他 JSON 里的 siteProfile 一致。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（用于门店信息快照，包括 id、shop_name、address 等，和其他 JSON 里的 siteProfile 一致）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.site_table_id IS '【说明】球台 ID。     【示例】2793020259897413（用于球台 ID）。          【JSON字段】site_table_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_settle_id IS '【说明】订单结算 ID，相当于“结账单号”的内部主键。     【示例】2957913171693253（用于订单结算 ID，相当于“结账单号”的内部主键）。          【JSON字段】order_settle_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_trade_no IS '【说明】订单交易号，整个订单层面的编号。     【示例】2957784612605829（用于订单交易号，整个订单层面的编号）。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_pay_id IS '【说明】关联到“支付记录”的主键 ID。     【示例】0（用于关联到“支付记录”的主键 ID）。          【JSON字段】order_pay_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_assistant_id IS '【说明】订单中“助教项目明细”的内部 ID。     【示例】2957788717240005（用于订单中“助教项目明细”的内部 ID）。          【JSON字段】order_assistant_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.order_assistant_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】order_assistant_type。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistantName IS '【说明】助教姓名，如“何海婷”“胡敏”等。     【示例】何海婷（用于助教姓名，如“何海婷”“胡敏”等）。          【JSON字段】assistantName。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistantNo IS '【说明】助教编号，例如 "27"。     【示例】27（用于助教编号，例如 "27"）。          【JSON字段】assistantNo。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistant_level IS '【说明】助教等级名称，与 assistant_level 一一对应（初级/中级/高级/助教管理）。     【示例】10（用于助教等级名称，与 assistant_level 一一对应（初级/中级/高级/助教管理））。          【JSON字段】assistant_level。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.levelname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】levelname。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.site_assistant_id IS '【说明】门店维度的助教 ID。     【示例】2946266869435205（用于门店维度的助教 ID）。          【JSON字段】site_assistant_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.skill_id IS '【说明】助教服务“课程/技能”ID。     【示例】2790683529513797（用于助教服务“课程/技能”ID）。          【JSON字段】skill_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.skillname IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】skillname。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.system_member_id IS '【说明】系统级会员 ID（全集团统一 ID）。     【示例】0（用于系统级会员 ID（全集团统一 ID））。          【JSON字段】system_member_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.tablename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】tablename。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.tenant_member_id IS '【说明】商户维度会员 ID（门店/品牌内的会员主键）。     【示例】0（用于商户维度会员 ID（门店/品牌内的会员主键））。          【JSON字段】tenant_member_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.user_id IS '【说明】助教对应的“用户账号 ID”（系统级用户）。     【示例】2946266868976453（用于助教对应的“用户账号 ID”（系统级用户））。          【JSON字段】user_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.assistant_team_id IS '【说明】助教所属团队 ID。     【示例】2792011585884037（用于助教所属团队 ID）。          【JSON字段】assistant_team_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.nickname IS '【说明】助教对外昵称，如“佳怡”“周周”“球球”等。     【示例】泡芙（用于助教对外昵称，如“佳怡”“周周”“球球”等）。          【JSON字段】nickname。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_name IS '【说明】名称字段，用于展示与辅助识别。     【示例】27-泡芙（名称字段，用于展示与辅助识别）。          【JSON字段】ledger_name。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_group_name IS '【说明】助教项目所属的“计费分组/套餐分组名称”，例如某种助教套餐或业务组名称。     【示例】NULL（用于助教项目所属的“计费分组/套餐分组名称”，例如某种助教套餐或业务组名称）。          【JSON字段】ledger_group_name。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_amount IS '【说明】按标准单价计算出来的应收金额（近似 = ledger_unit_price × income_seconds / 3600）。     【示例】206.67（用于按标准单价计算出来的应收金额（近似 = ledger_unit_price × income_seconds / 3600））。          【JSON字段】ledger_amount。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_count IS '【说明】台账记录的计时总秒数。     【示例】7592（用于台账记录的计时总秒数）。          【JSON字段】ledger_count。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_unit_price IS '【说明】助教服务 标准单价（通常是标价：每小时、每节课的单价）。     【示例】98.0（用于助教服务 标准单价（通常是标价：每小时、每节课的单价））。          【JSON字段】ledger_unit_price。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】ledger_status。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_start_time IS '【说明】台账层面记录的开始时间。     【示例】2025-11-09 21:18:18（用于台账层面记录的开始时间）。          【JSON字段】ledger_start_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.ledger_end_time IS '【说明】台账层面的结束时间。     【示例】2025-11-09 23:24:50（用于台账层面的结束时间）。          【JSON字段】ledger_end_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.manual_discount_amount IS '【说明】收银员手动给予的减免金额（人工改价）。     【示例】0.0（用于收银员手动给予的减免金额（人工改价））。          【JSON字段】manual_discount_amount。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.member_discount_amount IS '【说明】由会员卡折扣产生的优惠金额。     【示例】0.0（用于由会员卡折扣产生的优惠金额）。          【JSON字段】member_discount_amount。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.coupon_deduct_money IS '【说明】由“优惠券/代金券/团购券”等 直接抵扣到这条助教服务上的金额。     【示例】0.0（用于由“优惠券/代金券/团购券”等 直接抵扣到这条助教服务上的金额）。          【JSON字段】coupon_deduct_money。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.service_money IS '【说明】用于记录与助教结算的金额（平台预留的“成本/分成”字段）。     【示例】0.0（用于记录与助教结算的金额（平台预留的“成本/分成”字段））。          【JSON字段】service_money。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.projected_income IS '【说明】实际结算计入门店的金额（已经考虑折扣、卡权益、券等后的结果）。     【示例】168.0（用于实际结算计入门店的金额（已经考虑折扣、卡权益、券等后的结果））。          【JSON字段】projected_income。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.real_use_seconds IS '【说明】实际使用时长（秒）。     【示例】7592（用于实际使用时长（秒））。          【JSON字段】real_use_seconds。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.income_seconds IS '【说明】计费秒数 / 应计收入对应的时间。     【示例】7560（用于计费秒数 / 应计收入对应的时间）。          【JSON字段】income_seconds。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.start_use_time IS '【说明】助教实际开始服务时间。     【示例】2025-11-09 21:18:18（用于助教实际开始服务时间）。          【JSON字段】start_use_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.last_use_time IS '【说明】最后一次使用（实际服务）时间。     【示例】2025-11-09 23:24:50（用于最后一次使用（实际服务）时间）。          【JSON字段】last_use_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.create_time IS '【说明】这条助教流水记录创建时间（一般接近结算/下单时间）。     【示例】2025-11-09 23:25:11（用于这条助教流水记录创建时间（一般接近结算/下单时间））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_single_order IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】1（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_single_order。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_trash IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】0（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_trash。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_reason IS '【说明】废除原因（文本说明），例如“顾客取消”“录入错误”等。     【示例】NULL（用于废除原因（文本说明），例如“顾客取消”“录入错误”等）。          【JSON字段】trash_reason。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_applicant_id IS '【说明】提出废除申请的员工 ID（通常是操作员/管理员）。     【示例】0（用于提出废除申请的员工 ID（通常是操作员/管理员））。          【JSON字段】trash_applicant_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.trash_applicant_name IS '【说明】废除申请人姓名。     【示例】NULL（用于废除申请人姓名）。          【JSON字段】trash_applicant_name。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.operator_id IS '【说明】操作员 ID（录入/结算这条助教服务的员工）。     【示例】2790687322443013（用于操作员 ID（录入/结算这条助教服务的员工））。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.operator_name IS '【说明】操作员姓名，与 operator_id 一起使用，便于直接阅读。     【示例】收银员:郑丽珊（用于操作员姓名，与 operator_id 一起使用，便于直接阅读）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_name IS '【说明】关联的“营业员/销售员姓名”，用于提成归属。     【示例】NULL（关联的“营业员/销售员姓名”，用于提成归属）。          【JSON字段】salesman_name。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_org_id IS '【说明】营业员所属组织/部门 ID。     【示例】0（用于营业员所属组织/部门 ID）。          【JSON字段】salesman_org_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.salesman_user_id IS '【说明】营业员用户 ID。     【示例】0（用于营业员用户 ID）。          【JSON字段】salesman_user_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.person_org_id IS '【说明】助教所属“人事组织/部门 ID”。     【示例】2946266869336901（用于助教所属“人事组织/部门 ID”）。          【JSON字段】person_org_id。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.add_clock IS '【说明】加钟秒数，即在原有预约/服务基础上临时追加的时长。     【示例】0（用于加钟秒数，即在原有预约/服务基础上临时追加的时长）。          【JSON字段】add_clock。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.returns_clock IS '【说明】退钟秒数（取消加钟或提前结束退回的时间）。     【示例】0（用于退钟秒数（取消加钟或提前结束退回的时间））。          【JSON字段】returns_clock。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.composite_grade IS '【说明】综合评分（例如技能+服务加权后的平均分），当前数据没有实际评分。     【示例】0.0（用于综合评分（例如技能+服务加权后的平均分），当前数据没有实际评分）。          【JSON字段】composite_grade。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.composite_grade_time IS '【说明】助教服务所在的球台名称（如 "A17"、"S1"）。     【示例】0001-01-01 00:00:00（用于助教服务所在的球台名称（如 "A17"、"S1"））。          【JSON字段】composite_grade_time。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.skill_grade IS '【说明】顾客对“技能表现”的评分（整数或打分等级）。     【示例】0（用于顾客对“技能表现”的评分（整数或打分等级））。          【JSON字段】skill_grade。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.service_grade IS '【说明】顾客对“服务态度”的评分。     【示例】0（用于顾客对“服务态度”的评分）。          【JSON字段】service_grade。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.sum_grade IS '【说明】累计评分总和（可能用于计算平均分），当前为 0。     【示例】0.0（累计评分总和（可能用于计算平均分），当前为 0）。          【JSON字段】sum_grade。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.grade_status IS '【说明】1 = 未评价/正常。     【示例】1（用于1 = 未评价/正常）。          【JSON字段】grade_status。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.get_grade_times IS '【说明】该条记录对应的评价次数（或该助教被评价次数快照）。     【示例】0（用于该条记录对应的评价次数（或该助教被评价次数快照））。          【JSON字段】get_grade_times。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_not_responding IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】0（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_not_responding。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.is_confirm IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】2（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_confirm。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】assistant_service_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/assistant_service_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.assistant_service_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（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 'ODS 原始明细表：门店桌台主数据。来源：export/test-json-doc/site_tables_master.json；分析：site_tables_master-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.site_tables_master.id IS '【说明】台桌主键 ID。     【示例】2791964216463493（用于台桌主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.site_tables_master.site_id IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 ID）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.site_tables_master.siteName IS '【说明】门店名称快照，冗余字段，配合 site_id 使用。     【示例】朗朗桌球（用于门店名称快照，冗余字段，配合 site_id 使用）。          【JSON字段】siteName。';
COMMENT ON COLUMN billiards_ods.site_tables_master.areaName IS '【说明】区域名称，用于前台展示和区域维度管理。     【示例】A区（区域名称，用于前台展示和区域维度管理）。          【JSON字段】areaName。';
COMMENT ON COLUMN billiards_ods.site_tables_master.audit_status IS '【说明】当前值：全部为 2。     【示例】2（用于当前值：全部为 2）。          【JSON字段】audit_status。';
COMMENT ON COLUMN billiards_ods.site_tables_master.charge_free IS '【说明】当前值：全部为 0。     【示例】0（用于当前值：全部为 0）。          【JSON字段】charge_free。';
COMMENT ON COLUMN billiards_ods.site_tables_master.create_time IS '【说明】台桌配置的创建时间或最近一次创建/复制时间。     【示例】2025-07-15 17:52:54（用于台桌配置的创建时间或最近一次创建/复制时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.site_tables_master.delay_lights_time IS '【说明】台灯熄灭延迟时间（单位多半是秒或分钟），用于结账后延时关灯。     【示例】0（台灯熄灭延迟时间（单位多半是秒或分钟），用于结账后延时关灯）。          【JSON字段】delay_lights_time。';
COMMENT ON COLUMN billiards_ods.site_tables_master.is_online_reservation IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】2（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_online_reservation。';
COMMENT ON COLUMN billiards_ods.site_tables_master.is_rest_area IS '【说明】当前值：全部为 0。     【示例】0（用于当前值：全部为 0）。          【JSON字段】is_rest_area。';
COMMENT ON COLUMN billiards_ods.site_tables_master.light_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】2（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】light_status。';
COMMENT ON COLUMN billiards_ods.site_tables_master.only_allow_groupon IS '【说明】小程序二维码 URL。     【示例】2（用于小程序二维码 URL）。          【JSON字段】only_allow_groupon。';
COMMENT ON COLUMN billiards_ods.site_tables_master.order_delay_time IS '【说明】订单层面允许的“自动延时时长”（例如到点后自动延长多少时间继续计费）。     【示例】0（用于订单层面允许的“自动延时时长”（例如到点后自动延长多少时间继续计费））。          【JSON字段】order_delay_time。';
COMMENT ON COLUMN billiards_ods.site_tables_master.self_table IS '【说明】当前值：全部为 1。     【示例】1（用于当前值：全部为 1）。          【JSON字段】self_table。';
COMMENT ON COLUMN billiards_ods.site_tables_master.show_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】show_status。';
COMMENT ON COLUMN billiards_ods.site_tables_master.site_table_area_id IS '【说明】门店维度的“台桌区域 ID”。     【示例】2791963794329671（用于门店维度的“台桌区域 ID”）。          【JSON字段】site_table_area_id。';
COMMENT ON COLUMN billiards_ods.site_tables_master.tableStatusName IS '【说明】table_status 的中文名称，仅为展示用途。     【示例】空闲中（用于table_status 的中文名称，仅为展示用途）。          【JSON字段】tableStatusName。';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_cloth_use_Cycle IS '【说明】台呢使用周期阈值，例如达到某个秒数后提醒更换。     【示例】0（用于台呢使用周期阈值，例如达到某个秒数后提醒更换）。          【JSON字段】table_cloth_use_Cycle。';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_cloth_use_time IS '【说明】时间字段，用于记录业务时间点/发生时间。。     【示例】1863727（时间字段，用于记录业务时间点/发生时间。）。          【JSON字段】table_cloth_use_time。';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_name IS '【说明】台号/台名称，用于前台操作界面展示，也出现在小票和各种流水中的 ledger_name 或 tableName 字段。     【示例】A1（台号/台名称，用于前台操作界面展示，也出现在小票和各种流水中的 ledger_name 或 tableName 字段）。          【JSON字段】table_name。';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_price IS '【说明】设计上应为“台的基础单价”字段（例如按小时或按局单价）。     【示例】0.0（用于设计上应为“台的基础单价”字段（例如按小时或按局单价））。          【JSON字段】table_price。';
COMMENT ON COLUMN billiards_ods.site_tables_master.table_status IS '【说明】台当前运行状态，真实反映某一时刻台的占用/暂停情况。     【示例】1（用于台当前运行状态，真实反映某一时刻台的占用/暂停情况）。          【JSON字段】table_status。';
COMMENT ON COLUMN billiards_ods.site_tables_master.temporary_light_second IS '【说明】临时点灯时长（秒），例如手动临时开灯一段时间。     【示例】0（用于临时点灯时长（秒），例如手动临时开灯一段时间）。          【JSON字段】temporary_light_second。';
COMMENT ON COLUMN billiards_ods.site_tables_master.virtual_table IS '【说明】当前值：全部为 0。     【示例】0（用于当前值：全部为 0）。          【JSON字段】virtual_table。';
COMMENT ON COLUMN billiards_ods.site_tables_master.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】site_tables_master.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.site_tables_master.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/site_tables_master.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.site_tables_master.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.site_tables_master.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：台费折扣记录。来源：export/test-json-doc/table_fee_discount_records.json；分析：table_fee_discount_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.id IS '【说明】台费打折 / 调整流水主键 ID。     【示例】2957913441881989（用于台费打折 / 调整流水主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.site_id IS '【说明】门店 ID，本批数据全部为同一家门店（朗朗桌球）。     【示例】2790685415443269（用于门店 ID，本批数据全部为同一家门店（朗朗桌球））。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.siteProfile IS '【说明】门店信息快照，用于报表时直接读取，无需再联门店档案。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（门店信息快照，用于报表时直接读取，无需再联门店档案）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.site_table_id IS '【说明】台桌 ID。     【示例】2793020259897413（用于台桌 ID）。          【JSON字段】site_table_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tableProfile IS '【说明】折扣发生时，对应台桌的配置信息快照。     【示例】{"id": 2793020259897413, "tenant_id": 2790683160709957, "tenant_name": "", "siteName": "", "table_name": "S1", "site_ta…（用于折扣发生时，对应台桌的配置信息快照）。          【JSON字段】tableProfile。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.tenant_table_area_id IS '【说明】租户维度的“台桌区域 ID”。     【示例】2791961347968901（用于租户维度的“台桌区域 ID”）。          【JSON字段】tenant_table_area_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.adjust_type IS '【说明】文件名是“台费打折”，字段名为“调整类型”，当前所有记录都是 1，即“台费打折/台费减免”这一种调整类型。     【示例】1（用于文件名是“台费打折”，字段名为“调整类型”，当前所有记录都是 1，即“台费打折/台费减免”这一种调整类型）。          【JSON字段】adjust_type。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_amount IS '【说明】金额字段，用于计费/结算/分摊等金额计算。。     【示例】148.15（金额字段，用于计费/结算/分摊等金额计算。）。          【JSON字段】ledger_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_count IS '【说明】这里不是“秒数”，而是“调整次数/条数”的量化，目前固定为 1，表示“一次调账事件”。     【示例】1（用于这里不是“秒数”，而是“调整次数/条数”的量化，目前固定为 1，表示“一次调账事件”）。          【JSON字段】ledger_count。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_name IS '【说明】设计上应该用于记录“调账项目名称”或“打折原因描述”（例如某种优惠规则名称），但当前门店并未使用该字段。     【示例】NULL（设计上应该用于记录“调账项目名称”或“打折原因描述”（例如某种优惠规则名称），但当前门店并未使用该字段）。          【JSON字段】ledger_name。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.ledger_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】ledger_status。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.applicant_id IS '【说明】打折/调账申请人 ID。     【示例】2790687322443013（用于打折/调账申请人 ID）。          【JSON字段】applicant_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.applicant_name IS '【说明】申请人姓名（带角色描述），为 applicant_id 的冗余显示字段。     【示例】收银员:郑丽珊（用于申请人姓名（带角色描述），为 applicant_id 的冗余显示字段）。          【JSON字段】applicant_name。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.operator_id IS '【说明】实际执行调账操作的操作员 ID。     【示例】2790687322443013（用于实际执行调账操作的操作员 ID）。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.operator_name IS '【说明】操作员姓名。     【示例】收银员:郑丽珊（用于操作员姓名）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.order_settle_id IS '【说明】结算单/小票 ID。     【示例】2957913171693253（用于结算单/小票 ID）。          【JSON字段】order_settle_id。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.order_trade_no IS '【说明】订单交易号。     【示例】2957784612605829（用于订单交易号）。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.is_delete IS '【说明】逻辑删除标记（0=否，1=是）。。     【示例】0（用于逻辑删除标记（0=否，1=是））。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.create_time IS '【说明】台费调整记录的创建时间，即打折操作被执行的时间戳。     【示例】2025-11-09 23:25:11（用于台费调整记录的创建时间，即打折操作被执行的时间戳）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】table_fee_discount_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/table_fee_discount_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.table_fee_discount_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：台费流水。来源：export/test-json-doc/table_fee_transactions.json；分析：table_fee_transactions-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.id IS '【说明】台费流水记录主键（事实表主键）。     【示例】2957924029058885（用于台费流水记录主键（事实表主键））。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_id IS '【说明】门店 ID，本次数据全部来自同一门店（朗朗桌球）。     【示例】2790685415443269（用于门店 ID，本次数据全部来自同一门店（朗朗桌球））。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.siteProfile IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_id IS '【说明】球台 ID。     【示例】2793003705192517（用于球台 ID）。          【JSON字段】site_table_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_area_id IS '【说明】门店内“台桌区域” ID（站在门店物理布局的角度）。     【示例】2791963794329671（用于门店内“台桌区域” ID（站在门店物理布局的角度））。          【JSON字段】site_table_area_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.site_table_area_name IS '【说明】台桌区域的名称，用于门店表现和区域统计。     【示例】A区（台桌区域的名称，用于门店表现和区域统计）。          【JSON字段】site_table_area_name。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.tenant_table_area_id IS '【说明】租户维度的台桌区域 ID（品牌层面的同一类区域）。     【示例】2791960001957765（用于租户维度的台桌区域 ID（品牌层面的同一类区域））。          【JSON字段】tenant_table_area_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_trade_no IS '【说明】订单交易号，是整笔订单的主编号。     【示例】2957858167230149（用于订单交易号，是整笔订单的主编号）。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_pay_id IS '【说明】订单支付记录 ID。     【示例】0（用于订单支付记录 ID）。          【JSON字段】order_pay_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.order_settle_id IS '【说明】结算单号/结账 ID，对应一次结账操作。     【示例】2957922914357125（用于结算单号/结账 ID，对应一次结账操作）。          【JSON字段】order_settle_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_name IS '【说明】台号名称，实际展示给员工/顾客看的桌台编号。     【示例】A17（用于台号名称，实际展示给员工/顾客看的桌台编号）。          【JSON字段】ledger_name。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_amount IS '【说明】按单价与计费时长计算出的原始应收台费金额。     【示例】48.0（用于按单价与计费时长计算出的原始应收台费金额）。          【JSON字段】ledger_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_count IS '【说明】台账记录的计费秒数，计费用秒数（应收时长）。     【示例】3600（用于台账记录的计费秒数，计费用秒数（应收时长））。          【JSON字段】ledger_count。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_unit_price IS '【说明】台费结算时设置的 每小时单价/计费单价。     【示例】48.0（用于台费结算时设置的 每小时单价/计费单价）。          【JSON字段】ledger_unit_price。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】ledger_status。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_start_time IS '【说明】台账上的计费起始时间。     【示例】2025-11-09 22:28:57（用于台账上的计费起始时间）。          【JSON字段】ledger_start_time。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.ledger_end_time IS '【说明】台账上的计费结束时间。     【示例】2025-11-09 23:28:57（用于台账上的计费结束时间）。          【JSON字段】ledger_end_time。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.start_use_time IS '【说明】台开始使用的时间（实际开台时间）。     【示例】2025-11-09 22:28:57（用于台开始使用的时间（实际开台时间））。          【JSON字段】start_use_time。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.last_use_time IS '【说明】最后使用/操作时间。     【示例】2025-11-09 23:28:57（用于最后使用/操作时间）。          【JSON字段】last_use_time。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.real_table_use_seconds IS '【说明】实际使用的总秒数（系统真实统计的使用时长）。     【示例】3600（用于实际使用的总秒数（系统真实统计的使用时长））。          【JSON字段】real_table_use_seconds。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.real_table_charge_money IS '【说明】台费中实际向顾客收取的金额（现金/实付维度，未含券方承担或内部调账的那一部分）。     【示例】0.0（用于台费中实际向顾客收取的金额（现金/实付维度，未含券方承担或内部调账的那一部分））。          【JSON字段】real_table_charge_money。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.add_clock_seconds IS '【说明】加钟秒数，在原有使用基础上追加的时长。     【示例】0（用于加钟秒数，在原有使用基础上追加的时长）。          【JSON字段】add_clock_seconds。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.adjust_amount IS '【说明】调整金额/调账金额，用于将台费金额转移或冲减到其它项目，或手工调整。     【示例】0.0（调整金额/调账金额，用于将台费金额转移或冲减到其它项目，或手工调整）。          【JSON字段】adjust_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.coupon_promotion_amount IS '【说明】由优惠券/活动/团购（平台/门店促销）承担的优惠金额，直接抵扣在台费上。     【示例】48.0（用于由优惠券/活动/团购（平台/门店促销）承担的优惠金额，直接抵扣在台费上）。          【JSON字段】coupon_promotion_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.member_discount_amount IS '【说明】由会员权益产生的优惠金额，例如会员折扣、会员价等。     【示例】0.0（用于由会员权益产生的优惠金额，例如会员折扣、会员价等）。          【JSON字段】member_discount_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.used_card_amount IS '【说明】由储值卡、次卡等“卡内余额”抵扣的金额。     【示例】0.0（用于由储值卡、次卡等“卡内余额”抵扣的金额）。          【JSON字段】used_card_amount。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.mgmt_fee IS '【说明】管理费字段，用于未来支持“台费附加管理费/服务费”的功能。     【示例】0.0（管理费字段，用于未来支持“台费附加管理费/服务费”的功能）。          【JSON字段】mgmt_fee。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.service_money IS '【说明】门店用于记录“服务费/成本/分成金额”的字段，类似助教流水里的 service_money。     【示例】0.0（门店用于记录“服务费/成本/分成金额”的字段，类似助教流水里的 service_money）。          【JSON字段】service_money。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.fee_total IS '【说明】各种附加费用（如管理费、服务费）合计值。     【示例】0.0（用于各种附加费用（如管理费、服务费）合计值）。          【JSON字段】fee_total。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.is_single_order IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】1（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_single_order。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.is_delete IS '【说明】逻辑删除标记（0=否，1=是）。。     【示例】0（用于逻辑删除标记（0=否，1=是））。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.member_id IS '【说明】门店/租户内的会员 ID。     【示例】0（用于门店/租户内的会员 ID）。          【JSON字段】member_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.operator_id IS '【说明】操作员 ID，负责开台/结账的员工账号 ID。     【示例】2790687322443013（用于操作员 ID，负责开台/结账的员工账号 ID）。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.operator_name IS '【说明】操作员姓名（冗余字段），便于直接阅读，不必再联表员工档案。     【示例】收银员:郑丽珊（用于操作员姓名（冗余字段），便于直接阅读，不必再联表员工档案）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_name IS '【说明】业务员/营业员姓名，如果台费有单独提成员工，这里记录归属人。     【示例】NULL（用于业务员/营业员姓名，如果台费有单独提成员工，这里记录归属人）。          【JSON字段】salesman_name。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_org_id IS '【说明】营业员所属机构/部门 ID。     【示例】0（用于营业员所属机构/部门 ID）。          【JSON字段】salesman_org_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.salesman_user_id IS '【说明】营业员的用户 ID（与 salesman_name 搭配）。     【示例】0（用于营业员的用户 ID（与 salesman_name 搭配））。          【JSON字段】salesman_user_id。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.create_time IS '【说明】这条台费流水记录的创建时间，通常接近结账时间。     【示例】2025-11-09 23:35:57（用于这条台费流水记录的创建时间，通常接近结账时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】table_fee_transactions.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/table_fee_transactions.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.table_fee_transactions.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（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 'ODS 原始明细表：商品库存变动流水。来源：export/test-json-doc/goods_stock_movements.json；分析：goods_stock_movements-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteGoodsStockId IS '【说明】门店某个“商品库存记录”的主键 ID。     【示例】2957911857581957（用于门店某个“商品库存记录”的主键 ID）。          【JSON字段】siteGoodsStockId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.tenantId IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenantId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteId IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 ID）。          【JSON字段】siteId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.siteGoodsId IS '【说明】门店维度的商品 ID。     【示例】2793026183532613（用于门店维度的商品 ID）。          【JSON字段】siteGoodsId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsName IS '【说明】商品名称。     【示例】阿萨姆（用于商品名称）。          【JSON字段】goodsName。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsCategoryId IS '【说明】商品一级分类 ID。     【示例】2790683528350539（用于商品一级分类 ID）。          【JSON字段】goodsCategoryId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.goodsSecondCategoryId IS '【说明】商品二级分类 ID。     【示例】2790683528350540（用于商品二级分类 ID）。          【JSON字段】goodsSecondCategoryId。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.unit IS '【说明】库存计量单位。     【示例】瓶（用于库存计量单位）。          【JSON字段】unit。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.price IS '【说明】商品单价（单位金额）。     【示例】8.0（用于商品单价（单位金额））。          【JSON字段】price。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.stockType IS '【说明】1：89 条。     【示例】1（用于1：89 条）。          【JSON字段】stockType。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.changeNum IS '【说明】本次库存数量变化值。     【示例】-1（用于本次库存数量变化值）。          【JSON字段】changeNum。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.startNum IS '【说明】变动前（这次出入库之前）的库存数量。     【示例】28（用于变动前（这次出入库之前）的库存数量）。          【JSON字段】startNum。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.endNum IS '【说明】变动后（出入库之后）的库存数量。     【示例】27（用于变动后（出入库之后）的库存数量）。          【JSON字段】endNum。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.changeNumA IS '【说明】辅助单位的变化量（与 changeNum 对应的第二计量单位变化），当前未使用。     【示例】0（用于辅助单位的变化量（与 changeNum 对应的第二计量单位变化），当前未使用）。          【JSON字段】changeNumA。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.startNumA IS '【说明】辅助计量单位的起始库存（例如件/箱等第二单位）。     【示例】0（用于辅助计量单位的起始库存（例如件/箱等第二单位））。          【JSON字段】startNumA。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.endNumA IS '【说明】辅助单位的变动后库存，同样未启用。     【示例】0（用于辅助单位的变动后库存，同样未启用）。          【JSON字段】endNumA。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.remark IS '【说明】备注信息，用于手工记录本次变更的特殊原因说明（例如“盘点差异调整”“报损”）。     【示例】NULL（备注信息，用于手工记录本次变更的特殊原因说明（例如“盘点差异调整”“报损”））。          【JSON字段】remark。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.operatorName IS '【说明】执行此次库存变动的操作人。     【示例】收银员:郑丽珊（用于执行此次库存变动的操作人）。          【JSON字段】operatorName。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.createTime IS '【说明】这条库存变动记录的创建时间，即发生库存变更的时间点。     【示例】2025-11-09 23:23:34（用于这条库存变动记录的创建时间，即发生库存变更的时间点）。          【JSON字段】createTime。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】goods_stock_movements.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/goods_stock_movements.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_movements.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：商品分类树。来源：export/test-json-doc/stock_goods_category_tree.json；分析：stock_goods_category_tree-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.id IS '【说明】分类节点主键 ID（在商品分类维度中的唯一标识）。     【示例】2790683528350533（用于分类节点主键 ID（在商品分类维度中的唯一标识））。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.tenant_id IS '【说明】租户 ID（品牌/商户 ID）。     【示例】2790683160709957（用于租户 ID（品牌/商户 ID））。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.category_name IS '【说明】分类名称（实际业务分类名称）。     【示例】槟榔（用于分类名称（实际业务分类名称））。          【JSON字段】category_name。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.alias_name IS '【说明】名称字段，用于展示与辅助识别。。     【示例】NULL（名称字段，用于展示与辅助识别。）。          【JSON字段】alias_name。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.pid IS '【说明】父级分类 ID。     【示例】0（用于父级分类 ID）。          【JSON字段】pid。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.business_name IS '【说明】业务大类名称。     【示例】槟榔（用于业务大类名称）。          【JSON字段】business_name。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.tenant_goods_business_id IS '【说明】业务大类 ID。     【示例】2790683528317766（用于业务大类 ID）。          【JSON字段】tenant_goods_business_id。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.open_salesman IS '【说明】是否启用“营业员”或“导购提成”相关的功能开关。     【示例】2（用于是否启用“营业员”或“导购提成”相关的功能开关）。          【JSON字段】open_salesman。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.categoryBoxes IS '【说明】子分类数组。     【示例】[{"id": 2790683528350534, "tenant_id": 2790683160709957, "category_name": "槟榔", "alias_name": "", "pid": 27906835283505…（用于子分类数组）。          【JSON字段】categoryBoxes。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.sort IS '【说明】分类的排序序号，用于前端展示顺序的控制。     【示例】1（分类的排序序号，用于前端展示顺序的控制）。          【JSON字段】sort。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.is_warehousing IS '【说明】本文件可视为“所有参与库存管理的商品分类清单”，因此均为 1。     【示例】1（用于本文件可视为“所有参与库存管理的商品分类清单”，因此均为 1）。          【JSON字段】is_warehousing。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】stock_goods_category_tree.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/stock_goods_category_tree.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.stock_goods_category_tree.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：商品库存汇总。来源：export/test-json-doc/goods_stock_summary.json；分析：goods_stock_summary-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.siteGoodsId IS '【说明】门店商品 ID，本库存汇总表的主键，对应某个具体商品在本店的唯一标识。     【示例】2791953867886725（用于门店商品 ID，本库存汇总表的主键，对应某个具体商品在本店的唯一标识）。          【JSON字段】siteGoodsId。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsName IS '【说明】商品名称，冗余于门店商品档案的 goods_name。     【示例】东方树叶（用于商品名称，冗余于门店商品档案的 goods_name）。          【JSON字段】goodsName。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsUnit IS '【说明】商品的计量单位（售卖单位）。     【示例】瓶（用于商品的计量单位（售卖单位））。          【JSON字段】goodsUnit。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsCategoryId IS '【说明】一级商品分类 ID。     【示例】2790683528350539（用于一级商品分类 ID）。          【JSON字段】goodsCategoryId。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.goodsCategorySecondId IS '【说明】二级（次级）商品分类 ID，是 goodsCategoryId 的下级分类。     【示例】2790683528350540（用于二级（次级）商品分类 ID，是 goodsCategoryId 的下级分类）。          【JSON字段】goodsCategorySecondId。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.categoryName IS '【说明】一级分类名称，属于冗余字段，用于直接展示。     【示例】酒水（一级分类名称，属于冗余字段，用于直接展示）。          【JSON字段】categoryName。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeStartStock IS '【说明】查询区间 起始时刻 的库存数量（期初库存）。     【示例】165（用于查询区间 起始时刻 的库存数量（期初库存））。          【JSON字段】rangeStartStock。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeEndStock IS '【说明】查询区间 结束时刻 的库存数量（期末库存）。     【示例】118（用于查询区间 结束时刻 的库存数量（期末库存））。          【JSON字段】rangeEndStock。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeIn IS '【说明】查询区间内的 入库数量汇总（正值），包括采购入库、调拨入库等。     【示例】450（用于查询区间内的 入库数量汇总（正值），包括采购入库、调拨入库等）。          【JSON字段】rangeIn。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeOut IS '【说明】查询区间内的 出库数量汇总，以 负数 表示从库存扣减（出库/销售）。     【示例】-497（用于查询区间内的 出库数量汇总，以 负数 表示从库存扣减（出库/销售））。          【JSON字段】rangeOut。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeSale IS '【说明】查询区间内，该商品的 销售数量汇总（售出多少“包/瓶/份”等）。     【示例】488（用于查询区间内，该商品的 销售数量汇总（售出多少“包/瓶/份”等））。          【JSON字段】rangeSale。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeSaleMoney IS '【说明】查询区间内，该商品销售的 金额小计（按商品维度汇总）。     【示例】3904.0（用于查询区间内，该商品销售的 金额小计（按商品维度汇总））。          【JSON字段】rangeSaleMoney。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.rangeInventory IS '【说明】查询区间内的 盘点调整净变动量（盘盈–盘亏）。     【示例】0（用于查询区间内的 盘点调整净变动量（盘盈–盘亏））。          【JSON字段】rangeInventory。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.currentStock IS '【说明】导出时刻的实时库存数量。     【示例】118（用于导出时刻的实时库存数量）。          【JSON字段】currentStock。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】goods_stock_summary.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/goods_stock_summary.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.goods_stock_summary.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：支付流水。来源：export/test-json-doc/payment_transactions.json；分析：payment_transactions-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.payment_transactions.id IS '【说明】支付流水记录的主键 ID。     【示例】2957924026486597（用于支付流水记录的主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.payment_transactions.site_id IS '【说明】支付记录所属的门店 ID。     【示例】2790685415443269（用于支付记录所属的门店 ID）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.payment_transactions.siteProfile IS '【说明】门店信息快照，与其他 JSON 中的 siteProfile 结构一致。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（用于门店信息快照，与其他 JSON 中的 siteProfile 结构一致）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.payment_transactions.relate_type IS '【说明】表示“这条支付记录关联的业务类型”。     【示例】2（用于表示“这条支付记录关联的业务类型”）。          【JSON字段】relate_type。';
COMMENT ON COLUMN billiards_ods.payment_transactions.relate_id IS '【说明】关联业务记录的主键 ID（按 relate_type 不同指向不同表）。     【示例】2957922914357125（用于关联业务记录的主键 ID（按 relate_type 不同指向不同表））。          【JSON字段】relate_id。';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_amount IS '【说明】本条支付流水的“支付金额”，单位为元。     【示例】10.0（用于本条支付流水的“支付金额”，单位为元）。          【JSON字段】pay_amount。';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_status IS '【说明】支付状态枚举字段。     【示例】2（用于支付状态枚举字段）。          【JSON字段】pay_status。';
COMMENT ON COLUMN billiards_ods.payment_transactions.pay_time IS '【说明】实际支付完成时间（支付状态变为成功的时间戳）。     【示例】2025-11-09 23:35:57（用于实际支付完成时间（支付状态变为成功的时间戳））。          【JSON字段】pay_time。';
COMMENT ON COLUMN billiards_ods.payment_transactions.create_time IS '【说明】支付记录创建时间，通常与发起支付请求的时间一致（创建支付流水的时间戳）。     【示例】2025-11-09 23:35:57（用于支付记录创建时间，通常与发起支付请求的时间一致（创建支付流水的时间戳））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.payment_transactions.payment_method IS '【说明】支付方式枚举，例如微信、支付宝、现金、银行卡、储值卡等某一种。     【示例】4（用于支付方式枚举，例如微信、支付宝、现金、银行卡、储值卡等某一种）。          【JSON字段】payment_method。';
COMMENT ON COLUMN billiards_ods.payment_transactions.online_pay_channel IS '【说明】每一笔结账单（settleList.id）对应一条支付记录（当前样本中是一条记录，relate_id 唯一）。     【示例】0（用于每一笔结账单（settleList.id）对应一条支付记录（当前样本中是一条记录，relate_id 唯一））。          【JSON字段】online_pay_channel。';
COMMENT ON COLUMN billiards_ods.payment_transactions.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】payment_transactions.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.payment_transactions.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/payment_transactions.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.payment_transactions.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.payment_transactions.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：退款流水。来源：export/test-json-doc/refund_transactions.json；分析：refund_transactions-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.refund_transactions.id IS '【说明】本条 退款流水 的唯一 ID。     【示例】2955202296416389（用于本条 退款流水 的唯一 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.tenant_id IS '【说明】租户/品牌 ID，全系统维度标识该商户。     【示例】2790683160709957（用于租户/品牌 ID，全系统维度标识该商户）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.tenantName IS '【说明】租户（商户）名称。     【示例】朗朗桌球（用于租户（商户）名称）。          【JSON字段】tenantName。';
COMMENT ON COLUMN billiards_ods.refund_transactions.site_id IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 ID）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.siteProfile IS '【说明】门店信息快照，结构与其他 JSON 中的 siteProfile 完全一致。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（用于门店信息快照，结构与其他 JSON 中的 siteProfile 完全一致）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.refund_transactions.relate_type IS '【说明】本退款对应的“业务类型”。     【示例】5（用于本退款对应的“业务类型”）。          【JSON字段】relate_type。';
COMMENT ON COLUMN billiards_ods.refund_transactions.relate_id IS '【说明】本次退款关联的业务 ID。     【示例】2955078219057349（用于本次退款关联的业务 ID）。          【JSON字段】relate_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_sn IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】0（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】pay_sn。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_amount IS '【说明】本次退款的 资金变动金额。     【示例】-5000.0（用于本次退款的 资金变动金额）。          【JSON字段】pay_amount。';
COMMENT ON COLUMN billiards_ods.refund_transactions.refund_amount IS '【说明】设计上本应显示“实际退款金额”（正数），与 pay_amount 配合使用。     【示例】0.0（用于设计上本应显示“实际退款金额”（正数），与 pay_amount 配合使用）。          【JSON字段】refund_amount。';
COMMENT ON COLUMN billiards_ods.refund_transactions.round_amount IS '【说明】舍入金额/抹零金额。     【示例】0.0（用于舍入金额/抹零金额）。          【JSON字段】round_amount。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_status IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】2（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】pay_status。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_time IS '【说明】退款在支付渠道层面实际发生的时间。     【示例】2025-11-08 01:27:16（用于退款在支付渠道层面实际发生的时间）。          【JSON字段】pay_time。';
COMMENT ON COLUMN billiards_ods.refund_transactions.create_time IS '【说明】本条退款流水在系统内创建时间。     【示例】2025-11-08 01:27:16（用于本条退款流水在系统内创建时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.refund_transactions.payment_method IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】4（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】payment_method。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_terminal IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】pay_terminal。';
COMMENT ON COLUMN billiards_ods.refund_transactions.pay_config_id IS '【说明】支付配置 ID，例如商户在“非球科技”内配置的某一条支付通道（某个微信商户号、银联通道）的主键。     【示例】0（用于支付配置 ID，例如商户在“非球科技”内配置的某一条支付通道（某个微信商户号、银联通道）的主键）。          【JSON字段】pay_config_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.online_pay_channel IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】0（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】online_pay_channel。';
COMMENT ON COLUMN billiards_ods.refund_transactions.online_pay_type IS '【说明】当前：全部 0。     【示例】0（用于当前：全部 0）。          【JSON字段】online_pay_type。';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_fee IS '【说明】第三方支付渠道对本次退款收取的手续费。     【示例】0.0（用于第三方支付渠道对本次退款收取的手续费）。          【JSON字段】channel_fee。';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_payer_id IS '【说明】支付渠道侧的 payer ID，例如微信 openid、银行卡号掩码等。     【示例】NULL（用于支付渠道侧的 payer ID，例如微信 openid、银行卡号掩码等）。          【JSON字段】channel_payer_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.channel_pay_no IS '【说明】第三方支付平台的交易号（如微信支付单号、支付宝交易号等）。     【示例】NULL（用于第三方支付平台的交易号（如微信支付单号、支付宝交易号等））。          【JSON字段】channel_pay_no。';
COMMENT ON COLUMN billiards_ods.refund_transactions.member_id IS '【说明】租户内部的会员 ID（对应会员档案中的某个主键）。     【示例】0（用于租户内部的会员 ID（对应会员档案中的某个主键））。          【JSON字段】member_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.member_card_id IS '【说明】关联的会员卡账户 ID（对应“储值卡列表”或“会员档案”中的某一张卡）。     【示例】0（用于关联的会员卡账户 ID（对应“储值卡列表”或“会员档案”中的某一张卡））。          【JSON字段】member_card_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.cashier_point_id IS '【说明】收银点 ID，例如前台 1、前台 2、自助机等。     【示例】0（用于收银点 ID，例如前台 1、前台 2、自助机等）。          【JSON字段】cashier_point_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.operator_id IS '【说明】执行该退款操作的操作员 ID。     【示例】0（用于执行该退款操作的操作员 ID）。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.refund_transactions.action_type IS '【说明】当前：全部 2。     【示例】2（用于当前：全部 2）。          【JSON字段】action_type。';
COMMENT ON COLUMN billiards_ods.refund_transactions.check_status IS '【说明】当前：全部 1。     【示例】1（用于当前：全部 1）。          【JSON字段】check_status。';
COMMENT ON COLUMN billiards_ods.refund_transactions.is_revoke IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】0（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】is_revoke。';
COMMENT ON COLUMN billiards_ods.refund_transactions.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.refund_transactions.balance_frozen_amount IS '【说明】涉及会员储值卡退款时，暂时冻结的余额金额。     【示例】0.0（用于涉及会员储值卡退款时，暂时冻结的余额金额）。          【JSON字段】balance_frozen_amount。';
COMMENT ON COLUMN billiards_ods.refund_transactions.card_frozen_amount IS '【说明】与上一个类似，偏向“某张卡的被冻结金额”，也与会员卡/储值账户相关。     【示例】0.0（用于与上一个类似，偏向“某张卡的被冻结金额”，也与会员卡/储值账户相关）。          【JSON字段】card_frozen_amount。';
COMMENT ON COLUMN billiards_ods.refund_transactions.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】refund_transactions.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/refund_transactions.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.refund_transactions.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：平台券核销/使用记录。来源：export/test-json-doc/platform_coupon_redemption_records.json；分析：platform_coupon_redemption_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.id IS '【说明】本条平台验券记录在本系统内的主键 ID。     【示例】2957929042218501（用于本条平台验券记录在本系统内的主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.verify_id IS '【说明】平台核销记录 ID（某些平台会为每一次核销生成一个唯一 ID）。     【示例】7570689090418149418（用于平台核销记录 ID（某些平台会为每一次核销生成一个唯一 ID））。          【JSON字段】verify_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.certificate_id IS '【说明】平台侧的凭证 ID（通常由第三方团购平台生成的券实例 ID）。     【示例】5008024789379597447（用于平台侧的凭证 ID（通常由第三方团购平台生成的券实例 ID））。          【JSON字段】certificate_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_code IS '【说明】券码，顾客出示的团购券密码/编号。     【示例】0102701209726（用于券码，顾客出示的团购券密码/编号）。          【JSON字段】coupon_code。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_name IS '【说明】团购券产品名称（即第三方平台上向顾客展示的名称）。     【示例】【全天可用】中八桌球一小时（A区）（用于团购券产品名称（即第三方平台上向顾客展示的名称））。          【JSON字段】coupon_name。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_channel IS '【说明】券来源渠道（第三方平台渠道编号）。     【示例】1（用于券来源渠道（第三方平台渠道编号））。          【JSON字段】coupon_channel。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.groupon_type IS '【说明】团购券类型。     【示例】1（用于团购券类型）。          【JSON字段】groupon_type。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.group_package_id IS '【说明】标识类 ID 字段，用于关联/定位相关实体。。     【示例】0（标识类 ID 字段，用于关联/定位相关实体。）。          【JSON字段】group_package_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.sale_price IS '【说明】顾客在第三方平台上实际支付的价格（团购售价）。     【示例】29.9（用于顾客在第三方平台上实际支付的价格（团购售价））。          【JSON字段】sale_price。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_money IS '【说明】券面值 / 套餐价值（系统层面的“可抵扣金额或对应套餐价值”）。     【示例】48.0（用于券面值 / 套餐价值（系统层面的“可抵扣金额或对应套餐价值”））。          【JSON字段】coupon_money。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_free_time IS '【说明】券附带的“免费时长”字段（例如送多少分钟台费）。     【示例】0（用于券附带的“免费时长”字段（例如送多少分钟台费））。          【JSON字段】coupon_free_time。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_cover IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】coupon_cover。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.coupon_remark IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】617547ec-9697-4f58-a700-b30a49e88904||CgYIASAHKAESLgos9ZhHDryhHb0z3RpdBZ0dVoaQbkldBcx/XTXPV8Te+9SEqYOa7aDp8nbKOpsaAA==（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】coupon_remark。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.use_status IS '【说明】值 1：198 条。     【示例】1（用于值 1：198 条）。          【JSON字段】use_status。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.consume_time IS '【说明】券被核销/使用的业务时间。     【示例】2025-11-09 23:41:04（用于券被核销/使用的业务时间）。          【JSON字段】consume_time。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.create_time IS '【说明】验券记录在本系统中创建的时间（记录入库时间）。     【示例】2025-11-09 23:41:03（用于验券记录在本系统中创建的时间（记录入库时间））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.deal_id IS '【说明】另一个层次的团购产品 ID。     【示例】1345108507（用于另一个层次的团购产品 ID）。          【JSON字段】deal_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.channel_deal_id IS '【说明】渠道侧 dealId / 产品 ID，一般是第三方平台给该团购商品定义的主键。     【示例】1128411555（用于渠道侧 dealId / 产品 ID，一般是第三方平台给该团购商品定义的主键）。          【JSON字段】channel_deal_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.site_id IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 ID）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.site_order_id IS '【说明】门店内部的订单 ID（平台券核销时对应的店内订单）。     【示例】2957929043037702（用于门店内部的订单 ID（平台券核销时对应的店内订单））。          【JSON字段】site_order_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.table_id IS '【说明】使用券的球台 ID。     【示例】2793001904918661（用于使用券的球台 ID）。          【JSON字段】table_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.tenant_id IS '【说明】商户/租户 ID（品牌级别）。     【示例】2790683160709957（用于商户/租户 ID（品牌级别））。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.operator_id IS '【说明】操作员 ID（执行验券操作的收银员/员工）。     【示例】2790687322443013（用于操作员 ID（执行验券操作的收银员/员工））。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.operator_name IS '【说明】操作员姓名，例如 "收银员:郑丽珊"。     【示例】收银员:郑丽珊（用于操作员姓名，例如 "收银员:郑丽珊"）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.is_delete IS '【说明】把平台验券记录挂到本门店的一条订单上。     【示例】0（用于把平台验券记录挂到本门店的一条订单上）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.siteProfile IS '【说明】门店信息快照。     【示例】{"id": 2790685415443269, "org_id": 2790684179467077, "shop_name": "朗朗桌球", "avatar": "https://oss.ficoo.vip/admin/hXcE4E…（用于门店信息快照）。          【JSON字段】siteProfile。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】platform_coupon_redemption_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/platform_coupon_redemption_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.platform_coupon_redemption_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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,
      out_goods_id            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 'ODS 原始明细表：租户商品主数据。来源：export/test-json-doc/tenant_goods_master.json；分析：tenant_goods_master-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.id IS '【说明】商品档案主键 ID，唯一标识一条商品。     【示例】2791925230096261（用于商品档案主键 ID，唯一标识一条商品）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
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 '【说明】商品条码（EAN 等），目前未维护。     【示例】NULL（用于商品条码（EAN 等），目前未维护）。          【JSON字段】goods_bar_code。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_category_id IS '【说明】商品一级分类 ID。     【示例】2790683528350539（用于商品一级分类 ID）。          【JSON字段】goods_category_id。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_second_category_id IS '【说明】商品二级分类 ID。     【示例】2790683528350540（用于商品二级分类 ID）。          【JSON字段】goods_second_category_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。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_number IS '【说明】商品内部编码（自定义货号/系统货号）。     【示例】1（用于商品内部编码（自定义货号/系统货号））。          【JSON字段】goods_number。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.out_goods_id IS '【说明】外部系统商品 ID（对接第三方平台使用，如外卖、线上商城等）。     【示例】0（用于外部系统商品 ID（对接第三方平台使用，如外卖、线上商城等））。          【JSON字段】out_goods_id。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_state IS '【说明】商品状态（上架/下架等）。     【示例】1（用于商品状态（上架/下架等））。          【JSON字段】goods_state。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.sale_channel IS '【说明】销售渠道类型，如“门店堂食/线下零售/线上小程序”等的一种编码。     【示例】1（用于销售渠道类型，如“门店堂食/线下零售/线上小程序”等的一种编码）。          【JSON字段】sale_channel。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.able_discount IS '【说明】是否允许参与折扣/打折。     【示例】1（用于是否允许参与折扣/打折）。          【JSON字段】able_discount。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.able_site_transfer IS '【说明】布尔/开关字段，用于表示权限、可用性或状态开关。。     【示例】2（布尔/开关字段，用于表示权限、可用性或状态开关。）。          【JSON字段】able_site_transfer。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.is_warehousing IS '【说明】是否启用库存管理。     【示例】1（用于是否启用库存管理）。          【JSON字段】is_warehousing。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.isInSite IS '【说明】是否在当前门店启用/上架。     【示例】false（用于是否在当前门店启用/上架）。          【JSON字段】isInSite。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.cost_price IS '【说明】成本价格。     【示例】0.0（用于成本价格）。          【JSON字段】cost_price。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.cost_price_type IS '【说明】金额字段，用于计费/结算/分摊等金额计算。。     【示例】1（金额字段，用于计费/结算/分摊等金额计算。）。          【JSON字段】cost_price_type。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.market_price IS '【说明】商品标价 / 售价（标准销售单价）。     【示例】8.0（用于商品标价 / 售价（标准销售单价））。          【JSON字段】market_price。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.min_discount_price IS '【说明】该商品允许售卖的最低价格（底价）。     【示例】0.0（用于该商品允许售卖的最低价格（底价））。          【JSON字段】min_discount_price。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.common_sale_royalty IS '【说明】普通销售提成比例或提成金额的配置字段。     【示例】0（用于普通销售提成比例或提成金额的配置字段）。          【JSON字段】common_sale_royalty。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.point_sale_royalty IS '【说明】积分销售提成/积分赠送规则相关配置。     【示例】0（用于积分销售提成/积分赠送规则相关配置）。          【JSON字段】point_sale_royalty。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.pinyin_initial IS '【说明】拼音首字母/助记码。     【示例】DFSY,DFSX（用于拼音首字母/助记码）。          【JSON字段】pinyin_initial。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.commodityCode IS '【说明】与 commodity_code 是同一信息的数组形式（冗余存储），便于支持一个商品对应多个编码的场景。     【示例】["10000028"]（用于与 commodity_code 是同一信息的数组形式（冗余存储），便于支持一个商品对应多个编码的场景）。          【JSON字段】commodityCode。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.commodity_code IS '【说明】商品编码（通常为对外商品编码或条码）。     【示例】10000028（用于商品编码（通常为对外商品编码或条码））。          【JSON字段】commodity_code。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.goods_cover IS '【说明】商品封面图片 URL 地址。     【示例】https://oss.ficoo.vip/admin/ZwS8fj_1753175129443.jpg（用于商品封面图片 URL 地址）。          【JSON字段】goods_cover。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.supplier_id IS '【说明】供应商 ID，用于关联到供应商档案。     【示例】0（供应商 ID，用于关联到供应商档案）。          【JSON字段】supplier_id。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.remark_name IS '【说明】商品备注名/别名，通常用来配置简写或特殊显示名称。     【示例】NULL（用于商品备注名/别名，通常用来配置简写或特殊显示名称）。          【JSON字段】remark_name。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.create_time IS '【说明】商品档案创建时间。     【示例】2025-07-15 17:13:15（用于商品档案创建时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.update_time IS '【说明】商品档案最近一次修改时间。     【示例】2025-10-29 23:51:38（用于商品档案最近一次修改时间）。          【JSON字段】update_time。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】tenant_goods_master.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/tenant_goods_master.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.tenant_goods_master.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（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 'ODS 原始明细表：团购套餐主数据。来源：export/test-json-doc/group_buy_packages.json；分析：group_buy_packages-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.id IS '【说明】门店侧套餐 ID，本文件内部的主键。     【示例】2939215004469573（用于门店侧套餐 ID，本文件内部的主键）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.package_id IS '【说明】“上层套餐 ID” 或“总部/系统级套餐 ID”。     【示例】1814707240811572（用于“上层套餐 ID” 或“总部/系统级套餐 ID”）。          【JSON字段】package_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 '【说明】语义上应该是“团购售卖价”（顾客在平台购买券时的成交价格）。     【示例】0.0（用于语义上应该是“团购售卖价”（顾客在平台购买券时的成交价格））。          【JSON字段】selling_price。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.coupon_money IS '【说明】券面值或内部结算面值，表示该套餐在门店侧对应的金额额度。     【示例】0.0（用于券面值或内部结算面值，表示该套餐在门店侧对应的金额额度）。          【JSON字段】coupon_money。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.date_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】date_type。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.date_info IS '【说明】预留字段，通常用来存储更细粒度的日期信息，如具体日期列表、节假日特殊规则（可能是 JSON 字符串或编码）。     【示例】0（用于预留字段，通常用来存储更细粒度的日期信息，如具体日期列表、节假日特殊规则（可能是 JSON 字符串或编码））。          【JSON字段】date_info。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.start_time IS '【说明】套餐开始生效的日期时间。     【示例】2025-10-27 00:00:00（用于套餐开始生效的日期时间）。          【JSON字段】start_time。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.end_time IS '【说明】套餐失效的日期时间（到这个时间点后不可使用）。     【示例】2026-10-28 00:00:00（用于套餐失效的日期时间（到这个时间点后不可使用））。          【JSON字段】end_time。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.start_clock IS '【说明】每日可用起始时间点（第一段）。     【示例】00:00:00（用于每日可用起始时间点（第一段））。          【JSON字段】start_clock。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.end_clock IS '【说明】每日可用的结束时间点（第一段）。     【示例】1.00:00:00（用于每日可用的结束时间点（第一段））。          【JSON字段】end_clock。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.add_start_clock IS '【说明】附加可用时间段的起始时间（第二段）。     【示例】00:00:00（用于附加可用时间段的起始时间（第二段））。          【JSON字段】add_start_clock。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.add_end_clock IS '【说明】附加时段结束时间，多数情况配合 "00:00:00" 或 "10:00:00" 使用。     【示例】1.00:00:00（用于附加时段结束时间，多数情况配合 "00:00:00" 或 "10:00:00" 使用）。          【JSON字段】add_end_clock。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.duration IS '【说明】套餐内包含的时长（秒）。     【示例】3600（用于套餐内包含的时长（秒））。          【JSON字段】duration。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.usable_count IS '【说明】可使用次数上限。     【示例】9999999（用于可使用次数上限）。          【JSON字段】usable_count。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.usable_range IS '【说明】一般用于文字描述可用日期范围（例如“周一至周五”）。     【示例】NULL（一般用于文字描述可用日期范围（例如“周一至周五”））。          【JSON字段】usable_range。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_id IS '【说明】原始设计应为“单一台区 ID”，当套餐只限一个区域可以用这个字段存储。     【示例】0（用于原始设计应为“单一台区 ID”，当套餐只限一个区域可以用这个字段存储）。          【JSON字段】table_area_id。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_name IS '【说明】套餐适用的“门店台区名称”，用于显示和筛选。     【示例】A区（套餐适用的“门店台区名称”，用于显示和筛选）。          【JSON字段】table_area_name。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.table_area_id_list IS '【说明】用来存放具体台区 ID 列表（例如 "1,2,3"），实现更细粒度的台桌限制。     【示例】NULL（用于用来存放具体台区 ID 列表（例如 "1,2,3"），实现更细粒度的台桌限制）。          【JSON字段】table_area_id_list。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.tenant_table_area_id IS '【说明】与 table_area_id 类似，是租户层级的台区 ID，原本用于单区选择。     【示例】0（与 table_area_id 类似，是租户层级的台区 ID，原本用于单区选择）。          【JSON字段】tenant_table_area_id。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.tenant_table_area_id_list IS '【说明】实际代表“台区集合 ID”或“租户台区配置 ID”，用来限制套餐可用的台区范围。     【示例】2791960001957765（用于实际代表“台区集合 ID”或“租户台区配置 ID”，用来限制套餐可用的台区范围）。          【JSON字段】tenant_table_area_id_list。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.site_id IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 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 '【说明】租户 ID（品牌/商户 ID）。     【示例】2790683160709957（用于租户 ID（品牌/商户 ID））。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.card_type_ids IS '【说明】原意是“适用会员卡类型 ID 列表”，例如某套餐只允许某几种会员卡使用，可以在此配置。     【示例】0（用于原意是“适用会员卡类型 ID 列表”，例如某套餐只允许某几种会员卡使用，可以在此配置）。          【JSON字段】card_type_ids。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.group_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】group_type。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.system_group_type IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】system_group_type。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.type IS '【说明】内部业务子类型，具体含义需要结合系统文档。     【示例】2（用于内部业务子类型，具体含义需要结合系统文档）。          【JSON字段】type。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.effective_status IS '【说明】1：13 条。     【示例】1（用于1：13 条）。          【JSON字段】effective_status。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.is_enabled IS '【说明】启用状态。     【示例】1（用于启用状态）。          【JSON字段】is_enabled。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.max_selectable_categories IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】0（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】max_selectable_categories。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.area_tag_type IS '【说明】1 很可能代表“按台区标签限制”，例如 A区、中八区、包厢、KTV 等。     【示例】1（用于1 很可能代表“按台区标签限制”，例如 A区、中八区、包厢、KTV 等）。          【JSON字段】area_tag_type。';
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 '【说明】该套餐在系统中创建的时间。     【示例】2025-10-27 18:24:09（用于该套餐在系统中创建的时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】group_buy_packages.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/group_buy_packages.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.group_buy_packages.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【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 'ODS 原始明细表：团购核销记录。来源：export/test-json-doc/group_buy_redemption_records.json；分析：group_buy_redemption_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.id IS '【说明】本条“团购套餐流水”记录的 主键 ID。     【示例】2957924029615941（用于本条“团购套餐流水”记录的 主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.site_id IS '【说明】门店 ID，与其它 JSON 中一致。     【示例】2790685415443269（用于门店 ID，与其它 JSON 中一致）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.siteName IS '【说明】门店名称，冗余展示用。     【示例】朗朗桌球（用于门店名称，冗余展示用）。          【JSON字段】siteName。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_id IS '【说明】球台 ID。     【示例】2793003705192517（用于球台 ID）。          【JSON字段】table_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tableName IS '【说明】本次使用券所关联的 球台名称/台号。     【示例】A17（用于本次使用券所关联的 球台名称/台号）。          【JSON字段】tableName。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tableAreaName IS '【说明】该球台所属的 台区名称。     【示例】A区（用于该球台所属的 台区名称）。          【JSON字段】tableAreaName。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.tenant_table_area_id IS '【说明】租户级台区分组 ID，表示当前使用券的台桌所属的区域组合。     【示例】2791960001957765（用于租户级台区分组 ID，表示当前使用券的台桌所属的区域组合）。          【JSON字段】tenant_table_area_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_trade_no IS '【说明】订单交易号，和其它消费明细（台费、商品、助教、团购）共用的订单主键。     【示例】2957858167230149（用于订单交易号，和其它消费明细（台费、商品、助教、团购）共用的订单主键）。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_settle_id IS '【说明】结算单 ID（小票结账主键）。     【示例】2957922914357125（用于结算单 ID（小票结账主键））。          【JSON字段】order_settle_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_pay_id IS '【说明】指向支付记录表中的支付流水 ID。     【示例】0（用于指向支付记录表中的支付流水 ID）。          【JSON字段】order_pay_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_coupon_id IS '【说明】订单中“券使用记录”的 ID。     【示例】2957858168229573（用于订单中“券使用记录”的 ID）。          【JSON字段】order_coupon_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.order_coupon_channel IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】order_coupon_channel。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_code IS '【说明】团购券券码，核销时扫描/录入的字符串。     【示例】0107892475999（用于团购券券码，核销时扫描/录入的字符串）。          【JSON字段】coupon_code。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_money IS '【说明】本次核销时，这张券在门店侧对应的金额额度（“可抵扣金额”）。     【示例】48.0（用于本次核销时，这张券在门店侧对应的金额额度（“可抵扣金额”））。          【JSON字段】coupon_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.coupon_origin_id IS '【说明】平台/上游系统中的券记录主键 ID，“券来源 ID”。     【示例】2957858168229573（用于平台/上游系统中的券记录主键 ID，“券来源 ID”）。          【JSON字段】coupon_origin_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_name IS '【说明】台费侧关联的“团购项目名称”（记账名）。     【示例】全天A区中八一小时（用于台费侧关联的“团购项目名称”（记账名））。          【JSON字段】ledger_name。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_group_name IS '【说明】团购项目所属的“记账分组名称”（例如“团购台费”“团购包厢”等）。     【示例】NULL（用于团购项目所属的“记账分组名称”（例如“团购台费”“团购包厢”等））。          【JSON字段】ledger_group_name。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_amount IS '【说明】本次券实际冲抵台费的金额。     【示例】48.0（用于本次券实际冲抵台费的金额）。          【JSON字段】ledger_amount。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_count IS '【说明】按此次优惠实际计算的“核销秒数”。     【示例】3600（用于按此次优惠实际计算的“核销秒数”）。          【JSON字段】ledger_count。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_unit_price IS '【说明】对应台费的标准单价，单位元/小时（从数值来看是类似29.9/小时这种定价）。     【示例】29.9（用于对应台费的标准单价，单位元/小时（从数值来看是类似29.9/小时这种定价））。          【JSON字段】ledger_unit_price。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.ledger_status IS '【说明】流水状态。     【示例】1（用于流水状态）。          【JSON字段】ledger_status。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_charge_seconds IS '【说明】本次结算中该球台总计计费的秒数（整台的台费计费时间）。     【示例】3600（用于本次结算中该球台总计计费的秒数（整台的台费计费时间））。          【JSON字段】table_charge_seconds。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_activity_id IS '【说明】团购/促销活动 ID。     【示例】2957858166460101（用于团购/促销活动 ID）。          【JSON字段】promotion_activity_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_coupon_id IS '【说明】团购套餐定义 ID。     【示例】2798727423528005（用于团购套餐定义 ID）。          【JSON字段】promotion_coupon_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.promotion_seconds IS '【说明】团购套餐定义的“标准时长”（券本身标称的可用时长）。     【示例】3600（用于团购套餐定义的“标准时长”（券本身标称的可用时长））。          【JSON字段】promotion_seconds。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.offer_type IS '【说明】优惠类型。     【示例】1（用于优惠类型）。          【JSON字段】offer_type。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.assistant_promotion_money IS '【说明】分摊到“助教服务”的促销金额。     【示例】0.0（用于分摊到“助教服务”的促销金额）。          【JSON字段】assistant_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.assistant_service_promotion_money IS '【说明】进一步细分助教服务的促销金额。     【示例】0.0（用于进一步细分助教服务的促销金额）。          【JSON字段】assistant_service_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.table_service_promotion_money IS '【说明】本次券使用中，分摊到“台费服务费”部分的促销金额。     【示例】0.0（用于本次券使用中，分摊到“台费服务费”部分的促销金额）。          【JSON字段】table_service_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.goods_promotion_money IS '【说明】本次券使用中，分摊到“商品”部分的促销金额。     【示例】0.0（用于本次券使用中，分摊到“商品”部分的促销金额）。          【JSON字段】goods_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.recharge_promotion_money IS '【说明】来自“充值类优惠”的分摊金额（例如储值赠送部分）。     【示例】0.0（用于来自“充值类优惠”的分摊金额（例如储值赠送部分））。          【JSON字段】recharge_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.reward_promotion_money IS '【说明】本次促销中，属于“奖励金/积分抵扣”的金额。     【示例】0.0（用于本次促销中，属于“奖励金/积分抵扣”的金额）。          【JSON字段】reward_promotion_money。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.goodsOptionPrice IS '【说明】商品规格价格，用于商品类促销分摊时使用。     【示例】0.0（商品规格价格，用于商品类促销分摊时使用）。          【JSON字段】goodsOptionPrice。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_name IS '【说明】营业员姓名。     【示例】NULL（用于营业员姓名）。          【JSON字段】salesman_name。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.sales_man_org_id IS '【说明】营业员所属组织 ID。     【示例】0（用于营业员所属组织 ID）。          【JSON字段】sales_man_org_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_role_id IS '【说明】营业员角色 ID。     【示例】0（用于营业员角色 ID）。          【JSON字段】salesman_role_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.salesman_user_id IS '【说明】营业员/业务员用户 ID。     【示例】0（用于营业员/业务员用户 ID）。          【JSON字段】salesman_user_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.operator_id IS '【说明】执行本次核销/结算操作的 操作员 ID。     【示例】2790687322443013（用于执行本次核销/结算操作的 操作员 ID）。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.operator_name IS '【说明】操作员名称（包含角色说明），与 operator_id 对应的冗余展示字段。     【示例】收银员:郑丽珊（用于操作员名称（包含角色说明），与 operator_id 对应的冗余展示字段）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.is_single_order IS '【说明】是否单独作为一条订单行。     【示例】1（用于是否单独作为一条订单行）。          【JSON字段】is_single_order。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.is_delete IS '【说明】逻辑删除标记（0=否，1=是）。。     【示例】0（用于逻辑删除标记（0=否，1=是））。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.create_time IS '【说明】本条团购套餐使用流水创建时间（即券核销时间，或与结账时间接近）。     【示例】2025-11-09 23:35:57（用于本条团购套餐使用流水创建时间（即券核销时间，或与结账时间接近））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】group_buy_redemption_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/group_buy_redemption_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.group_buy_redemption_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（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 'ODS 原始明细表：结算小票明细。来源：export/test-json-doc/settlement_ticket_details.json；分析：settlement_ticket_details-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderSettleId IS '【说明】结算单 ID（和顶层字段相同，再次冗余）。     【示例】2957922914357125（用于结算单 ID（和顶层字段相同，再次冗余））。          【JSON字段】orderSettleId。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.actualPayment IS '【说明】本单实际支付金额总和（顾客本次实际付出：现金 + 线上 + 会员余额等）。     【示例】NULL（用于本单实际支付金额总和（顾客本次实际付出：现金 + 线上 + 会员余额等））。          【JSON字段】actualPayment。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.adjustAmount IS '【说明】人工调价/整单调整金额（例如手工改价、折扣调整），是所有类型的手工调整合计。     【示例】NULL（用于人工调价/整单调整金额（例如手工改价、折扣调整），是所有类型的手工调整合计）。          【JSON字段】adjustAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.assistantManualDiscount IS '【说明】针对“助教项目”的人工减免金额汇总（整单维度）。     【示例】NULL（用于针对“助教项目”的人工减免金额汇总（整单维度））。          【JSON字段】assistantManualDiscount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.balanceAmount IS '【说明】本单通过“会员余额/储值卡”支付的金额（从余额中扣除的总额）。     【示例】NULL（用于本单通过“会员余额/储值卡”支付的金额（从余额中扣除的总额））。          【JSON字段】balanceAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.cashierName IS '【说明】本单结算操作员名称（带角色前缀文字）。     【示例】NULL（用于本单结算操作员名称（带角色前缀文字））。          【JSON字段】cashierName。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.consumeMoney IS '【说明】本单“消费金额总计”（原价层面），即台费 + 商品 + 助教 + 服务等消费项目的金额总和（未扣除各类优惠）。     【示例】NULL（用于本单“消费金额总计”（原价层面），即台费 + 商品 + 助教 + 服务等消费项目的金额总和（未扣除各类优惠））。          【JSON字段】consumeMoney。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.couponAmount IS '【说明】本单由优惠券抵扣的金额汇总。     【示例】NULL（用于本单由优惠券抵扣的金额汇总）。          【JSON字段】couponAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.deliveryAddress IS '【说明】配送地址（若存在外送业务时使用）。     【示例】NULL（用于配送地址（若存在外送业务时使用））。          【JSON字段】deliveryAddress。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.deliveryFee IS '【说明】配送费金额（如果支持外送业务）。     【示例】NULL（用于配送费金额（如果支持外送业务））。          【JSON字段】deliveryFee。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ledgerAmount IS '【说明】商品小计金额（通常 = 单价 × 数量，未考虑其他折扣）。     【示例】NULL（用于商品小计金额（通常 = 单价 × 数量，未考虑其他折扣））。          【JSON字段】ledgerAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberDeductAmount IS '【说明】会员抵扣的某种数量或金额（例如积分抵现金额、次卡次数抵扣等），当前数据未启用。     【示例】NULL（用于会员抵扣的某种数量或金额（例如积分抵现金额、次卡次数抵扣等），当前数据未启用）。          【JSON字段】memberDeductAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberOfferAmount IS '【说明】由“会员权益/折扣”产生的优惠金额总计（整单维度）。     【示例】NULL（用于由“会员权益/折扣”产生的优惠金额总计（整单维度））。          【JSON字段】memberOfferAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.onlineReturnAmount IS '【说明】本单通过线上支付渠道退回的金额（如微信/支付宝退款）。     【示例】NULL（用于本单通过线上支付渠道退回的金额（如微信/支付宝退款））。          【JSON字段】onlineReturnAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderRemark IS '【说明】订单备注，由收银员录入，用于记录与本单相关的特殊说明。     【示例】NULL（订单备注，由收银员录入，用于记录与本单相关的特殊说明）。          【JSON字段】orderRemark。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderSettleNumber IS '【说明】结算单编号（与 ID 独立的一套编号体系，如流水号）。     【示例】NULL（用于结算单编号（与 ID 独立的一套编号体系，如流水号））。          【JSON字段】orderSettleNumber。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payMemberBalance IS '【说明】使用会员余额支付的金额，用于区分与 balanceAmount 的不同维度（如“本次支付使用余额部分”与“余额本身变化”等），当前未实际使用。     【示例】NULL（使用会员余额支付的金额，用于区分与 balanceAmount 的不同维度（如“本次支付使用余额部分”与“余额本身变化”等），当前未实际使用）。          【JSON字段】payMemberBalance。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payTime IS '【说明】本单最终支付成功时间。     【示例】NULL（用于本单最终支付成功时间）。          【JSON字段】payTime。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.paymentMethod IS '【说明】结算主支付方式编码（汇总视角）。     【示例】NULL（用于结算主支付方式编码（汇总视角））。          【JSON字段】paymentMethod。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.pointDiscountCost IS '【说明】积分抵扣对应的成本金额（成本侧）。     【示例】NULL（用于积分抵扣对应的成本金额（成本侧））。          【JSON字段】pointDiscountCost。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.pointDiscountPrice IS '【说明】积分抵扣对应的金额（售价侧）。     【示例】NULL（用于积分抵扣对应的金额（售价侧））。          【JSON字段】pointDiscountPrice。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.prepayMoney IS '【说明】预付金/定金在本单中使用的金额。     【示例】NULL（用于预付金/定金在本单中使用的金额）。          【JSON字段】prepayMoney。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.refundAmount IS '【说明】本单涉及的退款金额（汇总）。     【示例】NULL（用于本单涉及的退款金额（汇总））。          【JSON字段】refundAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.returnGoodsAmount IS '【说明】本单涉及的退货金额汇总。     【示例】NULL（用于本单涉及的退货金额汇总）。          【JSON字段】returnGoodsAmount。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.rewardName IS '【说明】用于标识本单适用的激励方案名称，可能用于内部绩效或活动名称展示。     【示例】NULL（用于标识本单适用的激励方案名称，可能用于内部绩效或活动名称展示）。          【JSON字段】rewardName。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.settleType IS '【说明】结算类型字符串标识。     【示例】NULL（用于结算类型字符串标识）。          【JSON字段】settleType。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteAddress IS '【说明】门店地址（详细地址）。     【示例】NULL（用于门店地址（详细地址））。          【JSON字段】siteAddress。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteBusinessTel IS '【说明】门店电话。     【示例】NULL（用于门店电话）。          【JSON字段】siteBusinessTel。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteId IS '【说明】门店 ID。     【示例】NULL（用于门店 ID）。          【JSON字段】siteId。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.siteName IS '【说明】门店名称，如“朗朗桌球”。     【示例】NULL（用于门店名称，如“朗朗桌球”）。          【JSON字段】siteName。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantId IS '【说明】租户 / 商户 ID（品牌维度）。     【示例】NULL（用于租户 / 商户 ID（品牌维度））。          【JSON字段】tenantId。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantName IS '【说明】租户名称，如“朗朗桌球”。     【示例】NULL（用于租户名称，如“朗朗桌球”）。          【JSON字段】tenantName。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ticketCustomContent IS '【说明】自定义小票内容，如商家自定义宣传语、条款等。     【示例】NULL（用于自定义小票内容，如商家自定义宣传语、条款等）。          【JSON字段】ticketCustomContent。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.ticketRemark IS '【说明】小票备注内容，可用于打印在小票底部或顶部（例如活动说明、特别提示）。     【示例】NULL（小票备注内容，可用于打印在小票底部或顶部（例如活动说明、特别提示））。          【JSON字段】ticketRemark。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.voucherMoney IS '【说明】代金券类金额字段（可能用于某类“代金券余额”或“券面值”记录）。     【示例】NULL（代金券类金额字段（可能用于某类“代金券余额”或“券面值”记录））。          【JSON字段】voucherMoney。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.memberProfile IS '【说明】不是会员卡主键，而是本次结账时的会员信息快照。     【示例】NULL（用于不是会员卡主键，而是本次结账时的会员信息快照）。          【JSON字段】memberProfile。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.orderItem IS '【说明】本次结算对应的“订单明细列表”，这部分是连接“台费流水 / 商品出库 / 券使用”等多个子领域的关键结构。     【示例】NULL（用于本次结算对应的“订单明细列表”，这部分是连接“台费流水 / 商品出库 / 券使用”等多个子领域的关键结构）。          【JSON字段】orderItem。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.tenantMemberCardLogs IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】tenantMemberCardLogs。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】settlement_ticket_details.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/settlement_ticket_details.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.settlement_ticket_details.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（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),
      batch_stock_quantity NUMERIC(18,2),
      days_available      INT,
      provisional_total_cost NUMERIC(18,2),
      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,
    sort                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 'ODS 原始明细表：门店商品主数据。来源：export/test-json-doc/store_goods_master.json；分析：store_goods_master-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.store_goods_master.id IS '【说明】门店商品 ID，门店维度的商品主键。     【示例】2793025851560005（用于门店商品 ID，门店维度的商品主键）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.store_goods_master.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.store_goods_master.site_id IS '【说明】门店 ID。     【示例】2790685415443269（用于门店 ID）。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.store_goods_master.siteName IS '【说明】门店名称，是对 site_id 的冗余展示，方便直接阅读，无需再去关联门店档案。     【示例】朗朗桌球（用于门店名称，是对 site_id 的冗余展示，方便直接阅读，无需再去关联门店档案）。          【JSON字段】siteName。';
COMMENT ON COLUMN billiards_ods.store_goods_master.tenant_goods_id IS '【说明】租户/品牌维度的商品 ID，相当于“全局商品 ID”。     【示例】2792178593255301（用于租户/品牌维度的商品 ID，相当于“全局商品 ID”）。          【JSON字段】tenant_goods_id。';
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 '【说明】商品条形码（如 EAN-13 编码），用于扫码销售。     【示例】NULL（商品条形码（如 EAN-13 编码），用于扫码销售）。          【JSON字段】goods_bar_code。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_category_id IS '【说明】商品一级分类 ID。     【示例】2791941988405125（用于商品一级分类 ID）。          【JSON字段】goods_category_id。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_second_category_id IS '【说明】商品二级分类 ID。     【示例】2793236829620037（用于商品二级分类 ID）。          【JSON字段】goods_second_category_id。';
COMMENT ON COLUMN billiards_ods.store_goods_master.oneCategoryName IS '【说明】一级分类名称，如“零食”“酒水”“服务费”等。     【示例】零食（用于一级分类名称，如“零食”“酒水”“服务费”等）。          【JSON字段】oneCategoryName。';
COMMENT ON COLUMN billiards_ods.store_goods_master.twoCategoryName IS '【说明】二级分类名称，如“面”“洋酒”“纸巾”等。     【示例】面（用于二级分类名称，如“面”“洋酒”“纸巾”等）。          【JSON字段】twoCategoryName。';
COMMENT ON COLUMN billiards_ods.store_goods_master.unit IS '【说明】商品计量单位（销售单位）。     【示例】桶（用于商品计量单位（销售单位））。          【JSON字段】unit。';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_price IS '【说明】商品标准销售价（挂牌价），单位为元。     【示例】12.0（用于商品标准销售价（挂牌价），单位为元）。          【JSON字段】sale_price。';
COMMENT ON COLUMN billiards_ods.store_goods_master.cost_price IS '【说明】商品成本价（单件成本）。     【示例】0.0（用于商品成本价（单件成本））。          【JSON字段】cost_price。';
COMMENT ON COLUMN billiards_ods.store_goods_master.cost_price_type IS '【说明】1 代表使用“固定成本价”（手工维护的 cost_price），provisional_total_cost 按“数量 × cost_price”算。     【示例】1（用于1 代表使用“固定成本价”（手工维护的 cost_price），provisional_total_cost 按“数量 × cost_price”算）。          【JSON字段】cost_price_type。';
COMMENT ON COLUMN billiards_ods.store_goods_master.min_discount_price IS '【说明】最低允许成交价（限价）。     【示例】7.0（用于最低允许成交价（限价））。          【JSON字段】min_discount_price。';
COMMENT ON COLUMN billiards_ods.store_goods_master.safe_stock IS '【说明】安全库存量（阈值），低于该值时系统可以提示补货。     【示例】0（用于安全库存量（阈值），低于该值时系统可以提示补货）。          【JSON字段】safe_stock。';
COMMENT ON COLUMN billiards_ods.store_goods_master.stock IS '【说明】当前可用库存数量（以 unit 为单位）。     【示例】18（用于当前可用库存数量（以 unit 为单位））。          【JSON字段】stock。';
COMMENT ON COLUMN billiards_ods.store_goods_master.stock_A IS '【说明】副单位库存数量。     【示例】0（用于副单位库存数量）。          【JSON字段】stock_A。';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_num IS '【说明】在当前统计口径下的销售数量（总销量，单位同 unit）。     【示例】104（用于在当前统计口径下的销售数量（总销量，单位同 unit））。          【JSON字段】sale_num。';
COMMENT ON COLUMN billiards_ods.store_goods_master.total_purchase_cost IS '【说明】总采购成本，单位为元。     【示例】0.0（用于总采购成本，单位为元）。          【JSON字段】total_purchase_cost。';
COMMENT ON COLUMN billiards_ods.store_goods_master.total_sales IS '【说明】累计销售数量。     【示例】104（用于累计销售数量）。          【JSON字段】total_sales。';
COMMENT ON COLUMN billiards_ods.store_goods_master.average_monthly_sales IS '【说明】平均月销量（件/月），根据某个统计周期内的销售数据折算而来。     【示例】1.32（用于平均月销量（件/月），根据某个统计周期内的销售数据折算而来）。          【JSON字段】average_monthly_sales。';
COMMENT ON COLUMN billiards_ods.store_goods_master.batch_stock_quantity IS '【说明】当前“批次”的库存数量（主单位）。     【示例】43（用于当前“批次”的库存数量（主单位））。          【JSON字段】batch_stock_quantity。';
COMMENT ON COLUMN billiards_ods.store_goods_master.days_available IS '【说明】商品“在架天数”或“可售天数”，大致等于当前时间减去首次上架时间。     【示例】13（用于商品“在架天数”或“可售天数”，大致等于当前时间减去首次上架时间）。          【JSON字段】days_available。';
COMMENT ON COLUMN billiards_ods.store_goods_master.provisional_total_cost IS '【说明】暂估总成本，单位为元。     【示例】0.0（用于暂估总成本，单位为元）。          【JSON字段】provisional_total_cost。';
COMMENT ON COLUMN billiards_ods.store_goods_master.enable_status IS '【说明】控制商品档案是否参与任何业务（库存、销售等）。     【示例】1（用于控制商品档案是否参与任何业务（库存、销售等））。          【JSON字段】enable_status。';
COMMENT ON COLUMN billiards_ods.store_goods_master.audit_status IS '【说明】观察值：全部为 2。     【示例】2（用于观察值：全部为 2）。          【JSON字段】audit_status。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_state IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】1（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】goods_state。';
COMMENT ON COLUMN billiards_ods.store_goods_master.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
COMMENT ON COLUMN billiards_ods.store_goods_master.is_warehousing IS '【说明】是否纳入库存管理。     【示例】1（用于是否纳入库存管理）。          【JSON字段】is_warehousing。';
COMMENT ON COLUMN billiards_ods.store_goods_master.able_discount IS '【说明】是否允许参与折扣。     【示例】1（用于是否允许参与折扣）。          【JSON字段】able_discount。';
COMMENT ON COLUMN billiards_ods.store_goods_master.able_site_transfer IS '【说明】表示是否允许跨门店调拨或跨站点共享库存。     【示例】2（用于表示是否允许跨门店调拨或跨站点共享库存）。          【JSON字段】able_site_transfer。';
COMMENT ON COLUMN billiards_ods.store_goods_master.forbid_sell_status IS '【说明】观察值：全部为 1。     【示例】1（用于观察值：全部为 1）。          【JSON字段】forbid_sell_status。';
COMMENT ON COLUMN billiards_ods.store_goods_master.send_state IS '【说明】观察值：全部为 1。     【示例】1（用于观察值：全部为 1）。          【JSON字段】send_state。';
COMMENT ON COLUMN billiards_ods.store_goods_master.custom_label_type IS '【说明】自定义标签类型。     【示例】2（用于自定义标签类型）。          【JSON字段】custom_label_type。';
COMMENT ON COLUMN billiards_ods.store_goods_master.option_required IS '【说明】是否需要在销售时选择规格/选项。     【示例】1（用于是否需要在销售时选择规格/选项）。          【JSON字段】option_required。';
COMMENT ON COLUMN billiards_ods.store_goods_master.sale_channel IS '【说明】销售渠道类型。     【示例】1（用于销售渠道类型）。          【JSON字段】sale_channel。';
COMMENT ON COLUMN billiards_ods.store_goods_master.sort IS '【说明】排序权重，用于前端商品列表展示时的排版顺序，数值越小/越大哪个优先，具体规则看系统设定（一般是数值越小排序越靠前）。     【示例】100（排序权重，用于前端商品列表展示时的排版顺序，数值越小/越大哪个优先，具体规则看系统设定（一般是数值越小排序越靠前））。          【JSON字段】sort。';
COMMENT ON COLUMN billiards_ods.store_goods_master.remark IS '【说明】商品备注（可以写口味说明、供应商、注意事项等）。     【示例】NULL（用于商品备注（可以写口味说明、供应商、注意事项等））。          【JSON字段】remark。';
COMMENT ON COLUMN billiards_ods.store_goods_master.pinyin_initial IS '【说明】商品名称的拼音首字母缩写，有时多个别名用逗号分隔。     【示例】HWDPM,GWDPM（用于商品名称的拼音首字母缩写，有时多个别名用逗号分隔）。          【JSON字段】pinyin_initial。';
COMMENT ON COLUMN billiards_ods.store_goods_master.goods_cover IS '【说明】商品图片 URL（如 OSS 对象存储地址），用于前端展示商品图片。     【示例】https://oss.ficoo.vip/admin/8M1WM7_1753204221337.jpg（商品图片 URL（如 OSS 对象存储地址），用于前端展示商品图片）。          【JSON字段】goods_cover。';
COMMENT ON COLUMN billiards_ods.store_goods_master.create_time IS '【说明】门店商品档案创建时间（商品在门店建立档案的时间点）。     【示例】2025-07-16 11:52:51（用于门店商品档案创建时间（商品在门店建立档案的时间点））。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.store_goods_master.update_time IS '【说明】最后一次修改该商品档案的时间（包括价格调整、状态变更等）。     【示例】2025-11-09 07:23:47（用于最后一次修改该商品档案的时间（包括价格调整、状态变更等））。          【JSON字段】update_time。';
COMMENT ON COLUMN billiards_ods.store_goods_master.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】store_goods_master.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/store_goods_master.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.store_goods_master.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';


CREATE TABLE IF NOT EXISTS billiards_ods.store_goods_sales_records (
      id                         BIGINT PRIMARY KEY,
      tenant_id                  BIGINT,
      site_id                    BIGINT,
      siteid                     BIGINT,
      sitename                   TEXT,
      site_goods_id              BIGINT,
      tenant_goods_id            BIGINT,
      order_settle_id            BIGINT,
      order_trade_no             TEXT,
      order_goods_id             BIGINT,
      ordergoodsid               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),
      discount_price             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,
      returns_number             INT,
      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 'ODS 原始明细表：门店商品销售流水。来源：export/test-json-doc/store_goods_sales_records.json；分析：store_goods_sales_records-Analysis.md。字段以导出原样为主；ETL 补充 source_file/source_endpoint/fetched_at，并保留 payload 为原始记录快照。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.id IS '【说明】本条「门店销售流水」记录的主键 ID。     【示例】2957924029550406（用于本条「门店销售流水」记录的主键 ID）。          【JSON字段】id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_id IS '【说明】租户/品牌 ID。     【示例】2790683160709957（用于租户/品牌 ID）。          【JSON字段】tenant_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_id IS '【说明】门店 ID（系统主键）。     【示例】2790685415443269（用于门店 ID（系统主键））。          【JSON字段】site_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.siteid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】siteid。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.sitename IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】sitename。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_goods_id IS '【说明】门店商品 ID。     【示例】2793026176012357（用于门店商品 ID）。          【JSON字段】site_goods_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_id IS '【说明】租户（品牌）级商品 ID（全局商品 ID）。     【示例】2792115932417925（用于租户（品牌）级商品 ID（全局商品 ID））。          【JSON字段】tenant_goods_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_settle_id IS '【说明】订单结算 ID（结账单主键）。     【示例】2957922914357125（用于订单结算 ID（结账单主键））。          【JSON字段】order_settle_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_trade_no IS '【说明】订单交易号（业务单号）。     【示例】2957858167230149（用于订单交易号（业务单号））。          【JSON字段】order_trade_no。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_goods_id IS '【说明】订单商品明细 ID（订单内部的商品行主键）。     【示例】2957858456391557（用于订单商品明细 ID（订单内部的商品行主键））。          【JSON字段】order_goods_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ordergoodsid IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。     【示例】NULL（来自 JSON 导出的原始字段，用于保留业务取值）。          【JSON字段】ordergoodsid。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_pay_id IS '【说明】关联支付记录的 ID。     【示例】0（用于关联支付记录的 ID）。          【JSON字段】order_pay_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.order_coupon_id IS '【说明】订单级优惠券 ID。     【示例】0（用于订单级优惠券 ID）。          【JSON字段】order_coupon_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 '【说明】原始应收金额，公式上接近 ledger_unit_price × ledger_count。     【示例】5.0（用于原始应收金额，公式上接近 ledger_unit_price × ledger_count）。          【JSON字段】ledger_amount。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_count IS '【说明】销售数量（以 unit 为单位，unit 字段在门店商品档案中）。     【示例】1（用于销售数量（以 unit 为单位，unit 字段在门店商品档案中））。          【JSON字段】ledger_count。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_unit_price IS '【说明】商品在该次销售中的「结算单价」（元/单位）。     【示例】5.0（用于商品在该次销售中的「结算单价」（元/单位））。          【JSON字段】ledger_unit_price。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.ledger_status IS '【说明】销售流水状态。     【示例】1（用于销售流水状态）。          【JSON字段】ledger_status。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.discount_money IS '【说明】本条销售明细的「价格优惠金额」，即原价部分被减免掉的金额。     【示例】0.0（用于本条销售明细的「价格优惠金额」，即原价部分被减免掉的金额）。          【JSON字段】discount_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.discount_price IS '【说明】折后单价（元/单位）。     【示例】5.0（用于折后单价（元/单位））。          【JSON字段】discount_price。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.coupon_deduct_money IS '【说明】被优惠券 / 团购券直接抵扣到这条商品明细上的金额。     【示例】0.0（用于被优惠券 / 团购券直接抵扣到这条商品明细上的金额）。          【JSON字段】coupon_deduct_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.member_discount_amount IS '【说明】由会员身份（会员折扣）针对这一行商品产生的优惠金额。     【示例】0.0（用于由会员身份（会员折扣）针对这一行商品产生的优惠金额）。          【JSON字段】member_discount_amount。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_coupon_deduct_money IS '【说明】由优惠券抵扣“选项价格”的金额。     【示例】0.0（用于由优惠券抵扣“选项价格”的金额）。          【JSON字段】option_coupon_deduct_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_member_discount_money IS '【说明】由会员折扣作用在“选项价格”上的优惠金额。     【示例】0.0（用于由会员折扣作用在“选项价格”上的优惠金额）。          【JSON字段】option_member_discount_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.point_discount_money IS '【说明】由积分抵扣的金额（顾客兑换积分抵现金额）。     【示例】0.0（用于由积分抵扣的金额（顾客兑换积分抵现金额））。          【JSON字段】point_discount_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.point_discount_money_cost IS '【说明】积分抵扣对应的“成本金额”（后台核算用），例如按积分成本来计提费用。     【示例】0.0（用于积分抵扣对应的“成本金额”（后台核算用），例如按积分成本来计提费用）。          【JSON字段】point_discount_money_cost。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.real_goods_money IS '【说明】商品实际入账金额（考虑折扣、可能还会考虑其它抵扣后的实际销售金额）。     【示例】5.0（用于商品实际入账金额（考虑折扣、可能还会考虑其它抵扣后的实际销售金额））。          【JSON字段】real_goods_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.cost_money IS '【说明】本条销售对应的成本金额（以元计）。     【示例】0.01（用于本条销售对应的成本金额（以元计））。          【JSON字段】cost_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.push_money IS '【说明】本条销售对应的提成金额（给营业员/促销员的提成）。     【示例】0.0（用于本条销售对应的提成金额（给营业员/促销员的提成））。          【JSON字段】push_money。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.sales_type IS '【说明】销售类型。     【示例】1（用于销售类型）。          【JSON字段】sales_type。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.is_single_order IS '【说明】是否单独订单标识。     【示例】1（用于是否单独订单标识）。          【JSON字段】is_single_order。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.is_delete IS '【说明】逻辑删除标志。     【示例】0（用于逻辑删除标志）。          【JSON字段】is_delete。';
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 '【说明】商品选项（规格/加料）的附加价格。     【示例】0.0（用于商品选项（规格/加料）的附加价格）。          【JSON字段】option_price。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_value_name IS '【说明】商品选项名称（如规格、口味：大杯/小杯，不加冰等）。     【示例】NULL（用于商品选项名称（如规格、口味：大杯/小杯，不加冰等））。          【JSON字段】option_value_name。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.option_name IS '【说明】名称字段，用于展示与辅助识别。     【示例】NULL（名称字段，用于展示与辅助识别）。          【JSON字段】option_name。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.member_coupon_id IS '【说明】会员券 ID（比如会员专享优惠券）。     【示例】0（用于会员券 ID（比如会员专享优惠券））。          【JSON字段】member_coupon_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.package_coupon_id IS '【说明】套餐券 ID。     【示例】0（用于套餐券 ID）。          【JSON字段】package_coupon_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.sales_man_org_id IS '【说明】营业员所属组织/部门 ID。     【示例】0（用于营业员所属组织/部门 ID）。          【JSON字段】sales_man_org_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_name IS '【说明】营业员姓名（如果有为具体销售员记业绩，则在此填姓名）。     【示例】NULL（用于营业员姓名（如果有为具体销售员记业绩，则在此填姓名））。          【JSON字段】salesman_name。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_role_id IS '【说明】营业员的系统角色 ID（例如某个角色代码表示“销售员”）。     【示例】0（用于营业员的系统角色 ID（例如某个角色代码表示“销售员”））。          【JSON字段】salesman_role_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.salesman_user_id IS '【说明】营业员用户 ID（系统账号 ID）。     【示例】0（用于营业员用户 ID（系统账号 ID））。          【JSON字段】salesman_user_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.operator_id IS '【说明】操作员 ID（录入这笔销售的员工）。     【示例】2790687322443013（用于操作员 ID（录入这笔销售的员工））。          【JSON字段】operator_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.operator_name IS '【说明】操作员姓名，文字冗余。     【示例】收银员:郑丽珊（用于操作员姓名，文字冗余）。          【JSON字段】operator_name。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.openSalesman IS '【说明】来自 JSON 导出的原始字段，用于保留业务取值。。     【示例】2（来自 JSON 导出的原始字段，用于保留业务取值。）。          【JSON字段】openSalesman。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.returns_number IS '【说明】退货数量（如果这条明细做了退货，会记录退货数量）。     【示例】0（用于退货数量（如果这条明细做了退货，会记录退货数量））。          【JSON字段】returns_number。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.site_table_id IS '【说明】球台 ID。     【示例】2793003705192517（用于球台 ID）。          【JSON字段】site_table_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_business_id IS '【说明】租户级商品「业务大类」ID（例如“零食类”“酒水类”等更高维度）。     【示例】2790683528317768（用于租户级商品「业务大类」ID（例如“零食类”“酒水类”等更高维度））。          【JSON字段】tenant_goods_business_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.tenant_goods_category_id IS '【说明】租户级商品一级分类 ID。     【示例】2790683528350540（用于租户级商品一级分类 ID）。          【JSON字段】tenant_goods_category_id。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.create_time IS '【说明】销售记录创建时间，通常就是结账时间或录入时间。     【示例】2025-11-09 23:35:57（用于销售记录创建时间，通常就是结账时间或录入时间）。          【JSON字段】create_time。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.payload IS '【说明】完整原始 JSON 记录快照，用于回溯与二次解析。     【示例】{...}（完整原始 JSON 记录快照，用于回溯与二次解析）。          【JSON字段】$（整条记录）。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.source_file IS '【说明】ETL 元数据：原始导出文件名，用于数据追溯。     【示例】store_goods_sales_records.json（ETL 元数据：原始导出文件名，用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.source_endpoint IS '【说明】ETL 元数据：采集来源（接口/文件路径），用于数据追溯。     【示例】export/test-json-doc/store_goods_sales_records.json（ETL 元数据：采集来源（接口/文件路径），用于数据追溯）。          【JSON字段】无（ETL元数据）。';
COMMENT ON COLUMN billiards_ods.store_goods_sales_records.fetched_at IS '【说明】ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理。     【示例】2025-11-10T00:00:00+08:00（ETL 元数据：采集/入库时间戳，用于口径对齐与增量处理）。          【JSON字段】无（ETL元数据）。';


