-- ============================================================
-- DWD 层（明细数据层）建表语句
-- 说明：在 ODS 层基础上关联生成的就诊明细事实表
-- ============================================================

-- 患者就诊明细事实表
CREATE TABLE IF NOT EXISTS fact_patient_exam_detail (
    -- 主键
    id BIGINT COMMENT '自增ID',

    -- 患者维度
    patient_id BIGINT COMMENT '患者ID',
    patient_id_str VARCHAR(50) COMMENT '病历号',
    patient_name VARCHAR(100) COMMENT '姓名',
    sex VARCHAR(10) COMMENT '性别',
    age INT COMMENT '年龄',
    birthday DATE COMMENT '生日',
    mobile VARCHAR(20) COMMENT '手机号',
    identity VARCHAR(50) COMMENT '身份证号',

    -- 就诊信息
    clinic_id BIGINT COMMENT '就诊ID',
    come_time DATETIME COMMENT '就诊时间',
    come_date DATE COMMENT '就诊日期',
    visit_type VARCHAR(20) COMMENT '就诊类型：初诊/复诊/预约/复查',
    channel VARCHAR(50) COMMENT '渠道',

    -- 商品维度
    goods_id BIGINT COMMENT '商品ID',
    goods_name VARCHAR(200) COMMENT '商品名称',
    goods_uuid VARCHAR(100) COMMENT '商品UUID',
    fee_class VARCHAR(50) COMMENT '收费分类',

    -- 取镜信息
    pickup_id BIGINT COMMENT '取镜记录ID',
    pickup_time DATETIME COMMENT '取镜时间',
    pickup_date DATE COMMENT '取镜日期',

    -- 订单信息
    order_id BIGINT COMMENT '订单ID',
    orderdetail_id BIGINT COMMENT '订单明细ID',
    pay_time DATETIME COMMENT '支付时间',
    pay_date DATE COMMENT '支付日期',
    pay_amt DECIMAL(18,2) COMMENT '支付金额',
    refund_time DATETIME COMMENT '退款时间',

    -- 机构维度
    org_id INT COMMENT '就诊机构ID',
    org_name VARCHAR(200) COMMENT '就诊机构名称',
    group_id INT COMMENT '地区ID',
    group_name VARCHAR(200) COMMENT '地区名称',

    -- 员工维度
    customer_optometrist_staff_id BIGINT COMMENT '专属视光师ID',
    customer_optometrist_name VARCHAR(100) COMMENT '专属视光师姓名',
    customer_optometrist_org_name VARCHAR(200) COMMENT '视光师归属机构',
    accept_doctor_id BIGINT COMMENT '接诊医生ID',
    accept_doctor_name VARCHAR(100) COMMENT '接诊医生姓名',
    accept_optometrist_id BIGINT COMMENT '接诊视光师ID',
    accept_optometrist_name VARCHAR(100) COMMENT '接诊视光师姓名',

    -- 检查结果原始数据
    exam_result_json STRING COMMENT '检查结果JSON',
    exam_tab VARCHAR(50) COMMENT '检查类型：yj_dnyg/tj_gxsw',
    exam_id INT COMMENT '检查项目ID',

    -- 检查指标（解析后的数值）
    right_se_val DECIMAL(10,2) COMMENT '右眼SE等效球镜',
    left_se_val DECIMAL(10,2) COMMENT '左眼SE等效球镜',
    right_sph_val DECIMAL(10,2) COMMENT '右眼球镜',
    left_sph_val DECIMAL(10,2) COMMENT '左眼球镜',
    right_cyl_val DECIMAL(10,2) COMMENT '右眼柱镜',
    left_cyl_val DECIMAL(10,2) COMMENT '左眼柱镜',
    al_od_val DECIMAL(10,2) COMMENT '眼轴右眼',
    al_os_val DECIMAL(10,2) COMMENT '眼轴左眼',

    -- 数据日期（用于增量同步）
    data_date DATE COMMENT '数据日期（就诊日期）',

    -- 元数据
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)
DUPLICATE KEY(id, come_time)
PROPERTIES (
    "replication_num" = "1",
    "in_memory" = "false",
    "storage_format" = "V2"
);

-- 创建索引提升查询性能
CREATE INDEX idx_patient_id ON fact_patient_exam_detail(patient_id);
CREATE INDEX idx_pickup_date ON fact_patient_exam_detail(pickup_date);
CREATE INDEX idx_data_date ON fact_patient_exam_detail(data_date);
CREATE INDEX idx_fee_class ON fact_patient_exam_detail(fee_class);
