- 范围:全仓除已完成的 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>
85 lines
8.9 KiB
SQL
85 lines
8.9 KiB
SQL
-- =============================================================================
|
||
-- 契约 #2 DB 迁移 | 模块:compliance(game-module-compliance,Wave3 合规域「锁风门 Gate」)| owner:Wave3 compliance 子 agent
|
||
-- 文件:V9.0.0__create_game_compliance.sql(Flyway,只新增;已合入禁止修改,回滚写新补偿迁移 V9.0.1 DROP TABLE)
|
||
-- 内容:compliance 模块三张表 —— 锁风门评估台账 game_compliance_gate_result + 内容分级 game_content_rating + 封禁台账 game_user_ban
|
||
-- 职责(架构 Doc B + D2 范围铁律):只做 Gate(聚合风格/IP 原子→verdict + 内容分级 + 封禁台账);
|
||
-- 【明确不建】审核状态机表 / audit_record —— 审核状态机权威归 project(game_review_record),compliance 绝不重写。
|
||
-- 锁风门 seam(R1):project.submitPublish 同进程调 ComplianceGateApi.evaluate → 聚合裁决落 game_compliance_gate_result + 分级落 game_content_rating
|
||
-- → 返回 verdict 供 project 据此置 admitted(block→admitted=false 不抛异常)。
|
||
-- 封禁联动(R3 状态分支):写 game_user_ban 台账(主操作恒执行);下架仅当 project 状态==PUBLISHED 时才调 project reviewProject(3);
|
||
-- 非 PUBLISHED 只记封禁不调状态机。【本波说明】ProjectApi 暂无 reviewProject seam,下架联动标 TODO 留 Phase C 主 agent 收口,本波仅写台账。
|
||
-- 降权出流屏蔽:P1 本波不生效(R5,不建 FeedDownweightApi 孤儿 seam)。
|
||
-- 约定:InnoDB + utf8mb4;显式列;含 Huijing 审计列 creator/create_time/updater/update_time/deleted + tenant_id;
|
||
-- 状态机用 tinyint,非法流转由 Service 校验,DO 层不承载;中文列注释;关键查询建索引、禁裸 select*。
|
||
-- 错误码段:compliance = 1-109-***-***
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_compliance_gate_result —— 锁风门评估台账(每次 publish 评估各落一条,审计/溯源用)
|
||
-- 用途:project.publish 注入 evaluate 时落聚合裁决 + 各原子明细 JSON;admin 复核与合规溯源据此查
|
||
-- 写口径:非幂等(每次评估各落一条审计记录,不去重);verdict 为聚合结果 max(各原子)
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_compliance_gate_result` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '锁风门评估记录 ID',
|
||
`game_id` BIGINT NOT NULL COMMENT '评估的游戏 ID(project.game_project.id)',
|
||
`version_id` BIGINT NOT NULL DEFAULT 0 COMMENT '评估的版本 ID(待发布版本;无版本时为 0)',
|
||
`verdict` VARCHAR(16) NOT NULL DEFAULT 'pass' COMMENT '聚合裁决:pass 通过/review 需人工复核/block 拦截(= max(各原子))',
|
||
`rating` VARCHAR(16) NOT NULL DEFAULT '' COMMENT '本次评估落定的内容分级:all/8+/12+/16+(可空)',
|
||
`details` VARCHAR(2048) NOT NULL DEFAULT '' COMMENT '各合规原子明细 JSON([{atom,verdict,reason}],便于复核溯源)',
|
||
`trace_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '全链路追踪 ID(与 publish 链路对账)',
|
||
`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`),
|
||
KEY `idx_game_version` (`game_id`, `version_id`) COMMENT '按游戏+版本查最近一次锁风门评估(复核/溯源)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '锁风门评估台账(每次 publish 评估落一条,聚合裁决+原子明细;审计/溯源)';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_content_rating —— 内容分级表(按游戏+版本唯一;评估时落、admin 复核可改)
|
||
-- 用途:/app-api/compliance/rating/get 读分级;分级写入仅由 Gate evaluate 落定 + admin 复核产生
|
||
-- 唯一键:(game_id,version_id) 业务唯一(含 deleted/tenant_id 适配逻辑删+多租户),同游戏同版本只存一条最新分级
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_content_rating` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '内容分级记录 ID',
|
||
`game_id` BIGINT NOT NULL COMMENT '游戏 ID(project.game_project.id)',
|
||
`version_id` BIGINT NOT NULL DEFAULT 0 COMMENT '版本 ID(无版本时为 0)',
|
||
`rating` VARCHAR(16) NOT NULL DEFAULT 'all' COMMENT '内容分级:all 全年龄/8+/12+/16+',
|
||
`rated_by` VARCHAR(32) NOT NULL DEFAULT 'gate' COMMENT '分级来源:gate 锁风门自动/admin 人工复核',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者(admin 复核改分级时记录)',
|
||
`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_version` (`game_id`, `version_id`, `deleted`, `tenant_id`) COMMENT '游戏+版本分级业务唯一键(含 deleted/tenant_id 适配逻辑删+多租户)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '内容分级表(评估落定+admin 复核;/app-api 只读取)';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_user_ban —— 封禁台账(封禁/降权的权威台账;主操作恒执行)
|
||
-- 用途:admin 封禁游戏/用户落台账(恒执行);R3 下架联动仅当游戏==PUBLISHED 时才调 project 状态机(本波标 TODO);
|
||
-- R5 降权出流屏蔽 P1 本波不生效(不建 feed seam)
|
||
-- 唯一键:(target_type,target_id,status) 生效中唯一(status=1 生效,含 deleted/tenant_id),同目标不可重复生效封禁;解封后(status=0)可再次封禁
|
||
-- 状态机 status:1 生效 → 0 已解封(解封由 admin 触发,Service 校验合法流转)
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_user_ban` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '封禁台账记录 ID',
|
||
`target_type` TINYINT NOT NULL COMMENT '封禁目标类型:1 游戏 / 2 用户',
|
||
`target_id` BIGINT NOT NULL COMMENT '封禁目标 ID(游戏=game_id / 用户=user_id)',
|
||
`ban_type` TINYINT NOT NULL DEFAULT 1 COMMENT '处置类型:1 封禁(下架/禁用)/ 2 降权(出流屏蔽,P1 本波不生效)',
|
||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '封禁状态机:1 生效 / 0 已解封(合法流转由 Service 校验)',
|
||
`reason` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '封禁/降权原因(合规处置说明)',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列;封禁操作的 admin userId)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(封禁时间)',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者(解封操作的 admin userId)',
|
||
`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_target_active` (`target_type`, `target_id`, `status`, `deleted`, `tenant_id`) COMMENT '生效中封禁业务唯一键:同目标 status=1 不可重复(含 deleted/tenant_id 适配逻辑删+多租户)',
|
||
KEY `idx_type_status` (`target_type`, `status`) COMMENT 'admin 按目标类型+状态分页查封禁台账'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '封禁台账表(封禁/降权权威台账;主操作恒执行,下架联动按 project 状态分支)';
|