# 主审专家选择功能实现说明
## 功能概述
在知识库文件上传表单中,对于需要专家审核的类型(典型案例(原创)、技术总结、培训心得),允许创建人选择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 字段的正确存储