# 急救转运任务科室ID保存与同步说明 ## 📋 功能概述 急救转运任务创建时,需要保存转出/转入医院的科室ID,并在同步到旧系统时将这些ID传递给 `admin_save_19.gds` 接口。 ## 🔄 完整数据流程 ### 1. 前端数据采集 **文件**:`app/pages/task/create-emergency.vue` #### 科室数据加载 ```javascript // 从 SQL Server 动态加载科室数据 loadDepartments() { getHospitalDepartments().then(response => { const list = response.data || []; this.departmentOptions = list.map(item => ({ id: item.vID, // 科室ID(来自SQL Server dictionary表) text: item.vtext // 科室名称 })); }) } ``` **数据源SQL**: ```sql SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder ``` #### 科室选择事件 ```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 ✅ } ``` #### 数据提交 ```javascript buildSubmitData() { const submitData = { taskType: 'EMERGENCY_TRANSFER', // ... 其他字段 // 医院信息(包含医院ID、科室名称、科室ID等完整信息) hospitalOut: this.taskForm.hospitalOut, // 包含: id, name, department, departmentId, bedNumber, address hospitalIn: this.taskForm.hospitalIn, // 包含: id, name, department, departmentId, bedNumber, address } return submitData } ``` **提交的数据结构**: ```json { "taskType": "EMERGENCY_TRANSFER", "hospitalOut": { "id": 123, // 医院ID(hosp_data.HospID) "name": "中山大学附属第一医院", "department": "急诊科", "departmentId": "45", // 科室ID(dictionary.vID)✅ "bedNumber": "12", "address": "广州市中山二路58号" }, "hospitalIn": { "id": 456, // 医院ID "name": "广东省人民医院", "department": "心内科", "departmentId": "78", // 科室ID(dictionary.vID)✅ "bedNumber": "5", "address": "广州市中山二路106号" } } ``` ### 2. 后端数据接收与保存 **文件**:`SysTaskServiceImpl.java` #### VO类定义 ```java // TaskCreateVO.java public static class HospitalInfo { private Long id; // 医院ID private String name; // 医院名称 private String department; // 科室名称 private String departmentId; // 科室ID ✅ private String bedNumber; // 床号 private String address; // 地址 private BigDecimal longitude; // 经度 private BigDecimal latitude; // 纬度 } ``` #### 数据保存 ```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()); // ✅ emergencyInfo.setHospitalOutBedNumber(createVO.getHospitalOut().getBedNumber()); emergencyInfo.setHospitalOutAddress(createVO.getHospitalOut().getAddress()); emergencyInfo.setHospitalOutLongitude(createVO.getHospitalOut().getLongitude()); emergencyInfo.setHospitalOutLatitude(createVO.getHospitalOut().getLatitude()); } // 设置转入医院信息 if (createVO.getHospitalIn() != null) { emergencyInfo.setHospitalInId(createVO.getHospitalIn().getId()); emergencyInfo.setHospitalInName(createVO.getHospitalIn().getName()); emergencyInfo.setHospitalInDepartment(createVO.getHospitalIn().getDepartment()); emergencyInfo.setHospitalInDepartmentId(createVO.getHospitalIn().getDepartmentId()); // ✅ emergencyInfo.setHospitalInBedNumber(createVO.getHospitalIn().getBedNumber()); emergencyInfo.setHospitalInAddress(createVO.getHospitalIn().getAddress()); emergencyInfo.setHospitalInLongitude(createVO.getHospitalIn().getLongitude()); emergencyInfo.setHospitalInLatitude(createVO.getHospitalIn().getLatitude()); } ``` **保存到数据库**: ```sql INSERT INTO sys_task_emergency ( 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, -- ✅ -- ... 其他字段 ) VALUES ( #{taskId}, #{hospitalOutId}, #{hospitalOutName}, #{hospitalOutDepartment}, #{hospitalOutDepartmentId}, -- ✅ #{hospitalInId}, #{hospitalInName}, #{hospitalInDepartment}, #{hospitalInDepartmentId}, -- ✅ -- ... 其他值 ) ``` ### 3. 同步到旧系统 **文件**:`LegacySystemSyncService.java` 或 `LegacySystemSyncTask.java` #### 参数映射 | 新系统字段 | 旧系统参数 | 数据源 | 说明 | |-----------|-----------|--------|------| | `hospital_out_id` | `ServiceOrdPtOutHospID` | hosp_data.HospID | 转出医院ID | | `hospital_out_name` | `ServiceOrdPtOutHosp` | hosp_data.hospName | 转出医院名称 | | `hospital_out_department_id` | `ServiceOrdPtServicesID` | dictionary.vID | 转出科室ID ✅ | | `hospital_out_department` | `ServiceOrdPtServices` | dictionary.vtext | 转出科室名称 | | `hospital_in_id` | `ServiceOrdPtInHospID` | hosp_data.HospID | 转入医院ID | | `hospital_in_name` | `ServiceOrdPtInHosp` | hosp_data.hospName | 转入医院名称 | | `hospital_in_department_id` | `ServiceOrdPtInServicesID` | dictionary.vID | 转入科室ID ✅ | | `hospital_in_department` | `ServiceOrdPtInServices` | dictionary.vtext | 转入科室名称 | #### 同步代码示例 ```java // 构建旧系统同步参数 Map params = new HashMap<>(); params.put("adminID", task.getCreatorOaUserId()); // 转出医院信息 params.put("ServiceOrdPtOutHospID", emergencyInfo.getHospitalOutId()); params.put("ServiceOrdPtOutHosp", emergencyInfo.getHospitalOutName()); params.put("ServiceOrdPtServicesID", emergencyInfo.getHospitalOutDepartmentId()); // ✅ params.put("ServiceOrdPtServices", emergencyInfo.getHospitalOutDepartment()); // 转入医院信息 params.put("ServiceOrdPtInHospID", emergencyInfo.getHospitalInId()); params.put("ServiceOrdPtInHosp", emergencyInfo.getHospitalInName()); params.put("ServiceOrdPtInServicesID", emergencyInfo.getHospitalInDepartmentId()); // ✅ params.put("ServiceOrdPtInServices", emergencyInfo.getHospitalInDepartment()); // ... 其他参数 // 调用旧系统接口 String response = httpClient.post(legacySystemUrl + "/admin_save_19.gds", params); ``` ## 📊 数据库表结构 **表名**:`sys_task_emergency` | 字段名 | 类型 | 说明 | 允许NULL | |--------|------|------|---------| | `hospital_out_id` | BIGINT | 转出医院ID(hosp_data.HospID) | 是 | | `hospital_out_name` | VARCHAR(200) | 转出医院名称 | 是 | | `hospital_out_department` | VARCHAR(100) | 转出科室名称 | 是 | | `hospital_out_department_id` | VARCHAR(50) | 转出科室ID(dictionary.vID)✅ | 是 | | `hospital_in_id` | BIGINT | 转入医院ID(hosp_data.HospID) | 是 | | `hospital_in_name` | VARCHAR(200) | 转入医院名称 | 是 | | `hospital_in_department` | VARCHAR(100) | 转入科室名称 | 是 | | `hospital_in_department_id` | VARCHAR(50) | 转入科室ID(dictionary.vID)✅ | 是 | ## 🔍 验证方法 ### 1. 前端验证 ```javascript // 在提交前打印数据 console.log('提交数据:', submitData) console.log('转出科室ID:', submitData.hospitalOut.departmentId) console.log('转入科室ID:', submitData.hospitalIn.departmentId) ``` ### 2. 后端验证 ```java // 在保存前打印数据 log.info("转出医院信息: ID={}, 名称={}, 科室={}, 科室ID={}", createVO.getHospitalOut().getId(), createVO.getHospitalOut().getName(), createVO.getHospitalOut().getDepartment(), createVO.getHospitalOut().getDepartmentId()); log.info("转入医院信息: ID={}, 名称={}, 科室={}, 科室ID={}", createVO.getHospitalIn().getId(), createVO.getHospitalIn().getName(), createVO.getHospitalIn().getDepartment(), createVO.getHospitalIn().getDepartmentId()); ``` ### 3. 数据库验证 ```sql -- 查询最近创建的任务,检查科室ID是否保存 SELECT task_id, hospital_out_name, hospital_out_department, hospital_out_department_id, -- 应该有值 hospital_in_name, hospital_in_department, hospital_in_department_id, -- 应该有值 create_time FROM sys_task_emergency ORDER BY create_time DESC LIMIT 10; ``` ### 4. 旧系统同步验证 ```sql -- 检查同步状态 SELECT task_id, legacy_service_ord_id, sync_status, sync_error_msg, sync_time FROM sys_task_emergency WHERE sync_status = 2 -- 同步成功 ORDER BY sync_time DESC LIMIT 10; ``` ## ⚠️ 注意事项 1. **科室ID类型**:科室ID使用 VARCHAR(50) 类型,因为来自 SQL Server dictionary 表的 vID 可能是字符串 2. **允许NULL**:科室ID字段允许为NULL,以兼容历史数据和手动输入场景 3. **数据一致性**:科室名称和科室ID应该保持一致,都来自同一个科室选择 4. **同步重试**:如果同步失败,定时任务会重试,确保科室ID最终传递到旧系统 5. **数据验证**:前端应验证科室选择,确保用户从下拉框选择而不是手动输入 ## 📝 相关文件 ### 前端文件 - `app/pages/task/create-emergency.vue` - 任务创建页面 - `app/api/dictionary.js` - 科室数据API ### 后端文件 - `ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java` - 实体类 - `ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java` - VO类 - `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` - 任务服务 - `ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml` - Mapper XML ### SQL文件 - `sql/add_department_id_fields.sql` - 科室ID字段添加脚本 ## ✅ 总结 科室ID的完整流程已经实现: 1. ✅ 前端从 SQL Server 动态加载科室数据(包含ID) 2. ✅ 前端选择科室时保存科室名称和科室ID 3. ✅ 前端提交时包含完整的医院和科室信息 4. ✅ 后端接收并保存科室ID到数据库 5. ✅ 后端准备同步到旧系统(需在同步服务中添加参数映射) **下一步工作**: - 在旧系统同步服务中添加科室ID参数(`ServiceOrdPtServicesID` 和 `ServiceOrdPtInServicesID`) - 测试完整流程,确保数据正确传递