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 表
// 第1260行
diseaseIds: this.selectedDiseases.map(d => d.id)
/** 病情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;
}
/** 病情ID列表(ICD-10疾病ID列表,逗号分隔,用于同步调度单的OrdICD_ID参数) */
private String diseaseIds;
public String getDiseaseIds() {
return diseaseIds;
}
public void setDiseaseIds(String diseaseIds) {
this.diseaseIds = diseaseIds;
}
// 导入
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);
}
<!-- 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>
ALTER TABLE sys_task_emergency
ADD COLUMN IF NOT EXISTS disease_ids VARCHAR(500)
COMMENT '病情ID列表(ICD-10疾病ID列表,逗号分隔,用于同步调度单的OrdICD_ID参数)'
AFTER passenger_phone;
// 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_IDapp/pages/task/create-emergency.vue - 前端任务创建页面ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java - 任务创建VOruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java - 急救转运实体类ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java - 任务服务实现类ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml - MyBatis映射文件ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java - 旧系统同步服务sql/update_sys_task_emergency_add_disease_ids.sql - 数据库表结构更新脚本sql/sys_task_emergency.sql - 更新后的建表脚本prd/病情选择列表存储功能说明.md - 详细功能说明文档prd/病情ID列表同步旧系统功能实现总结.md - 本文档# 在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;
# 重新编译后端项目
mvn clean package
# 重启后端服务
# 根据实际部署方式重启
# 编译H5版本
npm run build:h5
# 或编译微信小程序版本
npm run build:mp-weixin
-- 查询最新创建的任务
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"
# 查看后端日志
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一致
"1,2,3" (无首尾逗号),1,2,3, (有首尾逗号)"," + diseaseIds + ","if (StringUtils.isNotEmpty(emergency.getDiseaseIds()))症状:执行ALTER TABLE语句报错
解决方案:
1. 检查表是否存在:SHOW TABLES LIKE 'sys_task_emergency';
2. 检查字段是否已存在:DESC sys_task_emergency;
3. 如果已存在,跳过此步骤
症状:日志显示 "OrdICD_ID: "
可能原因:
1. 创建任务时未选择病情
2. disease_ids 字段未正确保存
排查步骤:sql -- 查询任务的disease_ids字段 SELECT disease_ids FROM sys_task_emergency WHERE task_id = [任务ID];
症状:ServiceOrder_ICD表中无记录
可能原因:
1. OrdICD_ID 格式错误
2. ServiceOrdID 不存在
3. 旧系统脚本执行失败
排查步骤:
1. 检查同步日志中的OrdICD_ID值
2. 确认格式为 ,1,2,3,
3. 检查旧系统数据库日志