- 范围:全仓除已完成的 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>
86 lines
8.6 KiB
SQL
86 lines
8.6 KiB
SQL
-- =============================================================================
|
||
-- 契约 #2 DB 迁移 | 主题:community 通知底座(站内信 + 创作者等级 + 新人奖励触发)(HJ-WAVE4-EXEC-001 §4.1)| owner:WS5
|
||
-- 文件:V12.0.0__create_game_community.sql(Flyway,只新增;已合入禁止修改,回滚写新补偿迁移 V12.0.1)
|
||
-- 设计依据:docs/agent-specs/2026-06-11-Wave4-community-biz-execution.md §4.1(D-B 通知底座最小集,覆盖 5/5 P0:P-NTF-01/02/03/05 + P-INC-01)。
|
||
-- 内容:community 三张新表(引架构 Doc B community 章节):
|
||
-- 1. game_community_message —— 站内消息中心(四类聚合:1系统 2公告 3审核 4收益;P-NTF-01/02/03/05 投递落点,T-CMU-06);
|
||
-- 2. game_community_level —— 创作者等级(P-INC-01 计数权威落点 published_count;T-CMU-11 等级引擎);
|
||
-- 3. game_community_reward —— 新人奖励触发记录(P-INC-01;本波只写触发记录,真实发放/记账留 M4)。
|
||
-- 守门①(必守,沿用 V10/V11 守门):本 V12 只放仓根 contracts/db-schemas/(授权源)
|
||
-- + huijing-server 执行目录(唯一执行副本),不放任何单模块 -server/db/migration/(避免同版本 V12 出现在多个 classpath jar 触发 Flyway 重复校验失败)。
|
||
-- 守门②:含中文 SQL,mini-desktop 执行必须 --default-character-set=utf8mb4(防乱码)。
|
||
-- 约定:InnoDB + utf8mb4;显式列 + 列级中文 COMMENT;状态机用 TINYINT,非法流转由 Service 校验、DO 层不承载;
|
||
-- 每表强制 Huijing 6 审计列(creator / create_time / updater / update_time / deleted BIT(1) / tenant_id BIGINT,全 NOT NULL,MVP 单租户 tenant_id=0);
|
||
-- 归属隔离列 user_id / creator_user_id 由 Mapper 强制以 getLoginUserId() 作 WHERE 谓词 enforce(可信边界,非 @DataPermission);禁裸 select*。
|
||
-- 错误码段:community = 1-107-***-***(落 -api 的 ErrorCodeConstants.java,见 community.yaml)。
|
||
-- 系统身份写:通知由上游同进程 @Primary notify 落库(系统身份 LoginUser id=0),creator/updater 写 '0' 防 NOT NULL 拒绝。
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表1:game_community_message —— 站内消息中心(P-NTF-01/02/03/05 投递落点,T-CMU-06)
|
||
-- 四类消息聚合:1系统 2公告 3审核 4收益;归属隔离 = Mapper 强制 user_id = getLoginUserId() 谓词,用户只见自己消息。
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_community_message` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '消息 ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '收件人用户 ID(归属隔离:Mapper 强制以 getLoginUserId() 作 WHERE 谓词,用户只见自己消息)',
|
||
`type` TINYINT NOT NULL COMMENT '消息类型:1系统 2公告 3审核 4收益',
|
||
`biz_ref` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '业务关联键(如 gameId/taskId/settleId,供前端跳转)',
|
||
`title` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '消息标题',
|
||
`content` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '消息正文(审核拒绝含原因)',
|
||
`read_status` TINYINT NOT NULL DEFAULT 0 COMMENT '已读状态:0未读 1已读',
|
||
`read_time` DATETIME NULL COMMENT '已读时间',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列;系统身份投递=0)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者(系统身份写=0,防 NOT NULL 拒绝)',
|
||
`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(MVP 单租户=0)',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_read` (`user_id`, `read_status`, `create_time`) COMMENT '我的消息中心列表(按已读态+时间倒序)',
|
||
KEY `idx_user_type` (`user_id`, `type`, `create_time`) COMMENT '按四类聚合查询'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '站内消息中心(四类聚合,T-CMU-06)';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表2:game_community_level —— 创作者等级(P-INC-01 计数权威落点 published_count,T-CMU-11)
|
||
-- published_count 权威源 = project 发布成功后同进程 notify 原子累加;MVP 仅维护计数 + 新人里程碑,分层留 P1。
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_community_level` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '等级记录 ID',
|
||
`creator_user_id` BIGINT NOT NULL COMMENT '创作者用户 ID',
|
||
`level` TINYINT NOT NULL DEFAULT 1 COMMENT '创作者等级:1小白(MVP 仅维护计数+新人里程碑,分层留 P1)',
|
||
`published_count` INT NOT NULL DEFAULT 0 COMMENT '已发布作品数(计数权威源=project 发布成功 notify 原子累加)',
|
||
`last_milestone` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '末次已触发里程碑键(如 publish_3,幂等防重复触发)',
|
||
`last_milestone_time` DATETIME NULL COMMENT '末次里程碑触发时间',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者',
|
||
`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 '逻辑删除',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_creator` (`creator_user_id`, `deleted`, `tenant_id`) COMMENT '一创作者一条等级记录(幂等初始化)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '创作者等级(T-CMU-11 等级引擎)';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表3:game_community_reward —— 新人奖励触发记录(P-INC-01;本波只写触发记录,真实发放留 M4)
|
||
-- 幂等:同创作者同里程碑只触发一次(uk_creator_milestone 防重复发钱);status=0 触发待发放为本波终态,1 已发放留 M4 回写。
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_community_reward` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '奖励触发记录 ID',
|
||
`creator_user_id` BIGINT NOT NULL COMMENT '创作者用户 ID',
|
||
`milestone` VARCHAR(32) NOT NULL COMMENT '里程碑键(如 publish_3 发满3作品)',
|
||
`reward_type` TINYINT NOT NULL COMMENT '奖励类型:1流量包 2现金',
|
||
`reward_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '奖励额度(流量包=曝光量;现金=分,BIGINT 防浮点;与 trade 同口径)',
|
||
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '发放状态:0已触发待发放(本波终态) 1已发放(M4 回写)',
|
||
`granted_ref` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'M4 发放回执(trade 流水 id / feed 流量包 id),本波空',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(系统身份触发=0)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者(系统身份写=0)',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_creator_milestone` (`creator_user_id`, `milestone`, `deleted`, `tenant_id`) COMMENT '同创作者同里程碑只触发一次(幂等防重复发钱)',
|
||
KEY `idx_status` (`status`) COMMENT 'M4 待发放扫描'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '新人奖励触发记录(P-INC-01,发放留 M4)';
|