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

急救转运任务科室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

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

/** 转出医院科室ID(对应SQL Server dictionary表的vID) */
private String hospitalOutDepartmentId;

/** 转入医院科室ID(对应SQL Server dictionary表的vID) */
private String hospitalInDepartmentId;

2. 后端 - Service层

文件IOrderClassDataService.java

/**
 * 从 SQL Server 查询医院科室列表(HospitalDepartment)
 * 
 * SQL: SELECT vID, vtext FROM dictionary WHERE vtitle='HospitalDepartment' AND vType=1 ORDER BY vOrder
 * 
 * @return 医院科室列表
 */
List<OrderClassDTO> getHospitalDepartments();

文件OrderClassDataServiceImpl.java

@Override
public List<OrderClassDTO> getHospitalDepartments()
{
    log.info("开始从 SQL Server 查询医院科室数据...");
    List<OrderClassDTO> list = orderClassMapper.selectHospitalDepartments();
    log.info("成功查询到 {} 条医院科室数据", list != null ? list.size() : 0);
    return list;
}

3. 后端 - Mapper

文件OrderClassMapper.xml

<!-- 查询医院科室列表(HospitalDepartment) -->
<select id="selectHospitalDepartments" resultMap="OrderClassResult">
    SELECT vID, vtext
    FROM dictionary
    WHERE vtitle = 'HospitalDepartment' AND vType = 1
    ORDER BY vOrder
</select>

4. 后端 - Controller

文件SqlServerDictionaryController.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<OrderClassDTO> list = orderClassDataService.getHospitalDepartments();
        return AjaxResult.success("查询成功", list);
    }
    catch (Exception e)
    {
        logger.error("查询医院科室数据失败", e);
        return AjaxResult.error("查询医院科室数据失败:" + e.getMessage());
    }
}

5. 后端 - 任务保存

文件SysTaskServiceImpl.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

// 医院信息
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

/**
 * 查询医院科室列表(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. 执行数据库脚本

mysql -u root -p ruoyi < sql/add_department_id_fields.sql

2. 重启后端服务

确保新代码生效

3. 重新编译前端

# 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. 验证数据库

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. 向后兼容:不影响历史数据,支持手动输入场景

所有代码变更已完成,执行数据库脚本后即可使用新功能!🚀