# 医院科室选择功能实现说明
## 需求背景
在急救转运任务创建页面中,转出医院和转入医院的科室需要改为选择器,从系统字典中加载科室数据,方便用户快速选择常用科室,确保数据规范统一。
## 实现方案
### 一、后端配置
#### 1. 数据库字典配置
**文件**: `sql/hospital_department_dict.sql`
##### 字典类型配置
```sql
INSERT INTO sys_dict_type(dict_name, dict_type, status, create_by, create_time, remark)
VALUES('医院科室', 'hospital_department', '0', 'admin', SYSDATE(), '医院科室列表');
```
##### 科室字典数据
共配置30个常用科室,包括:
**急诊相关**(2个)
- 急诊科(默认选项)
- 急救中心
**内科系统**(8个)
- 心内科
- 呼吸内科
- 消化内科
- 神经内科
- 肾内科
- 内分泌科
- 血液科
- 风湿免疫科
**外科系统**(6个)
- 普外科
- 骨科
- 神经外科
- 心胸外科
- 泌尿外科
- 烧伤科
**专科**(14个)
- ICU(重症监护室)
- CCU(冠心病监护病房)
- 肿瘤科
- 感染科
- 儿科
- 妇产科
- 眼科
- 耳鼻喉科
- 口腔科
- 皮肤科
- 康复科
- 中医科
- 精神科
- 其他科室
##### 字典数据示例
```sql
-- 急诊科(默认选项)
INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
VALUES(1, '急诊科', '急诊科', 'hospital_department', '', 'danger', 'Y', '0', 'admin', SYSDATE(), '急诊科室');
-- 心内科
INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
VALUES(3, '心内科', '心内科', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), '心血管内科');
```
##### 颜色标识说明
- `danger`(红色):急诊相关科室
- `primary`(蓝色):内科系统
- `success`(绿色):外科系统
- `warning`(橙色):重症监护
- `info`(灰色):其他专科
- `default`(默认):其他科室
#### 2. 执行SQL脚本
```sql
-- 在MySQL中执行
source sql/hospital_department_dict.sql;
-- 或直接执行
mysql -u root -p database_name < sql/hospital_department_dict.sql
```
### 二、前端实现
#### 1. API接口调用
**文件**: `app/pages/task/create-emergency.vue`
##### 导入字典API
```javascript
import { getDicts } from "@/api/dict"
```
##### 数据字段定义
```javascript
data() {
return {
// ... 其他字段
departmentOptions: [], // 科室字典数据
}
}
```
#### 2. 加载科室字典数据
##### 页面加载时调用
```javascript
onLoad(options) {
// ... 其他初始化代码
// 加载科室字典数据
this.loadDepartments()
}
```
##### 加载方法实现
```javascript
// 加载科室字典数据
loadDepartments() {
getDicts('hospital_department').then(response => {
this.departmentOptions = response.data || []
}).catch(error => {
console.error('加载科室字典失败:', error)
this.departmentOptions = []
})
}
```
#### 3. 模板选择器实现
##### 转出医院科室选择器
```html
科室
{{ taskForm.hospitalOut.department || '请选择科室' }}
```
##### 转入医院科室选择器
```html
科室
{{ taskForm.hospitalIn.department || '请选择科室' }}
```
#### 4. 选择事件处理
##### 转出医院科室选择
```javascript
// 转出医院科室选择
onHospitalOutDepartmentChange(e) {
const index = e.detail.value
this.taskForm.hospitalOut.department = this.departmentOptions[index].dictValue
}
```
##### 转入医院科室选择
```javascript
// 转入医院科室选择
onHospitalInDepartmentChange(e) {
const index = e.detail.value
this.taskForm.hospitalIn.department = this.departmentOptions[index].dictValue
}
```
### 三、数据流程
#### 1. 页面初始化流程
```
页面加载 (onLoad)
↓
调用 loadDepartments()
↓
请求后端 getDicts('hospital_department')
↓
获取科室字典数据
↓
保存到 departmentOptions
↓
选择器显示科室列表
```
#### 2. 用户选择流程
```
用户点击科室选择器
↓
显示科室列表(30个选项)
↓
用户选择某个科室
↓
触发 @change 事件
↓
调用 onHospitalOutDepartmentChange 或 onHospitalInDepartmentChange
↓
根据索引获取科室的 dictValue
↓
更新 taskForm.hospitalOut.department 或 taskForm.hospitalIn.department
↓
选择器显示已选科室名称
```
#### 3. 数据提交流程
```
用户点击保存按钮
↓
收集表单数据(包括科室)
↓
调用 submitTask()
↓
构建提交数据 buildSubmitData()
↓
提交到后端 addTask()
↓
保存到 sys_task_emergency 表
```
## 技术特点
### 1. 选择器配置
- `mode="selector"`:单选模式
- `:range="departmentOptions"`:数据源绑定
- `range-key="dictLabel"`:显示字段为 dictLabel
- `@change`:选择事件绑定
### 2. 数据格式
字典数据返回格式:
```javascript
[
{
dictCode: 1,
dictSort: 1,
dictLabel: "急诊科",
dictValue: "急诊科",
dictType: "hospital_department",
cssClass: "",
listClass: "danger",
isDefault: "Y",
status: "0"
},
// ... 更多科室
]
```
### 3. 显示与存储
- **显示**:`dictLabel`(例如:急诊科)
- **存储**:`dictValue`(例如:急诊科)
- **排序**:按 `dictSort` 字段排序
## 优化效果
### 1. 数据规范化
- ✅ 统一科室名称,避免手工输入错误
- ✅ 标准化科室数据,便于统计分析
- ✅ 可在后台管理系统中维护科室列表
### 2. 用户体验优化
- ✅ 点击即选,无需手动输入
- ✅ 常用科室一目了然
- ✅ 减少输入错误和时间
### 3. 系统维护
- ✅ 集中管理科室数据
- ✅ 新增科室只需在后台字典中配置
- ✅ 支持启用/禁用某些科室
## 后台管理
### 字典管理路径
```
系统管理 > 字典管理 > 数据字典
```
### 操作步骤
1. **查看字典类型**
- 字典名称:医院科室
- 字典类型:hospital_department
2. **查看/编辑字典数据**
- 点击字典类型后的"字典配置"按钮
- 可以查看所有科室列表
- 可以新增、修改、删除科室
3. **新增科室**
- 点击"新增"按钮
- 填写字典标签(显示名称)
- 填写字典键值(存储值)
- 设置排序号
- 选择列表样式(颜色)
- 保存
4. **修改科室**
- 点击科室后的"修改"按钮
- 修改相关信息
- 保存
5. **禁用科室**
- 点击科室后的"状态"开关
- 禁用后前端不会显示该科室
## 扩展建议
### 1. 科室分类
可以考虑增加科室分类字典,实现二级联动:
```
一级:内科/外科/专科
二级:具体科室
```
### 2. 医院-科室关联
可以关联医院和科室,不同医院显示不同的科室列表。
### 3. 常用科室
可以记录用户常用科室,优先显示在列表顶部。
### 4. 搜索功能
科室较多时,可以添加搜索功能快速定位。
## 注意事项
1. **字典类型名称**:必须使用 `hospital_department`,与代码中保持一致
2. **数据同步**:修改字典后,前端可能需要刷新页面或重新加载
3. **兼容性**:确保所有科室名称在数据库中正常显示(注意编码问题)
4. **默认值**:`is_default='Y'` 的科室会作为默认选项(目前是急诊科)
## 测试建议
### 功能测试
1. 页面加载后,点击科室选择器,应显示所有科室列表
2. 选择科室后,选择器应显示所选科室名称
3. 提交任务后,科室信息应正确保存到数据库
4. 在后台字典管理中修改科室,前端应能正确加载
### 数据测试
1. 测试所有30个科室是否都能正常选择
2. 测试科室数据是否按排序号正确排列
3. 测试禁用某个科室后,前端是否不显示
### 兼容性测试
1. 测试H5端选择器功能是否正常
2. 测试微信小程序端选择器功能是否正常
3. 测试不同手机系统的显示效果
## 相关文件
### 后端文件
- `sql/hospital_department_dict.sql` - 科室字典SQL脚本
### 前端文件
- `app/pages/task/create-emergency.vue` - 急救转运任务创建页面
- `app/api/dict.js` - 字典API接口
### 数据库表
- `sys_dict_type` - 字典类型表
- `sys_dict_data` - 字典数据表
## 版本历史
- **v1.0** (2025-10-19): 初始版本,实现科室选择功能
- 创建科室字典数据(30个常用科室)
- 前端改为选择器模式
- 支持转出/转入医院科室选择