-- Generated from DWD?????.docx; includes column comments from??
CREATE SCHEMA IF NOT EXISTS billiards_dwd;
SET search_path TO billiards_dwd;

-- SCD2 字段统一默认值、中文注释、唯一性（业务键 + 时间段不重叠）控制
CREATE EXTENSION IF NOT EXISTS btree_gist;

DO $$
DECLARE
    rec RECORD;
BEGIN
    -- 统一 SCD2 默认值与注释，避免后续手工遗漏
    FOR rec IN
        SELECT table_name
        FROM information_schema.columns
        WHERE table_schema = 'billiards_dwd'
          AND column_name = 'scd2_start_time'
    LOOP
        EXECUTE format('ALTER TABLE billiards_dwd.%I ALTER COLUMN scd2_start_time SET DEFAULT now()', rec.table_name);
        EXECUTE format('ALTER TABLE billiards_dwd.%I ALTER COLUMN scd2_end_time SET DEFAULT ''9999-12-31''', rec.table_name);
        EXECUTE format('ALTER TABLE billiards_dwd.%I ALTER COLUMN scd2_is_current SET DEFAULT 1', rec.table_name);
        EXECUTE format('ALTER TABLE billiards_dwd.%I ALTER COLUMN scd2_version SET DEFAULT 1', rec.table_name);

        EXECUTE format('COMMENT ON COLUMN billiards_dwd.%I.scd2_start_time IS ''SCD2 开始时间（版本生效起点）''', rec.table_name);
        EXECUTE format('COMMENT ON COLUMN billiards_dwd.%I.scd2_end_time IS ''SCD2 结束时间（默认 9999-12-31，表示当前版本仍有效）''', rec.table_name);
        EXECUTE format('COMMENT ON COLUMN billiards_dwd.%I.scd2_is_current IS ''SCD2 当前版本标记：1=当前版本，0=历史版本''', rec.table_name);
        EXECUTE format('COMMENT ON COLUMN billiards_dwd.%I.scd2_version IS ''SCD2 版本号，自增，配合时间段避免重叠''', rec.table_name);
    END LOOP;

    -- 约束：同一业务键时间段不重叠，且仅有一条当前版本
    FOR rec IN (
        SELECT tc.table_name,
               string_agg(format('%I WITH =', kcu.column_name), ', ' ORDER BY kcu.ordinal_position) AS pk_eq_expr,
               string_agg(format('%I', kcu.column_name), ', ' ORDER BY kcu.ordinal_position) AS pk_cols
        FROM information_schema.table_constraints tc
        JOIN information_schema.key_column_usage kcu
          ON tc.table_schema = kcu.table_schema
         AND tc.table_name = kcu.table_name
         AND tc.constraint_name = kcu.constraint_name
        WHERE tc.table_schema = 'billiards_dwd'
          AND tc.constraint_type = 'PRIMARY KEY'
          AND EXISTS (
              SELECT 1 FROM information_schema.columns c
              WHERE c.table_schema = 'billiards_dwd'
                AND c.table_name = tc.table_name
                AND c.column_name = 'scd2_start_time'
          )
        GROUP BY tc.table_name
    )
    LOOP
        IF NOT EXISTS (
            SELECT 1 FROM pg_constraint
             WHERE conname = format('%s_scd2_no_overlap', rec.table_name)
               AND conrelid = format('billiards_dwd.%s', rec.table_name)::regclass
        ) THEN
            EXECUTE format(
                'ALTER TABLE billiards_dwd.%I ADD CONSTRAINT %I EXCLUDE USING gist (%s, tstzrange(scd2_start_time, scd2_end_time) WITH &&) WHERE (scd2_is_current = 1);',
                rec.table_name,
                rec.table_name || '_scd2_no_overlap',
                rec.pk_eq_expr
            );
        END IF;

        IF to_regclass(format('billiards_dwd.%s_scd2_current_unique_idx', rec.table_name)) IS NULL THEN
            EXECUTE format(
                'CREATE UNIQUE INDEX %I ON billiards_dwd.%I (%s) WHERE (scd2_is_current = 1);',
                rec.table_name || '_scd2_current_unique_idx',
                rec.table_name,
                rec.pk_cols
            );
        END IF;
    END LOOP;
END
$$;

-- SCD2 统一约定（DIM 表使用）：
--   SCD2_start_time  TIMESTAMPTZ DEFAULT now()             -- 版本开始时间
--   SCD2_end_time    TIMESTAMPTZ DEFAULT '9999-12-31'      -- 版本结束时间
--   SCD2_is_current  INT DEFAULT 1                         -- 当前版本标记（1当前/0历史）
--   SCD2_version     INT DEFAULT 1                         -- 版本号，自增

-- dim_site
CREATE TABLE IF NOT EXISTS dim_site (
    site_id BIGINT,
    org_id BIGINT,
    tenant_id BIGINT,
    shop_name TEXT,
    site_label TEXT,
    full_address TEXT,
    address TEXT,
    longitude NUMERIC(10,6),
    latitude NUMERIC(10,6),
    tenant_site_region_id BIGINT,
    business_tel TEXT,
    site_type INTEGER,
    shop_status INTEGER,
    SCD2_start_time     TIMESTAMPTZ DEFAULT now(),
    SCD2_end_time       TIMESTAMPTZ DEFAULT '9999-12-31',
    SCD2_is_current     INT DEFAULT 1,
    SCD2_version        INT DEFAULT 1,
    PRIMARY KEY (site_id)
);
COMMENT ON COLUMN dim_site.site_id IS '???? ID?????????????????? site_id ??? | ??: siteProfile.id | ??: ??';
COMMENT ON COLUMN dim_site.org_id IS '???? ID?????????? | ??: siteProfile.org_id | ??: ??';
COMMENT ON COLUMN dim_site.tenant_id IS '?? ID????? tenant_id ??? | ??: siteProfile.tenant_id | ??: ??';
COMMENT ON COLUMN dim_site.shop_name IS '????????? | ??: siteProfile.shop_name';
COMMENT ON COLUMN dim_site.site_label IS '???????????????? | ??: siteProfile.site_label';
COMMENT ON COLUMN dim_site.full_address IS '??????? | ??: siteProfile.full_address';
COMMENT ON COLUMN dim_site.address IS '???????????? | ??: siteProfile.address';
COMMENT ON COLUMN dim_site.longitude IS '???????? | ??: siteProfile.longitude';
COMMENT ON COLUMN dim_site.latitude IS '???????? | ??: siteProfile.latitude';
COMMENT ON COLUMN dim_site.tenant_site_region_id IS '????/?????????? | ??: siteProfile.tenant_site_region_id';
COMMENT ON COLUMN dim_site.business_tel IS '????? | ??: siteProfile.business_tel';
COMMENT ON COLUMN dim_site.site_type IS '??????????????????? | ??: siteProfile.site_type';
COMMENT ON COLUMN dim_site.shop_status IS '??????????????????? | ??: siteProfile.shop_status';

-- dim_site_Ex
CREATE TABLE IF NOT EXISTS dim_site_Ex (
    site_id BIGINT,
    avatar TEXT,
    address TEXT,
    longitude NUMERIC(9,6),
    latitude NUMERIC(9,6),
    tenant_site_region_id BIGINT,
    auto_light INTEGER,
    light_status INTEGER,
    light_type INTEGER,
    light_token TEXT,
    site_type INTEGER,
    site_label TEXT,
    attendance_enabled INTEGER,
    attendance_distance INTEGER,
    customer_service_qrcode TEXT,
    customer_service_wechat TEXT,
    fixed_pay_qrCode TEXT,
    prod_env TEXT,
    shop_status INTEGER,
    create_time TIMESTAMPTZ,
    update_time TIMESTAMPTZ,
    SCD2_start_time     TIMESTAMPTZ DEFAULT now(),
    SCD2_end_time       TIMESTAMPTZ DEFAULT '9999-12-31',
    SCD2_is_current     INT DEFAULT 1,
    SCD2_version        INT DEFAULT 1,
    PRIMARY KEY (site_id)
);
COMMENT ON COLUMN dim_site_Ex.site_id IS '门店主键 ID，唯一标识一家门店。与所有事实表中的 site_id 对应。 | 来源: siteProfile.id | 角色: 主键';
COMMENT ON COLUMN dim_site_Ex.avatar IS '门店头像 URL。 | 来源: siteProfile.avatar';
COMMENT ON COLUMN dim_site_Ex.address IS '地址简写。 | 来源: siteProfile.address';
COMMENT ON COLUMN dim_site_Ex.longitude IS '经度。 | 来源: siteProfile.longitude';
COMMENT ON COLUMN dim_site_Ex.latitude IS '纬度。 | 来源: siteProfile.latitude';
COMMENT ON COLUMN dim_site_Ex.tenant_site_region_id IS '地区编码。 | 来源: siteProfile.tenant_site_region_id';
COMMENT ON COLUMN dim_site_Ex.auto_light IS '是否自动控制灯光：1=是，2=否（根据系统约定）。 | 来源: siteProfile.auto_light';
COMMENT ON COLUMN dim_site_Ex.light_status IS '灯光状态，系统预留字段。 | 来源: siteProfile.light_status';
COMMENT ON COLUMN dim_site_Ex.light_type IS '灯光类型，预留字段。 | 来源: siteProfile.light_type';
COMMENT ON COLUMN dim_site_Ex.light_token IS '灯光控制令牌。 | 来源: siteProfile.light_token';
COMMENT ON COLUMN dim_site_Ex.site_type IS '门店类型枚举（未在导出中说明，视系统配置）。 | 来源: siteProfile.site_type';
COMMENT ON COLUMN dim_site_Ex.site_label IS '门店标签，展示用。 | 来源: siteProfile.site_label';
COMMENT ON COLUMN dim_site_Ex.attendance_enabled IS '门店是否启用考勤功能：1=启用，2=不启用。 | 来源: siteProfile.attendance_enabled';
COMMENT ON COLUMN dim_site_Ex.attendance_distance IS '考勤打卡距离限制（米）。 | 来源: siteProfile.attendance_distance';
COMMENT ON COLUMN dim_site_Ex.customer_service_qrcode IS '客服二维码 URL。 | 来源: siteProfile.customer_service_qrcode';
COMMENT ON COLUMN dim_site_Ex.customer_service_wechat IS '客服微信号。 | 来源: siteProfile.customer_service_wechat';
COMMENT ON COLUMN dim_site_Ex.fixed_pay_qrCode IS '固定收款二维码。 | 来源: siteProfile.fixed_pay_qrCode';
COMMENT ON COLUMN dim_site_Ex.prod_env IS '环境标记（生产/测试）。 | 来源: siteProfile.prod_env';
COMMENT ON COLUMN dim_site_Ex.shop_status IS '门店状态，未在文档解释。 | 来源: siteProfile.shop_status';
COMMENT ON COLUMN dim_site_Ex.create_time IS '门店创建时间。 | 来源: siteProfile.create_time';
COMMENT ON COLUMN dim_site_Ex.update_time IS '门店最近更新时间。 | 来源: siteProfile.update_time';

-- dim_table
CREATE TABLE IF NOT EXISTS dim_table (
    table_id BIGINT,
    site_id BIGINT,
    table_name TEXT,
    site_table_area_id BIGINT,
    site_table_area_name TEXT,
    tenant_table_area_id BIGINT,
    table_price NUMERIC(18,2),
    SCD2_start_time     TIMESTAMPTZ DEFAULT now(),
    SCD2_end_time       TIMESTAMPTZ DEFAULT '9999-12-31',
    SCD2_is_current     INT DEFAULT 1,
    SCD2_version        INT DEFAULT 1,
    PRIMARY KEY (table_id)
);
COMMENT ON COLUMN dim_table.table_id IS '台桌主键，唯一标识一张台或包厢。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_table.site_id IS '门店 ID。 | 来源: siteId | 角色: 外键';
COMMENT ON COLUMN dim_table.table_name IS '台桌名称/编号，如 A17、888。 | 来源: tableName';
COMMENT ON COLUMN dim_table.site_table_area_id IS '门店区 ID，用于区分 A区/B区/补时区等。 | 来源: siteTableAreaId | 角色: 外键';
COMMENT ON COLUMN dim_table.site_table_area_name IS '区域名称，如 “A区”“补时长”。 | 来源: siteTableAreaName';
COMMENT ON COLUMN dim_table.tenant_table_area_id IS '租户级区域 ID。 | 来源: tenantTableAreaId | 角色: 外键';
COMMENT ON COLUMN dim_table.table_price IS '台桌基础单价，从table_fee_transactions取值。方法：对应本表id，table_fee_transactions表的site_table_id。';

-- dim_table_Ex
CREATE TABLE IF NOT EXISTS dim_table_Ex (
    table_id BIGINT,
    show_status INTEGER,
    is_online_reservation INTEGER,
    table_cloth_use_time INTEGER,
    table_cloth_use_cycle INTEGER,
    table_status INTEGER,
    SCD2_start_time     TIMESTAMPTZ DEFAULT now(),
    SCD2_end_time       TIMESTAMPTZ DEFAULT '9999-12-31',
    SCD2_is_current     INT DEFAULT 1,
    SCD2_version        INT DEFAULT 1,
    PRIMARY KEY (table_id)
);
COMMENT ON COLUMN dim_table_Ex.table_id IS '台桌主键，唯一标识一张台或包厢。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_table_Ex.show_status IS '显示状态：1=正常台；其他值=特殊用途（包厢、补时长等）。 | 来源: showStatus';
COMMENT ON COLUMN dim_table_Ex.is_online_reservation IS '是否可线上预约：1=是，2=否。 | 来源: isOnlineReservation';
COMMENT ON COLUMN dim_table_Ex.table_cloth_use_time IS '已使用台呢时长（秒）。 | 来源: tableClothUseTime';
COMMENT ON COLUMN dim_table_Ex.table_cloth_use_cycle IS '台呢更换周期阈值（秒）。 | 来源: tableClothUseCycle';
COMMENT ON COLUMN dim_table_Ex.table_status IS '当前台桌状态：1=空闲，2=使用中，3=暂停中，4=锁定。 | 来源: tableStatus';

-- dim_assistant
CREATE TABLE IF NOT EXISTS dim_assistant (
    assistant_id BIGINT,
    user_id BIGINT,
    assistant_no TEXT,
    real_name TEXT,
    nickname TEXT,
    mobile TEXT,
    tenant_id BIGINT,
    site_id BIGINT,
    team_id BIGINT,
    team_name TEXT,
    level INTEGER,
    entry_time TIMESTAMPTZ,
    resign_time TIMESTAMPTZ,
    leave_status INTEGER,
    assistant_status INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (assistant_id)
);
COMMENT ON COLUMN dim_assistant.assistant_id IS '助教账号 ID，关联助教服务流水表。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_assistant.user_id IS '系统用户 ID，用于统一跨模块身份。 | 来源: user_id | 角色: 外键';
COMMENT ON COLUMN dim_assistant.assistant_no IS '助教工号/编号，业务识别用。 | 来源: assistant_no';
COMMENT ON COLUMN dim_assistant.real_name IS '助教真实姓名。 | 来源: real_name';
COMMENT ON COLUMN dim_assistant.nickname IS '前台展示昵称。 | 来源: nickname';
COMMENT ON COLUMN dim_assistant.mobile IS '手机号码。 | 来源: mobile';
COMMENT ON COLUMN dim_assistant.tenant_id IS '租户 ID。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_assistant.site_id IS '门店 ID。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dim_assistant.team_id IS '助教团队 ID。 | 来源: team_id | 角色: 外键';
COMMENT ON COLUMN dim_assistant.team_name IS '团队名称。 | 来源: team_name';
COMMENT ON COLUMN dim_assistant.level IS '助教等级：8=管理员、10=初级、20=中级、30=高级、40=专家。 | 来源: level';
COMMENT ON COLUMN dim_assistant.entry_time IS '入职时间。 | 来源: entry_time';
COMMENT ON COLUMN dim_assistant.resign_time IS '离职时间；远未来日期表示在职。 | 来源: resign_time';
COMMENT ON COLUMN dim_assistant.leave_status IS '在职状态：0=在职，1=已离职。 | 来源: leave_status';
COMMENT ON COLUMN dim_assistant.assistant_status IS '账号启用状态：1=启用，2=停用/冻结。 | 来源: assistant_status';

-- dim_assistant_Ex
CREATE TABLE IF NOT EXISTS dim_assistant_Ex (
    assistant_id BIGINT,
    gender INTEGER,
    birth_date TIMESTAMPTZ,
    avatar TEXT,
    introduce TEXT,
    video_introduction_url TEXT,
    height NUMERIC(5,2),
    weight NUMERIC(5,2),
    shop_name TEXT,
    group_id BIGINT,
    group_name TEXT,
    person_org_id BIGINT,
    staff_id BIGINT,
    staff_profile_id BIGINT,
    assistant_grade DOUBLE PRECISION,
    sum_grade DOUBLE PRECISION,
    get_grade_times INTEGER,
    charge_way INTEGER,
    allow_cx INTEGER,
    is_guaranteed INTEGER,
    salary_grant_enabled INTEGER,
    entry_type INTEGER,
    entry_sign_status INTEGER,
    resign_sign_status INTEGER,
    work_status INTEGER,
    show_status INTEGER,
    show_sort INTEGER,
    online_status INTEGER,
    is_delete INTEGER,
    criticism_status INTEGER,
    create_time TIMESTAMPTZ,
    update_time TIMESTAMPTZ,
    start_time TIMESTAMPTZ,
    end_time TIMESTAMPTZ,
    last_table_id BIGINT,
    last_table_name TEXT,
    last_update_name TEXT,
    order_trade_no BIGINT,
    ding_talk_synced INTEGER,
    site_light_cfg_id BIGINT,
    light_equipment_id TEXT,
    light_status INTEGER,
    is_team_leader INTEGER,
    serial_number BIGINT,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (assistant_id)
);
COMMENT ON COLUMN dim_assistant_Ex.assistant_id IS '助教账号 ID，关联助教服务流水表。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_assistant_Ex.gender IS '性别枚举：0=未填/保密，1=男，2=女。 | 来源: gender';
COMMENT ON COLUMN dim_assistant_Ex.birth_date IS '出生日期，默认为 0001-01-01 表示未设置。 | 来源: birth_date';
COMMENT ON COLUMN dim_assistant_Ex.avatar IS '头像 URL。 | 来源: avatar';
COMMENT ON COLUMN dim_assistant_Ex.introduce IS '个人简介文案（目前为空）。 | 来源: introduce';
COMMENT ON COLUMN dim_assistant_Ex.video_introduction_url IS '视频介绍 URL。 | 来源: video_introduction_url';
COMMENT ON COLUMN dim_assistant_Ex.height IS '身高（厘米），0 表示未填。 | 来源: height';
COMMENT ON COLUMN dim_assistant_Ex.weight IS '体重（公斤），0 表示未填。 | 来源: weight';
COMMENT ON COLUMN dim_assistant_Ex.shop_name IS '门店名称。 | 来源: shop_name';
COMMENT ON COLUMN dim_assistant_Ex.group_id IS '上级分组 ID，未使用。 | 来源: group_id';
COMMENT ON COLUMN dim_assistant_Ex.group_name IS '上级分组名称，空。 | 来源: group_name';
COMMENT ON COLUMN dim_assistant_Ex.person_org_id IS '人事组织 ID，用于权限和报表分组。 | 来源: person_org_id';
COMMENT ON COLUMN dim_assistant_Ex.staff_id IS '预留员工 ID（全部为0）。 | 来源: staff_id';
COMMENT ON COLUMN dim_assistant_Ex.staff_profile_id IS '外部人事档案 ID（全部为0）。 | 来源: staff_profile_id';
COMMENT ON COLUMN dim_assistant_Ex.assistant_grade IS '平均评分（0 表示暂无）。 | 来源: assistant_grade';
COMMENT ON COLUMN dim_assistant_Ex.sum_grade IS '总评分累加值。 | 来源: sum_grade';
COMMENT ON COLUMN dim_assistant_Ex.get_grade_times IS '累计评分次数。 | 来源: get_grade_times';
COMMENT ON COLUMN dim_assistant_Ex.charge_way IS '计费方式：2=计时，其他未出现。 | 来源: charge_way';
COMMENT ON COLUMN dim_assistant_Ex.allow_cx IS '是否允许促销计费：1=允许。 | 来源: allow_cx';
COMMENT ON COLUMN dim_assistant_Ex.is_guaranteed IS '是否有保底：1=是。 | 来源: is_guaranteed';
COMMENT ON COLUMN dim_assistant_Ex.salary_grant_enabled IS '薪资发放开关（值2，具体含义未知）。 | 来源: salary_grant_enabled';
COMMENT ON COLUMN dim_assistant_Ex.entry_type IS '入职类型：1=正式；其他未出现。 | 来源: entry_type';
COMMENT ON COLUMN dim_assistant_Ex.entry_sign_status IS '入职签约状态：0=未签约，1=已签约（未出现）。 | 来源: entry_sign_status';
COMMENT ON COLUMN dim_assistant_Ex.resign_sign_status IS '离职签约状态，未出现非 0。 | 来源: resign_sign_status';
COMMENT ON COLUMN dim_assistant_Ex.work_status IS '工作状态：1=在岗，2=离岗。与 leave_status 呼应。 | 来源: work_status';
COMMENT ON COLUMN dim_assistant_Ex.show_status IS '前台展示状态：1=显示；其他值未出现。 | 来源: show_status';
COMMENT ON COLUMN dim_assistant_Ex.show_sort IS '前端排序序号。 | 来源: show_sort';
COMMENT ON COLUMN dim_assistant_Ex.online_status IS '在线状态：1=在线。 | 来源: online_status';
COMMENT ON COLUMN dim_assistant_Ex.is_delete IS '逻辑删除标记：0=未删除，1=已删除。 | 来源: is_delete';
COMMENT ON COLUMN dim_assistant_Ex.criticism_status IS '投诉状态：1=正常，2=有投诉。 | 来源: criticism_status';
COMMENT ON COLUMN dim_assistant_Ex.create_time IS '账号创建时间。 | 来源: create_time';
COMMENT ON COLUMN dim_assistant_Ex.update_time IS '账号最近修改时间。 | 来源: update_time';
COMMENT ON COLUMN dim_assistant_Ex.start_time IS '配置生效开始时间。 | 来源: start_time';
COMMENT ON COLUMN dim_assistant_Ex.end_time IS '配置生效结束时间。 | 来源: end_time';
COMMENT ON COLUMN dim_assistant_Ex.last_table_id IS '最近服务的台桌 ID（未必存在）。 | 来源: last_table_id';
COMMENT ON COLUMN dim_assistant_Ex.last_table_name IS '最近服务球台名称。 | 来源: last_table_name';
COMMENT ON COLUMN dim_assistant_Ex.last_update_name IS '最近更新该账号的管理员。 | 来源: last_update_name';
COMMENT ON COLUMN dim_assistant_Ex.order_trade_no IS '最近关联的订单号（非外键，仅做展示）。 | 来源: order_trade_no';
COMMENT ON COLUMN dim_assistant_Ex.ding_talk_synced IS '是否同步钉钉：1=已同步。 | 来源: ding_talk_synced';
COMMENT ON COLUMN dim_assistant_Ex.site_light_cfg_id IS '灯控配置 ID（未启用）。 | 来源: site_light_cfg_id';
COMMENT ON COLUMN dim_assistant_Ex.light_equipment_id IS '灯控设备 ID（未启用）。 | 来源: light_equipment_id';
COMMENT ON COLUMN dim_assistant_Ex.light_status IS '灯控状态（值2，具体含义未知）。 | 来源: light_status';
COMMENT ON COLUMN dim_assistant_Ex.is_team_leader IS '是否团队长：0=否，1=是。 | 来源: is_team_leader';
COMMENT ON COLUMN dim_assistant_Ex.serial_number IS '来源: serial_number';

-- dim_member
CREATE TABLE IF NOT EXISTS dim_member (
    member_id BIGINT,
    system_member_id BIGINT,
    tenant_id BIGINT,
    register_site_id BIGINT,
    mobile TEXT,
    nickname TEXT,
    member_card_grade_code BIGINT,
    member_card_grade_name TEXT,
    create_time TIMESTAMPTZ,
    update_time TIMESTAMPTZ,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (member_id)
);
COMMENT ON COLUMN dim_member.member_id IS '租户内会员主键。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_member.system_member_id IS '跨租户全局会员 ID。 | 来源: system_member_id | 角色: 外键';
COMMENT ON COLUMN dim_member.tenant_id IS '租户 ID。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_member.register_site_id IS '注册门店 ID。 | 来源: register_site_id | 角色: 外键';
COMMENT ON COLUMN dim_member.mobile IS '会员手机号。 | 来源: mobile';
COMMENT ON COLUMN dim_member.nickname IS '昵称（未必是真实姓名）。 | 来源: nickname';
COMMENT ON COLUMN dim_member.member_card_grade_code IS '会员等级代码：1=金卡？2=银卡？3=钻石卡？4=黑卡？（按照 MD 文档枚举）。 | 来源: member_card_grade_code';
COMMENT ON COLUMN dim_member.member_card_grade_name IS '等级名称，中文描述。 | 来源: member_card_grade_name';
COMMENT ON COLUMN dim_member.create_time IS '会员档案创建时间。 | 来源: create_time';

-- dim_member_Ex
CREATE TABLE IF NOT EXISTS dim_member_Ex (
    member_id BIGINT,
    referrer_member_id BIGINT,
    point NUMERIC(18,2),
    register_site_name TEXT,
    growth_value NUMERIC(18,2),
    user_status INTEGER,
    status INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (member_id)
);
COMMENT ON COLUMN dim_member_Ex.member_id IS '租户内会员主键。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_member_Ex.referrer_member_id IS '推荐人会员 ID，营销分析用。 | 来源: referrer_member_id';
COMMENT ON COLUMN dim_member_Ex.point IS '积分余额（暂未启用）。 | 来源: point';
COMMENT ON COLUMN dim_member_Ex.register_site_name IS '注册门店名称。 | 来源: site_name';
COMMENT ON COLUMN dim_member_Ex.growth_value IS '成长值，暂未启用。 | 来源: growth_value';
COMMENT ON COLUMN dim_member_Ex.user_status IS '会员状态枚举：1=正常，其它值未出现。 | 来源: user_status';
COMMENT ON COLUMN dim_member_Ex.status IS '帐户状态：1=正常；其它值未出现。 | 来源: status';

-- dim_member_card_account
CREATE TABLE IF NOT EXISTS dim_member_card_account (
    member_card_id BIGINT,
    tenant_id BIGINT,
    register_site_id BIGINT,
    tenant_member_id BIGINT,
    system_member_id BIGINT,
    card_type_id BIGINT,
    member_card_grade_code BIGINT,
    member_card_grade_code_name TEXT,
    member_card_type_name TEXT,
    member_name TEXT,
    member_mobile TEXT,
    balance NUMERIC(18,2),
    start_time TIMESTAMPTZ,
    end_time TIMESTAMPTZ,
    last_consume_time TIMESTAMPTZ,
    status INTEGER,
    is_delete INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (member_card_id)
);
COMMENT ON COLUMN dim_member_card_account.member_card_id IS '会员卡账户主键，唯一标识一张具体卡。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_member_card_account.tenant_id IS '租户/品牌 ID，用于分隔不同业务主体。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.register_site_id IS '开卡门店 ID，对应 dim_site.site_id。 | 来源: register_site_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.tenant_member_id IS '对应会员档案中的 member_id（本租户内）。0 表示未绑定会员。 | 来源: tenant_member_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.system_member_id IS '全局会员 ID，用于跨租户统一会员身份。0 表示未绑定会员。 | 来源: system_member_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.card_type_id IS '卡种 ID，指向卡种配置表。与下面的 grade_code 共同定义卡类别。 | 来源: card_type_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.member_card_grade_code IS '卡等级/卡类代码，区别不同类别卡。2790683528022853=储值卡，2790683528022856=活动抵用券，2790683528022855=台费卡，2790683528022858=酒水卡，2790683528022857=月卡';
COMMENT ON COLUMN dim_member_card_account.member_card_grade_code_name IS '卡等级中文名称，与 member_card_grade_code 一一对应。 | 来源: member_card_grade_code_name';
COMMENT ON COLUMN dim_member_card_account.member_card_type_name IS '卡类型名称，通常与 grade_code_name 相同，纯展示字段。 | 来源: member_card_type_name';
COMMENT ON COLUMN dim_member_card_account.member_name IS '持卡会员姓名快照，部分为空表示未绑定。 | 来源: member_name';
COMMENT ON COLUMN dim_member_card_account.member_mobile IS '持卡会员手机号快照。 | 来源: member_mobile';
COMMENT ON COLUMN dim_member_card_account.balance IS '当前余额或额度。对储值卡表示余额，对其他卡表示剩余金额或次数。 | 来源: balance';
COMMENT ON COLUMN dim_member_card_account.start_time IS '卡片有效期开始时间。 | 来源: start_time';
COMMENT ON COLUMN dim_member_card_account.end_time IS '卡片有效期结束时间。 | 来源: end_time';
COMMENT ON COLUMN dim_member_card_account.last_consume_time IS '最近一次消费时间；若为 "1970-01-01" 表示未消费过。 | 来源: last_consume_time';
COMMENT ON COLUMN dim_member_card_account.status IS '卡状态：1=正常可用；4=过期/停用。其他值在数据中未出现。 | 来源: status';
COMMENT ON COLUMN dim_member_card_account.is_delete IS '逻辑删除标记：0=未删除；1=已删除。 | 来源: is_delete';

-- dim_member_card_account_Ex
CREATE TABLE IF NOT EXISTS dim_member_card_account_Ex (
    member_card_id BIGINT,
    site_name TEXT,
    tenant_name VARCHAR(64),
    tenantAvatar TEXT,
    effect_site_id BIGINT,
    able_cross_site INTEGER,
    card_physics_type INTEGER,
    card_no TEXT,
    bind_password TEXT,
    use_scene TEXT,
    denomination NUMERIC(18,2),
    create_time TIMESTAMPTZ,
    disable_start_time TIMESTAMPTZ,
    disable_end_time TIMESTAMPTZ,
    is_allow_give INTEGER,
    is_allow_order_deduct INTEGER,
    sort INTEGER,
    table_discount NUMERIC(10,2),
    goods_discount NUMERIC(10,2),
    assistant_discount NUMERIC(10,2),
    assistant_reward_discount NUMERIC(10,2),
    table_service_discount NUMERIC(10,2),
    goods_service_discount NUMERIC(10,2),
    assistant_service_discount NUMERIC(10,2),
    coupon_discount NUMERIC(10,2),
    table_discount_sub_switch INTEGER,
    goods_discount_sub_switch INTEGER,
    assistant_discount_sub_switch INTEGER,
    assistant_reward_discount_sub_switch INTEGER,
    goods_discount_range_type INTEGER,
    table_deduct_radio NUMERIC(10,2),
    goods_deduct_radio NUMERIC(10,2),
    assistant_deduct_radio NUMERIC(10,2),
    table_service_deduct_radio NUMERIC(10,2),
    goods_service_deduct_radio NUMERIC(10,2),
    assistant_service_deduct_radio NUMERIC(10,2),
    assistant_reward_deduct_radio NUMERIC(10,2),
    coupon_deduct_radio NUMERIC(10,2),
    cardSettleDeduct NUMERIC(18,2),
    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),
    couponCardDeduct NUMERIC(18,2),
    deliveryFeeDeduct NUMERIC(18,2),
    tableAreaId TEXT,
    goodsCategoryId TEXT,
    pdAssisnatLevel TEXT,
    cxAssisnatLevel TEXT,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (member_card_id)
);
COMMENT ON COLUMN dim_member_card_account_Ex.member_card_id IS '会员卡账户主键，唯一标识一张具体卡。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_member_card_account_Ex.site_name IS '门店名称展示字段（全部相同）。 | 来源: site_name';
COMMENT ON COLUMN dim_member_card_account_Ex.tenant_name IS '租户名称（当前导出为空）。 | 来源: tenantName';
COMMENT ON COLUMN dim_member_card_account_Ex.tenantAvatar IS '租户头像 URL（当前导出为空）。 | 来源: tenantAvatar';
COMMENT ON COLUMN dim_member_card_account_Ex.effect_site_id IS '卡片限定生效门店 ID。0 表示不限门店，配合 able_cross_site=1 表示全店通用。 | 来源: effect_site_id';
COMMENT ON COLUMN dim_member_card_account_Ex.able_cross_site IS '是否允许跨门店使用该卡：1=允许跨店；0=仅限开卡门店。 | 来源: able_cross_site';
COMMENT ON COLUMN dim_member_card_account_Ex.card_physics_type IS '物理卡类型：1=实体/标准卡；其他值未出现，含义未知。 | 来源: card_physics_type';
COMMENT ON COLUMN dim_member_card_account_Ex.card_no IS '物理卡号或条码（当前全部为空）。 | 来源: card_no';
COMMENT ON COLUMN dim_member_card_account_Ex.bind_password IS '卡绑定密码（未启用）。 | 来源: bind_password';
COMMENT ON COLUMN dim_member_card_account_Ex.use_scene IS '使用场景说明（当前为空）。 | 来源: use_scene';
COMMENT ON COLUMN dim_member_card_account_Ex.denomination IS '面额或初始储值额度（当前均为 0.0，未启用）。 | 来源: denomination';
COMMENT ON COLUMN dim_member_card_account_Ex.create_time IS '卡片创建时间。 | 来源: create_time';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_start_time IS '卡片禁用开始时间，当前为默认值表示未禁用。 | 来源: disable_start_time';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_end_time IS '卡片禁用结束时间，当前为默认值表示未禁用。 | 来源: disable_end_time';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_give IS '是否允许转赠给他人：0=不允许；1=允许。 | 来源: is_allow_give';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_order_deduct IS '是否允许在订单层面统一扣款：0=不允许；1=允许。 | 来源: is_allow_order_deduct';
COMMENT ON COLUMN dim_member_card_account_Ex.sort IS '前端排序序号。 | 来源: sort';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount IS '台费折扣率（折扣百分比，10.0=不打折，9.0=九折等）。当前全部 10.0。 | 来源: table_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount IS '商品折扣率，当前为 10.0 表示无折扣。 | 来源: goods_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount IS '助教服务折扣率，当前为 10.0。 | 来源: assistant_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount IS '助教奖励折扣率，当前为 10.0（未启用）。 | 来源: assistant_reward_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_discount IS '台费服务类折扣率，当前为 10.0。 | 来源: table_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_discount IS '商品服务折扣率，当前为 10.0。 | 来源: goods_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_discount IS '助教服务类折扣率，当前为 10.0。 | 来源: assistant_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_discount IS '使用券的折扣比例（全部 10.0，未使用）。 | 来源: coupon_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount_sub_switch IS '台费折扣叠加开关：1=叠加其他折扣；2=不叠加，仅用卡折扣。 | 来源: table_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_sub_switch IS '商品折扣叠加开关，意义同上。 | 来源: goods_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount_sub_switch IS '助教折扣叠加开关，意义同上。 | 来源: assistant_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount_sub_switch IS '助教奖励折扣叠加开关（未启用）。 | 来源: assistant_reward_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_range_type IS '商品折扣范围类型，未在文档说明具体含义。 | 来源: goods_discount_range_type';
COMMENT ON COLUMN dim_member_card_account_Ex.table_deduct_radio IS '台费抵扣比例（百分比）。100.0 表示允许全额抵扣；0=不允许。 | 来源: table_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_deduct_radio IS '商品抵扣比例，意义同上。 | 来源: goods_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_deduct_radio IS '助教抵扣比例，意义同上。 | 来源: assistant_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_deduct_radio IS '台费服务金抵扣比例。 | 来源: table_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_deduct_radio IS '商品服务金抵扣比例。 | 来源: goods_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_deduct_radio IS '助教服务金抵扣比例。 | 来源: assistant_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_deduct_radio IS '助教奖励金抵扣比例（未启用）。 | 来源: assistant_reward_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_deduct_radio IS '券抵扣比例（未启用）。 | 来源: coupon_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.cardSettleDeduct IS '结算时统一扣卡金额配置（当前为 0.0，未使用）。 | 来源: cardSettleDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableCardDeduct IS '台费扣卡金额配置，当前 0.0。 | 来源: tableCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableServiceCardDeduct IS '台费服务金扣卡金额配置。 | 来源: tableServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCarDeduct IS '商品扣卡金额配置。 | 来源: goodsCarDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsServiceCardDeduct IS '商品服务金扣卡金额配置。 | 来源: goodsServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantCardDeduct IS '助教扣卡金额配置。 | 来源: assistantCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantServiceCardDeduct IS '助教服务金扣卡金额配置。 | 来源: assistantServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantRewardCardDeduct IS '助教奖励金扣卡金额配置（未启用）。 | 来源: assistantRewardCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.couponCardDeduct IS '使用券扣卡金额配置。 | 来源: couponCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.deliveryFeeDeduct IS '配送费扣卡金额配置（未启用）。 | 来源: deliveryFeeDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableAreaId IS '可用台区 ID 列表，空表示不限台区。 | 来源: tableAreaId';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCategoryId IS '可用商品分类 ID 列表，空表示不限制商品类别。 | 来源: goodsCategoryId';
COMMENT ON COLUMN dim_member_card_account_Ex.pdAssisnatLevel IS '允许的陪打助教等级列表，空表示不限。 | 来源: pdAssisnatLevel';
COMMENT ON COLUMN dim_member_card_account_Ex.cxAssisnatLevel IS '允许的促销助教等级列表，空表示不限。 | 来源: cxAssisnatLevel';

-- dim_tenant_goods
CREATE TABLE IF NOT EXISTS dim_tenant_goods (
    tenant_goods_id BIGINT,
    tenant_id BIGINT,
    supplier_id BIGINT,
    category_name VARCHAR(64),
    goods_category_id BIGINT,
    goods_second_category_id BIGINT,
    goods_name VARCHAR(128),
    goods_number VARCHAR(64),
    unit VARCHAR(16),
    market_price NUMERIC(18,2),
    goods_state INTEGER,
    create_time TIMESTAMPTZ,
    update_time TIMESTAMPTZ,
    is_delete INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (tenant_goods_id)
);
COMMENT ON COLUMN dim_tenant_goods.tenant_goods_id IS '租户级商品档案主键 ID，唯一标识一条商品档案。所有业务事实表（销售、库存等）中引用租户级商品时应指向此字段。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_tenant_goods.tenant_id IS '租户/品牌 ID，用于区分不同商户。当前样本中全表同一值，但模型上应作为维表外键，用于关联租户维度。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_tenant_goods.supplier_id IS '供应商 ID，用于关联供应商档案维度。当前样本全部为 0，说明门店尚未维护供应商信息或导出视图未包含真实供应商关联，但字段含义明确。 | 来源: supplier_id | 角色: 外键';
COMMENT ON COLUMN dim_tenant_goods.category_name IS '商品一级分类名称（可读名称），例如：零食、饮料、香烟、雪糕、小吃、酒水、面、槟榔等。真实分类关联通过 goods_category_id 与 goods_second_category_id 实现，此字段主要用于展示和直观分析。 | 来源: categoryName';
COMMENT ON COLUMN dim_tenant_goods.goods_category_id IS '商品一级分类 ID。与分类维表（例如 dim_goods_category）关联，构成商品分类的第一层。一个 goods_category_id 对应一个 category_name。 | 来源: goods_category_id | 角色: 外键';
COMMENT ON COLUMN dim_tenant_goods.goods_second_category_id IS '商品二级分类 ID。与分类维表的二级节点关联，用于更细粒度的品类统计。取值数目约十四种，每个值属于某个一级分类之下。 | 来源: goods_second_category_id | 角色: 外键';
COMMENT ON COLUMN dim_tenant_goods.goods_name IS '商品名称（前台展示名），如 “东方树叶”“红烧牛肉面”“百威 235 毫升”等。当前样本中基本唯一。作为用户认知的主显示名称，用于报表、前台展示、小票打印。 | 来源: goods_name';
COMMENT ON COLUMN dim_tenant_goods.goods_number IS '商品内部编号或自定义货号。当前样本中各记录不重复，如 “1”“2”“10”“11” 等。可用于与其他系统对接或人工查找，有一定对账和排错价值。 | 来源: goods_number';
COMMENT ON COLUMN dim_tenant_goods.unit IS '商品计量单位，例如：瓶、包、个、份、根、盒、杯、桶、盘、支等。用于解释数量含义，是销售数量与库存数量的度量单位。 | 来源: unit';
COMMENT ON COLUMN dim_tenant_goods.market_price IS '商品标价或标准销售单价。例如 2、5、6、8、10、12、15、18、20、28 元。POS 默认销售价格，结算时的基础金额字段。 | 来源: market_price';
COMMENT ON COLUMN dim_tenant_goods.goods_state IS '商品状态枚举。当前样本全部为 1，推测含义为“正常”“已上架”或“有效”。其他值（数据中未出现）通常表示下架、停用或草稿状态。用于控制商品是否可销售。 | 来源: goods_state';
COMMENT ON COLUMN dim_tenant_goods.create_time IS '商品档案创建时间，格式为 “YYYY-MM-DD HH:MM:SS”。每条记录唯一。用于增量抽取和审计，也可用于分析商品生命周期。 | 来源: create_time';
COMMENT ON COLUMN dim_tenant_goods.update_time IS '商品档案最近一次修改时间，可为空（表示自创建后未修改）。用于增量同步、变化跟踪和审计分析。 | 来源: update_time';
COMMENT ON COLUMN dim_tenant_goods.is_delete IS '逻辑删除标志。枚举：0 表示未删除（有效商品）；1 表示已逻辑删除（在前台不再展示）。当前样本全部为 0。用于软删除控制和历史数据保留。 | 来源: is_delete';

-- dim_tenant_goods_Ex
CREATE TABLE IF NOT EXISTS dim_tenant_goods_Ex (
    tenant_goods_id BIGINT,
    remark_name VARCHAR(128),
    pinyin_initial VARCHAR(128),
    goods_cover VARCHAR(512),
    goods_bar_code VARCHAR(64),
    commodity_code VARCHAR(64),
    commodity_code_list VARCHAR(256),
    min_discount_price NUMERIC(18,2),
    cost_price NUMERIC(18,2),
    cost_price_type INTEGER,
    able_discount INTEGER,
    sale_channel INTEGER,
    is_warehousing INTEGER,
    is_in_site BOOLEAN,
    able_site_transfer INTEGER,
    common_sale_royalty INTEGER,
    point_sale_royalty INTEGER,
    out_goods_id BIGINT,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (tenant_goods_id)
);
COMMENT ON COLUMN dim_tenant_goods_Ex.tenant_goods_id IS '租户级商品档案主键 ID，唯一标识一条商品档案。所有业务事实表（销售、库存等）中引用租户级商品时应指向此字段。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_tenant_goods_Ex.remark_name IS '商品备注名或别名，目前样本中均为空。设计用途为简写名、特殊展示名或内部备注，在当前门店尚未启用。 | 来源: remark_name';
COMMENT ON COLUMN dim_tenant_goods_Ex.pinyin_initial IS '商品拼音首字母或助记码，用于前台按拼音检索，如 “DFSY,DFSX”“HSNRM,GSNRM”“SP” 等。主要为操作便利，对经营分析影响较小。 | 来源: pinyin_initial';
COMMENT ON COLUMN dim_tenant_goods_Ex.goods_cover IS '商品封面图片 URL，用于前端展示商品图片。多个商品可能共用同一图片。对经营和结算逻辑无直接影响。 | 来源: goods_cover';
COMMENT ON COLUMN dim_tenant_goods_Ex.goods_bar_code IS '商品条码（如 EAN 码）。当前样本全部为空。含义明确但尚未使用，未来可用于扫码收银或与第三方商品库对接。 | 来源: goods_bar_code';
COMMENT ON COLUMN dim_tenant_goods_Ex.commodity_code IS '对外商品编码或系列编码，用于与外部系统或其他内部模块对接。例如 “10000”“100000”“10000028”等。一个编码在多条商品上复用，说明它不是主键而是“系列标识”或“外部编码”。具体业务含义依赖上游系统定义。 | 来源: commodity_code';
COMMENT ON COLUMN dim_tenant_goods_Ex.commodity_code_list IS '商品编码列表的序列化形式，对应源 JSON 的数组字段（当前每条记录仅一个元素）。设计上支持 “一个商品多个编码” 场景，目前仅为 commodity_code 的冗余表现形式。 | 来源: commodityCode';
COMMENT ON COLUMN dim_tenant_goods_Ex.min_discount_price IS '商品可售最低价（底价）。部分记录为 0.00，表示未设置底价或沿用系统默认规则。用于限制打折或手动改价的下限，防止亏损销售。 | 来源: min_discount_price';
COMMENT ON COLUMN dim_tenant_goods_Ex.cost_price IS '商品成本价，当前大多数为 0.00，仅少数录入 2.0、2.5、3.0 等。用于成本核算与毛利分析。虽当前门店未完整维护，但字段含义清晰，属于成本分析必备结构。 | 来源: cost_price';
COMMENT ON COLUMN dim_tenant_goods_Ex.cost_price_type IS '成本价格类型枚举，用于标识成本价的来源或计算方式。已知取值：1 和 2。常见推测：1 表示手工录入成本；2 表示按最近进货价或加权平均价生成。具体含义需结合系统枚举字典确认。 | 来源: cost_price_type';
COMMENT ON COLUMN dim_tenant_goods_Ex.able_discount IS '是否允许该商品参与折扣的标志。已知取值：1。按命名推断枚举约定为：1 表示允许参与打折；0 表示不允许参与打折（当前样本未出现）。配合活动、整单折扣等控制哪些商品可享优惠。 | 来源: able_discount';
COMMENT ON COLUMN dim_tenant_goods_Ex.sale_channel IS '销售渠道类型枚举。当前样本全部为 1，推测为“线下门店正常销售渠道”。理论上可扩展为不同渠道值，例如外卖、小程序、电商等，用于渠道维度分析。具体枚举说明依赖系统配置。 | 来源: sale_channel';
COMMENT ON COLUMN dim_tenant_goods_Ex.is_warehousing IS '是否纳入库存管理的标志。已知取值：1，表示纳入库存管理；0 则表示不纳入库存管理（虚拟商品等，当前未出现）。本门店所有商品均启用库存管理。 | 来源: is_warehousing';
COMMENT ON COLUMN dim_tenant_goods_Ex.is_in_site IS '是否在当前门店启用或上架。当前样本全部为 false。由于该文件是租户级商品档案视图，且 isInSite 全为 false，该字段在本视图的实际含义存在不确定性，可能仅在门店级商品表中才有明确业务意义。 | 来源: isInSite';
COMMENT ON COLUMN dim_tenant_goods_Ex.able_site_transfer IS '是否允许门店间调拨或门店级操作的枚举。已知取值：2 为绝大多数，0 为少数一条。按命名推测大致含义为：2 表示允许调拨或默认允许；0 表示禁止调拨。实际枚举定义需查阅系统配置，当前无法完全确定具体业务规则。 | 来源: able_site_transfer';
COMMENT ON COLUMN dim_tenant_goods_Ex.common_sale_royalty IS '普通销售提成或佣金配置字段，单位和含义需结合上游系统（可能为金额或比例）。当前样本全部为 0，说明未启用商品级提成配置。 | 来源: common_sale_royalty';
COMMENT ON COLUMN dim_tenant_goods_Ex.point_sale_royalty IS '积分销售相关的提成或赠送规则配置字段。当前样本全部为 0，同样未启用该功能。具体数值含义（百分比或固定值）需结合系统定义。 | 来源: point_sale_royalty';
COMMENT ON COLUMN dim_tenant_goods_Ex.out_goods_id IS '外部系统商品 ID，用于对接第三方平台或统一商品库时作为映射主键。目前样本全部为 0，说明尚未配置外部商品映射，具体对接规则依赖上游系统。 | 来源: out_goods_id';

-- dim_store_goods
CREATE TABLE IF NOT EXISTS dim_store_goods (
    site_goods_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    tenant_goods_id BIGINT,
    goods_name TEXT,
    goods_category_id BIGINT,
    goods_second_category_id BIGINT,
    category_level1_name TEXT,
    category_level2_name TEXT,
    batch_stock_qty INTEGER,
    sale_qty INTEGER,
    total_sales_qty INTEGER,
    sale_price NUMERIC(18,2),
    created_at TIMESTAMPTZ,
    updated_at TIMESTAMPTZ,
    avg_monthly_sales NUMERIC(18,4),
    goods_state INTEGER,
    enable_status INTEGER,
    send_state INTEGER,
    is_delete INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (site_goods_id)
);
COMMENT ON COLUMN dim_store_goods.site_goods_id IS '门店级商品 ID，本表主键；其它业务表中的 site_goods_id 与此对应，用于库存、销售等关联。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_store_goods.tenant_id IS '租户/品牌 ID，同一品牌下多个门店共享，用于跨门店汇总分析。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_store_goods.site_id IS '门店 ID，对应门店维度表主键。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dim_store_goods.tenant_goods_id IS '租户级（品牌级）商品 ID，用于关联 dim_tenant_goods，实现跨门店统一商品档案。 | 来源: tenant_goods_id | 角色: 外键';
COMMENT ON COLUMN dim_store_goods.goods_name IS '商品名称，例如“合味道泡面”“地道肠”“茶位费”。 | 来源: goods_name';
COMMENT ON COLUMN dim_store_goods.goods_category_id IS '商品一级分类 ID，对应商品分类维表主键，与 category_level1_name 一一对应。 | 来源: goods_category_id | 角色: 外键';
COMMENT ON COLUMN dim_store_goods.goods_second_category_id IS '商品二级分类 ID，其父分类为 goods_category_id。 | 来源: goods_second_category_id | 角色: 外键';
COMMENT ON COLUMN dim_store_goods.category_level1_name IS '一级分类名称，如“零食”“酒水”“服务费”，用于报表维度展示。 | 来源: oneCategoryName';
COMMENT ON COLUMN dim_store_goods.category_level2_name IS '二级分类名称，如“面”“洋酒”“纸巾”，用于更细粒度分类分析。 | 来源: twoCategoryName';
COMMENT ON COLUMN dim_store_goods.batch_stock_qty IS '当前成本批次的库存数量，用于按 cost_price 估算库存价值。 | 来源: batch_stock_quantity';
COMMENT ON COLUMN dim_store_goods.sale_qty IS '截至导出时的销售数量（件），当前数据中与 total_sales_qty 相同。 | 来源: sale_num';
COMMENT ON COLUMN dim_store_goods.total_sales_qty IS '累计销售数量；当前导出周期下与 sale_qty 一致，为历史全量口径。 | 来源: total_sales';
COMMENT ON COLUMN dim_store_goods.sale_price IS '商品标准销售价（挂牌价），单位为元。实际结算可能有折扣或券抵扣。 | 来源: sale_price';
COMMENT ON COLUMN dim_store_goods.created_at IS '门店商品档案创建时间（在门店建立该商品档案时的时间点）。 | 来源: create_time';
COMMENT ON COLUMN dim_store_goods.updated_at IS '最近一次修改商品档案的时间（包括价格调整、状态变更等）。 | 来源: update_time';
COMMENT ON COLUMN dim_store_goods.avg_monthly_sales IS '平均月销量（件/月），由某个统计周期内销售数据折算而来，用于补货和品类管理分析。 | 来源: average_monthly_sales';
COMMENT ON COLUMN dim_store_goods.goods_state IS '商品基础状态枚举：1=正常状态（主流值），2=特殊状态（如新建未完全启用或停售但未彻底下架，通常伴随 stock=0、days_on_shelf=0）。 | 来源: goods_state';
COMMENT ON COLUMN dim_store_goods.enable_status IS '档案启用状态：1=启用；2=停用（推测，样本中未出现）；控制商品档案是否参与业务处理。 | 来源: enable_status';
COMMENT ON COLUMN dim_store_goods.send_state IS '销售端可售状态：1=可销售/可下单；其他值可能代表停售或仅内部使用（当前样本全部为 1）。 | 来源: send_state';
COMMENT ON COLUMN dim_store_goods.is_delete IS '逻辑删除标志：0=未删除（有效档案）；1=已删除（逻辑删除，不再参与业务但保留历史引用）。 | 来源: is_delete';

-- dim_store_goods_Ex
CREATE TABLE IF NOT EXISTS dim_store_goods_Ex (
    site_goods_id BIGINT,
    site_name TEXT,
    unit TEXT,
    goods_barcode TEXT,
    goods_cover_url TEXT,
    pinyin_initial TEXT,
    stock_qty INTEGER,
    stock_secondary_qty INTEGER,
    safety_stock_qty INTEGER,
    cost_price NUMERIC(18,4),
    cost_price_type INTEGER,
    provisional_total_cost NUMERIC(18,2),
    total_purchase_cost NUMERIC(18,2),
    min_discount_price NUMERIC(18,2),
    is_discountable INTEGER,
    days_on_shelf INTEGER,
    audit_status INTEGER,
    sale_channel INTEGER,
    is_warehousing INTEGER,
    freeze_status INTEGER,
    forbid_sell_status INTEGER,
    able_site_transfer INTEGER,
    custom_label_type INTEGER,
    option_required INTEGER,
    remark TEXT,
    sort_order INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (site_goods_id)
);
COMMENT ON COLUMN dim_store_goods_Ex.site_goods_id IS '门店级商品 ID，本表主键；其它业务表中的 site_goods_id 与此对应，用于库存、销售等关联。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_store_goods_Ex.site_name IS '门店名称，例如“朗朗桌球”，是对 site_id 的冗余展示，方便直接阅读。 | 来源: siteName';
COMMENT ON COLUMN dim_store_goods_Ex.unit IS '销售计量单位，如“包”“瓶”“个”“份”“杯”等。 | 来源: unit';
COMMENT ON COLUMN dim_store_goods_Ex.goods_barcode IS '商品条形码，用于扫码销售；当前样本多为空。 | 来源: goods_bar_code';
COMMENT ON COLUMN dim_store_goods_Ex.goods_cover_url IS '商品图片 URL，用于前端展示商品图片。 | 来源: goods_cover';
COMMENT ON COLUMN dim_store_goods_Ex.pinyin_initial IS '商品名称拼音首字母缩写，有时多个别名用逗号分隔，用于按字母快速检索和排序。 | 来源: pinyin_initial';
COMMENT ON COLUMN dim_store_goods_Ex.stock_qty IS '当前主单位可用库存数量，以 unit 为单位。 | 来源: stock';
COMMENT ON COLUMN dim_store_goods_Ex.stock_secondary_qty IS '副单位库存数量；若商品存在双单位（如箱/瓶），用于记录副单位库存；当前门店未启用双单位库存，样本中为 0。 | 来源: stock_A';
COMMENT ON COLUMN dim_store_goods_Ex.safety_stock_qty IS '安全库存阈值，低于该值时系统可提示补货；当前门店尚未配置，样本中为 0。 | 来源: safe_stock';
COMMENT ON COLUMN dim_store_goods_Ex.cost_price IS '商品单件成本价，单位元；部分商品为 0，表示未录入或由其它模块结转成本。 | 来源: cost_price';
COMMENT ON COLUMN dim_store_goods_Ex.cost_price_type IS '成本类型枚举：1=固定成本价（按 cost_price 计），2=动态成本价（按采购单等方式结转，当前多数仍为暂估）。 | 来源: cost_price_type';
COMMENT ON COLUMN dim_store_goods_Ex.provisional_total_cost IS '当前库存暂估总成本，单位元；通常约等于 batch_stock_qty × cost_price。 | 来源: provisional_total_cost';
COMMENT ON COLUMN dim_store_goods_Ex.total_purchase_cost IS '当前库存总采购成本，单位元；当前样本中与 provisional_total_cost 相等，为后续精算成本预留。 | 来源: total_purchase_cost';
COMMENT ON COLUMN dim_store_goods_Ex.min_discount_price IS '最低允许成交价（限价），单位元；收银改价时需保证成交价 ≥ 此值，为 0 时表示未设置限价或由其它规则控制。 | 来源: min_discount_price';
COMMENT ON COLUMN dim_store_goods_Ex.is_discountable IS '是否允许参与折扣的标志：1=允许参与折扣；0=不参与任何折扣策略。当前样本全部为 1。 | 来源: able_discount';
COMMENT ON COLUMN dim_store_goods_Ex.days_on_shelf IS '商品在架天数或可售天数，大致等于当前时间减去首次上架时间；0 通常表示刚建档或刚启用。 | 来源: days_available';
COMMENT ON COLUMN dim_store_goods_Ex.audit_status IS '审核状态枚举：2=审核通过（当前唯一值）；其他值可能代表待提交、待审核、审核不通过等。 | 来源: audit_status';
COMMENT ON COLUMN dim_store_goods_Ex.sale_channel IS '销售渠道枚举：当前样本全部为 1 表示线下门店渠道；其他值可用于区分外卖、线上商城等渠道。 | 来源: sale_channel';
COMMENT ON COLUMN dim_store_goods_Ex.is_warehousing IS '是否纳入库存管理：1=参与库存管理（有出入库流水）；0 或其他值可能表示不计库存（样本中全部为 1）。 | 来源: is_warehousing';
COMMENT ON COLUMN dim_store_goods_Ex.freeze_status IS '冻结状态：0=未冻结；非 0 可能表示锁定库存或禁止出库，具体业务规则需系统确认。 | 来源: freeze';
COMMENT ON COLUMN dim_store_goods_Ex.forbid_sell_status IS '禁止销售状态：1=未禁止，允许销售；2=被禁止销售，即使上架也不能卖（含义基于命名和行业惯例推测）。 | 来源: forbid_sell_status';
COMMENT ON COLUMN dim_store_goods_Ex.able_site_transfer IS '是否允许跨门店调拨或跨站点共享库存：2=不允许跨店调拨（当前主流值）；0=未配置（个别记录），含义为是否参与跨店调拨功能。 | 来源: able_site_transfer';
COMMENT ON COLUMN dim_store_goods_Ex.custom_label_type IS '自定义标签类型（基于字段名和取值推测）：2=使用自定义标签；1 可能表示使用系统默认标签。具体影响哪些标签功能需业务确认。 | 来源: custom_label_type';
COMMENT ON COLUMN dim_store_goods_Ex.option_required IS '是否需要额外选项或规格（基于字段名和取值推测）：1=不需要额外选项，按单规格销售；其他值可能表示必须选择配料或口味。当前样本全部为 1。 | 来源: option_required';
COMMENT ON COLUMN dim_store_goods_Ex.remark IS '商品备注，可填写口味说明、供应商信息、注意事项等；当前样本全部为空。 | 来源: remark';
COMMENT ON COLUMN dim_store_goods_Ex.sort_order IS '前端展示排序权重，控制商品在列表中的显示顺序，具体规则（数值越大还是越小排前）由业务配置决定。 | 来源: sort';

-- dim_goods_category
CREATE TABLE IF NOT EXISTS dim_goods_category (
    category_id BIGINT,
    tenant_id BIGINT,
    category_name VARCHAR(50),
    alias_name VARCHAR(50),
    parent_category_id BIGINT,
    business_name VARCHAR(50),
    tenant_goods_business_id BIGINT,
    category_level INTEGER,
    is_leaf INTEGER,
    open_salesman INTEGER,
    sort_order INTEGER,
    is_warehousing INTEGER,
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (category_id)
);
COMMENT ON COLUMN dim_goods_category.category_id IS '分类节点主键。来自分类树节点的 id，在整个商品分类维度内唯一。用于在事实表中作为商品分类外键引用。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_goods_category.tenant_id IS '租户 ID（商户/品牌 ID）。当前所有节点取值相同，表示同一个租户下的分类树。事实表可通过该字段与租户维度或门店维度间接关联。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_goods_category.category_name IS '分类名称。一级大类示例：槟榔、器材、酒水、水果、零食、雪糕、香烟、其他、小吃。二级子类示例：槟榔、皮头、球杆、其他、饮料、酒水、茶水、咖啡、加料、洋酒、果盘、面、小吃等。用于前台展示和报表按细分类统计。 | 来源: category_name';
COMMENT ON COLUMN dim_goods_category.alias_name IS '分类别名。当前样例数据全部为空字符串，预留给业务方做简称或别名展示。对现阶段经营分析无影响。 | 来源: alias_name';
COMMENT ON COLUMN dim_goods_category.parent_category_id IS '父级分类 ID。根节点取值为 0，表示没有父分类；子节点取值为父分类的 id。与 category_id 共同形成树形层级关系。 | 来源: pid | 角色: 外键';
COMMENT ON COLUMN dim_goods_category.business_name IS '业务大类名称。将多个细分类归入同一业务线。观测值与一级大类相同：槟榔、器材、酒水、水果、零食、雪糕、香烟、其他、小吃。子类的 business_name 继承所属根节点的大类名称。用于按业务线汇总库存和销售。 | 来源: business_name';
COMMENT ON COLUMN dim_goods_category.tenant_goods_business_id IS '业务大类 ID。每个 business_name 对应唯一一个 tenant_goods_business_id，根节点和其下所有子节点共享同一取值。例如“酒水”大类及其子类饮料、茶水、咖啡、加料、洋酒拥有相同的业务 ID。可作为外键连接“业务线维度表”。 | 来源: tenant_goods_business_id | 角色: 外键';
COMMENT ON COLUMN dim_goods_category.category_level IS '分类层级：1 表示一级大类（pid = 0），2 表示二级子类（pid ≠ 0）。方便在报表中区分大类与子类进行分组和展示层级控制。 | 来源: 由 pid 推导';
COMMENT ON COLUMN dim_goods_category.is_leaf IS '是否叶子节点：1 表示叶子分类（categoryBoxes 为空列表），0 表示非叶子分类（存在子分类）。当前样例数据中，一级大类是非叶子节点，二级分类是叶子节点。用于树状导航或限制只能在叶子分类建商品。 | 来源: 由 categoryBoxes 推导';
COMMENT ON COLUMN dim_goods_category.open_salesman IS '营业员开关控制。枚举含义根据业务系统定义，一般设计为：1 表示启用营业员/导购相关功能，2 表示关闭或不启用。当前样例所有分类取值为 2，说明这一套分类在库存模块中统一未启用营业员逻辑。对目前的经营分析影响较小。 | 来源: open_salesman';
COMMENT ON COLUMN dim_goods_category.sort_order IS '分类排序序号。来自 sort 字段，用于前端展示顺序控制，数值越小越靠前。当前大部分分类为 0，仅少数为 1，说明排序配置较为粗略。对指标统计无实质影响。 | 来源: sort';
COMMENT ON COLUMN dim_goods_category.is_warehousing IS '是否参与库存管理。枚举：1 表示参与库存管理，0 表示不参与（如服务类商品、手工费用）。当前文件中所有分类取值为 1，表示这一份分类树只包含“走库存”的商品分类。可在库存报表中用作过滤条件。 | 来源: is_warehousing';

-- dim_groupbuy_package
CREATE TABLE IF NOT EXISTS dim_groupbuy_package (
    groupbuy_package_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    package_name VARCHAR(200),
    package_template_id BIGINT,
    selling_price NUMERIC(10,2),
    coupon_face_value NUMERIC(10,2),
    duration_seconds INTEGER,
    start_time TIMESTAMPTZ,
    end_time TIMESTAMPTZ,
    table_area_name VARCHAR(100),
    is_enabled INTEGER,
    is_delete INTEGER,
    create_time TIMESTAMPTZ,
    tenant_table_area_id_list VARCHAR(512),
    card_type_ids VARCHAR(255),
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (groupbuy_package_id)
);
COMMENT ON COLUMN dim_groupbuy_package.groupbuy_package_id IS '门店侧团购套餐主键。每条记录一个套餐定义，供团购券核销记录指向。平台验券记录中的 group_package_id 通常指向这里。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_groupbuy_package.tenant_id IS '租户（品牌/商户）ID。本数据集中全表相同，表示同一品牌。 | 来源: tenant_id | 角色: 外键（指向租户维）';
COMMENT ON COLUMN dim_groupbuy_package.site_id IS '门店 ID，本表所有记录属于同一门店。与其他 JSON 的 site_id 一致。 | 来源: site_id | 角色: 外键（指向门店维）';
COMMENT ON COLUMN dim_groupbuy_package.package_name IS '团购套餐名称，用于前台展示及核销界面，例如“早场特惠一小时”“KTV欢唱四小时”等。 | 来源: package_name';
COMMENT ON COLUMN dim_groupbuy_package.package_template_id IS '上层套餐 ID 或总部/系统级套餐 ID。多个 groupbuy_package_id 可能共享同一个 package_template_id，表示同一业务套餐在不同门店或不同版本下的配置。 | 来源: package_id | 角色: 外键（指向套餐模板维，后续可建）';
COMMENT ON COLUMN dim_groupbuy_package.selling_price IS '团购售卖价，面向顾客在外部平台的成交价格。当前样本全部为 0，实际平台售价可能在外部系统，不在本地落地。 | 来源: selling_price';
COMMENT ON COLUMN dim_groupbuy_package.coupon_face_value IS '券面值或内部结算面值。表示此套餐在门店侧可以抵扣的金额，用于验券或套餐流水时记账。例如“早场特惠一小时”可配置为 40.00，“KTV欢唱四小时”可配置为 200.00。当前样本为 0 但字段设计上非常关键。 | 来源: coupon_money';
COMMENT ON COLUMN dim_groupbuy_package.duration_seconds IS '套餐包含的时长，单位为秒。常见取值：3600 表示 1 小时，7200 表示 2 小时，14400 表示 4 小时。核销时可用于换算可用台费时长。 | 来源: duration';
COMMENT ON COLUMN dim_groupbuy_package.start_time IS '套餐整体生效开始时间。例如“2025-07-20 00:00:00”。通常从某日零点开始。 | 来源: start_time';
COMMENT ON COLUMN dim_groupbuy_package.end_time IS '套餐整体生效结束时间。在该时间点之后不可使用。极大日期（如 9999-12-31 23:59:59）可视为长期有效。 | 来源: end_time';
COMMENT ON COLUMN dim_groupbuy_package.table_area_name IS '套餐适用的门店台区名称，例如“A区中八”“B区中八”“斯诺克”“包厢”“KTV”等。主要用于展示和过滤，配合区域 ID 列实现人类可读的说明。 | 来源: table_area_name';
COMMENT ON COLUMN dim_groupbuy_package.is_enabled IS '启用状态枚举。1 表示启用或上架；2 表示停用或下架。侧重表示“配置是否上架”，与 effective_status 区分。 | 来源: is_enabled';
COMMENT ON COLUMN dim_groupbuy_package.is_delete IS '逻辑删除标志。0 表示正常；1 表示逻辑删除（数据仍保留但不再使用）。当前样本全部为 0。 | 来源: is_delete';
COMMENT ON COLUMN dim_groupbuy_package.create_time IS '套餐配置在系统中的创建时间，用于审计和版本追踪。 | 来源: create_time';
COMMENT ON COLUMN dim_groupbuy_package.tenant_table_area_id_list IS '租户级台区分组 ID 列表。当前每条记录为一个大整数（例如 2791960001957765）字符串，表示“台区分组”主键。系统通过此分组再关联到具体多个台区。 | 来源: tenant_table_area_id_list | 角色: 外键（指向台区分组维，后续可建）';
COMMENT ON COLUMN dim_groupbuy_package.card_type_ids IS '允许使用本套餐的会员卡类型 ID 列表。当前样本统一为字符串“0”，表示未限制卡种，任意顾客或任意会员卡都可使用。若未来启用，将以分隔的 ID 列表形式记录限定卡种。 | 来源: card_type_ids | 角色: 外键（潜在指向卡种维）';

-- dim_groupbuy_package_Ex
CREATE TABLE IF NOT EXISTS dim_groupbuy_package_Ex (
    groupbuy_package_id BIGINT,
    site_name VARCHAR(100),
    usable_count INTEGER,
    date_type INTEGER,
    usable_range VARCHAR(255),
    date_info VARCHAR(255),
    start_clock VARCHAR(16),
    end_clock VARCHAR(16),
    add_start_clock VARCHAR(16),
    add_end_clock VARCHAR(16),
    area_tag_type INTEGER,
    table_area_id BIGINT,
    tenant_table_area_id BIGINT,
    table_area_id_list VARCHAR(512),
    group_type INTEGER,
    system_group_type INTEGER,
    package_type INTEGER,
    effective_status INTEGER,
    max_selectable_categories INTEGER,
    creator_name VARCHAR(100),
    SCD2_start_time     TIMESTAMPTZ,
    SCD2_end_time       TIMESTAMPTZ,
    SCD2_is_current     INT,
    SCD2_version        INT,
    PRIMARY KEY (groupbuy_package_id)
);
COMMENT ON COLUMN dim_groupbuy_package_Ex.groupbuy_package_id IS '门店侧团购套餐主键。每条记录一个套餐定义，供团购券核销记录指向。平台验券记录中的 group_package_id 通常指向这里。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_groupbuy_package_Ex.site_name IS '门店名称，当前均为“朗朗桌球”。属于冗余展示字段，可用于报表标题。 | 来源: site_name';
COMMENT ON COLUMN dim_groupbuy_package_Ex.usable_count IS '可使用次数上限。当前全部为 9999999，用作“无限次使用”的哨兵值。若未来限制次数，只需配置为具体次数。 | 来源: usable_count';
COMMENT ON COLUMN dim_groupbuy_package_Ex.date_type IS '日期限制类型枚举。当前样本全部为 1。推测常见含义：1 表示“全部日期可用”；其他值可用于区分工作日、周末或指定日期等模式。 | 来源: date_type';
COMMENT ON COLUMN dim_groupbuy_package_Ex.usable_range IS '日期范围说明的文本，例如“周一至周五”等。当前全部为空字符串，实际规则由 date_type 与时间段字段控制。 | 来源: usable_range';
COMMENT ON COLUMN dim_groupbuy_package_Ex.date_info IS '更细粒度的日期信息，可能用于存储具体日期列表或节假日规则，形式可能是编码或 JSON 字符串。当前几乎全部为空，仅有极少记录为“0”。 | 来源: date_info';
COMMENT ON COLUMN dim_groupbuy_package_Ex.start_clock IS '每日可用时间段的起始时间（第一段），字符串格式 HH:MM:SS，例如“10:00:00”“00:00:00”。与 end_clock 组合定义日内时段。 | 来源: start_clock';
COMMENT ON COLUMN dim_groupbuy_package_Ex.end_clock IS '每日可用时间段的结束时间（第一段），字符串格式 HH:MM:SS。与 start_clock 共同描述第一段可用时段。 | 来源: end_clock';
COMMENT ON COLUMN dim_groupbuy_package_Ex.add_start_clock IS '附加可用时段的起始时间（第二段），格式 HH:MM:SS。当前样本常见值为“00:00:00”或“10:00:00”。用于配置早场加夜场等双时段场景。 | 来源: add_start_clock';
COMMENT ON COLUMN dim_groupbuy_package_Ex.add_end_clock IS '附加可用时段的结束时间（第二段）。常见值如“1.00:00:00”“18:00:00”“23:59:00”。其中“1.00:00:00”表示跨至次日零点，用于表示“可用到第二天凌晨”的场景。 | 来源: add_end_clock';
COMMENT ON COLUMN dim_groupbuy_package_Ex.area_tag_type IS '区域标记类型枚举。当前样本全部为 1。推测 1 表示“按台区标签限制”（如 A 区、B 区、中八、斯诺克、包厢、KTV 等）。其他取值可能对应按具体台桌或其它规则限用。 | 来源: area_tag_type';
COMMENT ON COLUMN dim_groupbuy_package_Ex.table_area_id IS '单一台区 ID。当前样本全部为 0。原始设计用于限定只能在一个具体区域使用，但由于已引入多选逻辑，实际使用已迁移到 tenant_table_area_id_list。 | 来源: table_area_id';
COMMENT ON COLUMN dim_groupbuy_package_Ex.tenant_table_area_id IS '租户级台区 ID，单值版本。当前样本全部为 0。与 table_area_id 类似，已被多选列表字段取代。 | 来源: tenant_table_area_id';
COMMENT ON COLUMN dim_groupbuy_package_Ex.table_area_id_list IS '门店级台区 ID 列表。当前样本全部为空字符串。根据命名推测原本用于存储多个 table_area_id，实际实现已转向租户维度列表字段。 | 来源: table_area_id_list';
COMMENT ON COLUMN dim_groupbuy_package_Ex.group_type IS '团购类型枚举。当前样本全部为 1。推测 1 表示“计时类/台费类套餐”。其他取值可能用于商品类套餐、代金券类等，需结合系统配置进一步确认。 | 来源: group_type';
COMMENT ON COLUMN dim_groupbuy_package_Ex.system_group_type IS '系统级团购类型枚举。当前样本全部为 1。推测 1 表示“券码类团购”，即通过券码核销。其他取值可能为卡内套餐、内部套餐等，具体含义有待业务确认。 | 来源: system_group_type';
COMMENT ON COLUMN dim_groupbuy_package_Ex.package_type IS '内部业务子类型枚举。样本中取值有 1 与 2，各占比不同。具体含义不明，可能区分不同产品线或套餐来源，例如“平台合作套餐”与“自定义套餐”等，需要参考业务文档。 | 来源: type';
COMMENT ON COLUMN dim_groupbuy_package_Ex.effective_status IS '当前有效状态枚举，由系统根据时间及配置动态计算。观测值：1 表示当前有效，可正常核销；3 表示失效或已过期（即使 is_enabled 仍为 1，也不可使用）。可用于分析时过滤失效套餐。 | 来源: effective_status';
COMMENT ON COLUMN dim_groupbuy_package_Ex.max_selectable_categories IS '最大可选择分类数或子项数，具体含义未在样本和说明中体现，当前值全部为 0。可能用于“组合型套餐”中限制可选项目数量。 | 来源: max_selectable_categories';
COMMENT ON COLUMN dim_groupbuy_package_Ex.creator_name IS '创建人名称，例如“店长:郑丽珊”。主要用于审计追踪和后台展示。 | 来源: creator_name';

-- dwd_settlement_head
CREATE TABLE IF NOT EXISTS dwd_settlement_head (
    order_settle_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    site_name VARCHAR(100),
    table_id BIGINT,
    settle_name VARCHAR(100),
    order_trade_no BIGINT,
    create_time TIMESTAMPTZ,
    pay_time TIMESTAMPTZ,
    settle_type INTEGER,
    revoke_order_id BIGINT,
    member_id BIGINT,
    member_name VARCHAR(100),
    member_phone VARCHAR(50),
    member_card_account_id BIGINT,
    member_card_type_name VARCHAR(100),
    is_bind_member BOOLEAN,
    member_discount_amount NUMERIC(18,2),
    consume_money NUMERIC(18,2),
    table_charge_money NUMERIC(18,2),
    goods_money NUMERIC(18,2),
    real_goods_money NUMERIC(18,2),
    assistant_pd_money NUMERIC(18,2),
    assistant_cx_money NUMERIC(18,2),
    adjust_amount NUMERIC(18,2),
    pay_amount NUMERIC(18,2),
    balance_amount NUMERIC(18,2),
    recharge_card_amount NUMERIC(18,2),
    gift_card_amount NUMERIC(18,2),
    coupon_amount NUMERIC(18,2),
    rounding_amount NUMERIC(18,2),
    point_amount NUMERIC(18,2),
    PRIMARY KEY (order_settle_id)
);
COMMENT ON COLUMN dwd_settlement_head.order_settle_id IS '结账记录主键 ID（订单结算 ID），全系统统一的结账单号，用于关联台费流水、助教流水、小票等明细表。 | 来源: settleList.id | 角色: 主键';
COMMENT ON COLUMN dwd_settlement_head.tenant_id IS '租户/商户 ID（品牌维度），与各业务 JSON 中的 tenantId 一致。 | 来源: settleList.tenantId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.site_id IS '门店 ID，用于关联门店维表 dim_site。 | 来源: settleList.siteId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.site_name IS '门店名称快照，冗余展示字段，推荐通过 site_id 关联维表获取标准名称。 | 来源: settleList.siteName';
COMMENT ON COLUMN dwd_settlement_head.table_id IS '结账关联的桌台 ID，对应台桌维表 dim_site_table 的主键。 | 来源: settleList.tableId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.settle_name IS '结账对象名称，一般为 “区域 + 桌号”，如 “A区 A17”，便于报表展示。 | 来源: settleList.settleName';
COMMENT ON COLUMN dwd_settlement_head.order_trade_no IS '交易号 / 订单流水号，与台费、助教等明细中的 order_trade_no 一致，用于按“交易维度”串联各业务明细。 | 来源: settleList.settleRelateId';
COMMENT ON COLUMN dwd_settlement_head.create_time IS '结账创建时间（收银端点击“确认结账”的时间），格式：YYYY-MM-DD HH:MM:SS。 | 来源: settleList.createTime';
COMMENT ON COLUMN dwd_settlement_head.pay_time IS '实际支付完成时间，通常晚于 create_time，用于资金结算及对账分析。 | 来源: settleList.payTime';
COMMENT ON COLUMN dwd_settlement_head.settle_type IS '结账类型枚举。样本中主要有：1=正常结账；3=特殊类型结账（如挂账、补单、调整单等，具体需业务确认）。 | 来源: settleList.settleType';
COMMENT ON COLUMN dwd_settlement_head.revoke_order_id IS '若当前记录属于撤销链路，记录对应的撤销单或原单的结账 ID，形成自关联关系。样本中为 0。 | 来源: settleList.revokeOrderId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.member_id IS '会员主键 ID，一般对应租户维度的会员 ID，用于关联 dim_member。 | 来源: settleList.memberId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.member_name IS '会员姓名快照，冗余展示字段；当前样本多为空，推荐通过关联会员维表获取标准姓名。 | 来源: settleList.memberName';
COMMENT ON COLUMN dwd_settlement_head.member_phone IS '会员手机号快照，冗余展示字段，通常通过会员维表获取更可靠。 | 来源: settleList.memberPhone';
COMMENT ON COLUMN dwd_settlement_head.member_card_account_id IS '会员卡账户 ID，对应 dim_member_card_account 主键；当前样本多为 0，但结构上是“结账 → 具体卡账户”的外键。 | 来源: settleList.tenantMemberCardId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head.member_card_type_name IS '会员卡类型名称快照，如“储值卡”“次卡”等，便于前端展示和报表查看。 | 来源: settleList.memberCardTypeName';
COMMENT ON COLUMN dwd_settlement_head.is_bind_member IS '本单是否绑定会员。0=否（散客）；1=是（存在 member_id）。样本中多为 0。 | 来源: settleList.isBindMember';
COMMENT ON COLUMN dwd_settlement_head.member_discount_amount IS '会员折扣产生的优惠金额（元），例如会员卡折扣减免的台费/商品金额，参与整单优惠拆分。 | 来源: settleList.memberDiscountAmount';
COMMENT ON COLUMN dwd_settlement_head.consume_money IS '本次结账消费总额（原价小计），约等于台费 + 商品 + 助教 + 服务等项目原价金额之和，未扣除任何优惠。 | 来源: settleList.consumeMoney';
COMMENT ON COLUMN dwd_settlement_head.table_charge_money IS '本单台费（桌台计费部分）的金额（原价侧）。 | 来源: settleList.tableChargeMoney';
COMMENT ON COLUMN dwd_settlement_head.goods_money IS '本单商品销售原价金额，对应酒水、小吃等商品类消费。 | 来源: settleList.goodsMoney';
COMMENT ON COLUMN dwd_settlement_head.real_goods_money IS '商品实际计入金额，通常为 goods_money 扣除部分促销/折扣之后的金额。 | 来源: settleList.realGoodsMoney';
COMMENT ON COLUMN dwd_settlement_head.assistant_pd_money IS '助教“排钟 / 点钟 / 按时长服务”等项目的应计金额（原价侧），与助教流水中的 ledger_amount 汇总对应。 | 来源: settleList.assistantPdMoney';
COMMENT ON COLUMN dwd_settlement_head.assistant_cx_money IS '助教“超休”类助教项目金额（原价侧），是对助教收入的补充拆分维度，具体业务定义需结合助教模块确认。 | 来源: settleList.assistantCxMoney';
COMMENT ON COLUMN dwd_settlement_head.adjust_amount IS '手动减免，人工调价金额汇总（整单减免或特殊价格调整），通常正值表示减免额度。 | 来源: settleList.adjustAmount';
COMMENT ON COLUMN dwd_settlement_head.pay_amount IS '本单顾客“实付金额”（不含券面值这类虚拟抵扣），等于各支付渠道金额之和减去退款等调整。 | 来源: settleList.payAmount';
COMMENT ON COLUMN dwd_settlement_head.balance_amount IS '从会员储值余额账户中扣除的金额（储值卡消费部分）。 | 来源: settleList.balanceAmount';
COMMENT ON COLUMN dwd_settlement_head.recharge_card_amount IS '充值卡支付金额（使用充值类卡片余额支付的金额），与储值/充值型卡资金来源相关。 | 来源: settleList.rechargeCardAmount';
COMMENT ON COLUMN dwd_settlement_head.gift_card_amount IS '礼品卡或代金卡支付金额。 | 来源: settleList.giftCardAmount';
COMMENT ON COLUMN dwd_settlement_head.coupon_amount IS '本单由优惠券（团购券、代金券等）实际抵扣的金额。 | 来源: settleList.couponAmount';
COMMENT ON COLUMN dwd_settlement_head.rounding_amount IS '抹零 / 四舍五入产生的金额差值，例如按角、分抹零。 | 来源: settleList.roundingAmount';
COMMENT ON COLUMN dwd_settlement_head.point_amount IS '积分相关金额或数量。根据系统配置可能表示“使用积分抵扣的金额”或“本单获得的积分折算金额”，文档未给出唯一定义。 | 来源: settleList.pointAmount';

-- dwd_settlement_head_Ex
CREATE TABLE IF NOT EXISTS dwd_settlement_head_Ex (
    order_settle_id BIGINT,
    serial_number INTEGER,
    settle_status INTEGER,
    can_be_revoked BOOLEAN,
    revoke_order_name VARCHAR(100),
    revoke_time TIMESTAMPTZ,
    is_first_order BOOLEAN,
    service_money NUMERIC(18,2),
    cash_amount NUMERIC(18,2),
    card_amount NUMERIC(18,2),
    online_amount NUMERIC(18,2),
    refund_amount NUMERIC(18,2),
    prepay_money NUMERIC(18,2),
    payment_method INTEGER,
    coupon_sale_amount NUMERIC(18,2),
    all_coupon_discount NUMERIC(18,2),
    goods_promotion_money NUMERIC(18,2),
    assistant_promotion_money NUMERIC(18,2),
    activity_discount NUMERIC(18,2),
    assistant_manual_discount NUMERIC(18,2),
    point_discount_price NUMERIC(18,2),
    point_discount_cost NUMERIC(18,2),
    is_use_coupon BOOLEAN,
    is_use_discount BOOLEAN,
    is_activity BOOLEAN,
    operator_name VARCHAR(100),
    salesman_name VARCHAR(100),
    order_remark VARCHAR(255),
    operator_id BIGINT,
    salesman_user_id BIGINT,
    PRIMARY KEY (order_settle_id)
);
COMMENT ON COLUMN dwd_settlement_head_Ex.order_settle_id IS '结账记录主键 ID（订单结算 ID），全系统统一的结账单号，用于关联台费流水、助教流水、小票等明细表。 | 来源: settleList.id | 角色: 主键';
COMMENT ON COLUMN dwd_settlement_head_Ex.serial_number IS '结账序列号或打印序号，当前样本全部为 0，具体业务用途未在文档中明确。 | 来源: settleList.serialNumber';
COMMENT ON COLUMN dwd_settlement_head_Ex.settle_status IS '结账状态枚举。当前样本值均为 2，表示“已结算/已完成”；其他取值及含义未在样本和文档中出现，需后续补充。 | 来源: settleList.settleStatus';
COMMENT ON COLUMN dwd_settlement_head_Ex.can_be_revoked IS '本单是否仍允许撤销/冲正。0=否；1=是。样本中均为 0。主要用于运维控制，分析价值有限。 | 来源: settleList.canBeRevoked';
COMMENT ON COLUMN dwd_settlement_head_Ex.revoke_order_name IS '撤销单名称/标识，用于人工识别撤销关系；当前样本为空。 | 来源: settleList.revokeOrderName';
COMMENT ON COLUMN dwd_settlement_head_Ex.revoke_time IS '撤销时间。无撤销时通常为系统默认值（如 0001-01-01 00:00:00）。 | 来源: settleList.revokeTime';
COMMENT ON COLUMN dwd_settlement_head_Ex.is_first_order IS '是否首单（新客首单）标记。0=否；1=是。当前样本全部为 0，且文档中说明为“推测用途”，具体业务定义需确认。 | 来源: settleList.isFirst';
COMMENT ON COLUMN dwd_settlement_head_Ex.service_money IS '其他服务费金额（如包间服务费等），用于与台费、商品、助教金额区分。 | 来源: settleList.serviceMoney';
COMMENT ON COLUMN dwd_settlement_head_Ex.cash_amount IS '现金支付金额。 | 来源: settleList.cashAmount';
COMMENT ON COLUMN dwd_settlement_head_Ex.card_amount IS '刷卡类支付金额（如银行卡/信用卡等），具体包含哪些通道需结合支付模块确认。 | 来源: settleList.cardAmount';
COMMENT ON COLUMN dwd_settlement_head_Ex.online_amount IS '线上支付金额汇总（如微信、支付宝、云闪付等），不区分具体通道。 | 来源: settleList.onlineAmount';
COMMENT ON COLUMN dwd_settlement_head_Ex.refund_amount IS '本单涉及的退款金额（元）。普通正常结账为 0，退单或部分退款时为正数。 | 来源: settleList.refundAmount';
COMMENT ON COLUMN dwd_settlement_head_Ex.prepay_money IS '本单使用的预付金/定金金额。 | 来源: settleList.prepayMoney';
COMMENT ON COLUMN dwd_settlement_head_Ex.payment_method IS '支付方式整体标记（枚举）。当前样本值统一为 0，具体各枚举值对应的支付方式未在文档中说明，需业务确认。 | 来源: settleList.paymentMethod';
COMMENT ON COLUMN dwd_settlement_head_Ex.coupon_sale_amount IS '优惠券本身的售卖金额/成本金额（例如顾客为购买套餐券支付的金额），当前样本多为 0。 | 来源: settleList.couponSaleAmount';
COMMENT ON COLUMN dwd_settlement_head_Ex.all_coupon_discount IS '所有券类优惠折扣的汇总金额，用于统计“券优惠总额”。 | 来源: settleList.allCouponDiscount';
COMMENT ON COLUMN dwd_settlement_head_Ex.goods_promotion_money IS '商品促销产生的优惠金额（如满减、买赠均摊到商品部分）。 | 来源: settleList.goodsPromotionMoney';
COMMENT ON COLUMN dwd_settlement_head_Ex.assistant_promotion_money IS '助教项目参与活动/促销产生的优惠金额。 | 来源: settleList.assistantPromotionMoney';
COMMENT ON COLUMN dwd_settlement_head_Ex.activity_discount IS '整单活动折扣金额（如整单打折、满减活动产生的优惠），不区分具体项目类别。 | 来源: settleList.activityDiscount';
COMMENT ON COLUMN dwd_settlement_head_Ex.assistant_manual_discount IS '针对助教服务的人工减免金额，与一般商品/台费折扣区分开。 | 来源: settleList.assistantManualDiscount';
COMMENT ON COLUMN dwd_settlement_head_Ex.point_discount_price IS '积分抵扣对应的金额（售价侧），记录因积分使用而减少的应收金额。 | 来源: settleList.pointDiscountPrice';
COMMENT ON COLUMN dwd_settlement_head_Ex.point_discount_cost IS '积分抵扣对应的成本金额（成本侧），用于毛利和利润分析。 | 来源: settleList.pointDiscountCost';
COMMENT ON COLUMN dwd_settlement_head_Ex.is_use_coupon IS '是否使用优惠券。0=未使用；1=使用。当前样本均为 0。 | 来源: settleList.isUseCoupon';
COMMENT ON COLUMN dwd_settlement_head_Ex.is_use_discount IS '是否使用折扣（包括会员折扣或其他整单折扣）。0=未使用；1=使用。当前样本多为 0。 | 来源: settleList.isUseDiscount';
COMMENT ON COLUMN dwd_settlement_head_Ex.is_activity IS '是否参与营销活动。0=未参与；1=参与。 | 来源: settleList.isActivity';
COMMENT ON COLUMN dwd_settlement_head_Ex.operator_name IS '结账操作员名称快照（通常带角色前缀，如“收银员:张三”），用于报表展示。 | 来源: settleList.operatorName';
COMMENT ON COLUMN dwd_settlement_head_Ex.salesman_name IS '营业员/业务员名称，用于业绩归属及提成分析；样本中多为空。 | 来源: settleList.salesManName';
COMMENT ON COLUMN dwd_settlement_head_Ex.order_remark IS '订单备注，由收银员手工填写的文字说明，如特殊情况、赠送原因等，主要用于人工复盘。 | 来源: settleList.orderRemark';
COMMENT ON COLUMN dwd_settlement_head_Ex.operator_id IS '结账操作员用户 ID，用于关联员工/账号维度（如 dim_staff）。 | 来源: settleList.operatorId | 角色: 外键';
COMMENT ON COLUMN dwd_settlement_head_Ex.salesman_user_id IS '营业员用户 ID，可关联员工维度，用于业绩分析和提成计算。 | 来源: settleList.salesManUserId | 角色: 外键';

-- dwd_table_fee_log
CREATE TABLE IF NOT EXISTS dwd_table_fee_log (
    table_fee_log_id BIGINT,
    order_trade_no BIGINT,
    order_settle_id BIGINT,
    order_pay_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    site_table_id BIGINT,
    site_table_area_id BIGINT,
    site_table_area_name VARCHAR(64),
    tenant_table_area_id BIGINT,
    member_id BIGINT,
    ledger_name VARCHAR(64),
    ledger_unit_price NUMERIC(18,2),
    ledger_count INTEGER,
    ledger_amount NUMERIC(18,2),
    real_table_charge_money NUMERIC(18,2),
    coupon_promotion_amount NUMERIC(18,2),
    member_discount_amount NUMERIC(18,2),
    adjust_amount NUMERIC(18,2),
    real_table_use_seconds INTEGER,
    add_clock_seconds INTEGER,
    start_use_time TIMESTAMPTZ,
    ledger_end_time TIMESTAMPTZ,
    create_time TIMESTAMPTZ,
    ledger_status INTEGER,
    is_single_order INTEGER,
    is_delete INTEGER,
    PRIMARY KEY (table_fee_log_id)
);
COMMENT ON COLUMN dwd_table_fee_log.table_fee_log_id IS '台费流水记录主键。每一条台费使用记录唯一一条。对应一次“台费计费单元”。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_table_fee_log.order_trade_no IS '订单交易号。整笔订单的主编号，用于把同一订单下的台费、商品、助教等多种明细串联在一起。可与支付记录中的交易号对应。 | 来源: order_trade_no | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.order_settle_id IS '结算单号 / 结账 ID。对应一次完整的结账操作。与 dwd_settlement_head 的主键关联。 | 来源: order_settle_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.order_pay_id IS '订单支付记录 ID。对应支付记录中的 id 或 relate_id（视具体模型）。用于追踪这条台费最终对应哪一条支付流水。 | 来源: order_pay_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.tenant_id IS '租户 / 品牌 ID。本文件内所有记录属于同一租户。与其他表的 tenant_id 一致，用于品牌级过滤。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.site_id IS '门店 ID。当前样本为同一门店。与嵌套的 siteProfile.id 以及其他 JSON 中的 site_id 对应，用于门店维度关联。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.site_table_id IS '桌台 ID。对应“台桌基础表”的主键。用于确定具体哪一张台或包厢。 | 来源: site_table_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.site_table_area_id IS '门店内“台桌区域” ID（门店视角的区域，如 A 区、B 区、斯诺克区、包厢区）。与门店内部的区域维度对应。 | 来源: site_table_area_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.site_table_area_name IS '台桌区域名称，如 “A区”“B区”“斯诺克区”“VIP包厢” 等。主要用于报表展示和人工阅读。 | 来源: site_table_area_name | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.tenant_table_area_id IS '租户层面的台桌区域 ID。用于品牌层统一定义的区域配置（一个区域可在多门店复用）。对应租户级区域维度。 | 来源: tenant_table_area_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.member_id IS '会员 ID。多数为 0 表示散客。非 0 时表示关联会员：0 表示散客或未使用会员；>0 对应会员档案中的 id。用于将台费流水关联到 dim_member。 | 来源: member_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log.ledger_name IS '台号名称，例如 “A1”“A2”“S1”“VIP包厢” 等。等价于桌台维表中的展示名称，冗余在流水中作为快照。 | 来源: ledger_name | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.ledger_unit_price IS '台费结算时的计费单价（元/小时或元/单位时长）。与 ledger_count 配合计算原始应收台费。常见值如 48.0、58.0、68.0、88.0、98.0、116.0 等。 | 来源: ledger_unit_price | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.ledger_count IS '计费时长单位数。与 ledger_unit_price 共同决定原始应收额。可与 real_table_use_seconds 换算关系约为：时长秒数 ≈ ledger_count × 计费粒度（例如 30 分钟、60 分钟）。 | 来源: ledger_count | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.ledger_amount IS '原始应收台费金额，按单价与计费时长计算出来的台费金额，尚未考虑会员、券、调账等各类优惠拆分。 | 来源: ledger_amount | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.real_table_charge_money IS '实际向顾客收取的台费金额（现金 / 实付维度），不含券方承担、会员承担和内部调账部分。若为 0，则该笔台费完全由券、会员或内部调账承担。 | 来源: real_table_charge_money | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.coupon_promotion_amount IS '由优惠券、活动、团购等促销承担的优惠金额，直接抵扣在台费上。常见值为与单价或整倍数相同，例如 48.0、96.0、136.0、144.0 等。若 real_table_charge_money 为 0 且该字段等于 ledger_amount，说明台费完全由促销承担。 | 来源: coupon_promotion_amount | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.member_discount_amount IS '由会员权益产生的优惠金额，例如会员折扣、会员免费台等。若 ledger_amount = real_table_charge_money = member_discount_amount，表示这笔台费由会员权益承担，但仍作为台费收入进行记录。 | 来源: member_discount_amount | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.adjust_amount IS '手动减免，调整金额 / 调账金额。用于将台费金额转移或冲减到其他项目（例如套餐、包厢统一计费）或做手工调整。若 ledger_amount 完全被 adjust_amount 抵消，则说明该笔台费被整体调出当前台费科目。 | 来源: adjust_amount | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.real_table_use_seconds IS '台费实际计费时长（秒）。用于计算台费单价与费率分析。内部统一以秒为单位。 | 来源: real_table_use_seconds | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.add_clock_seconds IS '加钟时长（秒）。在原有使用基础上追加的累计加钟时长，常见为 2400、4200 等 60 的倍数（对应 40 分钟、70 分钟等）。 | 来源: add_clock_seconds | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.start_use_time IS '台开始使用时间，即实际开台时间。与 ledger_start_time 相同，表示计费起算点。 | 来源: start_use_time | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.ledger_end_time IS '台账计费结束时间。通常与 last_use_time 相差 1 秒。可理解为系统为计费进行的截断时刻。 | 来源: ledger_end_time | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.create_time IS '台费流水记录创建时间，通常接近结账时间。用于区分计费期间与结账时间。 | 来源: create_time | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.ledger_status IS '台费状态。样本中全部为 1。含义：1 表示正常已结算台费。按命名推断，0 可能表示未结算，2 可能表示作废或撤销，需要结合后续数据确认。 | 来源: ledger_status | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.is_single_order IS '是否独立计费单元。枚举：1 表示该记录是独立结算的桌费；0 表示非独立结算条目（可能是合并结账、转台过程中的占位记录）。is_single_order = 0 的记录通常 ledger_count 与 real_table_use_seconds 为 0。 | 来源: is_single_order | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log.is_delete IS '逻辑删除标志。0 表示未删除（有效记录）；1 表示已逻辑删除（一般不参与统计）。当前样本全部为 0。 | 来源: is_delete | 角色: 无';

-- dwd_table_fee_log_Ex
CREATE TABLE IF NOT EXISTS dwd_table_fee_log_Ex (
    table_fee_log_id BIGINT,
    operator_name VARCHAR(64),
    salesman_name VARCHAR(64),
    used_card_amount NUMERIC(18,2),
    service_money NUMERIC(18,2),
    mgmt_fee NUMERIC(18,2),
    fee_total NUMERIC(18,2),
    ledger_start_time TIMESTAMPTZ,
    last_use_time TIMESTAMPTZ,
    operator_id BIGINT,
    salesman_user_id BIGINT,
    salesman_org_id BIGINT,
    PRIMARY KEY (table_fee_log_id)
);
COMMENT ON COLUMN dwd_table_fee_log_Ex.table_fee_log_id IS '台费流水记录主键。每一条台费使用记录唯一一条。对应一次“台费计费单元”。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_table_fee_log_Ex.operator_name IS '操作员姓名。为冗余展示字段，便于直接阅读而不必联表员工档案。 | 来源: operator_name | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.salesman_name IS '营业员姓名。当前样本为空。用于需要对营业员维度做业绩统计时作为冗余展示。 | 来源: salesman_name | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.used_card_amount IS '由储值卡、次卡等“卡内余额”直接抵扣到台费的金额。当前样本为 0，但语义明确，用于区分“卡扣款”与“现金收款”。 | 来源: used_card_amount | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.service_money IS '服务费 / 成本 /分成金额字段，类似助教流水里的 service_money。当前样本全为 0，门店未启用该字段，未来可能用于台费附加服务费或分成计算。 | 来源: service_money | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.mgmt_fee IS '管理费字段。当前样本为 0。推测用于未来支持“台费附加管理费”功能。尚未实际启用。 | 来源: mgmt_fee | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.fee_total IS '附加费用合计值字段。当前样本为 0。设计上用于汇总管理费、服务费等附加费用。尚未实际启用。 | 来源: fee_total | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.ledger_start_time IS '台账计费起始时间。当前样本与 start_use_time 相同，表示计费与开台同时开始。 | 来源: ledger_start_time | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.last_use_time IS '最后使用 / 操作时间，通常略晚于 ledger_end_time。可视为客人最后一次用台或最后一次加钟/操作的时间点。 | 来源: last_use_time | 角色: 无';
COMMENT ON COLUMN dwd_table_fee_log_Ex.operator_id IS '操作员 ID。负责开台 / 结账的员工账号 ID。与员工 / 账号体系中的用户 ID 对应。 | 来源: operator_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log_Ex.salesman_user_id IS '营业员用户 ID。目前样本值为 0，表示门店暂未使用此字段做提成员工归属，但语义清晰。 | 来源: salesman_user_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_log_Ex.salesman_org_id IS '营业员所属机构 / 部门 ID。目前样本为 0。用于员工组织结构统计时的归属。 | 来源: salesman_org_id | 角色: 外键';

-- dwd_table_fee_adjust
CREATE TABLE IF NOT EXISTS dwd_table_fee_adjust (
    table_fee_adjust_id BIGINT,
    order_trade_no BIGINT,
    order_settle_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    table_id BIGINT,
    table_area_id BIGINT,
    table_area_name VARCHAR(64),
    tenant_table_area_id BIGINT,
    ledger_amount NUMERIC(18,2),
    ledger_status INTEGER,
    is_delete INTEGER,
    adjust_time TIMESTAMPTZ,
    PRIMARY KEY (table_fee_adjust_id)
);
COMMENT ON COLUMN dwd_table_fee_adjust.table_fee_adjust_id IS '台费折扣 / 调整流水主键；一条台费打折或调账操作对应一条记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_table_fee_adjust.order_trade_no IS '订单交易号；与台费流水、结账记录等表中的同名字段一致，用于把本次台费调整挂到具体订单上。 | 来源: order_trade_no | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.order_settle_id IS '结算单 / 小票 ID；与小票、结账头表中的 order_settle_id 对应，用于关联同一次结账。 | 来源: order_settle_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.tenant_id IS '租户 / 品牌 ID；标识该记录属于哪一个商户。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.site_id IS '门店 ID；与 dim_site、其它业务事实表中的 site_id 一致。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.table_id IS '台桌 ID；与 dim_table（site_tables_master.id）以及各类台费、助教流水中的 site_table_id 对应，标识哪一张台发生了折扣/调账。 | 来源: site_table_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.table_area_id IS '门店维度的台桌区域 ID；与 dim_table 中的 site_table_area_id 对应，例如 “斯诺克区”“VIP包厢”等区域。 | 来源: tableProfile.site_table_area_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.table_area_name IS '台桌区域名称快照，例如 “斯诺克区”“A区”“VIP包厢”；冗余展示字段，可从 dim_table 通过 table_area_id 获取。 | 来源: tableProfile.site_table_area_name';
COMMENT ON COLUMN dwd_table_fee_adjust.tenant_table_area_id IS '租户维度的“台桌区域 ID”；同一租户下跨门店复用的区域标识，用于在租户级别统计各区域的折扣分布。 | 来源: tenant_table_area_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust.ledger_amount IS '台费调整金额；等于台费流水中对应记录的 adjust_amount。正数表示被减免/调账掉的台费金额（本批数据全部为正）；是衡量台费折扣规模的核心度量。 | 来源: ledger_amount';
COMMENT ON COLUMN dwd_table_fee_adjust.ledger_status IS '调整记录状态（枚举）。1：生效调整（当前有效的折扣/调账记录）；0：失效/被覆盖的历史记录（同一订单有多次调整时，旧记录会标记为 0，仅最新一条为 1）。 | 来源: ledger_status';
COMMENT ON COLUMN dwd_table_fee_adjust.is_delete IS '逻辑删除标记（枚举）。0：未删除（有效记录）；1：已逻辑删除（后台标记删除，不再参与业务统计）。当前数据全部为 0，但字段需保留以适配长期数据。 | 来源: is_delete';
COMMENT ON COLUMN dwd_table_fee_adjust.adjust_time IS '台费调整记录创建时间，即打折/调账操作被系统写入的时间戳，用于时间分析和与结账时间对比（判断是事前折扣还是事后调账）。 | 来源: create_time';

-- dwd_table_fee_adjust_Ex
CREATE TABLE IF NOT EXISTS dwd_table_fee_adjust_Ex (
    table_fee_adjust_id BIGINT,
    adjust_type INTEGER,
    ledger_count INTEGER,
    ledger_name VARCHAR(128),
    applicant_name VARCHAR(64),
    operator_name VARCHAR(64),
    applicant_id BIGINT,
    operator_id BIGINT,
    PRIMARY KEY (table_fee_adjust_id)
);
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.table_fee_adjust_id IS '台费折扣 / 调整流水主键；一条台费打折或调账操作对应一条记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.adjust_type IS '调整类型（枚举）。当前数据全部为 1。取值示例：1：台费打折 / 台费减免（本门店实际使用的唯一类型）；其他值：预留给台费转移、误操作恢复等其他类型（当前未出现，仅推测）。 | 来源: adjust_type';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.ledger_count IS '调整次数计数，本数据中恒为 1，表示“一次调整事件”；与台费流水中的 ledger_count（计时长）含义不同。 | 来源: ledger_count';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.ledger_name IS '调账项目名称或打折原因名称（设计意图）；当前门店所有记录值为空字符串，未实际使用。作用暂不明确，保留以备后续业务启用。 | 来源: ledger_name';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.applicant_name IS '申请人姓名快照，通常包含角色前缀（如 “收银员:张三”）；是 applicant_id 的冗余展示字段，实际名称应以员工维表为准。 | 来源: applicant_name';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.operator_name IS '操作员姓名快照；与 operator_id 对应的姓名冗余字段。 | 来源: operator_name';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.applicant_id IS '申请人 ID；发起本次台费折扣/调账的员工账号 ID，用于按员工维度统计折扣行为。 | 来源: applicant_id | 角色: 外键';
COMMENT ON COLUMN dwd_table_fee_adjust_Ex.operator_id IS '实际执行调账操作的操作员 ID；当前样本中与 applicant_id 相同，但模型上允许“申请人 ≠ 操作人”。 | 来源: operator_id | 角色: 外键';

-- dwd_store_goods_sale
CREATE TABLE IF NOT EXISTS dwd_store_goods_sale (
    store_goods_sale_id BIGINT,
    order_trade_no BIGINT,
    order_settle_id BIGINT,
    order_pay_id BIGINT,
    order_goods_id BIGINT,
    site_id BIGINT,
    tenant_id BIGINT,
    site_goods_id BIGINT,
    tenant_goods_id BIGINT,
    tenant_goods_category_id BIGINT,
    tenant_goods_business_id BIGINT,
    site_table_id BIGINT,
    ledger_name VARCHAR(200),
    ledger_group_name VARCHAR(100),
    ledger_unit_price NUMERIC(18,2),
    ledger_count INTEGER,
    ledger_amount NUMERIC(18,2),
    discount_price NUMERIC(18,2),
    real_goods_money NUMERIC(18,2),
    cost_money NUMERIC(18,2),
    ledger_status INTEGER,
    is_delete INTEGER,
    create_time TIMESTAMPTZ,
    PRIMARY KEY (store_goods_sale_id)
);
COMMENT ON COLUMN dwd_store_goods_sale.store_goods_sale_id IS '商品销售明细主键；每条记录代表一次订单中的一个商品行流水。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_store_goods_sale.order_trade_no IS '订单交易号（业务单号）；与台费、助教、团购等表的 order_trade_no 一致，用于把同一订单下各类消费串联起来。 | 来源: order_trade_no | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.order_settle_id IS '结账记录主键 ID；连接结账记录 / 结算头事实表。 | 来源: order_settle_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.order_pay_id IS '支付记录 ID；连接支付流水事实表，用于还原本条销售对应的收款信息。 | 来源: order_pay_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.order_goods_id IS '当前版本的订单内商品明细 ID；可在订单范围内唯一定位该商品行，用于与小票明细等做行级关联。 | 来源: order_goods_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.site_id IS '门店 ID（系统主键）；与其它流水表中的 site_id 一致。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.tenant_id IS '租户/品牌 ID；同一品牌下多门店共享同一个 tenant_id。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.site_goods_id IS '门店级商品 ID；连接门店商品档案 dim_store_goods，与库存变动记录中的 siteGoodsId 一致。 | 来源: site_goods_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.tenant_goods_id IS '租户级（品牌级）商品 ID；连接租户级商品档案维度表，一个 tenant_goods_id 在不同门店可对应多个 site_goods_id。 | 来源: tenant_goods_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.tenant_goods_category_id IS '租户级商品一级分类 ID；连接商品分类维度（如酒水、零食等）。 | 来源: tenant_goods_category_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.tenant_goods_business_id IS '租户级商品业务大类 ID（更高一层的业务分类，如“零食类”“酒水类”等）。 | 来源: tenant_goods_business_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.site_table_id IS '球台 ID；非 0 表示该商品在某张台桌上点单，0 表示前台售卖或与台桌无关。连接台桌维度 dim_table。 | 来源: site_table_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_name IS '销售项目名称（商品名），如“哇哈哈矿泉水”“地道肠”等；为当时销售时刻的名称快照。 | 来源: ledger_name';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_group_name IS '门店前台菜单分组名称，如“酒水”“零食”“小吃”等；与品牌统一分类是两套维度。 | 来源: ledger_group_name';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_unit_price IS '结算单价（元/单位）；本次销售实际使用的单价。 | 来源: ledger_unit_price';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_count IS '销售数量（以商品单位计），如 1、2、6、36 等。 | 来源: ledger_count';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_amount IS '原始应收金额（未考虑任何折扣/抵扣），通常接近 ledger_unit_price × ledger_count。 | 来源: ledger_amount';
COMMENT ON COLUMN dwd_store_goods_sale.discount_price IS '折后单价（元/单位）；无折扣时等于 ledger_unit_price，有折扣时小于 ledger_unit_price。 | 来源: discount_price';
COMMENT ON COLUMN dwd_store_goods_sale.real_goods_money IS '本行商品实际入账金额（已考虑折扣及其他抵扣后，实际计入营业额的金额）；一定不大于 ledger_amount。 | 来源: real_goods_money';
COMMENT ON COLUMN dwd_store_goods_sale.cost_money IS '本行商品对应的成本金额，用于毛利和利润分析；源自商品档案成本价及成本核算逻辑。 | 来源: cost_money';
COMMENT ON COLUMN dwd_store_goods_sale.ledger_status IS '销售流水状态：1=正常有效；其他数值（当前数据未出现）一般表示“待结算”“作废”等。 | 来源: ledger_status';
COMMENT ON COLUMN dwd_store_goods_sale.is_delete IS '逻辑删除标志：0=正常有效；1=已删除（仅保留历史，不再参与前端展示及统计）（本批数据全部为 0）。 | 来源: is_delete';
COMMENT ON COLUMN dwd_store_goods_sale.create_time IS '销售记录创建时间，通常为结账时间或录入时间；用于时间维度分析，与订单层时间字段对齐。 | 来源: create_time';

-- dwd_store_goods_sale_Ex
CREATE TABLE IF NOT EXISTS dwd_store_goods_sale_Ex (
    store_goods_sale_id BIGINT,
    legacy_order_goods_id BIGINT,
    site_name TEXT,
    legacy_site_id BIGINT,
    goods_remark TEXT,
    option_value_name TEXT,
    operator_name TEXT,
    open_salesman_flag INTEGER,
    salesman_user_id BIGINT,
    salesman_name TEXT,
    salesman_role_id BIGINT,
    salesman_org_id BIGINT,
    discount_money NUMERIC(18,2),
    returns_number INTEGER,
    coupon_deduct_money NUMERIC(18,2),
    member_discount_amount NUMERIC(18,2),
    point_discount_money NUMERIC(18,2),
    point_discount_money_cost NUMERIC(18,2),
    package_coupon_id BIGINT,
    order_coupon_id BIGINT,
    member_coupon_id BIGINT,
    option_price NUMERIC(18,2),
    option_member_discount_money NUMERIC(18,2),
    option_coupon_deduct_money NUMERIC(18,2),
    push_money NUMERIC(18,2),
    is_single_order INTEGER,
    sales_type INTEGER,
    operator_id BIGINT
);
COMMENT ON COLUMN dwd_store_goods_sale_Ex.store_goods_sale_id IS '商品销售明细主键；每条记录代表一次订单中的一个商品行流水。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.legacy_order_goods_id IS '旧版订单商品明细 ID，兼容字段；当前接口已统一使用 order_goods_id，本批数据全部为 0。 | 来源: orderGoodsId';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.site_name IS '门店名称，对 site_id 的冗余文本（例如“朗朗桌球”），用于展示。 | 来源: siteName';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.legacy_site_id IS '历史兼容门店 ID；当前接口统一使用 site_id，本批数据 siteId 全部为 0。 | 来源: siteId';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.goods_remark IS '商品备注/口味说明/特殊说明；部分记录为空，部分与商品名相同。 | 来源: goods_remark';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.option_value_name IS '商品选项名称（规格/口味，如大杯/小杯、不加冰等）；当前门店未启用多规格，样本中全部为空。 | 来源: option_value_name';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.operator_name IS '操作员姓名冗余，如“收银员:郑丽珊”；用于展示，不作为关联键。 | 来源: operator_name';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.open_salesman_flag IS '是否启用营业员机制标志：1=启用营业员/提成体系（需指定 salesman_* 字段）；2=未启用营业员体系（本批数据全部为 2）。 | 来源: openSalesman';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_user_id IS '营业员用户 ID（系统账号 ID）；当前样本全部为 0，说明门店未启用营业员业绩统计。 | 来源: salesman_user_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_name IS '营业员姓名；当前样本全部为空字符串。 | 来源: salesman_name';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_role_id IS '营业员角色 ID（例如某角色代码对应“销售员”角色）；当前样本全部为 0。 | 来源: salesman_role_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_org_id IS '营业员所属组织/部门 ID；当前样本全部为 0，未启用按组织分组统计。 | 来源: sales_man_org_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.discount_money IS '本行商品的直接价格优惠金额（打折让利部分）；在简单场景下满足：ledger_amount − discount_money ≈ real_goods_money（不含积分、券抵扣）。 | 来源: discount_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.returns_number IS '退货数量；当前样本全部为 0，如发生退货则记录退回的件数。 | 来源: returns_number';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.coupon_deduct_money IS '优惠券/团购券直接抵扣到本条商品明细上的金额；当前样本为 0，说明券更多在订单级处理。 | 来源: coupon_deduct_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.member_discount_amount IS '由会员折扣针对本行商品产生的优惠金额；当前样本全部为 0，折扣通常体现在 discount_money 中。 | 来源: member_discount_amount';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.point_discount_money IS '由积分抵扣的金额（顾客用积分兑换的抵现金额）。 | 来源: point_discount_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.point_discount_money_cost IS '积分抵扣对应的成本金额（积分成本、营销费用等核算用）。 | 来源: point_discount_money_cost';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.package_coupon_id IS '套餐券 ID；当商品来自套餐拆分或与套餐券关联时，用于追溯对应的套餐业务（当前样本为 0）。 | 来源: package_coupon_id';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.order_coupon_id IS '订单级优惠券 ID；整单使用某张券时，可用于记录该券对本行商品的分摊关系（当前样本为 0）。 | 来源: order_coupon_id';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.member_coupon_id IS '会员券 ID（如会员专享优惠券）；当前样本为 0，为会员权益预留字段。 | 来源: member_coupon_id';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.option_price IS '商品选项（规格/加料等）的附加价格；当前门店未启用此功能，样本为 0。 | 来源: option_price';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.option_member_discount_money IS '由会员折扣作用在“选项价格”上的优惠金额；当前样本为 0。 | 来源: option_member_discount_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.option_coupon_deduct_money IS '由优惠券抵扣“选项价格”的金额；当前样本为 0。 | 来源: option_coupon_deduct_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.push_money IS '本行商品对应的提成金额（营业员/业务员提成）；当前样本为 0，说明提成体系未启用。 | 来源: push_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.is_single_order IS '是否作为独立明细参与订单结算：1=作为独立明细参与订单；0=在特殊业务中可能合并为打包项目（当前样本全部为 1）。 | 来源: is_single_order';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.sales_type IS '销售类型：1=正常销售（当前样本全部为 1）；常见扩展用法：2=赠品；3=内部消耗；4=盘点调整等。 | 来源: sales_type';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.operator_id IS '操作员 ID（录入本条销售的员工）；与其它流水中的 operator_id 一致，可统一做员工维度分析。 | 来源: operator_id | 角色: 外键';

-- dwd_assistant_service_log
CREATE TABLE IF NOT EXISTS dwd_assistant_service_log (
    assistant_service_id BIGINT,
    order_trade_no BIGINT,
    order_settle_id BIGINT,
    order_pay_id BIGINT,
    order_assistant_id BIGINT,
    order_assistant_type INTEGER,
    tenant_id BIGINT,
    site_id BIGINT,
    site_table_id BIGINT,
    tenant_member_id BIGINT,
    system_member_id BIGINT,
    assistant_no VARCHAR(64),
    nickname VARCHAR(64),
    site_assistant_id BIGINT,
    user_id BIGINT,
    assistant_team_id BIGINT,
    person_org_id BIGINT,
    assistant_level INTEGER,
    level_name VARCHAR(64),
    skill_id BIGINT,
    skill_name VARCHAR(64),
    ledger_unit_price NUMERIC(10,2),
    ledger_amount NUMERIC(10,2),
    projected_income NUMERIC(10,2),
    coupon_deduct_money NUMERIC(10,2),
    income_seconds INTEGER,
    real_use_seconds INTEGER,
    add_clock INTEGER,
    create_time TIMESTAMPTZ,
    start_use_time TIMESTAMPTZ,
    last_use_time TIMESTAMPTZ,
    is_delete INTEGER,
    PRIMARY KEY (assistant_service_id)
);
COMMENT ON COLUMN dwd_assistant_service_log.assistant_service_id IS '助教服务流水主键，系统内唯一标识一次助教服务记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_assistant_service_log.order_trade_no IS '订单交易号，用于与台费、商品、支付等同一订单下的其他明细串联。 | 来源: order_trade_no | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.order_settle_id IS '结算单号，对应结账记录、小票中的结算主键。 | 来源: order_settle_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.order_pay_id IS '支付记录主键 ID，用于关联支付流水。 | 来源: order_pay_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.order_assistant_id IS '订单中“助教项目明细”的内部 ID，一笔订单中多段助教服务时用于区分。 | 来源: order_assistant_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.order_assistant_type IS '助教服务类型枚举：1 表示常规助教服务（如基础课）；2 表示附加类助教服务（如附加课）；其他值预留。 | 来源: order_assistant_type';
COMMENT ON COLUMN dwd_assistant_service_log.tenant_id IS '租户/品牌 ID，用于区分商户。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.site_id IS '门店 ID，对应门店维表中的门店主键。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.site_table_id IS '球台/包厢 ID，对应台桌维表主键。 | 来源: site_table_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.tenant_member_id IS '商户维度会员 ID，对应会员档案主键；0 表示非会员或散客。 | 来源: tenant_member_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.system_member_id IS '系统级会员 ID，用于跨门店识别同一会员。 | 来源: system_member_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.assistant_no IS '助教编号/工号，如 “27”；与助教档案中的工号一致。 | 来源: assistantNo';
COMMENT ON COLUMN dwd_assistant_service_log.nickname IS '助教对外昵称，如“佳怡”“周周”；用于展示，不参与业务逻辑。 | 来源: nickname';
COMMENT ON COLUMN dwd_assistant_service_log.site_assistant_id IS '门店维度助教 ID，对应助教账号维表主键。 | 来源: site_assistant_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.user_id IS '助教对应的系统用户 ID，对应账号体系中的 user_id。 | 来源: user_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.assistant_team_id IS '助教团队 ID，用于分组统计团队业绩。 | 来源: assistant_team_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.person_org_id IS '助教所属人事组织/部门 ID，如“助教部”；用于组织维度分析。 | 来源: person_org_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.assistant_level IS '助教等级编码：8=助教管理；10=初级；20=中级；30=高级；用于薪酬/评价分层。 | 来源: assistant_level | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.level_name IS '助教等级名称，与 assistant_level 对应，如“初级”“中级”“高级”“助教管理”。 | 来源: levelName';
COMMENT ON COLUMN dwd_assistant_service_log.skill_id IS '助教服务课程/技能 ID，应对应课程/技能配置表。 | 来源: skill_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log.skill_name IS '助教服务课程/技能名称，如“基础课”“附加课”。 | 来源: skillName';
COMMENT ON COLUMN dwd_assistant_service_log.ledger_unit_price IS '助教服务标准单价（原价），例如按小时或按节课的标价。 | 来源: ledger_unit_price';
COMMENT ON COLUMN dwd_assistant_service_log.ledger_amount IS '按标准单价计算的应收金额，近似等于 ledger_unit_price×计费时长换算后的金额。 | 来源: ledger_amount';
COMMENT ON COLUMN dwd_assistant_service_log.projected_income IS '实际计入门店收入的金额，已经考虑会员权益、券抵扣等后的结果。 | 来源: projected_income';
COMMENT ON COLUMN dwd_assistant_service_log.coupon_deduct_money IS '由优惠券、团购券等直接抵扣到本次助教服务上的金额；0 表示未使用券。 | 来源: coupon_deduct_money';
COMMENT ON COLUMN dwd_assistant_service_log.income_seconds IS '计费秒数（用于计算应收收入的时间长度），通常为按分钟取整的秒数。 | 来源: income_seconds';
COMMENT ON COLUMN dwd_assistant_service_log.real_use_seconds IS '实际服务时长（秒），真实消耗的时间，用于分析助教工作量。 | 来源: real_use_seconds';
COMMENT ON COLUMN dwd_assistant_service_log.add_clock IS '加钟秒数，在原有预约基础上临时增加的服务时间，数值为 60 的倍数。 | 来源: add_clock';
COMMENT ON COLUMN dwd_assistant_service_log.create_time IS '助教流水记录创建时间，接近下单/结算时间。 | 来源: create_time';
COMMENT ON COLUMN dwd_assistant_service_log.start_use_time IS '助教实际开始服务时间，通常与 ledger_start_time 一致。 | 来源: start_use_time';
COMMENT ON COLUMN dwd_assistant_service_log.last_use_time IS '助教最后一次服务时间，通常与 ledger_end_time 一致。 | 来源: last_use_time';
COMMENT ON COLUMN dwd_assistant_service_log.is_delete IS '逻辑删除标志：0 未删除；1 已逻辑删除，用于保留历史数据。 | 来源: is_delete';

-- dwd_assistant_service_log_Ex
CREATE TABLE IF NOT EXISTS dwd_assistant_service_log_Ex (
    assistant_service_id BIGINT,
    table_name VARCHAR(64),
    assistant_name VARCHAR(64),
    ledger_name VARCHAR(128),
    ledger_group_name VARCHAR(128),
    ledger_count INTEGER,
    member_discount_amount NUMERIC(10,2),
    manual_discount_amount NUMERIC(10,2),
    service_money NUMERIC(10,2),
    returns_clock INTEGER,
    ledger_start_time TIMESTAMPTZ,
    ledger_end_time TIMESTAMPTZ,
    ledger_status INTEGER,
    is_confirm INTEGER,
    is_single_order INTEGER,
    is_not_responding INTEGER,
    is_trash INTEGER,
    trash_applicant_id BIGINT,
    trash_applicant_name VARCHAR(64),
    trash_reason VARCHAR(255),
    salesman_user_id BIGINT,
    salesman_name VARCHAR(64),
    salesman_org_id BIGINT,
    skill_grade INTEGER,
    service_grade INTEGER,
    composite_grade NUMERIC(5,2),
    sum_grade NUMERIC(10,2),
    get_grade_times INTEGER,
    grade_status INTEGER,
    composite_grade_time TIMESTAMPTZ,
    PRIMARY KEY (assistant_service_id)
);
COMMENT ON COLUMN dwd_assistant_service_log_Ex.assistant_service_id IS '助教服务流水主键，系统内唯一标识一次助教服务记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.table_name IS '球台名称，如 “A17”“S1”，与 site_table_id 冗余，用于展示。 | 来源: tableName';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.assistant_name IS '助教姓名，如“何海婷”；与助教档案中的真实姓名一致。 | 来源: assistantName';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_name IS '助教计费项目名称，如“2-佳怡”等，通常为展示用组合字段。 | 来源: ledger_name';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_group_name IS '助教项目所属的计费分组/套餐分组名称，目前导出数据中为空，未看到实际使用场景。 | 来源: ledger_group_name';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_count IS '台账计费时长（秒），通常与 real_use_seconds 接近或相等。取income_seconds TEXT';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.member_discount_amount IS '由会员卡折扣产生的优惠金额，当前样本中为 0，但字段语义明确。 | 来源: member_discount_amount';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.manual_discount_amount IS '收银员手动减免金额（人工改价）；当前导出数据中为 0。 | 来源: manual_discount_amount';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.service_money IS '与助教结算的金额或服务成本金额，当前数据全部为 0，具体结算规则未见启用。 | 来源: service_money';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.returns_clock IS '退钟秒数（取消加钟或提前结束退回的时间），当前样本中全部为 0，未见业务使用。 | 来源: returns_clock';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_start_time IS '台账计费起始时间。 | 来源: ledger_start_time';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_end_time IS '台账计费结束时间，可作为本次服务结束时间。 | 来源: ledger_end_time';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.ledger_status IS '助教流水状态：当前数据为 1，表示正常有效；其他值预留给已作废、未结算等状态。 | 来源: ledger_status';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.is_confirm IS '确认状态：当前样本为 2，一般含义为 1=待确认，2=已确认/已完成（含义基于字段名和现有值推断）。 | 来源: is_confirm';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.is_single_order IS '是否单独订单：1 表示助教服务作为单独订单结算；0 表示与其他项目合单结算。当前样本全部为 1。 | 来源: is_single_order';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.is_not_responding IS '是否存在“未响应/爽约”等异常：0 表示正常；1 表示未响应或爽约（基于字段名推断，当前数据均为 0）。 | 来源: is_not_responding';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.is_trash IS '是否已废除：0 表示正常有效；1 表示已废除，与助教废除记录表（assistant_cancellation_records）对应。 | 来源: is_trash';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.trash_applicant_id IS '提出废除申请的员工 ID，用于追溯谁发起了废除操作。 | 来源: trash_applicant_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.trash_applicant_name IS '废除申请人姓名，仅用于展示，与 trash_applicant_id 冗余。 | 来源: trash_applicant_name';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.trash_reason IS '废除原因文案，如“顾客取消”“录入错误”，便于分析异常原因。 | 来源: trash_reason';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.salesman_user_id IS '营业员/销售员用户 ID，大多为 0，当前门店未明显使用此维度。 | 来源: salesman_user_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.salesman_name IS '营业员/销售员姓名，多数为空字符串。 | 来源: salesman_name';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.salesman_org_id IS '营业员所属组织/部门 ID，多数为 0，尚未看到实际业务使用。 | 来源: salesman_org_id | 角色: 外键';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.skill_grade IS '课程技能评分（整数），当前样本全为 0，评价功能尚未启用。 | 来源: skill_grade';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.service_grade IS '服务态度评分（整数），当前样本全为 0。 | 来源: service_grade';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.composite_grade IS '综合评分（技能+服务等加权结果），当前样本为 0。 | 来源: composite_grade';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.sum_grade IS '累计评分总和，用于计算平均分，当前样本为 0。 | 来源: sum_grade';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.get_grade_times IS '获得评价的次数，当前样本为 0。 | 来源: get_grade_times';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.grade_status IS '评价状态枚举：当前样本为 1，一般含义为“未评价/正常”，其他状态未见实际值。 | 来源: grade_status';
COMMENT ON COLUMN dwd_assistant_service_log_Ex.composite_grade_time IS '最近一次综合评分时间或评价更新时间，当前为默认时间 “0001-01-01 00:00:00”。 | 来源: composite_grade_time';

-- dwd_assistant_trash_event
CREATE TABLE IF NOT EXISTS dwd_assistant_trash_event (
    assistant_trash_event_id BIGINT,
    site_id BIGINT,
    table_id BIGINT,
    table_area_id BIGINT,
    assistant_no VARCHAR(32),
    assistant_name VARCHAR(64),
    charge_minutes_raw INTEGER,
    abolish_amount NUMERIC(18,2),
    trash_reason VARCHAR(255),
    create_time TIMESTAMPTZ,
    PRIMARY KEY (assistant_trash_event_id)
);
COMMENT ON COLUMN dwd_assistant_trash_event.assistant_trash_event_id IS '助教废除事件主键。与源 JSON 中 id 一一对应，单表内唯一。没有业务含义，只作为技术主键使用。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_assistant_trash_event.site_id IS '门店 ID。与其他 JSON 中的 siteId / site_id 含义一致。用来关联 dim_site。当前样例全部为同一门店（朗朗桌球），但设计上支持多门店。 | 来源: siteId | 角色: 外键（指向 dim_site）';
COMMENT ON COLUMN dwd_assistant_trash_event.table_id IS '台桌 ID。对应 site_tables_master.json 中的 id。用于定位哪一张球台发生了助教废除，用于后续软关联台费流水、助教流水时的重要条件。 | 来源: tableId | 角色: 外键（指向 dim_table）';
COMMENT ON COLUMN dwd_assistant_trash_event.table_area_id IS '台桌区域 ID。应与台桌维或区域维中的 area_id 一致，用于按区域统计（A 区/B 区/VIP 包厢等）。 | 来源: tableAreaId | 角色: 外键（潜在指向 dim_table_area）';
COMMENT ON COLUMN dwd_assistant_trash_event.assistant_no IS '助教编号（工号/序号），如 ''2''、''4''、''27'' 等。与助教档案表 assistant_accounts_master.assistant_no、助教流水中的 assistantNo 一致，用于标识哪位助教。枚举：在门店内是有限编号集合，但并非硬编码含义。 | 来源: assistantOn | 角色: 外键（指向 dim_assistant）';
COMMENT ON COLUMN dwd_assistant_trash_event.assistant_name IS '助教姓名/昵称，如 “泡芙”“佳怡”等。为冗余展示字段，真实姓名以助教档案为准。当前数据中与档案一致。 | 来源: assistantName';
COMMENT ON COLUMN dwd_assistant_trash_event.charge_minutes_raw IS '助教被废除前“已计费时长（分钟）”的原始值。单位为分钟。示例：214、3600、10800 等。0 表示尚未发生有效计费就被废除。当前数据中存在异常大值（例如 10800），这一业务含义需结合实际规则理解，但本字段原样保留。枚举：数值型，无固定枚举。 | 来源: pdChargeMinutes';
COMMENT ON COLUMN dwd_assistant_trash_event.abolish_amount IS '与本次助教废除操作关联的金额，单位元。字面含义为“助教废除金额”。当前样例均为非负数，如 5.83、570.00、0.00 等。正负方向：按照 ODS/JSON 原样保留，暂不在数仓层赋予“收入/支出”的方向含义，后续在 DWS 层按业务规则解释（例如是退还顾客、扣除收益等）。 | 来源: assistantAbolishAmount';
COMMENT ON COLUMN dwd_assistant_trash_event.trash_reason IS '废除原因的文本说明，例如可以写“顾客临时取消”“误操作”等。当前样例中全部为空字符串，说明前台并未使用该字段。但从结构上看，是一个自由文本字段，不是枚举。 | 来源: trashReason';
COMMENT ON COLUMN dwd_assistant_trash_event.create_time IS '这条废除记录创建的时间，格式 YYYY-MM-DD HH:MM:SS。代表系统正式记录“废除操作”的时刻，用于和助教服务流水按时间窗口做软关联（结合 site、table、assistant 等条件）。 | 来源: createTime';

-- dwd_assistant_trash_event_Ex
CREATE TABLE IF NOT EXISTS dwd_assistant_trash_event_Ex (
    assistant_trash_event_id BIGINT,
    table_name VARCHAR(64),
    table_area_name VARCHAR(64),
    PRIMARY KEY (assistant_trash_event_id)
);
COMMENT ON COLUMN dwd_assistant_trash_event_Ex.assistant_trash_event_id IS '助教废除事件主键。与源 JSON 中 id 一一对应，单表内唯一。没有业务含义，只作为技术主键使用。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_assistant_trash_event_Ex.table_name IS '台桌名称/编号，便于直观看报表，如 “C1”“B9”“VIP1”等。文案冗余自台桌维度。枚举：在门店范围内是有限集合，但不是固定编码表。 | 来源: tableName';
COMMENT ON COLUMN dwd_assistant_trash_event_Ex.table_area_name IS '台桌区域名称（中文），如 “A区”“B区”“C区”“VIP包厢”“补时长”等。展示用文本，具体层级信息由区域维表提供。 | 来源: tableArea';

-- dwd_member_balance_change
CREATE TABLE IF NOT EXISTS dwd_member_balance_change (
    balance_change_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    register_site_id BIGINT,
    tenant_member_id BIGINT,
    system_member_id BIGINT,
    tenant_member_card_id BIGINT,
    card_type_id BIGINT,
    card_type_name VARCHAR(32),
    member_name VARCHAR(64),
    member_mobile VARCHAR(20),
    balance_before NUMERIC(18,2),
    change_amount NUMERIC(18,2),
    balance_after NUMERIC(18,2),
    from_type INTEGER,
    payment_method INTEGER,
    change_time TIMESTAMPTZ,
    is_delete INTEGER,
    remark VARCHAR(255),
    PRIMARY KEY (balance_change_id)
);
COMMENT ON COLUMN dwd_member_balance_change.balance_change_id IS '余额变动记录主键 ID，来源于源系统的余额变更流水 ID，唯一标识一条余额变动事件。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_member_balance_change.tenant_id IS '租户/品牌 ID，在整体系统中唯一标识一家商户。当前样本中为同一值。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.site_id IS '本次余额变动发生的门店 ID。通常对应具体门店；样本中：非 0 为“朗朗桌球”，0 代表平台级/虚拟门店场景（如活动抵用券结算）。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.register_site_id IS '办卡门店 ID（卡注册门店）。与 site_id 区分：register_site_id=当初办卡门店，site_id=本次余额变动实际发生门店。当前样本中全部相同。 | 来源: register_site_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.tenant_member_id IS '租户维度会员 ID（同一租户内的会员主键），用于关联会员档案。 | 来源: tenant_member_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.system_member_id IS '系统全局会员 ID（跨租户统一的会员标识）。当前只有一个门店，但结构上允许同一人跨租户共享该 ID。 | 来源: system_member_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.tenant_member_card_id IS '会员卡账户 ID（租户内唯一的一张具体卡，例如某人的储值卡/酒水卡/台费卡/活动抵用券等）。本次余额变动作用于这张卡。 | 来源: tenant_member_card_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.card_type_id IS '卡种类型 ID。与 card_type_name 一一对应，用于区分不同卡种（储值卡/活动抵用券/酒水卡/台费卡）。 | 来源: card_type_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change.card_type_name IS '卡种名称（中文）：• 储值卡：通用储值卡；• 活动抵用券：活动送券型卡；• 酒水卡：指定用于酒水类消费；• 台费卡：指定用于台费消费。 | 来源: memberCardTypeName';
COMMENT ON COLUMN dwd_member_balance_change.member_name IS '会员姓名/称呼（如“曾丹烨”“葛先生”“胡先生”），主要用于运营、客服和人工识别。 | 来源: memberName';
COMMENT ON COLUMN dwd_member_balance_change.member_mobile IS '会员手机号（完整号码字符串），是会员识别、营销触达的重要字段。 | 来源: memberMobile';
COMMENT ON COLUMN dwd_member_balance_change.balance_before IS '本次变动前的卡内余额，单位：元。可为 0、数百、数千等。 | 来源: before';
COMMENT ON COLUMN dwd_member_balance_change.change_amount IS '本次余额变动金额，单位：元：• 正数：余额增加（充值、赠送、调整加款等）；• 负数：余额减少（消费扣款、退款冲减、活动抵扣等）。所有记录严格满足：balance_after = balance_before + change_amount（浮点精度内）。 | 来源: account_data';
COMMENT ON COLUMN dwd_member_balance_change.balance_after IS '本次变动后的卡内余额，单位：元。由 before + account_data 计算而得，在源数据中已给出。 | 来源: after';
COMMENT ON COLUMN dwd_member_balance_change.from_type IS '余额变动来源类型枚举（控制业务含义与方向）：• 1：日常消费扣款 —— change_amount 为负数，payment_method=0，表示用卡支付消费被扣余额；• 3：充值增加 —— change_amount 为正数，payment_method=4，表示顾客通过外部支付为卡充值（扫码、银行卡等）；• 4：调整/赠送增加 —— change_amount 为正数，payment_method=3，通常为后台赠送或手工加款；• 7：充值退款 —— change_amount 为负数，remark=''充值退款''，表示对历史充值做退款，以减少卡内余额方式体现；• 9：活动抵用券相关余额冲减 —— change_amount 为负数，卡种为“活动抵用券”，site_id=0，表示活动券额度被扣回或结算；• 2：其他增加 —— 当前仅 1 条正数样本（+1865.80），具体业务类型不明，但可确定为余额增加类。总体上：1/7/9 为减余额类，2/3/4 为加余额类。 | 来源: from_type';
COMMENT ON COLUMN dwd_member_balance_change.payment_method IS '支付/变动渠道枚举（与源系统支付方式枚举一致）：• 0：内部结算/无外部支付 —— 日常消费扣款、内部扣减、退款冲减等场景，新资金流不在本记录中产生；• 3：赠送/后台调整渠道 —— 与 from_type=4 搭配出现，表示此余额增加不是顾客付钱，而是后台发放或内部调账；• 4：充值外部支付渠道 —— 与 from_type=3 搭配出现，代表顾客通过某外部渠道完成充值（具体是微信/支付宝/银行卡等需要结合支付枚举表进一步映射）。 | 来源: payment_method';
COMMENT ON COLUMN dwd_member_balance_change.change_time IS '余额变动时间（记录创建时间），格式 YYYY-MM-DD HH:MM:SS。通常紧邻实际交易发生时间，用于按时间线分析资金变动。 | 来源: create_time';
COMMENT ON COLUMN dwd_member_balance_change.is_delete IS '逻辑删除标记：• 0：正常记录（当前样本全部为 0）；• 1：逻辑删除（标记为删除但数据库保留，用于追溯）。分析时通常需要过滤掉 is_delete=1 的记录。 | 来源: is_delete';
COMMENT ON COLUMN dwd_member_balance_change.remark IS '余额变动备注信息。当前样本中主要为：• 空字符串：无额外说明；• 充值退款：明确标记该条记录为“充值退款”业务，与 from_type=7 完全对应。后续可能出现其他业务备注。 | 来源: remark';

-- dwd_member_balance_change_EX
CREATE TABLE IF NOT EXISTS dwd_member_balance_change_EX (
    balance_change_id BIGINT,
    pay_site_name VARCHAR(64),
    register_site_name VARCHAR(64),
    refund_amount NUMERIC(18,2),
    operator_id BIGINT,
    operator_name VARCHAR(64),
    PRIMARY KEY (balance_change_id)
);
COMMENT ON COLUMN dwd_member_balance_change_EX.balance_change_id IS '余额变动记录主键 ID，来源于源系统的余额变更流水 ID，唯一标识一条余额变动事件。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_member_balance_change_EX.pay_site_name IS '余额变动发生门店名称，对应 site_id 的中文名。示例：朗朗桌球；当 site_id = 0 时通常为空字符串。纯展示冗余。 | 来源: paySiteName';
COMMENT ON COLUMN dwd_member_balance_change_EX.register_site_name IS '办卡门店名称，对应 register_site_id 的中文名。当前样本全部为 朗朗桌球，属于冗余展示。 | 来源: registerSiteName';
COMMENT ON COLUMN dwd_member_balance_change_EX.refund_amount IS '退款金额字段。在当前样本数据中全部为 0.00，推测用于区分“退回卡内余额”和“原路退回”等更细的退款模式，但目前未启用。 | 来源: refund_amount';
COMMENT ON COLUMN dwd_member_balance_change_EX.operator_id IS '操作员 ID，执行本次余额变动操作的员工账号主键。可关联员工/账号维度。 | 来源: operator_id | 角色: 外键';
COMMENT ON COLUMN dwd_member_balance_change_EX.operator_name IS '操作员名称及职位说明，例如：收银员:郑丽珊、店长:谢晓洪 等，是对 operator_id 的可读冗余。 | 来源: operator_name';

-- dwd_groupbuy_redemption
CREATE TABLE IF NOT EXISTS dwd_groupbuy_redemption (
    redemption_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    table_id BIGINT,
    tenant_table_area_id BIGINT,
    table_charge_seconds INTEGER,
    order_trade_no BIGINT,
    order_settle_id BIGINT,
    order_coupon_id BIGINT,
    coupon_origin_id BIGINT,
    promotion_activity_id BIGINT,
    promotion_coupon_id BIGINT,
    order_coupon_channel INTEGER,
    ledger_unit_price NUMERIC(18,2),
    ledger_count INTEGER,
    ledger_amount NUMERIC(18,2),
    coupon_money NUMERIC(18,2),
    promotion_seconds INTEGER,
    coupon_code VARCHAR(64),
    is_single_order INTEGER,
    is_delete INTEGER,
    ledger_name VARCHAR(128),
    create_time TIMESTAMPTZ,
    PRIMARY KEY (redemption_id)
);
COMMENT ON COLUMN dwd_groupbuy_redemption.redemption_id IS '团购券核销流水主键。一条记录代表一次团购券使用在某次台费上的一条核销明细。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_groupbuy_redemption.tenant_id IS '租户/品牌 ID。与其他表统一的租户标识，用于品牌维度聚合。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.site_id IS '门店 ID。与门店维度及其他业务事实中的 site_id 一致。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.table_id IS '球台 ID。与台桌维度表中的 id 对应，用于确定具体哪一张球台。 | 来源: table_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.tenant_table_area_id IS '租户级台区组合 ID。与团购套餐定义中的 tenant_table_area_id_list 元素对应，表示该券实际使用时所在的台区组合。用于校验券的适用台区是否匹配实际台桌。 | 来源: tenant_table_area_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.table_charge_seconds IS '本次结算中该球台总计计费的秒数（整台计费时间）。当台上除了券覆盖时长之外还有额外计费时间时，该值会大于券核销时长。 | 来源: table_charge_seconds';
COMMENT ON COLUMN dwd_groupbuy_redemption.order_trade_no IS '订单交易号。与台费流水、商品销售、助教服务、小票详情等表的 order_trade_no 一致，用于将同一笔结账中的所有明细串联起来。 | 来源: order_trade_no | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.order_settle_id IS '结算单 ID。与结账记录和小票详情中的结算主键对应，用于从团购券核销记录跳转到整单结算。 | 来源: order_settle_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.order_coupon_id IS '订单中的“券使用记录 ID”。与平台或内部券核销表中的主键一致，用于在订单内部定位这条券使用记录。当前与 coupon_origin_id 数值相等。 | 来源: order_coupon_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.coupon_origin_id IS '上游系统或第三方平台中该券记录的主键 ID。可在平台验券记录中查到券的来源平台、原订单等。当前与 order_coupon_id 数值一致，但语义是“券来源 ID”。 | 来源: coupon_origin_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.promotion_activity_id IS '促销活动 ID。每条记录对应一个活动主键，用于识别券所属的促销活动或团购活动。 | 来源: promotion_activity_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.promotion_coupon_id IS '团购套餐定义 ID。与 group_buy_packages.json 中的 id 一一对应，表示当前使用的是哪一种团购套餐（例如某款“一小时套餐”“两小时套餐”）。 | 来源: promotion_coupon_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.order_coupon_channel IS '券渠道类型枚举。观测值：1（大量记录）、2（少量记录）。用于区分券的来源渠道，例如不同团购平台或内部券。具体数值与渠道名称的映射由业务配置决定。 | 来源: order_coupon_channel | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.ledger_unit_price IS '本次券在台费侧对应的标准单价，单位元/小时。典型值如 29.9、39.9、59.9、69.9 等。与门店台费计费规则中的单价相对应，用于计算券对应的金额。 | 来源: ledger_unit_price';
COMMENT ON COLUMN dwd_groupbuy_redemption.ledger_count IS '本次券实际核销的计费秒数。大部分记录等于 promotion_seconds，少数略小于标准时长，表示这张券只覆盖了本次台费的一部分时长。 | 来源: ledger_count';
COMMENT ON COLUMN dwd_groupbuy_redemption.ledger_amount IS '本次团购券实际冲抵台费的金额。大部分记录中该值与 coupon_money 相等，少数存在小数差异，来源于按单价与秒数换算的结果。 | 来源: ledger_amount';
COMMENT ON COLUMN dwd_groupbuy_redemption.coupon_money IS '本次核销时，团购券在门店侧对应的金额额度（可抵扣金额）。同一种 promotion_coupon_id 下，该值固定，例如某套餐固定为 48.00 元、某套餐固定为 96.00 元等。 | 来源: coupon_money';
COMMENT ON COLUMN dwd_groupbuy_redemption.promotion_seconds IS '团购套餐定义的标准时长权益，单位秒。观测枚举值为 3600、7200、14400，分别对应 1 小时、2 小时、4 小时。与团购套餐定义表中的 duration 字段一致。 | 来源: promotion_seconds';
COMMENT ON COLUMN dwd_groupbuy_redemption.coupon_code IS '团购券券码字符串。每条记录一个唯一券码，例如“0107892475999”。用于与平台验券记录、券购买记录等做一一对应，追踪券的全生命周期。 | 来源: coupon_code | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption.is_single_order IS '是否作为单独订单行。观测值：1 为主，表示以独立条目方式结算；0 为个别记录，表示嵌入某种组合结算结构。具体业务含义依赖上层订单结构设计。 | 来源: is_single_order';
COMMENT ON COLUMN dwd_groupbuy_redemption.is_delete IS '逻辑删除标记。0 表示正常记录，1 表示逻辑删除但数据仍保留用于追溯。当前样本全部为 0，用于过滤有效记录。 | 来源: is_delete';
COMMENT ON COLUMN dwd_groupbuy_redemption.ledger_name IS '团购项目记账名称，如“全天A区中八一小时”“B区桌球一小时”“中八、斯诺克包厢两小时”等。通常与团购套餐名称相近，用于报表展示和套餐维度分析。 | 来源: ledger_name';
COMMENT ON COLUMN dwd_groupbuy_redemption.create_time IS '本条团购券核销流水的创建时间，通常即核销时间，格式为“YYYY-MM-DD HH:MM:SS”。用于时间维度分析和数据分区。 | 来源: create_time';

-- dwd_groupbuy_redemption_Ex
CREATE TABLE IF NOT EXISTS dwd_groupbuy_redemption_Ex (
    redemption_id BIGINT,
    site_name VARCHAR(64),
    table_name VARCHAR(64),
    table_area_name VARCHAR(64),
    order_pay_id BIGINT,
    goods_option_price NUMERIC(18,2),
    goods_promotion_money NUMERIC(18,2),
    table_service_promotion_money NUMERIC(18,2),
    assistant_promotion_money NUMERIC(18,2),
    assistant_service_promotion_money NUMERIC(18,2),
    reward_promotion_money NUMERIC(18,2),
    recharge_promotion_money NUMERIC(18,2),
    offer_type INTEGER,
    ledger_status INTEGER,
    operator_id BIGINT,
    operator_name VARCHAR(64),
    salesman_user_id BIGINT,
    salesman_name VARCHAR(64),
    salesman_role_id BIGINT,
    salesman_org_id BIGINT,
    ledger_group_name VARCHAR(128),
    PRIMARY KEY (redemption_id)
);
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.redemption_id IS '团购券核销流水主键。一条记录代表一次团购券使用在某次台费上的一条核销明细。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.site_name IS '门店名称。当前样本全部为同一门店，仅作冗余展示。 | 来源: siteName';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.table_name IS '球台名称或台号。如 A7、A11、B1 等。用于业务报表展示与人工识别。 | 来源: tableName';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.table_area_name IS '台区名称。观测枚举值包括 A区、B区、斯诺克区、麻将房。实际取值随门店台区配置变化。 | 来源: tableAreaName';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.order_pay_id IS '支付流水 ID。部分记录为 0，表示未在当前导出范围内关联到具体支付记录。真实含义为“指向支付记录表中的支付流水”。 | 来源: order_pay_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.goods_option_price IS '商品规格价格，用于商品类促销分摊时使用。当前在团购券核销场景中全部为 0，仅作为结构预留。 | 来源: goodsOptionPrice';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.goods_promotion_money IS '本次券使用中分摊到“商品”部分的促销金额。当前所有记录为 0，说明本门店的团购券未用于商品抵扣。 | 来源: goods_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.table_service_promotion_money IS '本次券使用中分摊到“台费服务费”部分的促销金额。当前样本全部为 0，结构上用于支持更细粒度的费用拆分。 | 来源: table_service_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.assistant_promotion_money IS '本次券使用中分摊到“助教服务”的促销金额。当前全部为 0，说明团购券尚未用于助教服务的抵扣。 | 来源: assistant_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.assistant_service_promotion_money IS '进一步细分助教服务对应的促销金额。当前为 0，仅预留结构以支持复杂场景。 | 来源: assistant_service_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.reward_promotion_money IS '本次促销中属于“奖励金、积分”等来源的促销金额分摊。当前为 0，预留用于积分或奖励金同时参与活动时的金额拆分。 | 来源: reward_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.recharge_promotion_money IS '来自“充值赠送”等储值优惠的促销金额分摊。当前为 0，预留用于将来区分“券优惠”和“充值赠送优惠”的场景。 | 来源: recharge_promotion_money';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.offer_type IS '优惠类型枚举。当前样本值全部为 1，表示本门店使用的团购券均为同一类型（例如“套餐券”）。其他取值可能对应满减、折扣、代金券等优惠类型，在本数据中未出现。 | 来源: offer_type';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.ledger_status IS '流水状态。观测值全部为 1。常规含义为：1 表示正常有效记录；其他值预留用于表示作废、撤销、未生效等状态。当前导出仅包含正常状态记录。 | 来源: ledger_status';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.operator_id IS '执行本次券核销操作的操作员 ID。可与员工维度表对接，用于分析不同操作员的核销行为与绩效。 | 来源: operator_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.operator_name IS '操作员名称及角色说明，例如“收银员:郑丽珊”。与 operator_id 冗余，对报表展示友好，但不参与模型关联。 | 来源: operator_name';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.salesman_user_id IS '营业员用户 ID。当前全部为 0，表示本门店在团购券场景未单独记录营业员信息。 | 来源: salesman_user_id | 角色: 外键';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.salesman_name IS '营业员姓名。当前为空字符串。结构上用于记录拉单或促销的业务员信息。 | 来源: salesman_name';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.salesman_role_id IS '营业员角色 ID。当前为 0，预留用于标识营业员在组织中的角色类型。 | 来源: salesman_role_id';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.salesman_org_id IS '营业员所属组织 ID。来源字段为 sales_man_org_id，DWD 层统一命名为 salesman_org_id。当前为 0，用于将来对接组织架构维度。 | 来源: sales_man_org_id';
COMMENT ON COLUMN dwd_groupbuy_redemption_Ex.ledger_group_name IS '团购项目的记账分组名称。当前全部为空，预留给将来按团购项目大类分组（例如“团购台费”“团购包厢”）使用。 | 来源: ledger_group_name';

-- dwd_platform_coupon_redemption
CREATE TABLE IF NOT EXISTS dwd_platform_coupon_redemption (
    platform_coupon_redemption_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    coupon_code VARCHAR(64),
    coupon_channel INTEGER,
    coupon_name VARCHAR(200),
    sale_price NUMERIC(10,2),
    coupon_money NUMERIC(10,2),
    coupon_free_time INTEGER,
    channel_deal_id BIGINT,
    deal_id BIGINT,
    group_package_id BIGINT,
    site_order_id BIGINT,
    table_id BIGINT,
    certificate_id VARCHAR(64),
    verify_id VARCHAR(64),
    use_status INTEGER,
    is_delete INTEGER,
    create_time TIMESTAMPTZ,
    consume_time TIMESTAMPTZ,
    PRIMARY KEY (platform_coupon_redemption_id)
);
COMMENT ON COLUMN dwd_platform_coupon_redemption.platform_coupon_redemption_id IS '平台券核销记录在本系统内的主键 ID。长整型分布式 ID，用于唯一标识本次核销流水。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.tenant_id IS '租户 ID，品牌级别标识。例如整套系统中的“朗朗桌球”品牌。与其他表的 tenant_id 一致，用于划分租户数据域。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.site_id IS '门店 ID。与门店维度 dim_site.site_id 对应，用于区分不同门店。siteProfile.id 与此字段相同，本表不再冗余门店快照。 | 来源: site_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.coupon_code IS '第三方团购券券码，顾客出示的核销码。当前样本中全表唯一，可视为业务自然主键，用于验券、对账、查询。 | 来源: coupon_code';
COMMENT ON COLUMN dwd_platform_coupon_redemption.coupon_channel IS '券来源渠道枚举，表示第三方平台渠道编号。观测值：1，2。具体含义需结合系统配置，一般可理解为：1 表示平台渠道 1（主平台），2 表示平台渠道 2（其他入口或子平台）。 | 来源: coupon_channel';
COMMENT ON COLUMN dwd_platform_coupon_redemption.coupon_name IS '第三方团购券产品名称，例如“【全天可用】中八桌球一小时（A区）”“1小时中八台球【11月特惠】（A区）”等。用于报表展示和区分不同团购产品。 | 来源: coupon_name';
COMMENT ON COLUMN dwd_platform_coupon_redemption.sale_price IS '顾客在第三方平台实际支付的团购售价，例如 11.11、29.90、39.90 等。始终小于 coupon_money，体现“折后价”。 | 来源: sale_price';
COMMENT ON COLUMN dwd_platform_coupon_redemption.coupon_money IS '券面值或套餐价值，即系统认为该券可抵扣的金额，例如 48.00、58.00、68.00、96.00、116.00、288.00。与 coupon_name 有固定对应关系。 | 来源: coupon_money';
COMMENT ON COLUMN dwd_platform_coupon_redemption.coupon_free_time IS '券附带的赠送时长，单位：秒。当前样本全部为 0，表示无独立赠送时长。若未来有赠送时间型券，则该字段存储赠送的秒数。 | 来源: coupon_free_time';
COMMENT ON COLUMN dwd_platform_coupon_redemption.channel_deal_id IS '渠道侧团购商品 ID（第三方平台 dealId）。值域有限（约 9 个值），与 coupon_name 一一对应。用于对接第三方接口和按平台商品维度统计。 | 来源: channel_deal_id | 角色: - 或 外键（预留）';
COMMENT ON COLUMN dwd_platform_coupon_redemption.deal_id IS '平台/系统侧团购商品 ID。多数记录为非 0 整数，也有部分为 0。与 coupon_name 存在稳定对应关系，0 表示内部未配置或未同步。未来可作为内部团购商品维度外键。 | 来源: deal_id | 角色: 外键（预留）';
COMMENT ON COLUMN dwd_platform_coupon_redemption.group_package_id IS '内部“团购套餐”定义表主键 ID。当前样本中全部为 0，表示平台券尚未映射到自有团购套餐；从设计上是预留的外键字段。 | 来源: group_package_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.site_order_id IS '门店内部订单 ID。本次平台券核销所挂靠的店内订单号。用于与结账记录、台费流水、商品销售等事实表通过订单维度关联。 | 来源: site_order_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.table_id IS '使用团购券的球台 ID。与 dim_site_table.table_id 对应，用于统计每张球台的第三方平台引流情况。 | 来源: table_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption.certificate_id IS '第三方平台侧券实例 ID（凭证 ID），通常为 16–19 位数字字符串。用于与外部平台对账与查询核销结果。存在重复值，不能单独作为唯一键。 | 来源: certificate_id';
COMMENT ON COLUMN dwd_platform_coupon_redemption.verify_id IS '第三方平台核销记录 ID。大部分记录为空，少量有值。存在时可用于精确反查平台侧核销记录。 | 来源: verify_id';
COMMENT ON COLUMN dwd_platform_coupon_redemption.use_status IS '券使用状态枚举。观测值：1、2。1 表示已使用/已核销（正常消耗）；2 表示已退款/已撤销或使用后反冲的状态。是判断券生命周期状态的核心字段。 | 来源: use_status';
COMMENT ON COLUMN dwd_platform_coupon_redemption.is_delete IS '逻辑删除标志。0 表示未删除；1 表示已逻辑删除。与 use_status 独立：即便业务状态异常（如 use_status=2），也可能 is_delete 仍为 0 以保留记录。 | 来源: is_delete';
COMMENT ON COLUMN dwd_platform_coupon_redemption.create_time IS '系统记录创建时间，即核销记录写入本系统的时间。格式为 YYYY-MM-DD HH:MM:SS。通常与 consume_time 相差约 1 秒。 | 来源: create_time';
COMMENT ON COLUMN dwd_platform_coupon_redemption.consume_time IS '券被核销/使用的业务时间，代表实际团购券使用发生的时间点。后续按核销日期统计核销量时以该字段为准。 | 来源: consume_time';

-- dwd_platform_coupon_redemption_Ex
CREATE TABLE IF NOT EXISTS dwd_platform_coupon_redemption_Ex (
    platform_coupon_redemption_id BIGINT,
    coupon_cover VARCHAR(255),
    coupon_remark VARCHAR(255),
    groupon_type INTEGER,
    operator_id BIGINT,
    operator_name VARCHAR(50),
    PRIMARY KEY (platform_coupon_redemption_id)
);
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.platform_coupon_redemption_id IS '平台券核销记录在本系统内的主键 ID。长整型分布式 ID，用于唯一标识本次核销流水。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.coupon_cover IS '券封面图片地址 URL，用于前端展示团购券图片。对经营分析和结算逻辑无影响。 | 来源: coupon_cover';
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.coupon_remark IS '券描述或备注信息，用于展示券规则、说明文字。未参与计算和关联逻辑。 | 来源: coupon_remark';
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.groupon_type IS '团购券类型枚举。当前样本全部为 1。推断含义：1 表示标准团购券，其他值预留为次卡、套餐券、权益券等类型。 | 来源: groupon_type';
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.operator_id IS '执行验券操作的员工/收银员账号 ID。当前样本中多数为同一值。可与员工/账号维度表关联。 | 来源: operator_id | 角色: 外键';
COMMENT ON COLUMN dwd_platform_coupon_redemption_Ex.operator_name IS '操作员姓名或显示名，例如“收银员:郑丽珊”。是 operator_id 的冗余展示字段，用于报表展示。 | 来源: operator_name';

-- dwd_recharge_order
CREATE TABLE IF NOT EXISTS dwd_recharge_order (
    recharge_order_id BIGINT,
    tenant_id BIGINT,
    site_id BIGINT,
    member_id BIGINT,
    member_name_snapshot TEXT,
    member_phone_snapshot TEXT,
    tenant_member_card_id BIGINT,
    member_card_type_name TEXT,
    settle_relate_id BIGINT,
    settle_type INTEGER,
    settle_name TEXT,
    is_first INTEGER,
    pay_amount NUMERIC(18,2),
    refund_amount NUMERIC(18,2),
    point_amount NUMERIC(18,2),
    cash_amount NUMERIC(18,2),
    payment_method INTEGER,
    create_time TIMESTAMPTZ,
    pay_time TIMESTAMPTZ,
    PRIMARY KEY (recharge_order_id)
);
COMMENT ON COLUMN dwd_recharge_order.recharge_order_id IS '充值结算记录主键；唯一标识一条充值/撤销记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_recharge_order.tenant_id IS '租户/品牌 ID；与其他 JSON 中 tenantId 含义一致。 | 来源: tenantId | 角色: 外键（dim_tenant）';
COMMENT ON COLUMN dwd_recharge_order.site_id IS '门店 ID；与 siteProfile.id 一致，用于关联门店维度。 | 来源: siteId | 角色: 外键（dim_site）';
COMMENT ON COLUMN dwd_recharge_order.member_id IS '会员 ID；对应会员档案中的 tenantMemberInfos.id。标识给哪个会员充值。 | 来源: memberId | 角色: 外键（dim_member）';
COMMENT ON COLUMN dwd_recharge_order.member_name_snapshot IS '会员姓名/昵称快照，可能是名称或手机号字符串。 | 来源: memberName';
COMMENT ON COLUMN dwd_recharge_order.member_phone_snapshot IS '会员手机号快照。 | 来源: memberPhone';
COMMENT ON COLUMN dwd_recharge_order.tenant_member_card_id IS '会员卡实例 ID（某张具体卡）；可关联 dim_member_card_account。 | 来源: tenantMemberCardId | 角色: 外键（dim_member_card_account）';
COMMENT ON COLUMN dwd_recharge_order.member_card_type_name IS '会员卡类型名称；当前样例主要有：“储值卡”、“月卡”。 | 来源: memberCardTypeName';
COMMENT ON COLUMN dwd_recharge_order.settle_relate_id IS '结算关联 ID；用于与支付记录等跨表关联（类似业务单 ID）。 | 来源: settleRelateId | 角色: 外键（与支付/结算域软关联）';
COMMENT ON COLUMN dwd_recharge_order.settle_type IS '结算类型枚举：5=“充值订单”（正常充值）；7=“充值撤销”（冲销记录）。 | 来源: settleType';
COMMENT ON COLUMN dwd_recharge_order.settle_name IS '结算类型名称："充值订单"、"充值撤销"；前端展示用。 | 来源: settleName';
COMMENT ON COLUMN dwd_recharge_order.is_first IS '是否首充标记。取值：1 或 2。理论含义类似“是否首充”，但 1/2 的精确定义需系统字典确认。 | 来源: isFirst';
COMMENT ON COLUMN dwd_recharge_order.pay_amount IS '本条记录的充值金额（可为正/负）：正数=实际充值金额；负数=撤销流水金额（settleType=7）。 | 来源: payAmount';
COMMENT ON COLUMN dwd_recharge_order.refund_amount IS '对该充值订单的退款金额（通常为正数）；原始充值单上为已退款金额，对应会有一条负数的“充值撤销”记录。 | 来源: refundAmount';
COMMENT ON COLUMN dwd_recharge_order.point_amount IS '计入会员账户的储值/积分金额；多数情况下等于 pay_amount 的绝对值；撤销记录一般为 0。 | 来源: pointAmount';
COMMENT ON COLUMN dwd_recharge_order.cash_amount IS '现金收款金额；样本中少数为 3000/5000，其余为 0。 | 来源: cashAmount';
COMMENT ON COLUMN dwd_recharge_order.payment_method IS '支付方式编码。样本取值：1、2、4；具体对应渠道（现金/微信/支付宝/银行卡等）需系统“支付方式字典”确认。 | 来源: paymentMethod';
COMMENT ON COLUMN dwd_recharge_order.create_time IS '充值记录创建时间（收银完成时间）；用于时间分区、统计。 | 来源: createTime';
COMMENT ON COLUMN dwd_recharge_order.pay_time IS '支付完成时间；通常与 create_time 接近或相同。 | 来源: payTime';

-- dwd_recharge_order_Ex
CREATE TABLE IF NOT EXISTS dwd_recharge_order_Ex (
    recharge_order_id BIGINT,
    site_name_snapshot TEXT,
    settle_status INTEGER,
    is_bind_member BOOLEAN,
    is_activity BOOLEAN,
    is_use_coupon BOOLEAN,
    is_use_discount BOOLEAN,
    can_be_revoked BOOLEAN,
    online_amount NUMERIC(18,2),
    balance_amount NUMERIC(18,2),
    card_amount NUMERIC(18,2),
    coupon_amount NUMERIC(18,2),
    recharge_card_amount NUMERIC(18,2),
    gift_card_amount NUMERIC(18,2),
    prepay_money NUMERIC(18,2),
    consume_money NUMERIC(18,2),
    goods_money NUMERIC(18,2),
    real_goods_money NUMERIC(18,2),
    table_charge_money NUMERIC(18,2),
    service_money NUMERIC(18,2),
    activity_discount NUMERIC(18,2),
    all_coupon_discount NUMERIC(18,2),
    goods_promotion_money NUMERIC(18,2),
    assistant_promotion_money NUMERIC(18,2),
    assistant_pd_money NUMERIC(18,2),
    assistant_cx_money NUMERIC(18,2),
    assistant_manual_discount NUMERIC(18,2),
    coupon_sale_amount NUMERIC(18,2),
    member_discount_amount NUMERIC(18,2),
    point_discount_price NUMERIC(18,2),
    point_discount_cost NUMERIC(18,2),
    adjust_amount NUMERIC(18,2),
    rounding_amount NUMERIC(18,2),
    operator_id BIGINT,
    operator_name_snapshot TEXT,
    salesman_user_id BIGINT,
    salesman_name TEXT,
    order_remark TEXT,
    table_id INTEGER,
    serial_number INTEGER,
    revoke_order_id BIGINT,
    revoke_order_name TEXT,
    revoke_time TIMESTAMPTZ,
    PRIMARY KEY (recharge_order_id)
);
COMMENT ON COLUMN dwd_recharge_order_Ex.recharge_order_id IS '充值结算记录主键；唯一标识一条充值/撤销记录。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dwd_recharge_order_Ex.site_name_snapshot IS '门店名称快照，如“朗朗桌球”；仅用于展示，门店改名后本字段不变。 | 来源: siteName';
COMMENT ON COLUMN dwd_recharge_order_Ex.settle_status IS '结算状态；当前数据全部为 2，推测 2=已完成。其它状态未出现在样本中。 | 来源: settleStatus';
COMMENT ON COLUMN dwd_recharge_order_Ex.is_bind_member IS '是否绑定为会员/其他绑定标记；当前所有记录为 False，而又都有 memberId，实际业务含义不清。 | 来源: isBindMember';
COMMENT ON COLUMN dwd_recharge_order_Ex.is_activity IS '是否关联营销活动；当前全部为 False，表示样本周期内充值未绑定活动。 | 来源: isActivity';
COMMENT ON COLUMN dwd_recharge_order_Ex.is_use_coupon IS '本次充值是否使用优惠券；当前样本全部为 False。结构上预留“充值用券”的能力。 | 来源: isUseCoupon';
COMMENT ON COLUMN dwd_recharge_order_Ex.is_use_discount IS '是否使用折扣（如充值折扣）；样本中全为 False。 | 来源: isUseDiscount';
COMMENT ON COLUMN dwd_recharge_order_Ex.can_be_revoked IS '当前记录是否仍可撤销；样本中全为 False（导出时均不可撤销）。 | 来源: canBeRevoked';
COMMENT ON COLUMN dwd_recharge_order_Ex.online_amount IS '线上支付金额（如微信、支付宝等）；当前样本为 0，但字段为支付渠道拆分预留。 | 来源: onlineAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.balance_amount IS '从账户余额中支付的金额；充值场景通常为 0（用余额充值没有实际意义）。 | 来源: balanceAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.card_amount IS '从其他储值卡或某种卡余额支付的金额；当前样本全为 0。 | 来源: cardAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.coupon_amount IS '使用券直接支付的金额（如储值券）；当前样本为 0。 | 来源: couponAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.recharge_card_amount IS '充值到卡上的金额（与 point_amount 区分不同资金属性）；样本为 0，结构预留。 | 来源: rechargeCardAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.gift_card_amount IS '赠送卡金额（如买 1000 送 100 的赠送部分）；当前样本为 0。 | 来源: giftCardAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.prepay_money IS '预付款金额（订金）；当前样本为 0，充值未启用此场景。 | 来源: prepayMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.consume_money IS '消费总金额；在充值文件中全部为 0，实际用于消费场景（台费/商品）的结算模型复用字段。 | 来源: consumeMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.goods_money IS '商品消费金额（充值记录中为 0）。 | 来源: goodsMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.real_goods_money IS '实际应计商品金额（扣除折扣后）；充值记录中为 0。 | 来源: realGoodsMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.table_charge_money IS '台费金额；充值记录中为 0，来自通用结算模型。 | 来源: tableChargeMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.service_money IS '服务项目金额（如助教、其他服务）；充值中为 0。 | 来源: serviceMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.activity_discount IS '营销活动折扣金额；当前样本为 0。 | 来源: activityDiscount';
COMMENT ON COLUMN dwd_recharge_order_Ex.all_coupon_discount IS '各类优惠券、团购券综合折扣金额；样本为 0。 | 来源: allCouponDiscount';
COMMENT ON COLUMN dwd_recharge_order_Ex.goods_promotion_money IS '商品促销优惠金额；样本为 0。 | 来源: goodsPromotionMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.assistant_promotion_money IS '助教相关促销优惠金额；样本为 0。 | 来源: assistantPromotionMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.assistant_pd_money IS '助教配单金额/相关费用；样本为 0。 | 来源: assistantPdMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.assistant_cx_money IS '助教冲销/促销相关金额；样本为 0。 | 来源: assistantCxMoney';
COMMENT ON COLUMN dwd_recharge_order_Ex.assistant_manual_discount IS '助教手工减免金额；样本为 0。 | 来源: assistantManualDiscount';
COMMENT ON COLUMN dwd_recharge_order_Ex.coupon_sale_amount IS '券/套餐销售金额（售卖券时使用）；充值场景中为 0。 | 来源: couponSaleAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.member_discount_amount IS '因会员折扣产生的优惠金额；在充值样本中为 0。 | 来源: memberDiscountAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.point_discount_price IS '积分抵扣产生的价差（价格部分）；样本为 0。 | 来源: pointDiscountPrice';
COMMENT ON COLUMN dwd_recharge_order_Ex.point_discount_cost IS '积分抵扣对应的成本金额；样本为 0。 | 来源: pointDiscountCost';
COMMENT ON COLUMN dwd_recharge_order_Ex.adjust_amount IS '手工调整金额（非抹零）；样本为 0。 | 来源: adjustAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.rounding_amount IS '抹零金额（四舍五入产生的差额）；样本为 0。 | 来源: roundingAmount';
COMMENT ON COLUMN dwd_recharge_order_Ex.operator_id IS '操作该笔充值的收银员/员工 ID。 | 来源: operatorId | 角色: 外键（将来可关联 dim_staff）';
COMMENT ON COLUMN dwd_recharge_order_Ex.operator_name_snapshot IS '操作员姓名快照，便于直接阅读；与 operator_id 对应。 | 来源: operatorName';
COMMENT ON COLUMN dwd_recharge_order_Ex.salesman_user_id IS '营业员用户 ID；当前样本全部为 0。 | 来源: salesManUserId | 角色: 外键（潜在 dim_staff）';
COMMENT ON COLUMN dwd_recharge_order_Ex.salesman_name IS '营业员/销售员姓名；样本为空字符串。 | 来源: salesManName';
COMMENT ON COLUMN dwd_recharge_order_Ex.order_remark IS '充值订单备注，如手工说明；当前样本为空。 | 来源: orderRemark';
COMMENT ON COLUMN dwd_recharge_order_Ex.table_id IS '台桌 ID；充值场景下全部是 0，表示该订单不挂具体球台。 | 来源: tableId';
COMMENT ON COLUMN dwd_recharge_order_Ex.serial_number IS '流水/小票序号；当前样本全部为 0，本门店未启用。 | 来源: serialNumber';
COMMENT ON COLUMN dwd_recharge_order_Ex.revoke_order_id IS '撤销相关订单 ID（被撤销原单或撤销单指针）；样本中存在值但逻辑未完全启用。 | 来源: revokeOrderId';
COMMENT ON COLUMN dwd_recharge_order_Ex.revoke_order_name IS '撤销单名称/说明；样本全为空。 | 来源: revokeOrderName';
COMMENT ON COLUMN dwd_recharge_order_Ex.revoke_time IS '撤销时间；当前样本为空，撤销信息主要通过负数流水与 refund_amount 表达。 | 来源: revokeTime';

-- dwd_payment
CREATE TABLE IF NOT EXISTS dwd_payment (
    payment_id BIGINT,
    site_id BIGINT,
    relate_type INTEGER,
    relate_id BIGINT,
    pay_amount NUMERIC(18,2),
    pay_status INTEGER,
    payment_method INTEGER,
    online_pay_channel INTEGER,
    create_time TIMESTAMPTZ,
    pay_time TIMESTAMPTZ,
    pay_date DATE,
    PRIMARY KEY (payment_id)
);
COMMENT ON COLUMN dwd_payment.payment_id IS '支付流水主键ID。与源系统 id 一致。每条支付流水唯一标识一条支付行为（包括金额为 0 的记录）。 | 来源: payment_transactions.id | 角色: 主键';
COMMENT ON COLUMN dwd_payment.site_id IS '门店ID。当前样本中全部为同一门店 2790685415443269。在数仓中外键关联 dim_site.site_id。 | 来源: payment_transactions.site_id | 角色: 外键';
COMMENT ON COLUMN dwd_payment.relate_type IS '业务关联类型枚举，用来区分这条支付流水对应哪一类业务单据：• 2：结账单支付，对应结账记录 settlement_records 中的结账单；• 5：会员卡充值/账户变动类支付，对应会员余额/充值业务单号，在会员余额变更或充值结算中复用；• 1：其他业务类型，目前样本中仅有 1 条记录，具体业务含义待业务侧补充。 | 来源: payment_transactions.relate_type | 角色: −';
COMMENT ON COLUMN dwd_payment.relate_id IS '关联业务记录ID，配合 relate_type 使用，是一个“多态外键”：• 当 relate_type = 2 时：relate_id = settlement_records.settleList.id（结账记录主键，对应 dwd_settlement_head_di.order_settle_id）；• 当 relate_type = 5 时：relate_id = 会员卡余额变动/充值业务单号，在会员余额变更流水中同名字段使用；• 当 relate_type = 1 时：关联具体业务尚未确认，仅可视为预留类型。 | 来源: payment_transactions.relate_id | 角色: 外键（多业务类型）';
COMMENT ON COLUMN dwd_payment.pay_amount IS '本次支付金额，单位元。为收入类字段，当前样本全部为非负数：• 正数：实际通过该支付方式收取的金额；• 0：仍生成支付流水，但实收金额为 0（例如整单由会员优惠、团购券、余额等抵扣），当前样本中有 140 条记录金额为 0。 | 来源: payment_transactions.pay_amount | 角色: −';
COMMENT ON COLUMN dwd_payment.pay_status IS '支付状态枚举。当前样本中仅出现：• 2：支付成功。其它可能的状态（未支付、支付中、失败、已退款等）在本次导出中未出现，需以后按系统支付状态配置补充。由于本 JSON 仅导出成功记录，可以视作“成功支付流水视图”。 | 来源: payment_transactions.pay_status | 角色: −';
COMMENT ON COLUMN dwd_payment.payment_method IS '支付方式枚举。当前样本中出现的取值：• 2：共 140 条记录；• 4：共 60 条记录。具体取值与“支付方式配置表”对应，例如可能代表现金、扫码支付、银行卡等。由于配置表未导出，在数仓中应作为枚举码字段，通过后续 dim_payment_method 进行解码。不要在数仓层擅自写死“2=微信、4=支付宝”等含义。 | 来源: payment_transactions.payment_method | 角色: 外键（预期关联支付方式维度）';
COMMENT ON COLUMN dwd_payment.online_pay_channel IS '线上支付通道枚举。用于进一步细分线上渠道，例如：• 0：无线上通道/线下，或未区分具体线上通道（当前样本全部为 0）；• 1：微信（推测，未在样本中出现）；• 2：支付宝（推测，未在样本中出现）。目前门店在当前时间段内尚未使用该字段进行实际区分，业务含义需结合正式配置确认。 | 来源: payment_transactions.online_pay_channel | 角色: −';
COMMENT ON COLUMN dwd_payment.create_time IS '支付流水创建时间，格式 YYYY-MM-DD HH:MM:SS。通常是发起支付请求的时间。当前样本中 create_time 与 pay_time 多数相同，但模型上允许两者不同（例如异步支付）。 | 来源: payment_transactions.create_time | 角色: −';
COMMENT ON COLUMN dwd_payment.pay_time IS '支付完成时间（支付成功时间戳），格式 YYYY-MM-DD HH:MM:SS。用于统计资金实际入账时间，以及与结账时间进行对齐分析。 | 来源: payment_transactions.pay_time | 角色: −';
COMMENT ON COLUMN dwd_payment.pay_date IS '支付日期分区字段，从 pay_time 截取 YYYY-MM-DD 得到。例如 pay_time = ''2025-11-09 23:35:57'' 时，pay_date = ''2025-11-09''。用于 DWD 表按天分区和日粒度汇总。 | 来源: 由 payment_transactions.pay_time 派生 | 角色: −';

-- dwd_refund
  CREATE TABLE IF NOT EXISTS dwd_refund (
      refund_id BIGINT,
      tenant_id BIGINT,
      site_id BIGINT,
      relate_type INTEGER,
      relate_id BIGINT,
      pay_amount NUMERIC(18,2),
      channel_fee NUMERIC(18,2),
      pay_time TIMESTAMPTZ,
      create_time TIMESTAMPTZ,
      payment_method INTEGER,
      member_id BIGINT,
      member_card_id BIGINT,
      PRIMARY KEY (refund_id)
  );
  COMMENT ON COLUMN dwd_refund.refund_id IS '退款流水主键。每条退款记录唯一 ID（雪花ID风格长整型） | 来源: id | 角色: 主键';
  COMMENT ON COLUMN dwd_refund.tenant_id IS '租户/品牌 ID，标识所属商户。与其他表中的 tenant_id 一致。 | 来源: tenant_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund.site_id IS '门店 ID。与门店维度 dim_site.site_id 对应，用于分门店分析。 | 来源: site_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund.relate_type IS '业务类型枚举，指示本退款对应哪类业务主单：当前样本值 {2, 5}：2=消费/结账类业务；5=充值/储值类业务（具体定义以业务字典为准）。与 relate_id 组合使用。 | 来源: relate_type';
  COMMENT ON COLUMN dwd_refund.relate_id IS '关联的业务主键 ID，含义依赖 relate_type：relate_type=2 时通常指结账主单 ID；relate_type=5 时通常指充值/储值业务单 ID。同一个 relate_id 可能有多笔退款（分批退款）。 | 来源: relate_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund.pay_amount IS '本次退款的资金金额，统一为负数。绝对值即退款金额，例如 -5000.00 表示退款 5000 元。 | 来源: pay_amount';
  COMMENT ON COLUMN dwd_refund.channel_fee IS '第三方支付渠道对本次退款收取的手续费。当前样本为 0.00，用于通道成本核算。 | 来源: channel_fee';
  COMMENT ON COLUMN dwd_refund.pay_time IS '退款在支付渠道/系统中发生的时间（退款完成时间），用于对账及按时间统计。 | 来源: pay_time';
  COMMENT ON COLUMN dwd_refund.create_time IS '本条退款流水在系统内创建时间，用于区分记录生成时间与渠道时间。 | 来源: create_time';
  COMMENT ON COLUMN dwd_refund.payment_method IS '支付方式枚举，指本次退款对应的原支付方式（如通道）。样本出现值 4，支付记录中有 {2,4}，具体含义需参照支付方式配置表。 | 来源: payment_method';
  COMMENT ON COLUMN dwd_refund.member_id IS '关联的会员 ID，对应会员档案表主键。样本为 0，表示未绑定会员。 | 来源: member_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund.member_card_id IS '关联的会员卡账户 ID，对应会员卡账户/储值卡维度主键。样本为 0，当前没有“退到会员卡”的记录。 | 来源: member_card_id | 角色: 外键';


  CREATE TABLE IF NOT EXISTS dwd_refund_Ex (
      refund_id BIGINT,
      tenant_name VARCHAR(64),
      pay_sn BIGINT,
      refund_amount NUMERIC(18,2),
      round_amount NUMERIC(18,2),
      balance_frozen_amount NUMERIC(18,2),
      card_frozen_amount NUMERIC(18,2),
      pay_status INTEGER,
      action_type INTEGER,
      is_revoke INTEGER,
      is_delete INTEGER,
      check_status INTEGER,
      online_pay_channel INTEGER,
      online_pay_type INTEGER,
      pay_terminal INTEGER,
      pay_config_id INTEGER,
      cashier_point_id INTEGER,
      operator_id BIGINT,
      channel_payer_id VARCHAR(128),
      channel_pay_no VARCHAR(128),
      PRIMARY KEY (refund_id)
  );
  COMMENT ON COLUMN dwd_refund_Ex.refund_id IS '退款流水主键。每条退款记录唯一 ID（雪花ID风格长整型）。 | 来源: id | 角色: 主键';
  COMMENT ON COLUMN dwd_refund_Ex.tenant_name IS '租户名称，例如“朗朗桌球”。与租户维度中的名称冗余。 | 来源: tenantName';
  COMMENT ON COLUMN dwd_refund_Ex.pay_sn IS '支付流水内部序号。退款记录中样本全部为 0，未看到实际使用场景，含义未说明。 | 来源: pay_sn';
  COMMENT ON COLUMN dwd_refund_Ex.refund_amount IS '本次退款金额（正数）设计字段，样本为 0.00，实际使用 pay_amount。 | 来源: refund_amount';
  COMMENT ON COLUMN dwd_refund_Ex.round_amount IS '退款过程中的舍入/抹零金额。 | 来源: round_amount';
  COMMENT ON COLUMN dwd_refund_Ex.balance_frozen_amount IS '与会员余额相关的冻结金额，样本为 0。 | 来源: balance_frozen_amount';
  COMMENT ON COLUMN dwd_refund_Ex.card_frozen_amount IS '与某张会员卡余额相关的冻结金额，样本为 0。 | 来源: card_frozen_amount';
  COMMENT ON COLUMN dwd_refund_Ex.pay_status IS '退款状态枚举。样本中全部为 2（成功/已完成）。 | 来源: pay_status';
  COMMENT ON COLUMN dwd_refund_Ex.action_type IS '资金动作类型枚举。样本全部为 2（退款）。 | 来源: action_type';
  COMMENT ON COLUMN dwd_refund_Ex.is_revoke IS '是否为撤销型退款：0=正常退款；1=撤销原支付。 | 来源: is_revoke';
  COMMENT ON COLUMN dwd_refund_Ex.is_delete IS '逻辑删除标志：0=未删除；1=已逻辑删除。 | 来源: is_delete';
  COMMENT ON COLUMN dwd_refund_Ex.check_status IS '审核状态。样本全部为 1（已审核/通过）。 | 来源: check_status';
  COMMENT ON COLUMN dwd_refund_Ex.online_pay_channel IS '线上支付渠道枚举。样本中全部为 0（线下或默认）。 | 来源: online_pay_channel';
  COMMENT ON COLUMN dwd_refund_Ex.online_pay_type IS '在线退款类型。样本全部为 0（原路退回）。 | 来源: online_pay_type';
  COMMENT ON COLUMN dwd_refund_Ex.pay_terminal IS '退款终端类型。样本全部为 1（前台收银端）。 | 来源: pay_terminal';
  COMMENT ON COLUMN dwd_refund_Ex.pay_config_id IS '支付配置 ID，例如某个具体支付通道（微信商户号、银联通道等）的配置主键。样本全部为 0。 | 来源: pay_config_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund_Ex.cashier_point_id IS '收银点编号，例如前台1、前台2、自助机等。样本全部为 0。 | 来源: cashier_point_id';
  COMMENT ON COLUMN dwd_refund_Ex.operator_id IS '执行退款操作的操作员 ID。样本全部为 0。 | 来源: operator_id | 角色: 外键';
  COMMENT ON COLUMN dwd_refund_Ex.channel_payer_id IS '支付渠道侧的付款人标识，如 openid、银行卡号掩码等。样本全部为空字符串。 | 来源: channel_payer_id';
  COMMENT ON COLUMN dwd_refund_Ex.channel_pay_no IS '第三方支付平台交易号（如微信支付单号、支付宝交易号等）。当前样本全部为空。 | 来源: channel_pay_no';
