- 范围:全仓除已完成的 game-cloud/game-admin(及排除区);91 文件 - cn.iocoder.yudao→com.wanxiang.huijing / cn.wanxiang.game→com.wanxiang.huijing.game / cn.iocoder.cloud→com.wanxiang / Yudao*→Huijing* / bare yudao→huijing - 含 contracts/api-schemas(apiInterface FQCN)、docs/architecture+agent-specs(含中文名,git ls-files -z 修复)、AGENTS.md/CLAUDE.md 等根文档 - 保留不动:上游归属 URL(gitee/github yudaocode·YunaiV,改则断链+违反署名)、game-cloud Flyway 迁移注释(保 checksum)、lockfile(装包重生) - 纯文档/字符串,零构建影响(game-cloud/game-admin 字节码未动) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
75 lines
7.9 KiB
SQL
75 lines
7.9 KiB
SQL
-- =============================================================================
|
||
-- 契约 #2 DB 迁移 | 模块:telemetry(遥测/事件批量入库→MQ 异步→聚合→回灌 feed/project)| owner:WS5
|
||
-- 文件:V5.0.0__create_game_telemetry.sql(Flyway,只新增;已合入禁止修改,回滚写新补偿迁移)
|
||
-- 内容:telemetry 模块核心表 —— 原始事件 game_telemetry_event + 游戏维度聚合 game_telemetry_game_stat
|
||
-- 约定:InnoDB + utf8mb4;显式列;含 Huijing 审计列;状态机用 tinyint,非法流转由服务端拒绝
|
||
-- 脊柱:批量事件(#5 envelope) → /app-api/telemetry/events/batch → MQ 异步消费(幂等) → 本两表 → 回灌 feed 与 project
|
||
-- 错误码段:telemetry = 1-104-***-***
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_telemetry_event —— 原始事件表(MQ 消费侧落库,幂等去重)
|
||
-- 对接点:消费 RocketMQ topic=telemetry-event 的 #5 envelope,逐条幂等入库
|
||
-- 幂等键:(trace_id, event, ts) → uk_dedup;至少一次投递下命中即跳过,保证聚合不重复
|
||
-- process_status 状态机:0待聚合 → 1已聚合(消费侧聚合成功后置位;2聚合失败待重试由数据质量监控 T-TEL-19 兜底)
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_telemetry_event` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '事件记录 ID',
|
||
`event` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事件名(须在 #5 events.schema.json eventRegistry 登记)',
|
||
`schema_version` VARCHAR(8) NOT NULL DEFAULT 'v1' COMMENT '事件 Schema 版本(对应 #5 schema_version,如 v1/v2)',
|
||
`ts` BIGINT NOT NULL COMMENT '事件发生时间戳(毫秒,对应 #5 ts)',
|
||
`trace_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '全链路追踪 ID(对应 #5 trace_id,幂等键之一)',
|
||
`session_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '会话 ID(对应 #5 session_id);来源=runtime sessionId(int64) 转 string,作 session 维度对账键',
|
||
`user_id` BIGINT NULL COMMENT '登录用户 ID(匿名为空,对应 #5 user.user_id)',
|
||
`anon_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '匿名稳定 ID(对应 #5 user.anon_id)',
|
||
`game_id` BIGINT NULL COMMENT '游戏 ID(聚合落点关键,对应 #5 context.game_id)',
|
||
`version_id` BIGINT NULL COMMENT '版本 ID(对应 #5 context.version_id)',
|
||
`channel` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '渠道归因(utm/channel 解析,对应 #5 context.channel)',
|
||
`device_type` VARCHAR(16) NOT NULL DEFAULT '' COMMENT '设备类型:mobile/desktop/miniapp(对应 #5 context.device_type)',
|
||
`props` JSON NULL COMMENT '事件私有字段(对应 #5 props,结构见对应 eventRegistry 项)',
|
||
`process_status` TINYINT NOT NULL DEFAULT 0 COMMENT '处理状态机:0待聚合 1已聚合 2聚合失败待重试(合法流转由消费侧 Service 校验)',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列;上报通道为 system/上报方)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(入库时间)',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除:0未删 1已删',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID(Huijing 多租户兼容,MVP 单租户=0)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_dedup` (`trace_id`, `event`, `ts`) COMMENT 'MQ 消费幂等键:同一信封重复投递只落一条',
|
||
KEY `idx_game_event` (`game_id`, `event`, `ts`) COMMENT '按游戏+事件取明细(聚合/漏斗回算)',
|
||
KEY `idx_status` (`process_status`, `id`) COMMENT '扫待聚合/聚合失败事件(增量聚合与兜底重试)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '遥测原始事件表(MQ 消费幂等落库)';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_telemetry_game_stat —— 游戏维度增量聚合表(按 游戏×统计日 聚合)
|
||
-- 由消费侧从 game_telemetry_event 增量累加产出;唯一约束 (game_id, stat_date) 保证聚合幂等
|
||
-- 回灌:play_count/like_count → project(game_project);quality_score → feed 排序信号
|
||
-- 看板数据源:/admin-api/telemetry/game-stat/* 直读本表(本模块只供数据,不渲染看板 UI)
|
||
-- ad/income 范围:ad_impression/ad_reward/income_settled 事件原始表(game_telemetry_event)照常入库,
|
||
-- 但本聚合表 = Wave2 变现范围外,later 补列(暂不含广告/收益聚合列,非遗漏)
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_telemetry_game_stat` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '聚合记录 ID',
|
||
`game_id` BIGINT NOT NULL COMMENT '游戏 ID(= game_project.id)',
|
||
`stat_date` DATE NOT NULL COMMENT '统计日(yyyy-MM-dd,按日聚合粒度)',
|
||
`play_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日试玩数;权威源=本模块 game_play_start 事件聚合(runtime session 仅观测、不计数);回灌 project.play_count',
|
||
`play_end_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日试玩结束数(game_play_end)',
|
||
`completed_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日完玩数(props.completed=true)',
|
||
`total_duration_ms` BIGINT NOT NULL DEFAULT 0 COMMENT '当日试玩总时长(毫秒,供算平均/quality_score)',
|
||
`like_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日点赞数(回灌 project.like_count)',
|
||
`favorite_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日收藏数',
|
||
`share_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日分享数',
|
||
`report_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日举报数(举报阈值降权信号)',
|
||
`load_fail_count` BIGINT NOT NULL DEFAULT 0 COMMENT '当日加载失败数(game_load_failed;降权信号)',
|
||
`quality_score` DECIMAL(5,2) NOT NULL DEFAULT 0.00 COMMENT '运营质量分(0-100)(T-TEL-04;回灌 feed 排序信号);≠ aigc 生成质量分(0-1),量纲不同、不可互相回灌',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列;聚合任务为 system)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除:0未删 1已删',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID(Huijing 多租户兼容,MVP 单租户=0)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_game_date` (`game_id`, `stat_date`) COMMENT '聚合幂等:同一游戏同一日一行,消费侧行级累加',
|
||
KEY `idx_date_quality` (`stat_date`, `quality_score`) COMMENT '按日取 quality_score 排序(feed 回灌信号/看板榜单)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '游戏维度增量聚合表(回灌 feed/project)';
|