# 急救转运任务科室ID字段功能说明 ## 📋 需求背景 原先科室数据从本地MySQL字典表(dict_type='hospital_department')读取,现改为从SQL Server的dictionary表动态加载,并且需要在任务表中存储科室ID,同步旧系统时也要传递医院ID和科室ID。 ## 🎯 实现目标 1. ✅ 科室数据源从本地字典改为SQL Server动态加载 2. ✅ 在 `sys_task_emergency` 表中添加科室ID字段 3. ✅ 前端选择科室时同时保存科室ID和科室名称 4. ✅ 后端接收并保存科室ID 5. ✅ 同步旧系统时传递医院ID和科室ID ## 📊 数据库变更 ### SQL 脚本 文件路径:`sql/add_department_id_fields.sql` ```sql -- 1. 添加转出医院科室ID字段 ALTER TABLE sys_task_emergency ADD COLUMN hospital_out_department_id VARCHAR(50) COMMENT '转出医院科室ID(对应SQL Server dictionary表的vID)' AFTER hospital_out_department; -- 2. 添加转入医院科室ID字段 ALTER TABLE sys_task_emergency ADD COLUMN hospital_in_department_id VARCHAR(50) COMMENT '转入医院科室ID(对应SQL Server dictionary表的vID)' AFTER hospital_in_department; -- 3. 创建索引以提升查询性能 CREATE INDEX idx_hospital_out_dept_id ON sys_task_emergency(hospital_out_department_id); CREATE INDEX idx_hospital_in_dept_id ON sys_task_emergency(hospital_in_department_id); ``` ### 字段说明 | 字段名 | 类型 | 说明 | 数据来源 | 允许NULL | |--------|------|------|---------|---------| | hospital_out_department_id | VARCHAR(50) | 转出医院科室ID | SQL Server dictionary.vID | 是 | | hospital_in_department_id | VARCHAR(50) | 转入医院科室ID | SQL Server dictionary.vID | 是 | **数据源SQL**: ```sql SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder ``` ## 🔧 代码变更 ### 1. 后端 - 实体类 **文件**:`SysTaskEmergency.java` ```java /** 转出医院科室ID(对应SQL Server dictionary表的vID) */ private String hospitalOutDepartmentId; /** 转入医院科室ID(对应SQL Server dictionary表的vID) */ private String hospitalInDepartmentId; ``` ### 2. 后端 - Service层 **文件**:`IOrderClassDataService.java` ```java /** * 从 SQL Server 查询医院科室列表(HospitalDepartment) * * SQL: SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder * * @return 医院科室列表 */ List getHospitalDepartments(); ``` **文件**:`OrderClassDataServiceImpl.java` ```java @Override public List getHospitalDepartments() { log.info("开始从 SQL Server 查询医院科室数据..."); List list = orderClassMapper.selectHospitalDepartments(); log.info("成功查询到 {} 条医院科室数据", list != null ? list.size() : 0); return list; } ``` ### 3. 后端 - Mapper **文件**:`OrderClassMapper.xml` ```xml ``` ### 4. 后端 - Controller **文件**:`SqlServerDictionaryController.java` ```java /** * 查询医院科室列表(HospitalDepartment) * * 数据源:SQL Server (dictionary表) * SQL: SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder * * @return 医院科室列表 */ @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')") @GetMapping("/hospitalDepartments") public AjaxResult getHospitalDepartments() { try { List list = orderClassDataService.getHospitalDepartments(); return AjaxResult.success("查询成功", list); } catch (Exception e) { logger.error("查询医院科室数据失败", e); return AjaxResult.error("查询医院科室数据失败:" + e.getMessage()); } } ``` ### 5. 后端 - 任务保存 **文件**:`SysTaskServiceImpl.java` ```java // 设置转出医院信息 if (createVO.getHospitalOut() != null) { emergencyInfo.setHospitalOutId(createVO.getHospitalOut().getId()); emergencyInfo.setHospitalOutName(createVO.getHospitalOut().getName()); emergencyInfo.setHospitalOutDepartment(createVO.getHospitalOut().getDepartment()); emergencyInfo.setHospitalOutDepartmentId(createVO.getHospitalOut().getDepartmentId()); // 科室ID // ... 其他字段 } // 设置转入医院信息 if (createVO.getHospitalIn() != null) { emergencyInfo.setHospitalInId(createVO.getHospitalIn().getId()); emergencyInfo.setHospitalInName(createVO.getHospitalIn().getName()); emergencyInfo.setHospitalInDepartment(createVO.getHospitalIn().getDepartment()); emergencyInfo.setHospitalInDepartmentId(createVO.getHospitalIn().getDepartmentId()); // 科室ID // ... 其他字段 } ``` ### 6. 后端 - 旧系统同步 **文件**:`LegacySystemSyncServiceImpl.java` ```java // 医院信息 params.put("ServiceOrdPtOutHosp", StringUtils.nvl(emergency.getHospitalOutName(), "")); params.put("ServiceOrdPtOutHospID", emergency.getHospitalOutId() != null ? emergency.getHospitalOutId().toString() : "0"); // 转出医院ID params.put("ServiceOrdPtInHosp", StringUtils.nvl(emergency.getHospitalInName(), "")); params.put("ServiceOrdPtInHospID", emergency.getHospitalInId() != null ? emergency.getHospitalInId().toString() : "0"); // 转入医院ID // 科室信息 params.put("ServiceOrdPtServices", StringUtils.nvl(emergency.getHospitalOutDepartment(), "")); params.put("ServiceOrdPtServicesID", StringUtils.nvl(emergency.getHospitalOutDepartmentId(), "0")); // 转出科室ID params.put("ServiceOrdPtInServices", StringUtils.nvl(emergency.getHospitalInDepartment(), "")); params.put("ServiceOrdPtInServicesID", StringUtils.nvl(emergency.getHospitalInDepartmentId(), "0")); // 转入科室ID ``` ### 7. 前端 - API接口 **文件**:`app/api/dictionary.js` ```javascript /** * 查询医院科室列表(HospitalDepartment) */ export function getHospitalDepartments() { return request({ url: '/sqlserver/dictionary/hospitalDepartments', method: 'get' }) } ``` ### 8. 前端 - 页面代码 **文件**:`app/pages/task/create-emergency.vue` **导入API**: ```javascript import { getServiceOrdAreaTypes, getServiceOrderTypes, getHospitalDepartments } from "@/api/dictionary" ``` **数据结构**: ```javascript hospitalOut: { id: null, // 医院ID name: '', department: '', departmentId: null, // 科室ID bedNumber: '', address: '' }, hospitalIn: { id: null, // 医院ID name: '', department: '', departmentId: null, // 科室ID bedNumber: '', address: '' }, ``` **加载科室数据**: ```javascript // 加载科室数据(从 SQL Server 动态加载) loadDepartments() { getHospitalDepartments().then(response => { const list = response.data || [] this.departmentOptions = list.map(item => ({ id: item.vID, text: item.vtext, dictValue: item.vtext // 为了保持兼容性,保留dictValue字段 })) }).catch(error => { console.error('加载科室数据失败:', error) this.departmentOptions = [] }) }, ``` **科室选择事件**: ```javascript // 转出医院科室选择 onHospitalOutDepartmentChange(e) { const index = e.detail.value const selected = this.departmentOptions[index] this.taskForm.hospitalOut.department = selected.text // 保存科室名称 this.taskForm.hospitalOut.departmentId = selected.id // 保存科室ID }, // 转入医院科室选择 onHospitalInDepartmentChange(e) { const index = e.detail.value const selected = this.departmentOptions[index] this.taskForm.hospitalIn.department = selected.text // 保存科室名称 this.taskForm.hospitalIn.departmentId = selected.id // 保存科室ID }, ``` ## 📝 部署步骤 ### 1. 执行数据库脚本 ```bash mysql -u root -p ruoyi < sql/add_department_id_fields.sql ``` ### 2. 重启后端服务 确保新代码生效 ### 3. 重新编译前端 ```bash # H5版本 npm run build:h5 # 微信小程序版本 npm run build:mp-weixin ``` ## ✅ 测试验证 ### 1. 测试科室数据加载 访问API接口: ``` GET /sqlserver/dictionary/hospitalDepartments ``` 预期响应: ```json { "code": 200, "msg": "查询成功", "data": [ { "vID": "1", "vtext": "急诊科" }, { "vID": "2", "vtext": "心内科" } // ... 更多科室 ] } ``` ### 2. 测试任务创建 1. 在前端创建急救转运任务 2. 选择医院和科室 3. 提交任务 ### 3. 验证数据库 ```sql SELECT task_id, hospital_out_id, hospital_out_name, hospital_out_department, hospital_out_department_id, hospital_in_id, hospital_in_name, hospital_in_department, hospital_in_department_id FROM sys_task_emergency ORDER BY id DESC LIMIT 10; ``` ### 4. 验证旧系统同步 创建任务后,查看同步日志,确认以下参数已正确传递: - `ServiceOrdPtOutHospID`:转出医院ID - `ServiceOrdPtInHospID`:转入医院ID - `ServiceOrdPtServicesID`:转出科室ID - `ServiceOrdPtInServicesID`:转入科室ID ## 🔍 数据对照表 ### 新旧系统字段映射 | 新系统字段 | 旧系统参数 | 说明 | |-----------|-----------|------| | hospital_out_id | ServiceOrdPtOutHospID | 转出医院ID | | hospital_out_name | ServiceOrdPtOutHosp | 转出医院名称 | | hospital_out_department_id | ServiceOrdPtServicesID | 转出科室ID | | hospital_out_department | ServiceOrdPtServices | 转出科室名称 | | hospital_in_id | ServiceOrdPtInHospID | 转入医院ID | | hospital_in_name | ServiceOrdPtInHosp | 转入医院名称 | | hospital_in_department_id | ServiceOrdPtInServicesID | 转入科室ID | | hospital_in_department | ServiceOrdPtInServices | 转入科室名称 | ### SQL Server 数据源 | 数据类型 | SQL查询 | 用途 | |---------|--------|------| | 医院科室 | `SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder` | 科室选择下拉框 | | 单据类型 | `SELECT vID, vtext FROM dictionary WHERE vtitle='ServiceOrdAreaType' AND vType=1 ORDER BY vOrder` | 单据类型选择 | | 任务类型 | `SELECT vID, vtext FROM dictionary WHERE vtitle='ServiceOrderType' AND vType>=1 ORDER BY vOrder` | 任务类型选择 | ## 📌 注意事项 ### 1. 数据兼容性 - 科室ID字段为VARCHAR(50),因为SQL Server的vID可能是字符串 - 允许NULL,兼容历史数据和手动输入场景 - 保留科室名称字段,用于显示和兼容 ### 2. 数据一致性 - 从SQL Server选择时,ID和名称应该一致 - 如果手动输入科室名称,只有名称没有ID(ID为NULL) - 同步旧系统时,如果ID为NULL则传"0" ### 3. 旧系统兼容 - 旧系统需要同时接收医院ID和医院名称 - 旧系统需要同时接收科室ID和科室名称 - 如果ID为空,传"0"作为默认值 ### 4. 性能优化 - 已为科室ID字段创建索引 - 前端加载时缓存科室数据,避免重复请求 - SQL Server查询已添加ORDER BY优化 ## 🎉 功能总结 本次更新实现了: 1. ✅ **数据源切换**:科室数据从本地字典改为SQL Server动态加载 2. ✅ **数据存储**:在sys_task_emergency表中添加科室ID字段 3. ✅ **前端集成**:前端选择科室时同时保存ID和名称 4. ✅ **后端处理**:后端正确接收和保存科室ID 5. ✅ **系统同步**:同步旧系统时传递医院ID和科室ID 6. ✅ **向后兼容**:不影响历史数据,支持手动输入场景 所有代码变更已完成,执行数据库脚本后即可使用新功能!🚀