smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java
@@ -107,9 +107,9 @@ * 把 patTaskRelevance 的基准日字段回填到 baseSubtask 后,委托给解耦入口。 */ public void buildSubtasksForPatient(ServiceTask serviceTask, ServiceTaskVO serviceTaskVO, List<Map<String, Object>> preachformList, ServiceTaskSchedule schedule, List<ServiceTaskScheduleDetail> detailList, List<ServiceTaskScheduleDetail> scheduleDetailList, PatTaskRelevance patTaskRelevance, ServiceSubtask baseSubtask) { // 回填基准日字段(手动路径的 baseSubtask 由 VO 拼装,基准日字段可能未填全) @@ -123,8 +123,7 @@ if (baseSubtask.getAdmindate() == null) { baseSubtask.setAdmindate(patTaskRelevance.getVisittime()); } buildSubtasksForPatient(serviceTask, schedule, detailList, baseSubtask, serviceTaskVO.getPreachformList()); buildSubtasksForPatient(serviceTask, schedule, scheduleDetailList, baseSubtask, preachformList); } /** smartor/src/main/java/com/smartor/domain/PatMedInhosp.java
@@ -98,6 +98,11 @@ private String icd10code; /** * 入院诊断ICD值编号集合 */ @ApiModelProperty(value = "入院诊断ICD值编号集合") private List<String> icd10codeList; /** * 入院诊断名称 */ @ApiModelProperty(value = "入院诊断名称") smartor/src/main/java/com/smartor/domain/ServiceTaskSchedule.java
@@ -99,31 +99,6 @@ private Date scheduleBenchmarkCustomTime; /** * 对应科室 */ @ApiModelProperty("对应科室") private String deptcodes; /** * 出院病区 */ @ApiModelProperty("出院病区") private String leavehospitaldistrictcode; /** * icd10编码 */ @ApiModelProperty("icd10编码") private String icdcodes; /** * 手术等级代码 */ @ApiModelProperty("手术等级代码") @Excel(name = "手术等级代码") private String oplevelcodes; /** * 删除标记(0存在 1删除) */ @ApiModelProperty("删除标记(0存在 1删除)") @@ -140,4 +115,52 @@ */ @ApiModelProperty("院区ID") private String campusid; /** * 绑定科室代码(逗号分隔),任务组自动纳入匹配用 */ @ApiModelProperty("绑定科室代码(逗号分隔),自动纳入用") private String deptCodes; /** * 绑定病区代码(逗号分隔),任务组自动纳入匹配用 */ @ApiModelProperty("绑定病区代码(逗号分隔),自动纳入用") private String wardCodes; /** * 绑定疾病ICD10代码(逗号分隔),任务组自动纳入匹配用 */ @ApiModelProperty("绑定疾病ICD10代码(逗号分隔),自动纳入用") private String icd10Codes; /** * 绑定手术类型代码(逗号分隔),任务组自动纳入匹配用(本期暂不用) */ @ApiModelProperty("绑定手术类型代码(逗号分隔),自动纳入用(本期暂不用)") private String oplevelCodes; /** * 绑定科室代码 */ @ApiModelProperty("绑定科室代码") private String deptCode; /** * 绑定病区代码 */ @ApiModelProperty("绑定病区代码") private String wardCode; /** * 绑定疾病ICD10代码 */ @ApiModelProperty("绑定疾病ICD10代码") private String icd10Code; /** * 绑定手术类型代码 */ @ApiModelProperty("绑定手术类型代码") private String oplevelCode; } smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -9,6 +9,7 @@ import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.common.ScheduleSubtaskBuilder; import com.smartor.domain.*; import com.smartor.domain.entity.ServiceSubtaskEntity; import com.smartor.mapper.*; @@ -64,6 +65,13 @@ private String active; @Autowired private IConfigService iSysConfigService; @Autowired private ServiceTaskScheduleMapper serviceTaskScheduleMapper; @Autowired private ScheduleSubtaskBuilder scheduleSubtaskBuilder; @Autowired private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper; /** @@ -336,133 +344,82 @@ */ public int dealOutHospInfoBySchedule(String config) { // 一次性查出所有需要处理的出院患者(三个维度任意一个未完成) List<PatMedInhosp> patList = patMedInhospMapper.selectNeedProcessList(); log.info("【统一扫描】待处理患者数:{}", patList.size()); ServiceTask serviceTaskVo = new ServiceTask(); serviceTaskVo.setLongTask(1); serviceTaskVo.setAppltype("5"); List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(serviceTaskVo); for (PatMedInhosp patMedInhosp1 : patList) { PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid()); if (Objects.isNull(patArchive)) { // 三个维度都标记为失败 markAllFlagsAsError(patMedInhosp1, "患者基本信息为空"); continue; } if (CollectionUtils.isEmpty(serviceTasks)) { for (ServiceTask serviceTask : serviceTasks) { if(!ObjectUtils.isEmpty(serviceTask.getTaskid())){ ServiceTaskSchedule serviceTaskSchedule = new ServiceTaskSchedule(); ServiceTaskSchedule taskSchedule = new ServiceTaskSchedule(); taskSchedule.setTaskid(serviceTask.getTaskid()); List<ServiceTaskSchedule> serviceTaskSchedules = serviceTaskScheduleMapper.selectServiceTaskScheduleList(taskSchedule); if(CollectionUtils.isNotEmpty(serviceTaskSchedules)){ serviceTaskSchedule = serviceTaskSchedules.get(0); String deptCodes = serviceTaskSchedule.getDeptCodes(); String wardCodes = serviceTaskSchedule.getWardCodes(); String icd10Codes = serviceTaskSchedule.getIcd10Codes(); String opLevelCodes = serviceTaskSchedule.getOplevelCodes(); // ── 维度1:科室 ── if ("0".equals(patMedInhosp1.getDeptcheckFlag())) { processTasksByDimension(patMedInhosp1, patArchive, config, 1); } List<String> icd10CodeList = new ArrayList<>(); List<String> opLevelList = new ArrayList<>(); List<String> deptCodeList = new ArrayList<>(); List<String> wardCodeList = new ArrayList<>(); // ── 维度2:病区 ──(新华医院跳过) if (!active.equals("xh") && "0".equals(patMedInhosp1.getWardcheckFlag())) { processTasksByDimension(patMedInhosp1, patArchive, config, 2); } Integer type = 1; if (StringUtils.isNotEmpty(deptCodes)) { type = 1; deptCodeList = Arrays.asList(deptCodes.split(",")); } if(StringUtils.isNotEmpty(wardCodes)) { type = 2; wardCodeList = Arrays.asList(wardCodes.split(",")); } if(StringUtils.isNotEmpty(icd10Codes)) { type = 3; icd10CodeList = Arrays.asList(icd10Codes.split(",")); } if (StringUtils.isNotEmpty(opLevelCodes)) { opLevelList = Arrays.asList(opLevelCodes.split(",")); } PatMedInhosp patMedInhospVo = new PatMedInhosp(); patMedInhospVo.setDeptcodeList(deptCodeList); patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList); patMedInhospVo.setIcd10codeList(icd10CodeList); List<PatMedInhosp> patList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo); log.info("dealOutHospInfoBySchedule 任务组随访, taskid = {}, 扫描患者人数 {}", serviceTask.getTaskid(), patList.size()); // ── 维度3:疾病 ──(新华医院跳过) if (!active.equals("xh") && "0".equals(patMedInhosp1.getDiagcheckFlag())) { processTasksByDimension(patMedInhosp1, patArchive, config, 3); for(PatMedInhosp patMedInhosp : patList){ ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail(); scheduleDetailVo.setTaskid(serviceTask.getTaskid()); scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId()); List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo); List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = new ArrayList<>(); PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid()); if (Objects.isNull(patArchive)) { break; } //封装serviceSubtask ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp, patArchive, config, type); List<Map<String, Object>> preachformList = new ArrayList<>(); if(StringUtils.isNotEmpty(serviceTask.getPreachformDesc())){ try { ObjectMapper objectMapper = new ObjectMapper(); preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class); }catch (Exception e){ break; } } scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList); } } } } } return 1; } /** * 按维度找到所有匹配长期任务,批量生成 subtask * type: 1=科室, 2=病区, 3=疾病 */ private void processTasksByDimension(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, int type) { List<Long> matchedTaskIds = findMatchingTaskIds(patMedInhosp1, type); if (CollectionUtils.isEmpty(matchedTaskIds)) { String reason = getDimensionReason(type); markFlagAsNoConfig(patMedInhosp1, type, reason); return; } // 一条 inhosp 记录 → 多个匹配任务 → 多条 subtask for (Long taskId : matchedTaskIds) { writeInSubTask(taskId, true, patMedInhosp1, patArchive, type, config); } } private String getDimensionReason(int type) { switch (type) { case 1: { // 科室 return "未找到科室匹配的长期任务"; } case 2: { // 病区 return "未找到病区匹配的长期任务"; } case 3: { // 疾病 return "未找到疾病匹配的长期任务"; } } return "多维长期任务-匹配类型为空"; } private void markFlagAsNoConfig(PatMedInhosp patMedInhosp, int type, String reason) { switch (type) { case 1: { // 科室 patMedInhosp.setDeptcheckFlag("2"); patMedInhosp.setRemark(reason); patMedInhospMapper.updatePatMedInhosp(patMedInhosp); break; } case 2: { // 病区 patMedInhosp.setWardcheckFlag("2"); patMedInhosp.setRemark(reason); patMedInhospMapper.updatePatMedInhosp(patMedInhosp); break; } case 3: { // 疾病 patMedInhosp.setDiagcheckFlag("2"); patMedInhosp.setRemark(reason); patMedInhospMapper.updatePatMedInhosp(patMedInhosp); break; } } } private void markAllFlagsAsError(PatMedInhosp patMedInhosp, String reason) { patMedInhosp.setDeptcheckFlag("2"); patMedInhosp.setWardcheckFlag("2"); patMedInhosp.setDiagcheckFlag("2"); patMedInhosp.setRemark(reason); patMedInhospMapper.updatePatMedInhosp(patMedInhosp); } /** * 根据维度类型查询匹配的长期任务 ID 列表 */ private List<Long> findMatchingTaskIds(PatMedInhosp patMedInhosp1, int type) { switch (type) { case 1: { // 科室 ServiceTaskdept query = new ServiceTaskdept(); query.setLongtask(1L); query.setDeptCode(patMedInhosp1.getLeaveldeptcode()); query.setDeptType("1"); query.setOrgid(patMedInhosp1.getOrgid()); return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList()); } case 2: { // 病区 ServiceTaskdept query = new ServiceTaskdept(); query.setLongtask(1L); query.setDeptCode(patMedInhosp1.getLeavehospitaldistrictcode()); query.setDeptType("2"); query.setOrgid(patMedInhosp1.getOrgid()); return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList()); } case 3: { // 疾病 if (StringUtils.isEmpty(patMedInhosp1.getLeaveicd10code())) return Collections.emptyList(); ServiceTaskdiag query = new ServiceTaskdiag(); query.setLongtask(1L); query.setIcd10code(patMedInhosp1.getLeaveicd10code()); query.setOrgid(patMedInhosp1.getOrgid()); return serviceTaskdiagMapper.selectServiceTaskdiagList(query).stream().map(ServiceTaskdiag::getTaskId).collect(Collectors.toList()); } } return Collections.emptyList(); } smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -16,6 +16,7 @@ import com.ruoyi.system.mapper.SysConfigMapper; import com.smartor.common.FtpService; import com.smartor.common.MtSubmitSmUtil; import com.smartor.common.ScheduleSubtaskBuilder; import com.smartor.config.PhoneUtils; import com.smartor.domain.DTO.ServiceSubtaskDetailDTO; import com.smartor.domain.*; @@ -119,7 +120,7 @@ private IServiceTaskScheduleService serviceTaskScheduleService; @Autowired private com.smartor.common.ScheduleSubtaskBuilder scheduleSubtaskBuilder; private ScheduleSubtaskBuilder scheduleSubtaskBuilder; @Autowired private FtpService ftpService; @@ -747,8 +748,12 @@ scheduleVO.setOrgid(serviceTask.getOrgid()); scheduleVO.setCampusid(serviceTask.getCampusid()); scheduleVO.setCreateBy(serviceTask.getCreateBy()); scheduleVO.setDeptcodes(serviceTask.getDeptcode()); scheduleVO.setLeavehospitaldistrictcode(serviceTask.getLeavehospitaldistrictcode()); scheduleVO.setDeptCodes(serviceTaskVO.getDeptcode()); scheduleVO.setWardCodes(serviceTaskVO.getLeavehospitaldistrictcode()); scheduleVO.setIcd10Codes(serviceTaskVO.getIcd10code()); scheduleVO.setOplevelCodes(serviceTaskVO.getOplevelcode()); log.info("----serviceTaskSchedule的值为:{}", scheduleVO); serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO); } else { @@ -846,7 +851,7 @@ List<ServiceTaskScheduleDetail> detailList = serviceTaskScheduleService.selectDetailByScheduleid(schedule.getId()); scheduleSubtaskBuilder.buildSubtasksForPatient( serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask); serviceTask, serviceTaskVO.getPreachformList(), schedule, detailList, patTaskRelevance, serviceSubtask); continue; } @@ -1076,6 +1081,10 @@ scheduleVO.setTaskid(serviceTask.getTaskid()); scheduleVO.setOrgid(serviceTask.getOrgid()); scheduleVO.setCampusid(serviceTask.getCampusid()); scheduleVO.setDeptCodes(serviceTaskVO.getDeptcode()); scheduleVO.setWardCodes(serviceTaskVO.getLeavehospitaldistrictcode()); scheduleVO.setIcd10Codes(serviceTaskVO.getIcd10code()); scheduleVO.setOplevelCodes(serviceTaskVO.getOplevelcode()); scheduleVO.setCreateBy(serviceTask.getUpdateBy()); serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO); } @@ -1142,7 +1151,7 @@ serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); serviceSubtask.setCreateBy(serviceTask.getUpdateBy()); scheduleSubtaskBuilder.buildSubtasksForPatient( serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask); serviceTask, serviceTaskVO.getPreachformList(), schedule, detailList, patTaskRelevance, serviceSubtask); continue; } if (patTaskRelevance.getIsoperation() == 2) { smartor/src/main/resources/mapper/smartor/ServiceTaskScheduleMapper.xml
@@ -17,6 +17,10 @@ <result property="nextExecuteTime" column="next_execute_time"/> <result property="scheduleBenchmark" column="schedule_benchmark"/> <result property="scheduleBenchmarkCustomTime" column="schedule_benchmark_custom_time"/> <result property="deptCodes" column="dept_codes"/> <result property="wardCodes" column="ward_codes"/> <result property="icd10Codes" column="icd10_codes"/> <result property="oplevelCodes" column="remark"/> <result property="remark" column="remark"/> <result property="delFlag" column="del_flag"/> <result property="createBy" column="create_by"/> @@ -40,6 +44,10 @@ next_execute_time, schedule_benchmark, schedule_benchmark_custom_time, deptCodes, wardCodes, icd10Codes, oplevelCodes, remark, del_flag, create_by, @@ -69,6 +77,10 @@ where del_flag = '0' <if test="taskid != null">and taskid = #{taskid}</if> <if test="scheduleStyle != null">and schedule_style = #{scheduleStyle}</if> <if test="deptCode != null">and INSTR(dept_codes, #{deptCode}) > 0</if> <if test="wardCode != null">and INSTR(ward_codes, #{wardCode}) > 0</if> <if test="icd10Code != null">and INSTR(icd10_codes, #{icd10Code}) > 0</if> <if test="oplevelCode != null">and INSTR(oplevel_codes, #{oplevelCode}) > 0</if> <if test="orgid != null and orgid != ''">and orgid = #{orgid}</if> <if test="campusid != null and campusid != ''">and campusid = #{campusid}</if> order by id desc @@ -89,6 +101,10 @@ <if test="nextExecuteTime != null">next_execute_time,</if> <if test="scheduleBenchmark != null">schedule_benchmark,</if> <if test="scheduleBenchmarkCustomTime != null">schedule_benchmark_custom_time,</if> <if test="deptCodes != null">dept_codes,</if> <if test="wardCodes != null">ward_codes,</if> <if test="icd10Codes != null">icd10_codes,</if> <if test="oplevelCodes != null">oplevel_codes,</if> <if test="remark != null">remark,</if> <if test="delFlag != null">del_flag,</if> <if test="createBy != null">create_by,</if> @@ -110,6 +126,10 @@ <if test="nextExecuteTime != null">#{nextExecuteTime},</if> <if test="scheduleBenchmark != null">#{scheduleBenchmark},</if> <if test="scheduleBenchmarkCustomTime != null">#{scheduleBenchmarkCustomTime},</if> <if test="deptCodes != null">#{deptCodes},</if> <if test="wardCodes != null">#{wardCodes},</if> <if test="icd10Codes != null">#{icd10Codes},</if> <if test="oplevelCodes != null">#{oplevelCodes},</if> <if test="remark != null">#{remark},</if> <if test="delFlag != null">#{delFlag},</if> <if test="createBy != null">#{createBy},</if> @@ -137,6 +157,10 @@ <if test="scheduleBenchmarkCustomTime != null"> schedule_benchmark_custom_time = #{scheduleBenchmarkCustomTime}, </if> <if test="deptCodes != null">dept_codes = #{deptCodes},</if> <if test="wardCodes != null">ward_codes = #{wardCodes},</if> <if test="icd10Codes != null">icd10_codes = #{icd10Codes},</if> <if test="oplevelCodes != null">oplevel_codes = #{oplevelCodes},</if> <if test="remark != null">remark = #{remark},</if> <if test="delFlag != null">del_flag = #{delFlag},</if> <if test="updateBy != null">update_by = #{updateBy},</if>