chore(brand): 造梦AI→绘境AI 全活层品牌不变量收口(441 文件)
把活层退役旧品牌「造梦AI」统一改为现行「绘境AI」,brand-invariant 门红线归零。构成: ~412 Java @author 署名 + game-studio/index.html 浏览器标题 + game-runtime/package.json 描述 + game-admin/.env VITE_APP_TITLE 运营后台标题 + contracts API title/@Schema 用户协议示例/events 描述 + docs-design mockup 品牌位 + 各模块注释。全是注释/显示/元数据,零逻辑改动。 zaomeng 拼音持久化标识符按 2026-06-24 评审 GR-05 不动(347 处保留)。 白名单(docs/ip 法律备案 / _archive / 带日期留痕)与 AGENTS.md 门定义自身不动。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ce7a4850eb
commit
b31cc37a4f
@ -13,7 +13,7 @@ openapi: 3.0.3
|
||||
# 与契约#7 对齐:广告位 CRUD 字段严格对齐 ad-slot.schema.json(slotId/type/provider/placement/providerSlotId/ecpmFloor/enabled/compliance),不重造广告位结构
|
||||
# 与契约#5 对齐:不重造 ad_impression/ad_reward/income_settled 事件(那是 telemetry 分析埋点);本模块只新增计费上报接口与收入台账
|
||||
info:
|
||||
title: 造梦AI ad 模块 API
|
||||
title: 绘境AI ad 模块 API
|
||||
version: 1.0.0
|
||||
description: >-
|
||||
广告引擎("赚得到"上游)。SDK Plugin.Ad 拉取启用广告位(契约#7) → 有效曝光/激励视频完成计费上报 →
|
||||
|
||||
@ -14,7 +14,7 @@ openapi: 3.0.3
|
||||
# 子段:001 锁风门 / 002 封禁 / 003 分级 / 004 政策正文(U4)/ 005 申诉(U4)。publish-blocked 不在本模块登记(R1:block→admitted=false 不抛异常)。
|
||||
# 响应统一 Huijing CommonResult 信封:{ code, data, msg };code=0 成功
|
||||
info:
|
||||
title: 造梦AI compliance 模块 API
|
||||
title: 绘境AI compliance 模块 API
|
||||
version: 1.0.0
|
||||
description: >-
|
||||
合规锁风门 Gate("做得出"安全闸门)。project.publish 发布前同步调 evaluate → 聚合风格/IP 合规原子产出 verdict
|
||||
|
||||
@ -31,7 +31,7 @@ openapi: 3.0.3
|
||||
# - project-api ProjectApi 取 baseVersion 源项目引用 + 新预览版落库(version 产物权威仍在 project;源项目独立 game_source_project 表存 V18)。
|
||||
# idempotency 语义(create/modify/extend 共用):同 userId+operation+idempotencyKey 命中则返回既有 taskChain(不重复触发生成);缺省=不去重;建议 TTL 24h。
|
||||
info:
|
||||
title: 造梦AI studio 模块 API
|
||||
title: 绘境AI studio 模块 API
|
||||
version: 1.0.0
|
||||
description: >-
|
||||
创作主链路最小版("做得出"工作台)。创作者进工作坊建草稿(移交 project 建游戏拿 gameId)→ 一句话生成(委托 aigc)→
|
||||
|
||||
@ -15,7 +15,7 @@ openapi: 3.0.3
|
||||
# 资金严谨:金额一律用「分」(BIGINT),禁浮点;比例用 DECIMAL;所有资金写入有幂等键(biz_no/source_ref + uk);状态机用 tinyint,非法流转服务端拒绝。
|
||||
# 与契约#5 对齐:不重造 income_settled 事件(那是 telemetry 分析埋点 props:amount/source);本模块落账走 game_trade_income,income_settled 仅为埋点镜像。
|
||||
info:
|
||||
title: 造梦AI trade 模块 API
|
||||
title: 绘境AI trade 模块 API
|
||||
version: 1.0.0
|
||||
description: >-
|
||||
分账/结算/提现域。消费上游 ad 未结算广告收入 → 按 creator_share(Nacos 0.80) T+1 分账入创作者收益账户 →
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://wanxiang.ai/contracts/events.schema.json",
|
||||
"title": "TelemetryEvents",
|
||||
"description": "造梦AI 遥测事件契约 v1(契约 #5,owner=WS5)。前端批量上报 / SDK 上报 → /app-api/telemetry/events/batch → MQ 异步入库 → qualityScore → feed 排序(数据回路闭环)。每事件带 schemaVersion;新增字段给默认值、老消费者忽略未知字段;不兼容变更用新事件名。【Wave3 GAP-4 评审记录】利用无生产数据 + MQ 未实现窗口,一次性把信封 envelope/user 由 snake_case 统一为 camelCase(与 telemetry.yaml 及前端 SDK 对齐),保持 additionalProperties:false;豁免本文件 README §2『不兼容变更用新事件名并行』规则(本次改的是信封字段命名而非事件名),已确认仓外无 snake_case 消费者(telemetry.yaml/sdk-interface.d.ts/game-studio 均为 camelCase)。",
|
||||
"description": "绘境AI 遥测事件契约 v1(契约 #5,owner=WS5)。前端批量上报 / SDK 上报 → /app-api/telemetry/events/batch → MQ 异步入库 → qualityScore → feed 排序(数据回路闭环)。每事件带 schemaVersion;新增字段给默认值、老消费者忽略未知字段;不兼容变更用新事件名。【Wave3 GAP-4 评审记录】利用无生产数据 + MQ 未实现窗口,一次性把信封 envelope/user 由 snake_case 统一为 camelCase(与 telemetry.yaml 及前端 SDK 对齐),保持 additionalProperties:false;豁免本文件 README §2『不兼容变更用新事件名并行』规则(本次改的是信封字段命名而非事件名),已确认仓外无 snake_case 消费者(telemetry.yaml/sdk-interface.d.ts/game-studio 均为 camelCase)。",
|
||||
"type": "object",
|
||||
"required": ["envelope", "eventRegistry"],
|
||||
"additionalProperties": false,
|
||||
|
||||
@ -94,7 +94,7 @@ print('%s|%s'%(c,n))
|
||||
if [ "$ok" = "1" ]; then PASS=$((PASS+1)); _log " ${G}✓${N} $name ($detail)"; else FAIL=$((FAIL+1)); FAILED_ITEMS+=("$name [$detail]"); _log " ${R}✗${N} $name ($detail)"; fi
|
||||
}
|
||||
|
||||
_log "${B}造梦AI staging 五链路冒烟门${N} BASE=$BASE TOKEN=${TOKEN:0:2}*** deep=$DEEP"
|
||||
_log "${B}绘境AI staging 五链路冒烟门${N} BASE=$BASE TOKEN=${TOKEN:0:2}*** deep=$DEEP"
|
||||
|
||||
# ---------------- 基础设施 + 鉴权 ----------------
|
||||
_head "基础设施 / 鉴权"
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
-- =============================================================================
|
||||
-- 造梦AI · huijing 死菜单清理(2026-06-11 审计版)
|
||||
-- 绘境AI · huijing 死菜单清理(2026-06-11 审计版)
|
||||
-- 适用库:ruoyi-vue-pro(staging:mini-desktop docker game-staging-mysql,MySQL 8.4.8)
|
||||
-- 性质:软删(deleted=1),全量可回滚(备份表 + 固化删除集表)
|
||||
-- 判据:16 棵死顶级子树(views 已被 fork 删除,点开全空白);详见
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>造梦AI · studio 设计体系 mockup(HJ-FE-DS-001)</title>
|
||||
<title>绘境AI · studio 设计体系 mockup(HJ-FE-DS-001)</title>
|
||||
<!--
|
||||
设计体系蓝图(评审版配套 mockup)。自包含、浏览器直开。
|
||||
本文件的 CSS 变量 = 提案的「真实 token 值」,落地时直接映射到 game-studio/src/styles/tokens.css。
|
||||
@ -244,7 +244,7 @@ textarea.ctrl{min-height:96px;line-height:1.55;resize:vertical}
|
||||
|
||||
<!-- ============ 顶栏 + 语言切换(i18n 实证) ============ -->
|
||||
<header class="topbar"><div class="topbar-in">
|
||||
<div class="brand"><span class="dot"></span><span class="nm" data-i18n="brand">造梦AI</span></div>
|
||||
<div class="brand"><span class="dot"></span><span class="nm" data-i18n="brand">绘境AI</span></div>
|
||||
<span class="note" data-i18n="subtitle">studio 设计体系 mockup · 暗色先行</span>
|
||||
<span class="spacer"></span>
|
||||
<div class="lang-toggle" role="group" aria-label="theme" style="margin-right:6px">
|
||||
@ -427,7 +427,7 @@ textarea.ctrl{min-height:96px;line-height:1.55;resize:vertical}
|
||||
<div class="sec-h"><h2 data-i18n="s_desk">代表屏 · 响应式桌面(消费居中放大)</h2><span data-i18n="s_desk_d">同一套组件 → 桌面浏览器放大,非 demo 的后台侧栏</span></div>
|
||||
<div class="desk">
|
||||
<div class="bar2">
|
||||
<div class="brand" style="font-size:15px"><span class="dot" style="width:22px;height:22px"></span><span class="nm" data-i18n="brand">造梦AI</span></div>
|
||||
<div class="brand" style="font-size:15px"><span class="dot" style="width:22px;height:22px"></span><span class="nm" data-i18n="brand">绘境AI</span></div>
|
||||
<nav class="nav">
|
||||
<a class="on" data-i18n="nav_feed">游戏流</a><a data-i18n="nav_create">创作</a><a data-i18n="nav_discover">发现</a><a data-i18n="nav_me">我的</a>
|
||||
</nav>
|
||||
@ -449,7 +449,7 @@ textarea.ctrl{min-height:96px;line-height:1.55;resize:vertical}
|
||||
</section>
|
||||
|
||||
<div class="foot">
|
||||
HJ-FE-DS-001 · 造梦AI studio 设计体系 mockup · 暗色先行 / 主题就绪 / 跨端 token 单一事实源 ·
|
||||
HJ-FE-DS-001 · 绘境AI studio 设计体系 mockup · 暗色先行 / 主题就绪 / 跨端 token 单一事实源 ·
|
||||
<span data-i18n="foot">配套评审版:docs/agent-specs/2026-06-16-studio视觉体系-i18n-组件库-review.md</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -470,7 +470,7 @@ textarea.ctrl{min-height:96px;line-height:1.55;resize:vertical}
|
||||
<script>
|
||||
/* i18n 字典(mockup 内联演示;落地用 vue-i18n 的 src/locales/{zh-CN,en-US}/*.json) */
|
||||
const I18N={
|
||||
zh:{brand:"造梦AI",subtitle:"studio 设计体系 mockup · 多档舒适主题",th_dark:"暗色",th_light:"浅色",th_dim:"柔和",
|
||||
zh:{brand:"绘境AI",subtitle:"studio 设计体系 mockup · 多档舒适主题",th_dark:"暗色",th_light:"浅色",th_dim:"柔和",
|
||||
s_color:"语义色板(semantic tokens)",s_color_d:"组件只用语义层 · 主题就绪 · 跨端中立",
|
||||
s_type:"字号 / 字重 / 间距 / 圆角 / 阴影",t_h1:"标题 H1",t_h2:"标题 H2",t_h3:"小标题 H3",t_body:"正文 Body(消费面 ≥14px 保可读)",t_cap:"辅助 Caption(muted)",
|
||||
s_btn:"按钮 AppButton(全状态)",b_primary:"主操作",b_secondary:"次操作",b_ghost:"幽灵",b_danger:"危险",b_loading:"生成中",b_disabled:"不可用",b_lg:"大号 CTA",b_sm:"小号",
|
||||
|
||||
@ -68,4 +68,4 @@
|
||||
|
||||
## 6. 专项代码评审留痕
|
||||
|
||||
- `2026-06-24-非后端四模块代码评审-review.md` — **非后端四模块(game-runtime / game-studio / tier2 / wg1)跨模块代码评审**(4 并行 workflow × 三阶段·静态分析在 mini-desktop·逐条 file:line 证伪,配方 `scratchpad/review/module-review.workflow.mjs`):**0 P0 / 9 P1 / 7 P2 / 9 P3**,四模块核心代码语言规范达大厂基线、无 error 级问题。真风险四条:① 生成 worker 成本与幂等闸(wg1 `/generate` 无幂等去重、`run_studio.max_tokens` 未透传;tier2 ¥硬闸跨 resume 不累计)② 活层 3 处旧品牌「造梦AI」+ 品牌门扫描面有洞(漏 `index.html`/`package.json`/`wg1/`)③ 契约真空 / v1→v2 标注漂移 ④ game-studio vue-i18n 缺失卡类型门 + host CSP 注释失真。逐模块明细嵌于该档 §七。
|
||||
- `2026-06-24-非后端四模块代码评审-review.md` — **非后端四模块(game-runtime / game-studio / tier2 / wg1)跨模块代码评审**(4 并行 workflow × 三阶段·静态分析在 mini-desktop·逐条 file:line 证伪,配方 `scratchpad/review/module-review.workflow.mjs`):**0 P0 / 9 P1 / 7 P2 / 9 P3**,四模块核心代码语言规范达大厂基线、无 error 级问题。真风险四条:① 生成 worker 成本与幂等闸(wg1 `/generate` 无幂等去重、`run_studio.max_tokens` 未透传;tier2 ¥硬闸跨 resume 不累计)② 旧品牌残留 3 处(活层)+ 品牌门扫描面有洞(漏 `index.html`/`package.json`/`wg1/`)〔残留 2026-06-25 已全活层清零;门扫描面拓宽仍待办〕③ 契约真空 / v1→v2 标注漂移 ④ game-studio vue-i18n 缺失卡类型门 + host CSP 注释失真。逐模块明细嵌于该档 §七。
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
|
||||
## 原文快照(截至 2026-06-11,黄金闭环轮)
|
||||
|
||||
# 造梦AI MVP 作战清单(执行视图 · 你打勾 / 我执行)
|
||||
# 绘境AI MVP 作战清单(执行视图 · 你打勾 / 我执行)
|
||||
|
||||
> 本清单 = MVP「**下一步做什么 + 谁做 + 完成线**」的唯一执行序列。
|
||||
> **状态以 [`MVP进度总账.md`](./MVP进度总账.md) 为准**(哪些真实/桩、里程碑);本清单只管**排序与归属**,两者勿混。
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
# 标题(造梦AI 品牌文案;技术框架名 huijing 保留不改)
|
||||
VITE_APP_TITLE=造梦AI 运营后台
|
||||
# 标题(绘境AI 品牌文案;技术框架名 huijing 保留不改)
|
||||
VITE_APP_TITLE=绘境AI 运营后台
|
||||
|
||||
# 项目本地运行端口号
|
||||
VITE_PORT=80
|
||||
|
||||
@ -33,10 +33,10 @@ VITE_APP_CAPTCHA_ENABLE=false
|
||||
# GoView域名
|
||||
VITE_GOVIEW_URL='http://127.0.0.1:3000'
|
||||
|
||||
# API 加解密开关(本地对接造梦AI MVP 后端 http://localhost:48080:后端默认未配置 huijing 加解密密钥,
|
||||
# API 加解密开关(本地对接绘境AI MVP 后端 http://localhost:48080:后端默认未配置 huijing 加解密密钥,
|
||||
# 故本地关闭,覆盖 .env 中的默认 true,避免请求被加密导致 401/解析失败。真实环境如启用加解密,需与后端统一密钥后再开启)
|
||||
VITE_APP_API_ENCRYPT_ENABLE = false
|
||||
|
||||
# 造梦AI 运营页 mock 兜底开关:true=各 wanxiang api 返回本地 mock 数据(MVP 后端未起时也可预览/独立构建);
|
||||
# 绘境AI 运营页 mock 兜底开关:true=各 wanxiang api 返回本地 mock 数据(MVP 后端未起时也可预览/独立构建);
|
||||
# 后端联调就绪后改为 false 走真实 /admin-api。严格贴 admin-api 契约,发现缺口记 contractGaps 不私造。
|
||||
VITE_APP_WANXIANG_MOCK = true
|
||||
@ -2,7 +2,7 @@ import request from '@/config/axios'
|
||||
import { isMock, mockPage, mockResult } from './mock'
|
||||
|
||||
/**
|
||||
* 造梦AI —— ad 模块 admin 接口(广告位管理 + 广告收入台账对账)
|
||||
* 绘境AI —— ad 模块 admin 接口(广告位管理 + 广告收入台账对账)
|
||||
* 契约:contracts/api-schemas/ad.yaml(字段严格对齐契约#7 ad-slot.schema.json,不重造广告位结构)
|
||||
* - POST /admin-api/ad/slot/create 新建广告位(slotId 业务唯一)
|
||||
* - PUT /admin-api/ad/slot/update 更新(按主键 id,slotId 不可改)
|
||||
|
||||
@ -2,7 +2,7 @@ import request from '@/config/axios'
|
||||
import { isMock, mockPage, mockResult } from './mock'
|
||||
|
||||
/**
|
||||
* 造梦AI —— feed 模块 admin 接口(游戏流精选池运营)
|
||||
* 绘境AI —— feed 模块 admin 接口(游戏流精选池运营)
|
||||
* 契约:contracts/api-schemas/feed.yaml
|
||||
* - GET /admin-api/feed/featured/page 精选池列表(可按 zoneId 筛选)
|
||||
* - POST /admin-api/feed/featured 置顶/取消 + 运营加权(写 game_feed_rank.pinned/boost)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 造梦AI 运营页 mock 兜底基础设施
|
||||
* 绘境AI 运营页 mock 兜底基础设施
|
||||
*
|
||||
* 背景:MVP 后端(http://localhost:48080 /admin-api)可能尚未启动,但运营后台需可独立预览与构建。
|
||||
* 机制:各 wanxiang api 模块在每个接口入口判断 isMock(),为真则返回本地 mock 数据、为假则调用真实 request。
|
||||
|
||||
@ -2,7 +2,7 @@ import request from '@/config/axios'
|
||||
import { isMock, mockPage, mockResult } from './mock'
|
||||
|
||||
/**
|
||||
* 造梦AI —— project 模块 admin 接口(项目审核)
|
||||
* 绘境AI —— project 模块 admin 接口(项目审核)
|
||||
* 契约:contracts/api-schemas/project.yaml
|
||||
* - GET /admin-api/project/review/page 审核队列(默认 status=1 审核中)
|
||||
* - POST /admin-api/project/review 审核决策(通过/拒绝/下架)
|
||||
|
||||
@ -2,7 +2,7 @@ import request from '@/config/axios'
|
||||
import { isMock, mockPage, mockResult } from './mock'
|
||||
|
||||
/**
|
||||
* 造梦AI —— telemetry 模块 admin 接口(数据看板数据源 + 经营看板聚合)
|
||||
* 绘境AI —— telemetry 模块 admin 接口(数据看板数据源 + 经营看板聚合)
|
||||
* 契约:contracts/api-schemas/telemetry.yaml
|
||||
* - GET /admin-api/telemetry/game-stat/page 游戏维度聚合分页(看板表格数据源)
|
||||
* - GET /admin-api/telemetry/game-stat/{gameId} 单游戏最新聚合快照
|
||||
|
||||
@ -2,7 +2,7 @@ import request from '@/config/axios'
|
||||
import { isMock, mockPage, mockResult } from './mock'
|
||||
|
||||
/**
|
||||
* 造梦AI —— trade 模块 admin 接口(提现审核 + 收益流水查询 + 平台营收报表 + 赋余额 + 赋订阅)
|
||||
* 绘境AI —— trade 模块 admin 接口(提现审核 + 收益流水查询 + 平台营收报表 + 赋余额 + 赋订阅)
|
||||
* 契约:contracts/api-schemas/trade.yaml
|
||||
* - GET /admin-api/trade/withdraw/page 提现审核队列(默认 status=0 待审核)
|
||||
* - POST /admin-api/trade/withdraw/audit 审核(通过/驳回,驱动状态机;非法流转服务端拒绝)
|
||||
|
||||
@ -43,7 +43,7 @@ import Logger from '@/utils/Logger'
|
||||
import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患
|
||||
|
||||
// 说明:原 huijing 的 wangEditor 自定义节点插件(@/views/bpm/model/form/PrintTemplate)
|
||||
// 仅服务于 bpm 打印模板模块。该业务模块已在造梦AI MVP 裁剪中移除,故此处一并移除其插件注册,
|
||||
// 仅服务于 bpm 打印模板模块。该业务模块已在绘境AI MVP 裁剪中移除,故此处一并移除其插件注册,
|
||||
// 避免对已删视图的死 import 导致构建失败。
|
||||
|
||||
import print from 'vue3-print-nb' // 打印插件
|
||||
|
||||
@ -235,10 +235,10 @@ const remainingRouter: AppRouteRecordRaw[] = [
|
||||
}
|
||||
},
|
||||
// ===========================================================================
|
||||
// 造梦AI(wanxiang) MVP 运营页静态路由:
|
||||
// 绘境AI(wanxiang) MVP 运营页静态路由:
|
||||
// - 已裁剪 huijing 无关业务模块(ai/bpm/crm/erp/iot/mall/member/mp/pay/report)的全部静态路由,
|
||||
// 避免对已删视图的死 import 导致构建失败;
|
||||
// - 新增造梦AI 8 个 MVP 运营页(wanxiang/*)静态路由:后端 RBAC 菜单未下发时也可路由可见、
|
||||
// - 新增绘境AI 8 个 MVP 运营页(wanxiang/*)静态路由:后端 RBAC 菜单未下发时也可路由可见、
|
||||
// 可独立构建(mock 兜底见各 wanxiang api 模块),对接我方 admin-api。
|
||||
// (U10 追加 3 页:限曝光控制 / 经营看板 / 赋余额+订阅。)
|
||||
// ===========================================================================
|
||||
|
||||
@ -26,7 +26,7 @@ import java.util.List;
|
||||
* MVP 单体:同进程内由 {@code AdRevenueApiImpl}(@RestController @Primary) 就地解析(仿 huijing DictDataApi);
|
||||
* 拆微服务后按 {@link ApiConstants#NAME} 走真实 Feign。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@FeignClient(name = ApiConstants.NAME)
|
||||
@Tag(name = "RPC 服务 - 广告收入台账")
|
||||
|
||||
@ -11,7 +11,7 @@ import java.time.LocalDate;
|
||||
* 拉取未结算广告收入,按 creatorUserId 聚合 ×creator_share 分账;分账入账后经 markSettled 回标已结算。
|
||||
* 字段严格对齐契约 x-feign-contracts.operations[getUnsettledRevenue].output.itemFields(不多不少)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Data
|
||||
public class AdRevenueRespDTO {
|
||||
|
||||
@ -14,7 +14,7 @@ import java.util.Objects;
|
||||
* - type=interstitial/banner:收入计在 IMPRESSION。
|
||||
* 同一 trace_id 的 IMPRESSION 与 REWARD 各落一条、互不覆盖(uk_trace=(trace_id,event_type,tenant_id))。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
|
||||
@ -11,7 +11,7 @@ import java.util.Objects;
|
||||
* 合法流转:0未结算 → 1已结算(trade 分账入账成功后经 AdRevenueApi.markSettled 回标)。
|
||||
* 非法回退(1→0)由 Service 拒绝;DO 层不承载校验。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
|
||||
@ -11,7 +11,7 @@ import com.wanxiang.huijing.framework.common.enums.RpcConstants;
|
||||
* 拆分微服务后该值即对应 ad 服务的 spring.application.name。
|
||||
* - PREFIX:RPC 接口前缀 /rpc-api/ad,与业务端 /app-api、/admin-api 隔离,避免与业务路由冲突。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public class ApiConstants {
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ import com.wanxiang.huijing.framework.common.exception.ErrorCode;
|
||||
* ad 模块独占 1-111-***-*** 段(见 contracts/api-schemas/ad.yaml 头部 + .agents/rules/engineering-conventions.md)。
|
||||
* 约定:禁止与其它模块错误码段重叠(100 project/101 aigc/102 runtime/103 feed/104 telemetry/106 trade);新增错误码在此登记。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public interface ErrorCodeConstants {
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ import static com.wanxiang.huijing.framework.common.pojo.CommonResult.success;
|
||||
* @RestController + @Primary:与 huijing DictDataApiImpl 同构——单体内同进程调用走本实现,拆微服务后走 Feign。
|
||||
* 仅做契约转换(DO → DTO)并委托 Service,不写业务逻辑(业务在 AdRevenueService)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@Validated
|
||||
|
||||
@ -25,7 +25,7 @@ import static com.wanxiang.huijing.framework.common.pojo.CommonResult.success;
|
||||
* 端前缀 /admin-api 由框架按包名 controller.admin.* 自动添加。
|
||||
* 这是 ad↔trade seam 的人工对账视图;与 trade 侧 game_trade_income.source_ref 通过台账 id + trace_id 对齐。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Tag(name = "管理后台 - 广告收入台账")
|
||||
@RestController
|
||||
|
||||
@ -25,7 +25,7 @@ import static com.wanxiang.huijing.framework.common.pojo.CommonResult.success;
|
||||
* 端前缀 /admin-api 由框架按包名 controller.admin.* 自动添加。
|
||||
* 鉴权:RBAC,@PreAuthorize 注解 + 网关双重校验。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Tag(name = "管理后台 - 广告位配置")
|
||||
@RestController
|
||||
|
||||
@ -14,7 +14,7 @@ import java.time.LocalDate;
|
||||
* 分页参数复用 Huijing PageParam;可选按广告位/游戏/创作者/事件类型/结算状态/归集日筛选(命中相应索引)。
|
||||
* eventType 以 tinyint 入参(1 impression / 2 reward),与 DO 一致,避免编码转换散落到 Mapper。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 广告收入台账分页 Request VO")
|
||||
@Data
|
||||
|
||||
@ -12,7 +12,7 @@ import java.time.LocalDateTime;
|
||||
* 这是 ad↔trade seam 的数据源:settleStatus=0 的记录由 trade 经 AdRevenueApi.getUnsettledRevenue 拉取做 T+1 分账,
|
||||
* 分账后回标 settleStatus=1。eventType 以编码(impression/reward)对外,与 DO 的 tinyint 解耦。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 广告收入台账 Response VO")
|
||||
@Data
|
||||
|
||||
@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode;
|
||||
*
|
||||
* 分页参数复用 Huijing PageParam(pageNo/pageSize);可选按 type/provider/enabled 筛选。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 广告位分页 Request VO")
|
||||
@Data
|
||||
|
||||
@ -11,7 +11,7 @@ import java.time.LocalDateTime;
|
||||
*
|
||||
* providerSlotId 在 admin 可见明文,供运营核对(区别于 app 端 SDK 配置恒不下发明文)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 广告位详情 Response VO")
|
||||
@Data
|
||||
|
||||
@ -11,7 +11,7 @@ import lombok.Data;
|
||||
*
|
||||
* 新建无 id;更新带 id,slotId 不可改(业务唯一键)。provider!=mock 时 providerSlotId 必填(Service 校验)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 广告位新建/更新 Request VO")
|
||||
@Data
|
||||
|
||||
@ -37,7 +37,7 @@ import static com.wanxiang.huijing.framework.common.pojo.CommonResult.success;
|
||||
* 计费链反作弊三条件(§6.2,缺一不得合入):①两计费端点 @RateLimiter(IP 维度);②幂等已有(traceId)保持;
|
||||
* ③聚合侧剔除桩(telemetry AnomalyFilterService)同时覆盖 ad 计费事件——本控制器落条件①,②保持,③在 telemetry。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Tag(name = "用户 App - 广告")
|
||||
@RestController
|
||||
|
||||
@ -8,7 +8,7 @@ import lombok.Data;
|
||||
*
|
||||
* 在 app 端(SDK 下发配置)与 admin 端(CRUD 入参/详情)共用同一形态。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "合规植入规则(未成年人保护)")
|
||||
@Data
|
||||
|
||||
@ -11,7 +11,7 @@ import lombok.Data;
|
||||
* 区别于 telemetry 分析埋点 ad_impression:本上报落 game_ad_revenue(决定收入)。
|
||||
* traceId 为计费幂等键,重复上报只计一次收入。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 有效曝光计费上报 Request VO")
|
||||
@Data
|
||||
|
||||
@ -6,7 +6,7 @@ import lombok.Data;
|
||||
/**
|
||||
* 有效曝光计费受理结果 VO(app-api,对齐 ad.yaml AdReportResultVO)
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 有效曝光计费受理结果")
|
||||
@Data
|
||||
|
||||
@ -11,7 +11,7 @@ import lombok.Data;
|
||||
* 服务端→联盟回调校验防作弊:联盟回调携带 transId + sign,服务端验签通过才计费发奖。
|
||||
* traceId 为幂等键(uk_trace),重复回调只计费一次、只发奖一次。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 激励视频服务端回调 Request VO")
|
||||
@Data
|
||||
|
||||
@ -8,7 +8,7 @@ import lombok.Data;
|
||||
*
|
||||
* 验签通过并计费=accepted/rewarded=true;验签失败由错误码 1-111-002-004 拦截,不达此 VO。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 激励视频回调受理结果 VO")
|
||||
@Data
|
||||
|
||||
@ -10,7 +10,7 @@ import lombok.Data;
|
||||
*
|
||||
* mock 直接校验通过(rewarded=true);traceId 为幂等键,重复上报只发奖+计费一次。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 激励视频完成校验 Request VO")
|
||||
@Data
|
||||
|
||||
@ -6,7 +6,7 @@ import lombok.Data;
|
||||
/**
|
||||
* 激励视频完成校验结果 VO(app-api,对齐 ad.yaml AdRewardResultVO)
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 激励视频完成校验结果")
|
||||
@Data
|
||||
|
||||
@ -8,7 +8,7 @@ import lombok.Data;
|
||||
*
|
||||
* 安全:providerSlotId 默认不下发明文(本配置恒不含),真实联盟由服务端代理拉广告,前端不持有联盟广告位 ID。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Schema(description = "用户 App - 广告位配置(SDK Plugin.Ad 渲染用)")
|
||||
@Data
|
||||
|
||||
@ -16,7 +16,7 @@ import java.util.stream.Collectors;
|
||||
* 单独成层的原因:eventType 在 DB 为 tinyint(1/2)、在 admin VO 为编码(impression/reward),需集中转码;
|
||||
* 同时承载 DO → 跨模块 DTO(AdRevenueRespDTO,ad→trade seam,字段裁剪为契约约定的 5 项)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public class AdRevenueConvert {
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ import java.util.stream.Collectors;
|
||||
* 结构不一致无法 BeanUtils 平铺拷贝,需在此集中拆/合,避免散落到各 Controller/Service。
|
||||
* 安全:SDK 配置 toConfigVO 恒不下发 providerSlotId 明文(前端不持有联盟广告位 ID)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public class AdSlotConvert {
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ import java.time.LocalDate;
|
||||
* 金额单位:ecpm / revenue_amount 一律「分」(BIGINT),禁浮点。
|
||||
* 状态机/收入口径合法性由 Service 校验,DO 层只承载数据。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@TableName("game_ad_revenue")
|
||||
@KeySequence("game_ad_revenue_seq") // Oracle/PostgreSQL 等主键自增用;MySQL 可忽略
|
||||
|
||||
@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
|
||||
* compliance(未成年人保护)拆为显式列 block_minor / max_per_session(便于查询与计费限流),不用 JSON 整块存。
|
||||
* provider=mock 走桩(MVP 默认);csj/gdt 走审核闸门后由人填 provider_slot_id 注入。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@TableName("game_ad_slot")
|
||||
@KeySequence("game_ad_slot_seq") // Oracle/PostgreSQL 等主键自增用;MySQL 可忽略
|
||||
|
||||
@ -21,7 +21,7 @@ import java.util.List;
|
||||
* - selectUnsettledByDate 命中 idx_settle_date(settle_status, stat_date)(trade 扫未结算);
|
||||
* - 分页命中 idx_creator_date / idx_game。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Mapper
|
||||
public interface AdRevenueMapper extends BaseMapperX<AdRevenueDO> {
|
||||
|
||||
@ -14,7 +14,7 @@ import java.util.List;
|
||||
*
|
||||
* 显式列查询(MyBatis-Plus 默认按 DO 字段映射,不裸 select*);分页/筛选命中 idx_provider、拉启用命中 idx_enabled。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Mapper
|
||||
public interface AdSlotMapper extends BaseMapperX<AdSlotDO> {
|
||||
|
||||
@ -17,7 +17,7 @@ import org.springframework.stereotype.Component;
|
||||
* - blockMinor:minor 信号缺省为「非未成年」→ 不拦截(留 isMinor 对接点);
|
||||
* - maxPerSession:会话计数缺省为 0 → 不超限(留 currentSessionCount 对接点,后续接 Redis INCR + EXPIRE)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Component
|
||||
public class AdComplianceChecker {
|
||||
|
||||
@ -5,7 +5,7 @@ package com.wanxiang.huijing.game.module.ad.framework.compliance;
|
||||
*
|
||||
* 把合规判定结果建模为枚举,供 Service 据此决定是否计费、抛哪个错误码(口径单一、可单测)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public enum AdComplianceResult {
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ package com.wanxiang.huijing.game.module.ad.framework.provider;
|
||||
* MVP 仅 {@link MockAdProvider}(provider=mock);真实联盟 csj 穿山甲 / gdt 优量汇 由审核闸门后注入(留扩展位,不实现)。
|
||||
* Service 按广告位 provider 选择对应实现(getProvider()),不在业务层散落联盟分支。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public interface AdProvider {
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ import java.util.stream.Collectors;
|
||||
* MVP 仅 mock 实现:未注册的 provider(csj/gdt 尚未注入)一律降级到 mock,保证 MVP 全 mock 计费可跑通;
|
||||
* 真实联盟注入后自动按 provider 命中其实现,无需改本类与 Service。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Component
|
||||
public class AdProviderFactory {
|
||||
|
||||
@ -6,7 +6,7 @@ package com.wanxiang.huijing.game.module.ad.framework.provider;
|
||||
* 承载联盟回调携带的验签所需信息:联盟交易号 + 签名 + 业务参数。
|
||||
* 各 provider 实现据此用联盟密钥验签(mock/callback 桩走桩直通,真实 csj/gdt 走真实验签)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public class AdRewardCallbackContext {
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ import java.security.NoSuchAlgorithmException;
|
||||
* 真实联盟注入(审核闸门后):新增 CsjAdProvider/GdtAdProvider 实现真实验签(联盟密钥 + 联盟签名算法),本类不变;
|
||||
* 工厂按 game_ad_slot.provider 命中(provider=callback 命中本类,provider=csj/gdt 命中真实实现)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Component
|
||||
public class CallbackAdProvider implements AdProvider {
|
||||
|
||||
@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
|
||||
* - verifyReward:直通返回 true(前端上报即视为完成)。
|
||||
* 真实联盟(csj/gdt)走审核闸门后注入新 AdProvider 实现,本类不变。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Component
|
||||
public class MockAdProvider implements AdProvider {
|
||||
|
||||
@ -19,7 +19,7 @@ import java.util.List;
|
||||
* 承载计费核心:有效曝光/激励计费上报(合规校验 + 归因 + mock eCPM 计收入 + 幂等落台账)、
|
||||
* trade 拉未结算、结算回标、admin 对账分页。计费规则在 Service 强制(DO/前端不承载)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public interface AdRevenueService {
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ import static com.wanxiang.huijing.framework.common.exception.util.ServiceExcept
|
||||
* 归因:gameId 经 ProjectApi 反查 creator_user_id,落台账供 trade 按创作者聚合分账(跨模块只走 -api Feign)。
|
||||
* 结算回标:settle_status 仅允许 0→1(Service 强制,DO 不校验)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Service
|
||||
public class AdRevenueServiceImpl implements AdRevenueService {
|
||||
|
||||
@ -9,7 +9,7 @@ import lombok.Getter;
|
||||
* 把「本次计入收入 + 是否首次计费」从持久化 DO 中剥离,避免在 AdRevenueDO 上挂瞬态字段污染持久模型。
|
||||
* firstBilling=false 表示命中计费幂等键(重复上报),未重复计收入。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
|
||||
@ -13,7 +13,7 @@ import java.util.List;
|
||||
* 承载广告位 CRUD + 业务校验(slotId 唯一、provider!=mock 时 providerSlotId 必填、slotId 不可改)+ SDK 拉启用项。
|
||||
* 校验规则在 Service 强制(前端与 DO 层均不承载)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public interface AdSlotService {
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ import static com.wanxiang.huijing.framework.common.exception.util.ServiceExcept
|
||||
*
|
||||
* 业务校验(slotId 唯一、provider!=mock 时 providerSlotId 必填、slotId 不可改)在此承载,可单测、可追溯。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Service
|
||||
public class AdSlotServiceImpl implements AdSlotService {
|
||||
|
||||
@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.*;
|
||||
* - sign 缺失:拒绝(二次防御);
|
||||
* - verifyReward(前端直通入口):callback provider 一律 false(强制走回调验签,防绕过作弊)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
class CallbackAdProviderTest extends BaseMockitoUnitTest {
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ import static org.mockito.Mockito.*;
|
||||
* 归因失败拒计、停用广告位拒计、结算回标幂等。这些是钱财闭环上游的规则守卫,必须有测试兜底。
|
||||
* mock BaseMapper.insert 用 any(AdRevenueDO.class) 消歧(裸 any() 会因重载报错)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
class AdRevenueServiceImplTest extends BaseMockitoUnitTest {
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ import static org.mockito.Mockito.*;
|
||||
* 覆盖广告位业务校验:slotId 唯一查重、provider!=mock 时 providerSlotId 必填、新建默认值、slotId 不可改。
|
||||
* mock BaseMapper.insert/updateById 用 any(AdSlotDO.class) 消歧(裸 any() 会因重载报错)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
class AdSlotServiceImplTest extends BaseMockitoUnitTest {
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>
|
||||
造梦AI - ad 模块(广告引擎):联盟接入 / 广告位 AI 植入 / 曝光计费 / eCPM / 归因。
|
||||
绘境AI - ad 模块(广告引擎):联盟接入 / 广告位 AI 植入 / 曝光计费 / eCPM / 归因。
|
||||
不做结算提现(归 trade)。MVP provider 默认 mock。错误码段 = 1-111-***-***。
|
||||
</description>
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ import java.util.List;
|
||||
* 写类 RPC(submitGenerate/getTask/retryTask)无登录上下文:userId 由调用方(studio 受信边界)显式传入,
|
||||
* 不从匿名上下文推断、不裸暴露给前端;service 层据此做数据归属校验(创作者只见自己任务)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@FeignClient(name = ApiConstants.NAME)
|
||||
@Tag(name = "RPC 服务 - AI 生成")
|
||||
|
||||
@ -10,7 +10,7 @@ import lombok.Data;
|
||||
* 注意(R7 attachments 持久化-only):本 DTO 不含 attachments 字段——studio 侧 attachments 仅落库持久化、本波不透传 aigc;
|
||||
* P1 若需透传,再 additive 给本 DTO 加字段,不在本波私造。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Data
|
||||
public class AigcGenerateReqDTO {
|
||||
|
||||
@ -7,7 +7,7 @@ import lombok.Data;
|
||||
*
|
||||
* 异步语义:提交/重试立即返回 taskId(status=0 queued),studio 据 taskId 轮询直至终态(getTask)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Data
|
||||
public class AigcGenerateRespDTO {
|
||||
|
||||
@ -9,7 +9,7 @@ import lombok.Data;
|
||||
* aigc succeeded(2) → 链完成回填 version_id;failed(3)/timed_out(4) → 链失败。
|
||||
* 字段为 studio 编排所需的最小集(status/progress/versionId/failureReason/traceId),不全量镜像 AigcTaskDO。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Data
|
||||
public class AigcTaskRespDTO {
|
||||
|
||||
@ -9,7 +9,7 @@ import lombok.Data;
|
||||
* 字段对齐 aigc-server 的 {@code TemplateRespVO}(不多不少),由 {@code AigcApiImpl} 转换后跨模块返回。
|
||||
* 跨模块只依赖 aigc 的 -api(com.wanxiang.huijing.game.module.aigc.dto),禁止 studio 依赖 aigc 的 -server。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Data
|
||||
public class AigcTemplateDTO {
|
||||
|
||||
@ -12,7 +12,7 @@ import com.wanxiang.huijing.framework.common.enums.RpcConstants;
|
||||
* 拆微服务后该值即对应 aigc 服务的 spring.application.name。
|
||||
* - PREFIX:RPC 接口前缀 /rpc-api/aigc,与业务端 /app-api、/admin-api 隔离,避免与业务路由冲突。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public class ApiConstants {
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ import static com.wanxiang.huijing.framework.common.pojo.CommonResult.success;
|
||||
* 纯暴露层:仅做 DTO↔VO/DO 转换并委托既有 {@link AigcTaskService},不写任何业务逻辑(业务在 service,不改)。
|
||||
* 删除本类后 aigc 既有单测仍绿(service 零改动),即「只暴露不改」回滚门。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@Validated
|
||||
|
||||
@ -40,7 +40,7 @@ import java.time.Clock;
|
||||
* 总开关与回滚双双失效。守护单测:AigcGenerateExecutorTest「开关行为」用例以 ApplicationContextRunner
|
||||
* 断言 enabled 缺省/false 时 Bean 缺席。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnProperty(prefix = "aigc.executor", name = "enabled", havingValue = "true")
|
||||
|
||||
@ -18,7 +18,7 @@ import java.util.Map;
|
||||
*
|
||||
* <p>映射锚到现 {@code contracts/templates/*.schema.json}(8 个品类 schema),作品类 profile 引导锚(§4.2)。
|
||||
*
|
||||
* @author 造梦AI(固定架构 B2 拓扑扩展)
|
||||
* @author 绘境AI(固定架构 B2 拓扑扩展)
|
||||
*/
|
||||
final class SaaArchetypes {
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ import java.util.regex.Pattern;
|
||||
* <li>{@code verdict}(JSON)/{@code playPass}/{@code feedback} —— play 产出(playPass=九门是否全过)。</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
final class SaaGenNodes {
|
||||
|
||||
|
||||
@ -74,7 +74,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
* <p><b>Bean 注册铁律(§3)</b>:本类不标 @Component/@Service,只经 {@code AigcExecutorConfiguration} @Bean 注册
|
||||
* (随 aigc.executor.enabled 总开关装配)。仅 {@code aigc.executor.dispatcher=saa} 时被执行器选用(默认 http 不选)。
|
||||
*
|
||||
* @author 造梦AI(SAA 迁移 #2 生产收口)
|
||||
* @author 绘境AI(SAA 迁移 #2 生产收口)
|
||||
*/
|
||||
@Slf4j
|
||||
public class SaaGraphDispatcher implements GenerationDispatcher {
|
||||
|
||||
@ -25,7 +25,7 @@ import java.util.regex.Pattern;
|
||||
*
|
||||
* <p>few-shot 与 Python 同口径:读 game-runtime/games/_wg1-gen/_goldenpath-probe/factory.js(读文件防漂移,prompt.py:9-20)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
final class SaaPrompts {
|
||||
|
||||
|
||||
@ -62,7 +62,7 @@ import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.node_async;
|
||||
* <p>纪律边界:本类只产 {@link CompiledGraph} 与 {@link StateGraph} 布线;job→state 入参与 result→回调出参的对接在
|
||||
* {@link SaaGraphDispatcher}(形态①)/ 测试里各自完成,本类不耦合 job 契约;saver/registry 由调用方构造后传入(本类不自建)。
|
||||
*
|
||||
* @author 造梦AI(SAA 迁移 #2 生产收口)
|
||||
* @author 绘境AI(SAA 迁移 #2 生产收口)
|
||||
*/
|
||||
public final class SaaStudioGraph {
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ import java.util.regex.Pattern;
|
||||
*
|
||||
* <p>纪律(本步边界):emit <b>不接 DifyCallbackReqVO/HMAC 回调</b>(那是 step7 形态②);不接 saver(step5);不接 job 契约。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
final class SaaStudioNodes {
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ import com.wanxiang.huijing.game.module.aigc.controller.admin.task.vo.DifyCallba
|
||||
* ⚠️ 命名注记(2026-06-12,C2/HJ-GEN-001):真实 Dify/OpenGame 已降级远期、从未部署。本回调面【现行由 M-b agent 闭环执行器复用其三表同事务写链语义】(非空挂、亦勿误以为已接真 Dify);
|
||||
* 类名沿用「Dify」仅历史,远期若真启用 Dify 复用同一写链。生成主线=new-api 网关 + agent 写码于插件库,勿据本类名推断 Dify 为现行依赖。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public interface DifyCallbackService {
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ import static com.wanxiang.huijing.game.module.aigc.enums.ErrorCodeConstants.AIG
|
||||
*
|
||||
* ⚠️ 命名注记(2026-06-12,C2/HJ-GEN-001):真实 Dify/OpenGame 已降级远期、从未部署。本类是【现行 M-b agent 闭环写链的外层编排入口】(真在用),类名「Dify」仅历史;勿据类名推断 Dify 为现行依赖。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
|
||||
@ -52,7 +52,7 @@ import static com.wanxiang.huijing.framework.common.exception.util.ServiceExcept
|
||||
*
|
||||
* ⚠️ 命名注记(2026-06-12,C2/HJ-GEN-001):真实 Dify/OpenGame 已降级远期、从未部署。本类是【现行 M-b agent 闭环写链的内层事务 Bean】(真在用),类名「Dify」仅历史;勿据类名推断 Dify 为现行依赖。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
|
||||
@ -16,7 +16,7 @@ import java.util.List;
|
||||
* 通道纪律常量(温度/节流/重试/超时)一并集中本类:沿 C1 spike 配方(gen_spike.py:28-30/100-110,
|
||||
* llm_client.py:29-33 同源),52/52 结构层已验,不开放配置面(避免误调破坏已验配方)。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@ConfigurationProperties("aigc.executor")
|
||||
@Data
|
||||
|
||||
@ -65,7 +65,7 @@ import static com.wanxiang.huijing.game.module.aigc.enums.ErrorCodeConstants.AIG
|
||||
* 故每任务处理边界(含 watchdog 收尸)统一经 {@link #executeWithSystemIdentity} 注入系统用户
|
||||
* 安全上下文(LoginUser id=0),finally 必清理——详见该方法注释。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
public class AigcGenerateExecutor {
|
||||
|
||||
@ -21,7 +21,7 @@ import java.util.List;
|
||||
* 【扩展纪律】批② 扩 idle/tycoon 在此 List 加列表项即可(同时 getTemplateList 加对应 TemplateRespVO 条 +
|
||||
* PromptResourceLoader/GameConfigSchemaValidator 资源 Map 加行),白名单口径单点维护。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
public final class AigcTemplateConstants {
|
||||
|
||||
|
||||
@ -24,7 +24,7 @@ import java.security.MessageDigest;
|
||||
* 【Bean 注册铁律(§3)】本类经 {@code AigcExecutorConfiguration} @Bean 注册(随 aigc.executor.enabled
|
||||
* 总开关一同装配),类上不标 @Component/@Service,防组件扫描绕过开关。
|
||||
*
|
||||
* @author 造梦AI(P3 派发面·3b-B 服务间签名)
|
||||
* @author 绘境AI(P3 派发面·3b-B 服务间签名)
|
||||
*/
|
||||
@Slf4j
|
||||
public class CallbackSignatureVerifier {
|
||||
|
||||
@ -34,7 +34,7 @@ import java.time.Duration;
|
||||
*
|
||||
* Bean 注册铁律(§3):本类不标 @Component/@Service,只经 AigcExecutorConfiguration @Bean 注册。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
public class ExecutorLlmClient {
|
||||
|
||||
@ -36,7 +36,7 @@ import java.util.Set;
|
||||
*
|
||||
* Bean 注册铁律(§3):本类不标 @Component/@Service,只经 AigcExecutorConfiguration @Bean 注册。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
public class GameConfigSchemaValidator {
|
||||
|
||||
@ -28,7 +28,7 @@ import java.util.Map;
|
||||
* <p><b>纪律(不破坏现行行为)</b>:默认 {@code aigc.executor.dispatcher=http} 即现行 {@link WorkerDispatchClient}
|
||||
* 行为逐字不变;saa 实现 opt-in。共用 new-api 单一成本层(两实现都经 new-api 网关计费,不另起成本面)。
|
||||
*
|
||||
* @author 造梦AI(SAA 迁移 #2 生产收口)
|
||||
* @author 绘境AI(SAA 迁移 #2 生产收口)
|
||||
*/
|
||||
public interface GenerationDispatcher {
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ import java.util.regex.Pattern;
|
||||
* Bean 注册铁律(§3):本类不标 @Component/@Service,只经 AigcExecutorConfiguration @Bean 注册,
|
||||
* 防组件扫描绕过 aigc.executor.enabled 总开关。
|
||||
*
|
||||
* @author 造梦AI
|
||||
* @author 绘境AI
|
||||
*/
|
||||
@Slf4j
|
||||
public class PromptResourceLoader {
|
||||
|
||||
@ -29,7 +29,7 @@ import java.util.Map;
|
||||
* 【Bean 注册铁律(§3)】本类不标 @Component/@Service,只经 AigcExecutorConfiguration @Bean 注册,
|
||||
* 防组件扫描绕过 aigc.executor.enabled 总开关。
|
||||
*
|
||||
* @author 造梦AI(P3 派发面)
|
||||
* @author 绘境AI(P3 派发面)
|
||||
*/
|
||||
@Slf4j
|
||||
public class WorkerDispatchClient implements GenerationDispatcher {
|
||||
|
||||
@ -22,7 +22,7 @@ import java.util.Map;
|
||||
* 【权重占位(执行版 §9-2 待校准)】playability 0.50 / firstPlay 0.25 / stability 0.15 / efficiency 0.10——
|
||||
* v0 落公式骨架 + 此占位权重上线,待质量轨观察真实就绪分布后校准(评分只展示不拦截,占位权重风险低)。
|
||||
*
|
||||
* @author 造梦AI(W-G1 组B · D11 就绪评分)
|
||||
* @author 绘境AI(W-G1 组B · D11 就绪评分)
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
|
||||
@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
* 节点工厂({@code designNode/generateNode/...})只<b>存</b> {@code gameRuntimeRoot} 句柄、路径在运行时才 resolve——故
|
||||
* dummy key + dummy 路径构造全图安全(不触网/不触盘)。这把「per-role budget clamp 不抛」与真模型/真网关解耦坐实。
|
||||
*
|
||||
* @author 造梦AI(Plan A · U1 · P0-2 专项)
|
||||
* @author 绘境AI(Plan A · U1 · P0-2 专项)
|
||||
*/
|
||||
class SaaAnthropicAssembleTest {
|
||||
|
||||
|
||||
@ -52,7 +52,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
* 100.64.0.8 走 clash 代理 → <b>502 TransientAiException</b>。{@link SaaStudioGraph#anthropicModel} 内已设
|
||||
* {@code SimpleClientHttpRequestFactory.setProxy(NO_PROXY)} 旁路;{@code -DargLine} 的 nonProxyHosts 是双保险。
|
||||
*
|
||||
* @author 造梦AI(Plan A · U1 Anthropic client 门控烟测)
|
||||
* @author 绘境AI(Plan A · U1 Anthropic client 门控烟测)
|
||||
*/
|
||||
class SaaAnthropicSmokeTest {
|
||||
|
||||
|
||||
@ -69,7 +69,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
* </pre>
|
||||
* 无开关时整类跳过(不阻断常规 test-compile/无 DB 环境)。
|
||||
*
|
||||
* @author 造梦AI(SAA 迁移 step5 真恢复验证)
|
||||
* @author 绘境AI(SAA 迁移 step5 真恢复验证)
|
||||
*/
|
||||
@EnabledIfSystemProperty(named = "saa.checkpoint.mysql", matches = "1",
|
||||
disabledReason = "需 staging MySQL(13306) + spike schema saa_spike;开关 -Dsaa.checkpoint.mysql=1")
|
||||
|
||||
@ -30,7 +30,7 @@ import static org.mockito.Mockito.mock;
|
||||
* <li>{@code WorkerDispatchClient} 是 {@link GenerationDispatcher}(接口抽象就位,可灰度切换)。</li>
|
||||
* </ol>
|
||||
*
|
||||
* @author 造梦AI(SAA 迁移 #2 生产收口)
|
||||
* @author 绘境AI(SAA 迁移 #2 生产收口)
|
||||
*/
|
||||
class SaaDispatcherWiringTest {
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
*
|
||||
* <p>覆盖:happy + 边界(空/null/越界/非法)+ 等价类,对齐 ce-work「Test Scenario Completeness」。
|
||||
*
|
||||
* @author 造梦AI(003-U1 验收门工具化)
|
||||
* @author 绘境AI(003-U1 验收门工具化)
|
||||
*/
|
||||
class SaaFullGraphE2eGateLogicTest {
|
||||
|
||||
|
||||
@ -80,7 +80,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
* // 有界并发量测(K=4 并行真玩,端口对自动错开):追加 -Dsaa.e2e.concurrency=4
|
||||
* </pre>
|
||||
*
|
||||
* @author 造梦AI(U7 集成顶石;003-U1 验收门工具化 + sourceMode/concurrency 量测 flags)
|
||||
* @author 绘境AI(U7 集成顶石;003-U1 验收门工具化 + sourceMode/concurrency 量测 flags)
|
||||
*/
|
||||
class SaaFullGraphE2eTest {
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ import static org.mockito.Mockito.when;
|
||||
* <li>seam 缺席(sourceProjectApi=null)→ 取源旁路、空串、不崩。</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author 造梦AI(U6/B7 modify 取 base 源)
|
||||
* @author 绘境AI(U6/B7 modify 取 base 源)
|
||||
*/
|
||||
class SaaGraphDispatcherBaseSourceTest {
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
* <li>parse-fail / null-state 返 null 不抛(best-effort 纪律 §6.4)。</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author 造梦AI(W-G1 组B · 闭合 SAA split-brain)
|
||||
* @author 绘境AI(W-G1 组B · 闭合 SAA split-brain)
|
||||
*/
|
||||
class SaaGraphDispatcherTraceTest {
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user