# 病情ID列表同步旧系统功能实现总结 ## 实现时间 2025-10-25 ## 功能概述 完成了病情ID列表(diseaseIds)从前端提交到后端存储,再到旧系统同步的完整数据流程,用于在调度单同步时传递OrdICD_ID参数。 ## 完整数据流程 ``` 前端选择病情 ↓ [{ id: 1, icdCode: "A00.0", icdName: "霍乱弧菌所致的霍乱" }, ...] ↓ 前端提交: diseaseIds: [1, 2, 3] ↓ 后端VO接收: List 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) ```javascript // 第1260行 diseaseIds: this.selectedDiseases.map(d => d.id) ``` ### 2. 后端VO(TaskCreateVO.java) ```java /** 病情ID列表(ICD-10疾病ID列表,用于同步调度单的OrdICD_ID参数) */ private List diseaseIds; public List getDiseaseIds() { return diseaseIds; } public void setDiseaseIds(List diseaseIds) { this.diseaseIds = diseaseIds; } ``` ### 3. 实体类(SysTaskEmergency.java) ```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) ```java // 导入 import java.util.stream.Collectors; // saveEmergencyInfo方法中 // 设置病情ID列表(将List转换为逗号分隔的字符串) 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) ```xml select ..., disease_ids, ... disease_ids, ... #{diseaseIds}, disease_ids = #{diseaseIds}, ``` ### 6. 数据库表 ```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; ``` ### 7. 旧系统同步(LegacySystemSyncServiceImpl.java) ```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参数后的处理流程: ```vbscript '写入诊断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 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. 数据库升级 ```bash # 在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. 后端编译部署 ```bash # 重新编译后端项目 mvn clean package # 重启后端服务 # 根据实际部署方式重启 ``` ### 3. 前端编译部署 ```bash # 编译H5版本 npm run build:h5 # 或编译微信小程序版本 npm run build:mp-weixin ``` ## 测试验证 ### 1. 功能测试 #### 测试步骤: 1. 打开急救转运任务创建页面 2. 填写患者信息、医院信息等必填字段 3. 选择一个或多个病情(ICD-10疾病) 4. 保存任务 #### 验证点: - [ ] 前端能正常选择病情 - [ ] 提交时病情ID正确传递到后端 - [ ] 后端正确保存到数据库 - [ ] disease_ids字段格式正确(如:"1,2,3") ### 2. 数据库验证 ```sql -- 查询最新创建的任务 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 表中正确写入记录 #### 日志查看: ```bash # 查看后端日志 tail -f logs/sys-info.log | grep "病情ID" ``` **预期日志**: ``` 病情ID列表已设置,任务ID: 123, OrdICD_ID: ,1,2,3, ``` #### 旧系统数据验证: ```sql -- 在旧系统数据库中查询 SELECT ServiceOrdID, icd_id FROM ServiceOrder_ICD WHERE ServiceOrdIDDt = [对应的ServiceOrdID] ``` **预期结果**: - 每个病情ID有一条记录 - icd_id 值与新系统选择的病情ID一致 ### 4. 边界测试 #### 测试场景: 1. **不选择病情**: - disease_ids 应为 NULL - OrdICD_ID 应为空字符串 "" - 旧系统不应写入 ServiceOrder_ICD 表 2. **选择单个病情**: - disease_ids = "1" - OrdICD_ID = ",1," 3. **选择多个病情**: - disease_ids = "1,2,3,4,5" - OrdICD_ID = ",1,2,3,4,5," 4. **病情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. 检查旧系统数据库日志 ## 相关参考 - [病情选择列表存储功能说明.md](./病情选择列表存储功能说明.md) - [急救转运任务创建流程](../README.md) - [旧系统同步机制说明](../oldCode/README.md) ## 更新历史 - 2025-10-25:完成病情ID列表从前端到旧系统的完整数据流程 - 前端提交病情ID列表 - 后端存储到数据库 - 旧系统同步实现 - 文档编写完成