# 指摘管理系统 · 开发指南 ## 1. 当前已完成(master 骨架) ### 后端 | 组件 | 状态 | 说明 | |------|------|------| | Maven 多模块结构 | ✅ | ims-common / ims-api / ims-service / ims-web | | 数据库表 & Flyway 迁移 | ✅ | 22 张表,7 个迁移脚本 | | JPA Entity + Repository | ✅ | 22 Entity + 22 Repository | | Spring Security + JWT | ✅ | 登录接口真实实现 | | 所有 Controller 定义 | ✅ | 11 个 Controller,接口签名已定义 | | 统一返回结构 | ✅ | ApiResponse / PageResult / 全局异常处理 | | CRUD DTO 类 | ✅ | 26 个请求/响应类 | | docker-compose | ✅ | PostgreSQL+pgvector / Redis / MinIO | | 配置文件 | ✅ | application.yml / dev / prod | ### 前端 | 组件 | 状态 | 说明 | |------|------|------| | Vite + React + TypeScript | ✅ | 项目初始化 | | Ant Design 主题 | ✅ | 品牌色、圆角已配置 | | 路由表 | ✅ | 全部 13 个页面路由 + 懒加载 + 路由守卫 | | 登录页 | ✅ | 表单 + API 调用 + token 存储 + 跳转 | | 全局 Layout | ✅ | 侧边栏菜单树 + 顶栏(用户/通知) | | axios 封装 | ✅ | 请求拦截器(自动带 token)+ 响应拦截器(401 跳登录) | | Redux Store | ✅ | auth slice + 各模块 slice 空壳 | --- ## 2. 开发流程 ### 两阶段 ``` Phase 1(你 ─ 当前阶段) master └── 实现知识库模块(后端 Service + 前端页面) 完成后合并到 master,通知其他组 Phase 2(各组 ─ 知识库完成后) master(含知识库模块) ├── feature/group1 指摘 CRUD + 工作台 + 驾驶舱 ├── feature/group2 批量录入 + 系统管理 └── feature/group3 AI 分析 + Prompt + Agent 各组从 master 拉分支 → 独立开发 → PR → 合入 master ``` ### 分支策略 ``` master ── 骨架 + 知识库模块,各组以此为基线 ├── feature/group1 ├── feature/group2 └── feature/group3 ``` ### 合并规则 | 阶段 | 操作 | |------|------| | 日常开发 | 各组在自己分支上提交,不往 master 推 | | 功能完成 | 发起 Pull Request,指定 reviewer 审核 | | 审核通过 | 通过 PR 合入 master,禁止直接 push | ### 不冲突保障 各组修改范围完全不重叠: ``` backend/ims-api/src/main/java/com/ims/api/controller/ ├── IssueController.java ← 一组 ├── UserController.java ← 二组 ├── KnowledgeController.java ← 你 ├── AiAnalysisController.java ← 三组 └── ...其余 Controller 同理 ← 各组对应 frontend/src/pages/ ├── issues/ ← 一组 ├── dashboard/ ← 一组 ├── batch-input/ ← 二组 ├── ai-analysis/ ← 三组 ├── knowledge-base/ ← 你 └── system/ ← 二组 backend/ims-service/src/main/java/com/ims/service/ ├── entity/ ← 仅 master 改,各组不能动 ├── repository/ ← 仅 master 改,各组不能动 └── security/ ← 仅 master 改,各组不能动 ``` **核心原则**:Entity 和 Repository 是共享契约,任何人不得修改 master 上的 Entity 字段和 Repository 方法签名。 --- ## 3. 各组分工 ### 高优先级功能定义 | 优先级 | 功能 | 说明 | |--------|------|------| | **P0** | 批量上传 | 历史评审数据与新增数据的快速录入 | | **P0** | AI 自动分析 | 针对上传数据实时提取风险点、改进项 | | **P1** | 问题一览管理 | 对 AI 分析结果统一管理,支持进度追踪 | | **P1** | 基础仪表盘 | 图表展示质量趋势与风险分布 | | **P1** | 对策状况登记 | 针对问题登记解决方案,含负责人与期限 | ### 优先级 vs 现有模块映射 | 优先级 | 对应模块 | 归属 | |--------|---------|------| | P0 批量上传 | 批次录入 + 导入导出 | 二组 | | P0 AI 自动分析 | AI 智能分析 | 三组 | | P1 问题一览管理 | 指摘列表 + 详情 | 一组 | | P1 基础仪表盘 | 工作台 | 一组 | | P1 对策状况登记 | 指摘状态流转 + 编辑 | 一组 | ### 你 — 知识库模块(Phase 1 实施人) **前置依赖**:无 | # | 任务 | 涉及文件 | 说明 | |---|------|---------|------| | 1 | 文档上传 API | KnowledgeController + KnowledgeService | 接收文件,存入 MinIO,记录到 knowledge_documents | | 2 | 文档解析 + 切片 | DocumentParserService | 使用 Apache Tika 解析 PDF/Word/TXT,按 500 Token 切片 | | 3 | 向量化 + 写入 pgvector | VectorizationService | 调用 Ollama nomic-embed-text 向量化,写入 knowledge_chunks | | 4 | 语义检索 | SearchService | 向量化 → pgvector 余弦相似度检索 → 重排序 | | 5 | 检索审计 | SearchLogService | 记录每次检索的 query、耗时、命中数 | | 6 | 知识库管理页面 | frontend/pages/knowledge-base/ | 文档列表、上传、删除、重新向量化 | | 7 | EmbeddingService 接口 | ims-service 新增 | **供三组调用** | **EmbeddingService 接口契约(供三组调用):** ```java public interface EmbeddingService { List embed(String text); List search(String query, int topK); } ``` ### 一组 — 指摘 CRUD + 工作台 + 驾驶舱 **前置依赖**:等 master 含知识库后拉分支 | # | 任务 | 前端页面 | 后端接口 | |---|------|---------|---------| | 1 | 指摘列表查询 | issues/list.tsx | GET /api/v1/issues | | 2 | 创建指摘 | issues/new.tsx | POST /api/v1/issues | | 3 | 指摘详情 | issues/detail.tsx | GET /api/v1/issues/{id} | | 4 | 编辑指摘 | issues/edit.tsx | PUT /api/v1/issues/{id} | | 5 | 状态流转 | 详情页内 | PATCH /api/v1/issues/{id}/status | | 6 | 附件管理 | 详情页内 | POST /issues/{id}/attachments | | 7 | 工作台仪表盘 | dashboard/index.tsx | GET /api/v1/dashboard/stats | | 8 | 通知 | 顶栏铃铛 | GET /api/v1/notifications | | 9 | Agent 指令 | 工作台 + 详情页 | POST /api/v1/agent/execute | | 10 | Agent 审批 | 详情页 | POST /api/v1/agent/approval/* | ### 二组 — 批量录入 + 系统管理 **前置依赖**:等 master 含知识库后拉分支 | # | 任务 | 前端页面 | 后端接口 | |---|------|---------|---------| | 1 | 批量导入 Excel | batch-input/index.tsx | POST /api/v1/import/excel | | 2 | 模板下载 | 批量录入页 | GET /api/v1/import/template | | 3 | 用户管理 | system/users.tsx | GET/POST /api/v1/users | | 4 | 部门树 | 用户管理页 | GET /api/v1/departments | | 5 | 角色权限 | system/roles.tsx | GET/POST /api/v1/roles | | 6 | 系统日志 | system/logs.tsx | GET /api/v1/logs | | 7 | Agent 管理 | system/agent-admin.tsx | GET/PUT /api/v1/agent/config | | 8 | Prompt 模板管理 | Agent 管理页内 | GET/POST /api/v1/prompts | | 9 | AI 配置管理 | Agent 管理页内 | GET/PUT /api/v1/ai/config | ### 三组 — AI 分析 + Prompt 引擎 + Agent 核心 **前置依赖**: - 等知识库模块的 EmbeddingService 接口就绪后对接 - 可以先写 Mock 实现,不阻塞开发 | # | 任务 | 前端页面 | 后端实现 | |---|------|---------|---------| | 1 | AI 分析列表 | ai-analysis/index.tsx | GET /api/v1/ai/records | | 2 | 批量生成分析 | AI 分析页 | POST /api/v1/ai/batch-generate | | 3 | 分析反馈 | 分析详情 | POST /api/v1/ai/records/{id}/feedback | | 4 | Prompt 模板引擎 | — | PromptTemplateEngine | | 5 | Prompt 格式适配 | — | PromptFormatter | | 6 | Spring AI 集成 | — | AiProviderConfig | | 7 | 模型切换 + 容错 | — | ModelRoutingService | | 8 | Agent ReAct 循环 | — | AgentOrchestrator | | 9 | Agent 长期记忆 | — | MemoryService | | 10 | 工具注册中心 | — | ToolRegistry | --- ## 4. 开发约定 ### 后端 - Service 类放在 `com.ims.service.{模块名}`,接口在 `ims-api`,实现在 `ims-service` - 类名格式:`{模块名}Service` - API 路径(已定义,不要修改): ``` /api/v1/issues ← 一组 /api/v1/users ← 二组 /api/v1/knowledge ← 你 /api/v1/ai ← 三组 /api/v1/agent ← 一组 /api/v1/prompts ← 三组 ``` ### 前端 - 统一使用 `src/request.ts` 的 axios 实例 - 组件 PascalCase 命名 ### 数据库 - Entity 字段任何人不得修改 - 如需新增字段,加 Flyway 迁移脚本(版本号格式 `V{版本}__{说明}.sql`),通知其他组 ### 代码风格 - Java:Lombok `@Data` / `@Builder`,不写注释 - TypeScript:使用类型定义,避免 `any` --- ## 5. 启动指南 ```bash # 1. 启动数据库 docker compose up -d # 2. 编译后端 cd backend mvn install -DskipTests # 3. 启动后端(端口 8080) mvn spring-boot:run -pl ims-web -am # 4. 启动前端(新开终端) cd frontend npm install && npm run dev # 5. 浏览器打开 http://localhost:5173,用 admin / Admin@2026 登录 ``` --- ## 6. 知识库模块详细设计 ### 6.1 数据流 ``` 用户上传文档 (PDF/Word/TXT/MD) ↓ KnowledgeController.upload() ↓ MinIO 存储源文件 → knowledge_documents 记录 ↓ DocumentParserService 解析文本 (Tika) ↓ TextSplitter 切片 (500 Token, 10% 重叠) ↓ VectorizationService ├── Ollama nomic-embed-text 向量化 └→ 每个切片写入 knowledge_chunks (content + embedding) ↓ knowledge_documents.status = 'completed' ``` ### 6.2 检索流程 ``` 用户输入 query ↓ SearchService.search(query, topK) ├── EmbeddingModel.embed() 将 query 转为向量 ├── pgvector 余弦相似度检索 (IVFFlat) └→ 返回 Top K 结果 ↓ SearchLogService 记录审计日志 ``` --- ## 7. 常见问题 **Q: 我改了 Entity 字段,别人不知道怎么办?** A: 不要改。如需加字段,在群里通知所有人后各自 rebase。 **Q: 前端页面路由冲突怎么办?** A: 路由表已按路径隔离,各组只关心自己的页面路径。 **Q: 后端编译报错怎么办?** A: 先 `mvn clean compile` 检查。确认是 master 问题则在群里反馈。