# 病情选择列表存储功能说明 ## 功能概述 在急救转运任务创建页面的病情选择功能中,添加了病情ID列表(diseaseIds)字段的存储功能,用于在同步调度单到旧系统时传递OrdICD_ID参数。 ## 实现时间 2025-10-25 ## 需求背景 - 在创建急救转运任务时,用户可以选择多个病情(ICD-10疾病分类) - 需要将选中的病情ID列表保存到数据库 - 在同步调度单到旧系统时,需要使用这些病情ID作为OrdICD_ID参数 ## 数据流转 ### 前端 → 后端 1. 用户在病情选择器中选择一个或多个病情 2. 前端将选中的病情对象数组 `selectedDiseases` 转换为ID数组 3. 在提交任务时,将 `diseaseIds` 作为参数传递给后端 ### 后端存储 1. 后端接收 `List 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 方法添加 ```javascript const submitData = { // ... 其他字段 // 病情ID列表(用于同步调度单的OrdICD_ID参数) diseaseIds: this.selectedDiseases.map(d => d.id), // ... 其他字段 } ``` #### 数据示例 ```javascript // selectedDiseases 数组结构 [ { id: 1, icdCode: "A00.0", icdName: "霍乱弧菌所致的霍乱", sm: "霍乱" }, { id: 2, icdCode: "A00.1", icdName: "埃尔托弧菌所致的霍乱", sm: "霍乱" } ] // 转换后的 diseaseIds [1, 2] ``` ### 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 方法添加 ```java private void saveEmergencyInfo(Long taskId, TaskCreateVO createVO) { // ... 其他代码 // 设置病情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) #### ResultMap添加 ```xml ``` #### selectSysTaskEmergencyVo添加 ```xml select id, task_id, ..., passenger_phone, disease_ids, document_type_id, ... ``` #### insertSysTaskEmergency添加 ```xml disease_ids, #{diseaseIds}, ``` #### updateSysTaskEmergency添加 ```xml 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; ``` #### 字段说明 - 字段名:`disease_ids` - 类型:`VARCHAR(500)` - 可空:是 - 位置:在 `passenger_phone` 字段之后 - 存储格式:逗号分隔的ID列表,如 "1,2,3" ## 数据存储示例 ### 前端提交数据 ```json { "taskType": "EMERGENCY_TRANSFER", "diseaseIds": [1, 2, 3], "patient": { ... }, "hospitalOut": { ... }, ... } ``` ### 后端处理 ```java // List -> String [1, 2, 3] -> "1,2,3" ``` ### 数据库存储 ``` disease_ids: "1,2,3" ``` ### 同步到旧系统(待实现) ```java // String -> List "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` 表,用于病情诊断 #### 实现代码: ```java // 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行): ```vbscript '写入诊断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` 查询病情详细信息 2. **任务编辑功能**: - 支持在编辑任务时修改病情选择 - 更新 `disease_ids` 字段 ## 注意事项 1. **数据格式**: - 前端传递:`List` 类型 - 数据库存储:`String` 类型(逗号分隔) - 确保转换逻辑正确,避免数据丢失 2. **字段长度**: - VARCHAR(500) 可存储约100个ID(假设每个ID平均5个字符) - 如果需要存储更多病情,需要调整字段长度 3. **兼容性**: - 旧数据的 `disease_ids` 字段为NULL - 查询和展示时需要处理NULL值 4. **同步时机**: - 病情ID列表主要用于调度单同步 - 不影响服务单的创建和同步 ## 相关资料 - ICD-10国际疾病分类标准 - 旧系统调度单接口文档:admin_save_24.gds - OrdICD_ID参数说明:格式为 ",1,2,3,",用逗号分隔,旧系统会解析后写入 ServiceOrder_ICD 表 ## 更新记录 - 2025-10-25:初始版本,实现前端、后端和数据库存储 - 2025-10-25:完成旧系统同步逻辑,实现OrdICD_ID参数传递