feat: 接入运维真实数据与三角色权限链路

- 新增 model_deploy 与 model_operations 双库查询,支持模型列表、模型详情、单月监控结果和运维工作台真实接口。

- 关闭运维模块生产 Mock 数据,补充缺表/空数据降级、工作台空状态和首条纵向链路测试。

- 按业务团队、模型团队、管理员权限矩阵接入菜单、页面、操作按钮和后端接口权限校验,支持 business_team 角色。

- 更新工作台布局、深色欢迎卡片、全宽页面适配、顶部回退,以及权限分组展示。

- 新增架构实现基线、周目标完成情况和角色权限矩阵初始化 SQL 文档。
This commit is contained in:
郑龙捷
2026-09-02 15:02:47 +08:00
parent 6d044784ec
commit 74dd97428f
51 changed files with 2142 additions and 1062 deletions
@@ -0,0 +1,151 @@
# A 卡模型运维模块后端架构与数据库设计 V0.3
> 状态:工程实现基线;首条接口链路已实现,真实非空数据联调和三角色验收待完成
> 日期:2026-09-02
> 依据:当前 `feature/a-card-operations` 代码、`origin/develop` 基础工程、现有三库结构和当前运维前端原型
## 1. 本版本结论
本版本将 V0.2 设计稿与当前代码实现对齐,作为本周开发和联调基线。
1. 同一工程内继续保留平台能力和运维能力,不拆分微服务。
2. 登录、Workspace 和平台级 RBAC 继续复用 `model_platform`
3. 模型部署、银行、模型版本的首条查询链路当前读取 `model_deploy`
4. 月度监控结果、判级和复核快照当前读取 `model_operations`
5. React 运维页面已切换为真实 API;没有数据时保留页面结构并显示 0、— 或空列表。
6. 当前已经完成接口代码、空数据验证和前端纵向调用;尚未用非空业务数据完成端到端验收。
## 2. 总体架构
```text
浏览器
│ 同源请求 /api/v1/*
Nginx / Vite 代理
FastAPI
├─ 平台上下文:model_platform
│ ├─ 登录、Cookie、用户、角色、权限、Workspace
│ └─ 平台已有脚本、对象存储和调度能力
├─ 模型来源查询:model_deploy(只读)
│ ├─ model_deploy
│ ├─ model_bank
│ ├─ model_deploy_bank_map
│ ├─ model_version
│ └─ sys_project_space
└─ 运维数据查询/写入:model_operations
├─ ops_monitor_batches
├─ ops_monitor_results
├─ ops_monitor_evaluations
├─ ops_monitor_reviews
└─ 后续报告、流程、知识库、配置和 Outbox
```
当前工作区代码目录:
- `backend/src/backend/api/operations/`:运维 API、Workspace/角色依赖和健康检查。
- `backend/src/backend/services/operations/deploy_model_queries.py`:跨 `model_deploy``model_operations` 的首条模型查询服务。
- `backend/src/backend/services/operations/workbench_queries.py`:工作台聚合查询。
- `frontend/app/services/operationsApi.ts`:运维 API 请求和 DTO 转换。
- `frontend/app/features/operations/OperationsDataContext.tsx`:统一加载真实接口数据并处理空数据。
- `frontend/app/features/operations/`:运维页面和展示组件。
## 3. 数据责任边界
### 3.1 平台库 `model_platform`
由现有平台和权限模块负责。运维模块只复用登录和 Workspace 上下文,不创建新的账号或 RBAC 表。
- 用户、角色、权限和 Workspace:现有认证/系统管理模块维护。
- `password_hash`:运维模块禁止读取。
- 运维页面的登录角色只使用统一认证返回的 `role_code`
### 3.2 模型库 `model_deploy`
首条链路作为模型来源库只读查询。模型方负责维护:
- 银行:`model_bank`
- 模型部署实例:`model_deploy`
- 模型与银行关系:`model_deploy_bank_map`
- 模型版本:`model_version`
- Workspace/项目空间映射:`sys_project_space``deploy.group_code`
### 3.3 运维库 `model_operations`
监控和运维模块维护:
- 月度批次、原始监控结果、特征指标和分布。
- 判级快照、模型团队初审、业务团队终审。
- 报告、流程、文档、Prompt、规则、配置、使用统计和 Outbox。
## 4. 当前首条真实接口链路
### 4.1 模型列表
`GET /api/v1/operations/models?workspace_id=<workspace_id>`
后端先从 `model_deploy` 查询模型、银行、版本和 Workspace 映射,再从 `model_operations` 查询最新已发布监控结果和当前判级,最后组装前端 DTO。
### 4.2 模型详情
`GET /api/v1/operations/models/{model_id}?workspace_id=<workspace_id>`
`deploy.code` 或部署 ID 识别模型,返回与模型列表相同的数据口径,避免列表和详情出现两套计算结果。
### 4.3 单月监控结果
`GET /api/v1/operations/models/{model_id}/monitor-results?month=YYYY-MM&workspace_id=<workspace_id>`
只读取 `batch_status='published'` 的批次,并按监控月份和修订号取当前结果。月份不存在或模型没有该月结果时返回业务层的“结果不存在”,前端保持详情页面结构。
### 4.4 结果关联要求
`ops_monitor_results` 需要能与 `model_deploy` 的部署行关联。当前查询服务支持以下任一关联标识:
- `model_instance_id = model_deploy.id`
- `source_result_ref = model_deploy.code`
- `source_result_ref = model_deploy.id`
- 版本标识与 `model_version.id` 对应。
如果模型方采用其他来源 ID,需要在写入协议中明确映射,不能让前端自行猜测。
## 5. 当前 API 实现状态
已经实现:
1. `GET /api/v1/operations/health`
2. `GET /api/v1/operations/models`
3. `GET /api/v1/operations/models/{model_id}`
4. `GET /api/v1/operations/models/{model_id}/monitor-results`
5. `GET /api/v1/operations/workbench`
尚未实现的后续 API 包括模型大类汇总、银行汇总、监控明细筛选、特征分布、处理复核、报告、流程、知识库、规则、Prompt 和系统配置写接口。
## 6. 登录与 RBAC
- 登录继续使用现有 `/api/v1/auth/login` 和 Cookie 会话。
- `/api/v1/auth/me` 返回当前用户、Workspace、`role_code` 和权限集合。
- 前端将 `admin` 映射为管理员,将 `developer/model_team` 映射为模型团队,将 `business/business_team/biz` 映射为业务团队。
- 运维查询接口使用 `operations_context` 校验登录状态和 Workspace 访问范围。
- 平台用户、角色、权限接口继续使用现有 `system_admin_context`,不由运维模块重新实现。
- 前端隐藏菜单只负责展示,服务端仍必须对写接口进行授权校验。
## 7. 当前缺口与决策项
1. **表模型口径尚未完全统一**V0.2 设计过 `ops_banks/ops_model_instances/ops_model_versions` 作为模型方外部写入表,但当前首条接口实际查询的是 `model_deploy` 及其关联表。需要模型方确认最终以哪套表为主,并在确认后统一代码、DDL和文档。
2. **非空数据缺口**:当前联调库模型和监控结果为空,尚未完成非空链路验收。
3. **Workspace 映射缺口**:需要确认 `sys_project_space.name``sys_project_space.id``deploy.group_code` 与认证 Workspace 的最终映射。
4. **监控结果关联缺口**:需要确认 `model_instance_id/model_version_id/source_result_ref` 的来源 ID 规则。
5. **三角色验收缺口**:需要准备三个真实账号并完成菜单、页面、查询和写操作验收。
6. **完整 API 文档缺口**:当前接口已注册,但请求/响应/错误码尚未形成独立对外清单。
## 8. 本周验收口径
本周目标只有在以下条件全部满足后才可标记完成:
1. 架构、数据库、API 和工程骨架文档与当前代码一致。
2. 三角色可以登录,角色展示和基础访问边界正确。
3. 模型方提供最小非空数据。
4. 列表、详情、单月结果三次请求成功。
5. 三个页面的模型、版本、月份、排序性、KS、PSI 等字段一致。
6. 空数据、无结果、不存在模型、无权限和跨 Workspace 请求均有明确结果。
@@ -0,0 +1,179 @@
-- A 卡运维平台角色权限矩阵初始化 V0.1
-- 目标库:model_platform
-- 说明:
-- 1. 本脚本只新增/恢复运维权限和业务团队角色,不删除既有权限。
-- 2. 重复执行幂等;已有软删除权限/关联会被恢复。
-- 3. admin、developer 使用现有角色;developer 对应模型团队。
-- 4. 业务账号不会在本脚本中被批量改角色,需确认用户名后再分配 business_team。
USE model_platform;
SET NAMES utf8mb4;
START TRANSACTION;
-- 业务团队角色:不存在时创建,存在时恢复并更新展示信息。
INSERT INTO roles (
role_id, role_code, role_name, role_scope, is_builtin,
description, is_deleted, deleted_at
) VALUES (
'0000000000VKFJ85E90FABHPGT',
'business_team',
'业务团队',
'platform',
1,
'A 卡运维平台业务团队角色',
0,
NULL
) AS incoming_role
ON DUPLICATE KEY UPDATE
role_name = incoming_role.role_name,
role_scope = incoming_role.role_scope,
is_builtin = incoming_role.is_builtin,
description = incoming_role.description,
is_deleted = 0,
deleted_at = NULL;
-- 运维页面和操作权限。
INSERT INTO permissions (
permission_id, permission_code, permission_name, module_code,
description, is_deleted, deleted_at
) VALUES
('10000000000000000000000001', 'operations:workbench:view', '查看运维工作台', 'operations', '查看运维工作台、KPI、待办和关注', 0, NULL),
('10000000000000000000000002', 'operations:usage:view', '查看平台使用统计', 'operations', '查看平台使用统计', 0, NULL),
('10000000000000000000000003', 'operations:model-overview:view', '查看模型大类概览', 'operations', '查看模型大类概览', 0, NULL),
('10000000000000000000000004', 'operations:bank-overview:view', '查看细分银行概览', 'operations', '查看细分银行概览', 0, NULL),
('10000000000000000000000005', 'operations:deployed-models:view', '查看已上线模型详情', 'operations', '查看已上线模型详情', 0, NULL),
('10000000000000000000000006', 'operations:monitoring-overview:view', '查看模型监控概览', 'operations', '查看模型监控概览和监控明细', 0, NULL),
('10000000000000000000000007', 'operations:monitoring-detail:view', '查看模型监控详情', 'operations', '查看模型监控详情和指标分布', 0, NULL),
('10000000000000000000000008', 'operations:monitoring-detail:model-review', '模型团队初审监控结果', 'operations', '模型团队处理监控结果并提交初审', 0, NULL),
('10000000000000000000000009', 'operations:monitoring-detail:business-review', '业务团队终审监控结果', 'operations', '业务团队确认监控处理结果', 0, NULL),
('1000000000000000000000000A', 'operations:report:view', '查看监控诊断报告', 'operations', '查看监控诊断报告', 0, NULL),
('1000000000000000000000000B', 'operations:report:edit', '编辑监控诊断报告', 'operations', '编辑监控诊断报告内容', 0, NULL),
('1000000000000000000000000D', 'operations:report:export', '导出监控诊断报告', 'operations', '导出监控诊断报告', 0, NULL),
('1000000000000000000000000E', 'operations:report:send', '发送监控诊断报告', 'operations', '发送监控诊断报告', 0, NULL),
('1000000000000000000000000F', 'operations:report-summary:view', '查看历史报告汇总', 'operations', '查看历史报告汇总', 0, NULL),
('10000000000000000000000010', 'operations:workflow:view', '查看全流程进度', 'operations', '查看全流程进度', 0, NULL),
('10000000000000000000000011', 'operations:workflow:create', '发起模型需求', 'operations', '业务团队发起模型开发或迭代需求', 0, NULL),
('10000000000000000000000012', 'operations:workflow:feedback', '流程反馈', 'operations', '业务团队填写方案设计等反馈', 0, NULL),
('10000000000000000000000013', 'operations:workflow:confirm', '流程确认', 'operations', '业务团队确认流程材料和结果', 0, NULL),
('10000000000000000000000014', 'operations:workflow:submit-material', '提交流程材料', 'operations', '模型团队提交流程材料', 0, NULL),
('10000000000000000000000015', 'operations:workflow:advance', '推进流程', 'operations', '模型团队推进流程环节', 0, NULL),
('10000000000000000000000016', 'operations:workflow:online', '模型上线', 'operations', '模型团队提交模型上线信息', 0, NULL),
('10000000000000000000000017', 'operations:knowledge:view', '查看文档知识库', 'operations', '按模型、名称和环节查看文档知识库', 0, NULL),
('10000000000000000000000018', 'operations:rules:view', '查看监控等级规则', 'operations', '查看监控等级规则', 0, NULL),
('10000000000000000000000019', 'operations:rules:publish', '发布监控等级规则', 'operations', '发布监控等级规则版本', 0, NULL),
('1000000000000000000000001A', 'operations:rules:rollback', '回滚监控等级规则', 'operations', '回滚监控等级规则版本', 0, NULL),
('1000000000000000000000001B', 'operations:rules:simulate', '测算监控等级规则', 'operations', '测算阈值变化影响', 0, NULL),
('1000000000000000000000001C', 'operations:prompt:view', '查看报告 Prompt', 'operations', '查看报告 Prompt 管理页面', 0, NULL),
('1000000000000000000000001D', 'operations:prompt:edit', '编辑报告 Prompt', 'operations', '编辑报告 Prompt', 0, NULL),
('1000000000000000000000001E', 'operations:prompt:regression', '提交 Prompt 回归', 'operations', '提交 Prompt 回归测试', 0, NULL),
('1000000000000000000000001F', 'operations:settings:view', '查看系统配置', 'operations', '查看和维护运维系统配置', 0, NULL) AS incoming_permission
ON DUPLICATE KEY UPDATE
permission_name = incoming_permission.permission_name,
module_code = incoming_permission.module_code,
description = incoming_permission.description,
is_deleted = 0,
deleted_at = NULL;
-- 业务团队:我的工作台、上线/监控/报告/流程的业务侧能力。
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.role_id, p.permission_id
FROM roles AS r
JOIN permissions AS p
ON p.permission_code IN (
'dashboard:view',
'operations:workbench:view',
'operations:model-overview:view',
'operations:bank-overview:view',
'operations:monitoring-overview:view',
'operations:monitoring-detail:view',
'operations:monitoring-detail:business-review',
'operations:report:view',
'operations:report:export',
'operations:report-summary:view',
'operations:workflow:view',
'operations:workflow:create',
'operations:workflow:feedback',
'operations:workflow:confirm'
)
WHERE r.role_code = 'business_team'
AND r.is_deleted = 0
AND p.is_deleted = 0
ON DUPLICATE KEY UPDATE
is_deleted = 0,
deleted_at = NULL;
-- 模型团队:developer 角色对应模型团队。
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.role_id, p.permission_id
FROM roles AS r
JOIN permissions AS p
ON p.permission_code IN (
'dashboard:view',
'operations:workbench:view',
'operations:model-overview:view',
'operations:bank-overview:view',
'operations:deployed-models:view',
'operations:monitoring-overview:view',
'operations:monitoring-detail:view',
'operations:monitoring-detail:model-review',
'operations:report:view',
'operations:report:edit',
'operations:report:export',
'operations:report:send',
'operations:report-summary:view',
'operations:workflow:view',
'operations:workflow:submit-material',
'operations:workflow:advance',
'operations:workflow:online',
'operations:knowledge:view',
'operations:rules:view',
'operations:prompt:view',
'operations:prompt:edit',
'operations:prompt:regression'
)
WHERE r.role_code = 'developer'
AND r.is_deleted = 0
AND p.is_deleted = 0
ON DUPLICATE KEY UPDATE
is_deleted = 0,
deleted_at = NULL;
-- 管理员:拥有全部运维页面和操作权限;既有系统权限不受影响。
INSERT INTO role_permissions (role_id, permission_id)
SELECT r.role_id, p.permission_id
FROM roles AS r
JOIN permissions AS p
ON p.module_code = 'operations'
AND p.is_deleted = 0
WHERE r.role_code = 'admin'
AND r.is_deleted = 0
ON DUPLICATE KEY UPDATE
is_deleted = 0,
deleted_at = NULL;
COMMIT;
-- 执行后核验:应看到 admin、developer、business_team 三个角色的运维权限。
SELECT
r.role_code,
r.role_name,
COUNT(p.permission_id) AS operations_permission_count
FROM roles AS r
LEFT JOIN role_permissions AS rp
ON rp.role_id = r.role_id
AND rp.is_deleted = 0
LEFT JOIN permissions AS p
ON p.permission_id = rp.permission_id
AND p.module_code = 'operations'
AND p.is_deleted = 0
WHERE r.role_code IN ('admin', 'developer', 'business_team')
GROUP BY r.role_code, r.role_name
ORDER BY FIELD(r.role_code, 'admin', 'developer', 'business_team');
-- 如需给某个业务账号分配业务团队角色,请先确认用户名,再单独执行:
-- UPDATE users
-- SET platform_role_id = (SELECT role_id FROM roles WHERE role_code = 'business_team'),
-- updated_at = CURRENT_TIMESTAMP(3)
-- WHERE username = '<确认后的业务账号>'
-- AND is_deleted = 0;
@@ -0,0 +1,165 @@
# A 卡模型运维模块:本周目标完成情况
> 版本:V0.1
> 日期:2026-09-02
> 用途:内部开发推进、联调和周目标验收基线
## 一、结论
本周目标目前属于“工程基础已具备,真实非空数据验收未完成”。
技术架构、数据库设计初稿、前后端工程骨架和首条接口代码已经形成;登录与角色适配能力已有基础;“模型列表—模型详情—单月监控结果”三条接口也已经接入前端真实请求。
当前不能直接宣称本周目标全部完成,主要原因是联调数据库中的模型、版本和监控结果目前没有非空业务数据。因此现在验证到的是接口注册、响应结构、空数据降级和前端调用链路,还没有验证真实业务数据下的完整页面展示及数值一致性。
## 二、目标逐项状态
### 1. 技术架构
状态:已完成初稿,进入实现校准阶段。
已具备:
1. 同一工程、平台库与运维库双数据库边界。
2. `model_platform` 作为现有认证、Workspace、平台基础能力来源。
3. `model_deploy` 作为模型部署、银行、版本等模型侧数据来源。
4. `model_operations` 作为监控结果和运维业务数据来源。
5. FastAPI、React、MySQL、对象存储和后续 Outbox/队列的职责边界。
6. 架构图、数据域关系图和数据库设计稿。
仍需补齐:
1. 把设计稿中的“计划实现”与当前已经实现的真实代码逐项对齐。
2. 明确模型方写入 `model_deploy``model_operations` 的最终字段及批次协议。
3. 补充部署环境的连接配置、账号权限和回滚方式。
### 2. 数据库模型初稿
状态:DDL 和表关系初稿已完成,等待 DBA/模型方确认和非空数据验证。
已具备:
1. `model_operations` 建库建表脚本及校验脚本。
2. 模型、版本、监控批次、监控结果、特征指标、分布、判级、复核、报告、流程和 Outbox 等表的初稿。
3. 页面—表—数据责任关系说明。
4. 模型方外部写入表的范围说明。
仍需补齐:
1. 确认 `model_deploy``model_operations` 的实际表结构与字段类型。
2. 确认银行表最终来源;当前银行主数据仍待模型方补充确认。
3. DBA 执行建库/授权,或确认现有表已满足接口查询。
4. 由模型方提供一组可追溯的非空测试数据。
5. 对模型、版本、监控月份、修订号和发布状态补充唯一性与幂等约束。
### 3. API 清单
状态:首条链路接口已实现,完整 API 契约文档尚未完成。
当前已注册并可从 OpenAPI 查到:
1. `GET /api/v1/operations/health`
2. `GET /api/v1/operations/models`
3. `GET /api/v1/operations/models/{model_id}`
4. `GET /api/v1/operations/models/{model_id}/monitor-results?month=YYYY-MM`
5. `GET /api/v1/operations/workbench`
仍需补齐:
1. 将运维接口从通用 `API.md` 中拆出独立清单。
2. 补充每个接口的请求参数、响应字段、状态码、错误码和权限要求。
3. 明确百分比单位、月份格式、空值规则和分页规则。
4. 增加模型大类、银行概览、监控明细、报告、流程、知识库和配置接口清单。
### 4. 前后端工程骨架
状态:已完成首期骨架。
已具备:
1. FastAPI 运维路由、依赖、服务和查询层目录。
2. React 运维路由、数据上下文、API service 和页面骨架。
3. 前端运维模块已关闭生产 Mock 数据,统一请求后端接口。
4. 缺少真实数据时,页面保留结构并显示 0、— 或空列表。
5. 5173 当前功能分支和 5174 `develop` 对照环境均可独立启动。
仍需补齐:
1. 其余页面从占位/空状态逐步接入后端资源接口。
2. 报告、流程、处理、导出和配置等写操作接口。
3. 前端统一处理接口错误、权限不足、空数据和加载状态。
4. CI 中固定执行前端 typecheck/build 和后端测试。
### 5. 三角色登录与 RBAC 基础能力
状态:登录和角色适配已有,三角色真实账号验收未完成。
已具备:
1. 继续复用现有登录接口和 Cookie 会话。
2. 登录返回 `role_code`、用户信息、Workspace 和权限集合。
3. 前端可区分业务团队、模型团队和管理员。
4. 系统管理的用户、角色、项目等既有功能继续复用。
5. 运维 API 使用 Workspace 访问校验和角色映射。
仍需补齐:
1. 分别使用业务团队、模型团队、管理员账号完成登录验收。
2. 验证三种角色的菜单可见范围、页面可见范围和按钮可见范围。
3. 验证后端不能仅依赖前端隐藏按钮,而是对写接口再次进行角色校验。
4. 明确运维模块与既有权限模块的最终责任边界。
### 6. 首条真实接口纵向链路
状态:代码链路已跑通,真实非空业务链路未验收。
目标链路:
`model_deploy / model_operations` 数据 → 后端模型查询 → 模型列表 → 模型详情 → 单月监控结果 → 前端详情展示。
已验证:
1. 三个接口已注册。
2. 前端已从 Mock 切换为真实 API 请求。
3. 缺表时后端可降级为空数据,页面不再跳转到说明页。
4. 空库时列表、工作台和相关页面能够保留结构并显示空状态。
5. 前端类型检查和生产构建通过。
未完成:
1. 模型方写入至少 1 个银行、1 个模型、1 个版本和 1 个月监控结果。
2. 使用登录会话从列表点击进入详情。
3. 从详情进入指定月份监控结果。
4. 核对列表、详情和监控结果中的模型名称、版本、KS、PSI、排序性和处理状态一致。
5. 验证不同 Workspace、无权限和不存在模型的返回结果。
## 三、当前最关键的三个缺口
1. **没有非空真实数据**:这是首条纵向链路还不能验收的首要原因。
2. **三角色没有完成真实账号矩阵验收**:现有代码具备基础,但还没有形成可签字的验收记录。
3. **设计文档与实现状态未同步**:现有架构 V0.2 仍写着“接口尚未实现”,需要新版本勘误。
## 四、现在可以先写的文档
以下内容不依赖全部业务功能完成,可以立即起草:
1. **技术架构与实现说明 V0.3**:以当前双数据库、FastAPI、React 和真实接口代码为准,标出已实现/待实现边界。
2. **数据库模型与外部写入协议 V0.2**:列出模型方需要写入的表、字段、写入时机、批次状态、幂等和发布规则。
3. **运维 API 清单 V0.1**:先固化已实现的 5 个接口,再把后续接口标为规划项。
4. **三角色登录/RBAC 验收说明 V0.1**:列出角色、菜单、页面、接口和写操作验收项。
5. **首条纵向链路联调手册 V0.1**:写清测试数据准备、请求顺序、预期响应和数值核对点。
6. **本周目标验收记录 V0.1**:等模型方提供非空数据后,直接补充实际请求和截图结果。
## 五、建议本周剩余顺序
1. 先让模型方补一套最小非空数据,不等待全部页面完成。
2. 先完成列表—详情—单月结果的真实联调和数值核对。
3. 同时用三种角色做登录、菜单和接口权限验收。
4. 根据联调结果更新架构 V0.3、数据库外部写入协议 V0.2 和 API 清单 V0.1。
5. 最后再扩展工作台、监控明细、报告和流程等页面的接口。
## 六、当前不可对外承诺的内容
在非空数据和三角色验收完成前,不建议对外表述为“首条真实接口链路已完整跑通”。更准确的表述是:
> 已完成首条真实接口链路的工程实现、接口注册、前端接入和空数据验证;待模型方提供最小非空数据后完成业务数据联调验收。