# 主审专家选择功能实现说明 ## 功能概述 在知识库文件上传表单中,对于需要专家审核的类型(典型案例(原创)、技术总结、培训心得),允许创建人选择1-2位专家组成员作为主审人。 ## 实现内容 ### 1. Tag 标签文件 **文件路径**: `src/main/webapp/WEB-INF/tags/sys/selectExpert.tag` 创建了新的 tag 文件 `selectExpert.tag`,用于选择专家组成员: - 支持多选(复选框模式) - 限制最多选择2位专家(可通过 `maxSelect` 参数自定义) - 调用 `/sys/office/treeDataAll?type=3&isExpert=1` 接口获取专家列表 - 前端验证:至少选择1位,最多选择2位 - 显示格式:专家姓名用逗号分隔 **使用示例**: ```jsp ``` ### 2. 后端接口修改 #### 2.1 OfficeController.java **文件路径**: `src/main/java/com/jeeplus/modules/sys/web/OfficeController.java` **修改内容**: 1. 注入 `WorkKnowledgeExpertService` 2. 在 `treeDataAll` 方法中添加 `isExpert` 参数 3. 当 `type=3` 且 `isExpert=1` 时,过滤只返回专家用户所在的部门 **核心逻辑**: ```java if("3".equals(type) && "1".equals(isExpert)){ // 获取所有启用的专家 List expertList = expertService.findEnabledList(); // 过滤mapList,只保留有专家的部门 ... } ``` ### 3. 实体类修改 #### 3.1 WorkKnowledgeBaseShareInfo.java **文件路径**: `src/main/java/com/jeeplus/modules/WorkKnowledgeBase/entity/WorkKnowledgeBaseShareInfo.java` **新增字段**: ```java /** 主审专家ID列表(多个用逗号分隔) */ private String expertReviewerIds; /** 主审专家姓名列表(多个用逗号分隔,非数据库字段,用于展示) */ private String expertReviewerNames; ``` 包含 getter/setter 方法。 ### 4. 表单页面修改 **文件路径**: `src/main/webapp/webpage/modules/WorkKnowledgeBase/workKnowledgeBaseShareForm.jsp` **修改内容**: 1. 在 Controller 的 `form` 方法中添加 `treeName` 传递 2. 在表单中添加主审专家选择器,条件显示: - 非问答答疑分类 - 且(技术总结 或 培训心得 或 典型案例+原创) **显示条件**: ```jsp ``` **UI 提示**: ```html 可选可不选,最多选择2位专家 ``` ### 5. MyBatis Mapper 修改 **文件路径**: `src/main/resources/mappings/modules/WorkKnowledgeBase/WorkKnowledgeBaseShareInfoDao.xml` **修改内容**: 1. `shareColumns` SQL 片段添加 `expert_reviewer_ids` 字段映射 2. `findDynamicList` SELECT 子句添加字段 3. `findDynamicList` GROUP BY 子句添加字段 4. `insert` 语句添加字段 5. `update` 语句添加字段 ### 6. 数据库迁移脚本 **文件路径**: `src/main/resources/mysqlDateBase/alter_work_knowledge_base_share_info_expert_reviewer.sql` **SQL 内容**: ```sql ALTER TABLE work_knowledge_base_share_info ADD COLUMN expert_reviewer_ids VARCHAR(500) COMMENT '主审专家ID列表(多个用逗号分隔)' AFTER manual_score_time; ``` **执行说明**: 需要在数据库中手动执行此脚本以添加新字段。 ## 数据流程 1. **前端展示**: 用户打开表单 → Controller 查询 treeName → JSP 根据条件显示主审专家选择器 2. **选择专家**: 点击搜索按钮 → 调用 `/sys/office/treeDataAll?type=3&isExpert=1` → 返回专家所在部门列表 → 用户勾选专家 3. **提交保存**: 表单提交 → `expertReviewerIds` 字段保存到数据库(格式:`id1,id2`) 4. **编辑回显**: 从数据库读取 `expertReviewerIds` → 通过 UserUtils 获取专家姓名 → 填充到 `expertReviewerNames` ## 注意事项 1. **专家定义**: 专家是在 `work_knowledge_expert` 表中配置且状态为启用的用户 2. **可选性**: 主审专家是可选的,不强制要求选择 3. **数量限制**: 最多选择2位专家,前端和 tag 文件中都有验证 4. **数据存储**: 只存储专家ID列表(逗号分隔),姓名为动态获取(非持久化字段) 5. **权限控制**: 只有启用的专家才会出现在选择列表中 ## 相关文件清单 | 文件 | 类型 | 说明 | |------|------|------| | `selectExpert.tag` | 新建 | 专家选择器 tag | | `OfficeController.java` | 修改 | 添加 isExpert 参数支持 | | `WorkKnowledgeBaseShareInfo.java` | 修改 | 添加主审专家字段 | | `WorkKnowledgeBaseShareController.java` | 修改 | form 方法添加 treeName | | `workKnowledgeBaseShareForm.jsp` | 修改 | 添加主审专家选择器 UI | | `WorkKnowledgeBaseShareInfoDao.xml` | 修改 | 添加字段映射 | | `alter_work_knowledge_base_share_info_expert_reviewer.sql` | 新建 | 数据库迁移脚本 | ## 测试建议 1. 测试不同分类下主审专家选择器的显示/隐藏逻辑 2. 测试选择1位、2位专家的正常保存 3. 测试选择超过2位专家的拦截提示 4. 测试编辑时的回显功能 5. 测试清空主审专家的功能 6. 测试数据库中 expert_reviewer_ids 字段的正确存储