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

病情选择列表存储功能说明

功能概述

在急救转运任务创建页面的病情选择功能中,添加了病情ID列表(diseaseIds)字段的存储功能,用于在同步调度单到旧系统时传递OrdICD_ID参数。

实现时间

2025-10-25

需求背景

  • 在创建急救转运任务时,用户可以选择多个病情(ICD-10疾病分类)
  • 需要将选中的病情ID列表保存到数据库
  • 在同步调度单到旧系统时,需要使用这些病情ID作为OrdICD_ID参数

数据流转

前端 → 后端

  1. 用户在病情选择器中选择一个或多个病情
  2. 前端将选中的病情对象数组 selectedDiseases 转换为ID数组
  3. 在提交任务时,将 diseaseIds 作为参数传递给后端

后端存储

  1. 后端接收 List<Long> diseaseIds
  2. 将ID列表转换为逗号分隔的字符串(如:"1,2,3")
  3. 保存到 sys_task_emergency 表的 disease_ids 字段

旧系统同步

  1. 从数据库读取 disease_ids 字段
  2. 将逗号分隔的字符串解析为ID列表
  3. 作为 OrdICD_ID 参数传递给旧系统调度单接口

技术实现

1. 前端修改(create-emergency.vue)

buildSubmitData 方法添加

const submitData = {
  // ... 其他字段
  
  // 病情ID列表(用于同步调度单的OrdICD_ID参数)
  diseaseIds: this.selectedDiseases.map(d => d.id),
  
  // ... 其他字段
}

数据示例

// selectedDiseases 数组结构
[
  {
    id: 1,
    icdCode: "A00.0",
    icdName: "霍乱弧菌所致的霍乱",
    sm: "霍乱"
  },
  {
    id: 2,
    icdCode: "A00.1",
    icdName: "埃尔托弧菌所致的霍乱",
    sm: "霍乱"
  }
]

// 转换后的 diseaseIds
[1, 2]

2. 后端VO修改(TaskCreateVO.java)

/** 病情ID列表(ICD-10疾病ID列表,用于同步调度单的OrdICD_ID参数) */
private List<Long> diseaseIds;

public List<Long> getDiseaseIds() {
    return diseaseIds;
}

public void setDiseaseIds(List<Long> diseaseIds) {
    this.diseaseIds = diseaseIds;
}

3. 实体类修改(SysTaskEmergency.java)

/** 病情ID列表(ICD-10疾病ID列表,逗号分隔,用于同步调度单的OrdICD_ID参数) */
private String diseaseIds;

public String getDiseaseIds() {
    return diseaseIds;
}

public void setDiseaseIds(String diseaseIds) {
    this.diseaseIds = diseaseIds;
}

4. 服务层修改(SysTaskServiceImpl.java)

导入依赖

import java.util.stream.Collectors;

saveEmergencyInfo 方法添加

private void saveEmergencyInfo(Long taskId, TaskCreateVO createVO) {
    // ... 其他代码
    
    // 设置病情ID列表(将List<Long>转换为逗号分隔的字符串)
    if (createVO.getDiseaseIds() != null && !createVO.getDiseaseIds().isEmpty()) {
        String diseaseIdsStr = createVO.getDiseaseIds().stream()
            .map(String::valueOf)
            .collect(Collectors.joining(","));
        emergencyInfo.setDiseaseIds(diseaseIdsStr);
    }
    
    // ... 其他代码
}

5. Mapper XML修改(SysTaskEmergencyMapper.xml)

ResultMap添加

<result property="diseaseIds" column="disease_ids" />

selectSysTaskEmergencyVo添加

select id, task_id, ..., passenger_phone, disease_ids, document_type_id, ...

insertSysTaskEmergency添加

<if test="diseaseIds != null">disease_ids,</if>
<!-- values部分 -->
<if test="diseaseIds != null">#{diseaseIds},</if>

updateSysTaskEmergency添加

<if test="diseaseIds != null">disease_ids = #{diseaseIds},</if>

6. 数据库表修改

新增字段

ALTER TABLE sys_task_emergency 
ADD COLUMN IF NOT EXISTS disease_ids VARCHAR(500) 
COMMENT '病情ID列表(ICD-10疾病ID列表,逗号分隔,用于同步调度单的OrdICD_ID参数)' 
AFTER passenger_phone;

字段说明

  • 字段名:disease_ids
  • 类型:VARCHAR(500)
  • 可空:是
  • 位置:在 passenger_phone 字段之后
  • 存储格式:逗号分隔的ID列表,如 "1,2,3"

数据存储示例

前端提交数据

{
  "taskType": "EMERGENCY_TRANSFER",
  "diseaseIds": [1, 2, 3],
  "patient": { ... },
  "hospitalOut": { ... },
  ...
}

后端处理

// List<Long> -> String
[1, 2, 3] -> "1,2,3"

数据库存储

disease_ids: "1,2,3"

同步到旧系统(待实现)

// String -> List<Long>
"1,2,3" -> [1, 2, 3]

// 传递给旧系统
OrdICD_ID = 病情ID列表的第一个ID(或拼接的字符串,具体根据旧系统接口要求)

文件清单

已修改文件

  1. app/pages/task/create-emergency.vue - 前端任务创建页面
  2. ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java - 任务创建VO
  3. ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java - 急救转运实体类
  4. ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java - 任务服务实现类
  5. ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml - MyBatis映射文件

新增文件

  1. sql/update_sys_task_emergency_add_disease_ids.sql - 数据库表结构更新脚本
  2. prd/病情选择列表存储功能说明.md - 本文档

数据库升级步骤

  1. 执行SQL脚本添加字段:
    bash mysql -u root -p your_database < sql/update_sys_task_emergency_add_disease_ids.sql

  2. 验证字段是否添加成功:
    sql DESC sys_task_emergency;

  3. 确认 disease_ids 字段存在且类型正确

测试要点

1. 功能测试

  • [ ] 创建任务时选择单个病情,验证是否正确保存
  • [ ] 创建任务时选择多个病情,验证是否正确保存为逗号分隔的字符串
  • [ ] 创建任务时不选择病情,验证字段为NULL
  • [ ] 查询任务详情,验证病情ID列表是否正确返回

2. 数据验证

  • [ ] 检查数据库中 disease_ids 字段的值格式是否正确
  • [ ] 验证ID列表的顺序是否与前端选择顺序一致

3. 边界测试

  • [ ] 选择大量病情(接近VARCHAR(500)限制)
  • [ ] 包含特殊ID(如0、负数、超大数字)

后续工作

已实现功能

  1. 旧系统同步逻辑(✅ 已完成):
  • LegacySystemSyncServiceImpl.buildDispatchOrderParams 方法中实现了调度单同步
  • disease_ids 字段读取病情ID列表
  • 将格式从 "1,2,3" 转换为 ",1,2,3," 后传递给旧系统的 OrdICD_ID 参数
  • 旧系统会将这些ID写入 ServiceOrder_ICD 表,用于病情诊断

实现代码:

// LegacySystemSyncServiceImpl.buildDispatchOrderParams方法中添加

// 病情ID列表(ICD-10疾病ID,用于诊断ICD)
// 格式:逗号分隔的ID列表,如 ",1,2,3,"
String ordIcdId = "";
if (StringUtils.isNotEmpty(emergency.getDiseaseIds())) {
    // 将存储的 "1,2,3" 格式转换为旧系统要求的 ",1,2,3," 格式
    ordIcdId = "," + emergency.getDiseaseIds() + ",";
    log.info("病情ID列表已设置,任务ID: {}, OrdICD_ID: {}", task.getTaskId(), ordIcdId);
}
params.put("OrdICD_ID", ordIcdId);
params.put("OrdICD_ID_old", ""); // 旧病情ID列表(用于对比是否需要更新)

旧系统处理逻辑(admin_save_24.gds 第340-353行):

'写入诊断ICD
OrdICD_ID = SafeRequest(Request.form("OrdICD_ID"))
OrdICD_ID_old = SafeRequest(Request.form("OrdICD_ID_old"))
If OrdICD_ID <> OrdICD_ID_old Then
    sql="delete from ServiceOrder_ICD where ServiceOrdIDDt="&ServiceOrdID
    objConn.Execute sql
    If OrdICD_ID<>"" then
        OrdICD_IDSP = SPLIT(OrdICD_ID,",")
        for i=1 to ubound(OrdICD_IDSP)-1
            If OrdICD_IDSP(i)<>"" Then
                sql="insert into ServiceOrder_ICD (ServiceOrdIDDt,icd_id) values ("&ServiceOrdID&","&OrdICD_IDSP(i)&")"
                objConn.Execute sql
            End If
        Next
    End If
End If

待实现功能

  1. 任务详情页面显示
  • 在任务详情页面显示选中的病情列表
  • 根据 disease_ids 查询病情详细信息
  1. 任务编辑功能
  • 支持在编辑任务时修改病情选择
  • 更新 disease_ids 字段

注意事项

  1. 数据格式
  • 前端传递:List<Long> 类型
  • 数据库存储:String 类型(逗号分隔)
  • 确保转换逻辑正确,避免数据丢失
  1. 字段长度
  • VARCHAR(500) 可存储约100个ID(假设每个ID平均5个字符)
  • 如果需要存储更多病情,需要调整字段长度
  1. 兼容性
  • 旧数据的 disease_ids 字段为NULL
  • 查询和展示时需要处理NULL值
  1. 同步时机
  • 病情ID列表主要用于调度单同步
  • 不影响服务单的创建和同步

相关资料

  • ICD-10国际疾病分类标准
  • 旧系统调度单接口文档:admin_save_24.gds
  • OrdICD_ID参数说明:格式为 ",1,2,3,",用逗号分隔,旧系统会解析后写入 ServiceOrder_ICD 表

更新记录

  • 2025-10-25:初始版本,实现前端、后端和数据库存储
  • 2025-10-25:完成旧系统同步逻辑,实现OrdICD_ID参数传递