-- ============================================
-- 会员到店签到记录表
-- 版本: V13
-- 描述: 创建sign_in_record表，用于记录会员签到信息
-- ============================================

-- 创建签到记录表
CREATE TABLE IF NOT EXISTS sign_in_record (
    id BIGSERIAL PRIMARY KEY,                                    -- 自增主键
    member_id BIGINT NOT NULL,                                   -- 会员ID，关联member表
    member_card_id BIGINT,                                       -- 签到时使用的会员卡ID
    sign_in_time TIMESTAMP NOT NULL,                             -- 签到入场时间
    sign_in_type VARCHAR(20) NOT NULL,                           -- 签到方式：QR_CODE-扫码签到，MANUAL-手动签到，FACE-人脸识别
    sign_in_status VARCHAR(20) NOT NULL DEFAULT 'SUCCESS',      -- 签到状态：SUCCESS-成功，FAILED-失败
    verification_details TEXT,                                   -- JSON格式，存储会员卡验证时的快照数据
    fail_reason VARCHAR(500),                                    -- 失败时的具体原因文案
    operator_id BIGINT,                                          -- 操作人ID（前台人员），自助签到时为NULL
    operator_name VARCHAR(100),                                  -- 操作人姓名冗余
    device_info VARCHAR(200),                                    -- 签到设备标识或型号
    ip_address VARCHAR(50),                                      -- 客户端IP地址
    source VARCHAR(20) NOT NULL,                                 -- 签到来源：MINI_PROGRAM-小程序扫码，PC_BACKEND-后台管理端
    is_delete BOOLEAN DEFAULT FALSE,                             -- 软删除标识：false-未删除，true-已删除
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,    -- 记录创建时间
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP     -- 记录更新时间
);

-- 创建索引
-- 会员ID索引（加速按会员查询签到记录）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_member_id ON sign_in_record(member_id);

-- 签到时间索引（加速按时间范围查询）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_sign_in_time ON sign_in_record(sign_in_time);

-- 签到状态索引（加速按状态筛选）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_sign_in_status ON sign_in_record(sign_in_status);

-- 会员卡ID索引（加速按会员卡查询）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_member_card_id ON sign_in_record(member_card_id);

-- 操作人ID索引（加速按操作人查询）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_operator_id ON sign_in_record(operator_id);

-- 签到来源索引（加速按来源统计）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_source ON sign_in_record(source);

-- 软删除索引（加速查询未删除的记录）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_is_delete ON sign_in_record(is_delete);

-- 复合索引：会员ID + 签到时间（加速会员签到历史查询）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_member_time ON sign_in_record(member_id, sign_in_time);

-- 复合索引：签到状态 + 签到时间（加速统计数据查询）
CREATE INDEX IF NOT EXISTS idx_sign_in_record_status_time ON sign_in_record(sign_in_status, sign_in_time);

-- 添加表注释
COMMENT ON TABLE sign_in_record IS '会员到店签到记录表';

-- 添加字段注释
COMMENT ON COLUMN sign_in_record.id IS '自增主键';
COMMENT ON COLUMN sign_in_record.member_id IS '会员ID，关联member表';
COMMENT ON COLUMN sign_in_record.member_card_id IS '签到时使用的会员卡ID';
COMMENT ON COLUMN sign_in_record.sign_in_time IS '签到入场时间';
COMMENT ON COLUMN sign_in_record.sign_in_type IS '签到方式：QR_CODE-扫码签到，MANUAL-手动签到，FACE-人脸识别';
COMMENT ON COLUMN sign_in_record.sign_in_status IS '签到状态：SUCCESS-成功，FAILED-失败';
COMMENT ON COLUMN sign_in_record.verification_details IS 'JSON格式，存储会员卡验证时的快照数据';
COMMENT ON COLUMN sign_in_record.fail_reason IS '失败时的具体原因文案';
COMMENT ON COLUMN sign_in_record.operator_id IS '操作人ID（前台人员），自助签到时为NULL';
COMMENT ON COLUMN sign_in_record.operator_name IS '操作人姓名冗余';
COMMENT ON COLUMN sign_in_record.device_info IS '签到设备标识或型号';
COMMENT ON COLUMN sign_in_record.ip_address IS '客户端IP地址';
COMMENT ON COLUMN sign_in_record.source IS '签到来源：MINI_PROGRAM-小程序扫码，PC_BACKEND-后台管理端';
COMMENT ON COLUMN sign_in_record.is_delete IS '软删除标识：false-未删除，true-已删除';
COMMENT ON COLUMN sign_in_record.created_at IS '记录创建时间';
COMMENT ON COLUMN sign_in_record.updated_at IS '记录更新时间';
