feat: AI 助手模型管理(CRUD、会话绑定、自动化验收)

- Flyway V6:模型表、默认种子、ai_chat_session.model_id 回填
- 管理端 /api/admin/ai/models;用户端选模与新会话绑定
- 禁用模型后会话只读(5009);chat 按会话 modelCode 调 DashScope
- 前端 AiModels 页、助手模型选择器与 localStorage
- 单测、AiModelManagementApiIT、Playwright E2E;e2e Profile 关闭注解限流
- 技术实施文档与验收报告;移除过期冲突分析文档

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
nojava
2026-05-24 03:36:31 +08:00
parent 9cf811d8c1
commit 6c8b31e38a
58 changed files with 2693 additions and 556 deletions
@@ -0,0 +1,107 @@
# AI 助手模型管理功能 — 自动验收报告
| 文档版本 | 验收日期 | 验收方式 |
| :------- | :--------- | :----------------- |
| V1.0 | 2026-05-24 | 自动化测试 + 代码核对 |
**关联需求**[AI助手模型管理功能需求.md](./AI助手模型管理功能需求.md)V1.2
**关联实施**[AI助手模型管理功能技术实施文档.md](./AI助手模型管理功能技术实施文档.md)V1.3
---
## 1. 自动化执行摘要
| 套件 | 命令/入口 | 结果 | 用例数 |
| :--- | :-------- | :--- | :----- |
| 模型 Service 单元测试 | `AiAssistantModelServiceImplTest` | **通过** | 6 |
| 助手 Service 单元测试 | `AiChatServiceImplTest`(含模型绑定/禁用) | **通过** | 9 |
| 助手集成测试 | `AiChatServiceIntegrationTest` | **通过** | 4 |
| API 集成(e2e Profile | `AiModelManagementApiIT` | **通过** | 2 |
| 浏览器 E2E | `e2e/tests/ai-model-management.spec.js` | **通过**2026-05-24 03:18 全绿;依赖 `mvn install -am` + `e2e` Profile |
```bash
# 复现命令
mvn test -pl jog-module-blog -am -Dmaven.frontend.skip=true \
-Dtest=AiAssistantModelServiceImplTest,AiChatServiceImplTest,AiChatServiceIntegrationTest \
-Dsurefire.failIfNoSpecifiedTests=false
mvn test -pl jog-admin -am -Dmaven.frontend.skip=true \
-Dtest=AiModelManagementApiIT -Dsurefire.failIfNoSpecifiedTests=false
cd e2e && npm test
```
**集成测试模型编码**`qwen3-vl-32b-thinking`(与需求约定一致)
---
## 2. 验收标准对照(需求 §3.1.4 / §3.2.4 / §3.3.6
### 2.1 管理端 AC-AI-MODEL-ADM-*
| 编号 | 验收项 | 结论 | 依据 |
| :--- | :----- | :--- | :--- |
| AC-ADM-01 | 新增两条模型,用户端可选 | **通过** | E2E-18 + `AiModelManagementApiIT` |
| AC-ADM-02 | 重复 modelCode 拒绝 | **通过** | `TC-AI-MODEL-01` |
| AC-ADM-03 | 默认模型互斥 | **通过** | `TC-AI-MODEL-02` |
| AC-ADM-04 | 删除默认模型失败 | **通过** | `TC-AI-MODEL-04` |
| AC-ADM-05 | 禁用全部模型失败 | **通过** | `TC-AI-MODEL-03` |
| AC-ADM-06 | 逻辑删除后列表不展示 | **通过** | `deleteLogical` + 列表查询 `deleted=0`(代码);E2E 删除/重建 |
| AC-ADM-07 | 多模态开关保存、助手无上传入口 | **通过** | `AiModels.vue` 表单字段;`AiChatPanel` 无 upload 组件(代码核对) |
### 2.2 用户端 AC-AI-MODEL-FE-*
| 编号 | 验收项 | 结论 | 依据 |
| :--- | :----- | :--- | :--- |
| AC-FE-01 | 新会话使用新模型 | **通过** | E2E-18Mock chat + 模型选择) |
| AC-FE-02 | 同会话切换下拉不换模 | **通过** | 会话 `model_id` 绑定 + `AiChatServiceImplTest` |
| AC-FE-03 | 刷新恢复 localStorage | **通过** | `AiAssistant.vue` `MODEL_STORAGE_KEY`(代码);未单独 E2E |
| AC-FE-04 | 禁用模型后旧会话只读 | **通过** | E2E-19 + `AiModelManagementApiIT` |
| AC-FE-05 | 未满 5 轮亦不可发 | **通过** | E2E-19 + `listMessages` `readOnlyReason` |
### 2.3 后端 AC-AI-MODEL-BE-*
| 编号 | 验收项 | 结论 | 依据 |
| :--- | :----- | :--- | :--- |
| AC-BE-01 | 不同会话使用不同 modelCode | **通过** | `AiModelManagementApiIT` chat 断言 `model` |
| AC-BE-02 | 禁用后 chat 拒绝 | **通过** | IT 断言 code **5009**;单测 `AI_MODEL_DISABLED` |
| AC-BE-03 | 不传 modelId 用默认 | **通过** | `TC-AI-MODEL-06` |
| AC-BE-04 | 非管理员访问 admin 403 | **通过** | `SecurityConfig` `hasRole("ADMIN")`(代码);无专用自动化用例 |
---
## 3. 功能需求追溯(摘要)
| 需求类 | 覆盖情况 |
| :----- | :------- |
| FR-AI-MODEL-ADM-01~14 | **已实现**;核心规则有单测 |
| FR-AI-MODEL-FE-01~08b | **已实现** |
| FR-AI-MODEL-FE-09 | **未实现**(见 §4 |
| FR-AI-MODEL-FE-10 | **已实现**(单模型仍展示选择器) |
| FR-AI-MODEL-BE-01~10 | **已实现**;摘要不读模型表(`AiSummaryServiceImpl``properties.getModel()` |
---
## 4. 已知缺口与建议
| 项 | 说明 | 建议 |
| :--- | :--- | :--- |
| **FR-AI-MODEL-FE-09** | 模型列表失败时未展示「模型加载失败」 | 下一迭代在 `AiAssistant.vue` `loadModels` catch 分支补 UI |
| **管理端 `updatedAt` 列** | 需求未强制,列表未展示 | 可选增强 |
| **AC-BE-04** | 无 MockMvc 403 专项用例 | 可加 `AiModelManagementApiIT` 用户 Token 调 admin 断言 403 |
| **E2E 环境** | 须先 `mvn -pl jog-admin -am install``e2e` Profile 关闭注解限流 | 见 `e2e/README.md` |
| **`jog_test` 库** | 无权限时默认 `jog` | DBA 授权后设 `MYSQL_DATABASE=jog_test` |
---
## 5. 总体验收结论
**结论:通过(可发布联调/预发),附带 §4 非阻塞缺口。**
- 待办 1~19(实施文档 §6)与需求核心 AC 已由自动化覆盖。
- 待办 20 本报告视为完成;剩余 FE-09 为体验增强,不阻断主流程。
---
**编写**:自动验收(Cursor Agent
**建议**:产品/测试人工抽检管理端表单与「刷新恢复模型」场景后签字。