编辑 | blame | 历史 | 原始文档

急救转运任务科室ID保存与同步说明

📋 功能概述

急救转运任务创建时,需要保存转出/转入医院的科室ID,并在同步到旧系统时将这些ID传递给 admin_save_19.gds 接口。

🔄 完整数据流程

1. 前端数据采集

文件app/pages/task/create-emergency.vue

科室数据加载

// 从 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

科室选择事件

// 转出医院科室选择
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 ✅
}

数据提交

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类定义

// 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;  // 纬度
}

数据保存

// 设置转出医院信息
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.javaLegacySystemSyncTask.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 转入科室名称

同步代码示例

// 构建旧系统同步参数
Map<String, Object> 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. 前端验证

// 在提交前打印数据
console.log('提交数据:', submitData)
console.log('转出科室ID:', submitData.hospitalOut.departmentId)
console.log('转入科室ID:', submitData.hospitalIn.departmentId)

2. 后端验证

// 在保存前打印数据
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. 数据库验证

-- 查询最近创建的任务,检查科室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. 旧系统同步验证

-- 检查同步状态
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参数(ServiceOrdPtServicesIDServiceOrdPtInServicesID
- 测试完整流程,确保数据正确传递