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

病情ID列表同步旧系统功能实现总结

实现时间

2025-10-25

功能概述

完成了病情ID列表(diseaseIds)从前端提交到后端存储,再到旧系统同步的完整数据流程,用于在调度单同步时传递OrdICD_ID参数。

完整数据流程

前端选择病情
    ↓
[{ id: 1, icdCode: "A00.0", icdName: "霍乱弧菌所致的霍乱" }, ...]
    ↓
前端提交: diseaseIds: [1, 2, 3]
    ↓
后端VO接收: List<Long> diseaseIds
    ↓
服务层转换: String "1,2,3"
    ↓
数据库存储: disease_ids = "1,2,3"
    ↓
同步读取: getDiseaseIds() = "1,2,3"
    ↓
格式转换: ",1,2,3,"
    ↓
旧系统接收: OrdICD_ID = ",1,2,3,"
    ↓
旧系统解析: SPLIT(OrdICD_ID, ",")
    ↓
写入旧系统: ServiceOrder_ICD 表

已完成的修改

1. 前端(create-emergency.vue)

// 第1260行
diseaseIds: this.selectedDiseases.map(d => d.id)

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方法中
// 设置病情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 ..., disease_ids, ...

<!-- insertSysTaskEmergency -->
<if test="diseaseIds != null">disease_ids,</if>
...
<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;

7. 旧系统同步(LegacySystemSyncServiceImpl.java)

// 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)接收到OrdICD_ID参数后的处理流程:

'写入诊断ICD(第340-353行)
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. 接收格式为 ,1,2,3, 的字符串
2. 使用逗号分割字符串
3. 遍历分割后的数组(跳过首尾空元素)
4. 将每个有效的病情ID写入 ServiceOrder_ICD

数据格式说明

前端到后端

  • 前端选择selectedDiseases 数组,每个对象包含 { id, icdCode, icdName, sm }
  • 前端提交diseaseIds: [1, 2, 3] (Long数组)
  • 后端接收List<Long> diseaseIds

后端存储

  • 服务层转换"1,2,3" (逗号分隔字符串)
  • 数据库存储disease_ids = "1,2,3" (VARCHAR(500))

同步到旧系统

  • 读取格式"1,2,3"
  • 转换格式,1,2,3, (首尾添加逗号)
  • 参数名称OrdICD_ID
  • 旧系统接收:VBScript通过SPLIT函数分割并写入数据库

文件清单

已修改文件

  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映射文件
  6. ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java - 旧系统同步服务

新增文件

  1. sql/update_sys_task_emergency_add_disease_ids.sql - 数据库表结构更新脚本
  2. sql/sys_task_emergency.sql - 更新后的建表脚本
  3. prd/病情选择列表存储功能说明.md - 详细功能说明文档
  4. prd/病情ID列表同步旧系统功能实现总结.md - 本文档

部署步骤

1. 数据库升级

# 在MySQL中执行
mysql -u root -p your_database < sql/update_sys_task_emergency_add_disease_ids.sql

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

2. 后端编译部署

# 重新编译后端项目
mvn clean package

# 重启后端服务
# 根据实际部署方式重启

3. 前端编译部署

# 编译H5版本
npm run build:h5

# 或编译微信小程序版本
npm run build:mp-weixin

测试验证

1. 功能测试

测试步骤:

  1. 打开急救转运任务创建页面
  2. 填写患者信息、医院信息等必填字段
  3. 选择一个或多个病情(ICD-10疾病)
  4. 保存任务

验证点:

  • [ ] 前端能正常选择病情
  • [ ] 提交时病情ID正确传递到后端
  • [ ] 后端正确保存到数据库
  • [ ] disease_ids字段格式正确(如:"1,2,3")

2. 数据库验证

-- 查询最新创建的任务
SELECT 
    t.task_id,
    t.task_code,
    e.disease_ids,
    e.patient_name
FROM sys_task t
LEFT JOIN sys_task_emergency e ON t.task_id = e.task_id
WHERE t.task_type = 'EMERGENCY_TRANSFER'
ORDER BY t.create_time DESC
LIMIT 10;

预期结果
- disease_ids 字段包含逗号分隔的ID列表
- 格式如:"1,2,3" 或 "5,10,15"

3. 旧系统同步验证

测试步骤:

  1. 创建包含病情的急救转运任务
  2. 等待定时任务自动同步,或手动触发同步
  3. 检查同步日志

验证点:

  • [ ] 同步日志中包含 "病情ID列表已设置" 信息
  • [ ] OrdICD_ID参数格式正确(如:",1,2,3,")
  • [ ] 旧系统 ServiceOrder_ICD 表中正确写入记录

日志查看:

# 查看后端日志
tail -f logs/sys-info.log | grep "病情ID"

预期日志
病情ID列表已设置,任务ID: 123, OrdICD_ID: ,1,2,3,

旧系统数据验证:

-- 在旧系统数据库中查询
SELECT 
    ServiceOrdID,
    icd_id
FROM ServiceOrder_ICD
WHERE ServiceOrdIDDt = [对应的ServiceOrdID]

预期结果
- 每个病情ID有一条记录
- icd_id 值与新系统选择的病情ID一致

4. 边界测试

测试场景:

  1. 不选择病情
  • disease_ids 应为 NULL
  • OrdICD_ID 应为空字符串 ""
  • 旧系统不应写入 ServiceOrder_ICD 表
  1. 选择单个病情
  • disease_ids = "1"
  • OrdICD_ID = ",1,"
  1. 选择多个病情
  • disease_ids = "1,2,3,4,5"
  • OrdICD_ID = ",1,2,3,4,5,"
  1. 病情ID包含特殊字符(理论上不应出现):
  • 验证系统是否正确处理

注意事项

1. 数据格式一致性

  • 新系统存储:"1,2,3" (无首尾逗号)
  • 旧系统接收:,1,2,3, (有首尾逗号)
  • 转换逻辑:"," + diseaseIds + ","

2. 字段长度限制

  • VARCHAR(500) 约可存储100个病情ID
  • 平均每个ID占用5个字符(包括逗号)
  • 如需存储更多,需调整字段长度

3. NULL值处理

  • 未选择病情时,disease_ids 为 NULL
  • 同步时判断:if (StringUtils.isNotEmpty(emergency.getDiseaseIds()))
  • 确保不传递 null 给旧系统

4. 兼容性考虑

  • 历史数据的 disease_ids 字段为 NULL
  • 旧系统能正确处理空的 OrdICD_ID 参数
  • 不影响现有功能的正常运行

5. 同步时机

  • 调度单同步时才使用 disease_ids
  • 服务单同步不受影响
  • 确保先同步服务单,再同步调度单

常见问题处理

Q1: 数据库添加字段失败

症状:执行ALTER TABLE语句报错

解决方案
1. 检查表是否存在:SHOW TABLES LIKE 'sys_task_emergency';
2. 检查字段是否已存在:DESC sys_task_emergency;
3. 如果已存在,跳过此步骤

Q2: 同步时OrdICD_ID为空

症状:日志显示 "OrdICD_ID: "

可能原因
1. 创建任务时未选择病情
2. disease_ids 字段未正确保存

排查步骤
sql -- 查询任务的disease_ids字段 SELECT disease_ids FROM sys_task_emergency WHERE task_id = [任务ID];

Q3: 旧系统未写入ServiceOrder_ICD表

症状:ServiceOrder_ICD表中无记录

可能原因
1. OrdICD_ID 格式错误
2. ServiceOrdID 不存在
3. 旧系统脚本执行失败

排查步骤
1. 检查同步日志中的OrdICD_ID值
2. 确认格式为 ,1,2,3,
3. 检查旧系统数据库日志

相关参考

更新历史

  • 2025-10-25:完成病情ID列表从前端到旧系统的完整数据流程
  • 前端提交病情ID列表
  • 后端存储到数据库
  • 旧系统同步实现
  • 文档编写完成