SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; USE hyapp_user; -- 用户在房时长服务端事实:消费 room outbox 的 RoomUserJoined/RoomUserLeft/RoomUserKicked, -- 替代只靠客户端 room_stay 埋点的口径(杀进程丢时长导致进房时长偏低甚至小于上麦时长)。 CREATE TABLE IF NOT EXISTS user_room_sessions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', room_session_id VARCHAR(128) NOT NULL COMMENT '在房会话 ID,取 RoomUserJoined 事件 ID', user_id BIGINT NOT NULL COMMENT '用户 ID', room_id VARCHAR(64) NOT NULL COMMENT '房间 ID', status VARCHAR(32) NOT NULL COMMENT '业务状态 open/ended', is_robot TINYINT(1) NOT NULL DEFAULT 0 COMMENT '进房时固化的机器人标记,机器人会话不产生统计事实', joined_at_ms BIGINT NOT NULL COMMENT '进房时间,UTC epoch ms', ended_at_ms BIGINT NULL COMMENT '离房时间,UTC epoch ms', end_reason VARCHAR(64) NOT NULL DEFAULT '' COMMENT '结束原因', room_online_ms BIGINT NOT NULL DEFAULT 0 COMMENT '在房毫秒值', opened_event_id VARCHAR(128) NOT NULL COMMENT '进房事件 ID', closed_event_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '闭合事件 ID', last_event_id VARCHAR(128) NOT NULL COMMENT '最后事件 ID', last_room_version BIGINT NOT NULL DEFAULT 0 COMMENT '最后房间版本', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, room_session_id), KEY idx_user_room_sessions_user_status (app_code, user_id, status, joined_at_ms), KEY idx_user_room_sessions_room_user (app_code, room_id, user_id, status), KEY idx_user_room_sessions_open_timeout (app_code, status, joined_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房会话表'; CREATE TABLE IF NOT EXISTS user_room_daily_stats ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', user_id BIGINT NOT NULL COMMENT '用户 ID', stat_date CHAR(10) NOT NULL COMMENT '统计日期,UTC', room_online_ms BIGINT NOT NULL DEFAULT 0 COMMENT '在房毫秒值', session_count BIGINT NOT NULL DEFAULT 0 COMMENT '会话数量', first_room_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '首次在房时间,UTC epoch ms', last_room_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最后在房时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, user_id, stat_date), KEY idx_user_room_daily_date (app_code, stat_date, room_online_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房每日统计表'; CREATE TABLE IF NOT EXISTS user_room_orphan_leaves ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', event_id VARCHAR(128) NOT NULL COMMENT '离房事件 ID', room_id VARCHAR(64) NOT NULL COMMENT '房间 ID', user_id BIGINT NOT NULL COMMENT '用户 ID', left_at_ms BIGINT NOT NULL COMMENT '离房时间,UTC epoch ms', reason VARCHAR(64) NOT NULL DEFAULT '' COMMENT '离房原因', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, event_id), KEY idx_user_room_orphan_room_user (app_code, room_id, user_id, left_at_ms), KEY idx_user_room_orphan_left_at (app_code, left_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='先于进房事实到达的离房事件暂存表'; CREATE TABLE IF NOT EXISTS user_room_event_consumption ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', event_id VARCHAR(128) NOT NULL COMMENT '事件幂等 ID', event_type VARCHAR(64) NOT NULL COMMENT '事件类型', room_id VARCHAR(64) NOT NULL COMMENT '房间 ID', user_id BIGINT NOT NULL COMMENT '用户 ID', status VARCHAR(32) NOT NULL COMMENT '业务状态', skip_reason VARCHAR(128) NOT NULL DEFAULT '' COMMENT '跳过原因', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', consumed_at_ms BIGINT NULL COMMENT '消费时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, event_id), KEY idx_user_room_event_user (app_code, user_id, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房事件消费位点表';