|  |  | 
 |  |  | package com.smartor.service.impl; | 
 |  |  |  | 
 |  |  | import com.fasterxml.jackson.core.JsonProcessingException; | 
 |  |  | import com.fasterxml.jackson.core.type.TypeReference; | 
 |  |  | import com.fasterxml.jackson.databind.ObjectMapper; | 
 |  |  | import com.ruoyi.common.core.domain.entity.SysDept; | 
 |  |  | import com.ruoyi.common.utils.DateUtils; | 
 |  |  | import com.ruoyi.common.utils.DtoConversionUtils; | 
 |  |  | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.time.Instant; | 
 |  |  | import java.time.temporal.ChronoUnit; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ServiceSubtaskMapper serviceSubtaskMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private SysUserDeptMapper sysUserDeptMapper; | 
 |  |  |     private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper; | 
 |  |  |  | 
 |  |  |     @Value("${visitHosp}") | 
 |  |  |     private Integer visitHosp; | 
 |  |  |     @Value("${spring.profiles.active}") | 
 |  |  |     private String active; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 查询患者住院记录 | 
 |  |  | 
 |  |  |         PatMedRes patMedRes = null; | 
 |  |  |         // 获取当前登陆人的部门权限 | 
 |  |  |         if (org.springframework.util.CollectionUtils.isEmpty(patMedReq.getDeptcodeList())) { | 
 |  |  |             Long userId = SecurityUtils.getUserId(); | 
 |  |  |             List<SysDept> sysDepts = sysUserDeptMapper.selectDeptListByUserId(userId); | 
 |  |  |             List<String> deptCode = new ArrayList<>(); | 
 |  |  |             for (SysDept sysDept : sysDepts) { | 
 |  |  |                 deptCode.add(sysDept.getDeptId().toString()); | 
 |  |  |             } | 
 |  |  |             patMedReq.setDeptcodeList(deptCode); | 
 |  |  |             patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq); | 
 |  |  | //            Long userId = SecurityUtils.getUserId(); | 
 |  |  | //            List<SysDept> sysDepts = sysUserDeptMapper.selectDeptListByUserId(userId); | 
 |  |  | //            List<String> deptCode = new ArrayList<>(); | 
 |  |  | //            for (SysDept sysDept : sysDepts) { | 
 |  |  | //                deptCode.add(sysDept.getDeptId().toString()); | 
 |  |  | //            } | 
 |  |  | //            patMedReq.setDeptcodeList(deptCode); | 
 |  |  | //            patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq); | 
 |  |  |         } | 
 |  |  |         patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq); | 
 |  |  |         return patMedRes; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //根据患者所在病区,获取该病区的长期任务,新华医院可以先不用根据病区和疾病来做 | 
 |  |  |         if (visitHosp != 1) { | 
 |  |  |  | 
 |  |  |         if (active.equals("xh")) { | 
 |  |  |             PatMedInhosp pmbq = new PatMedInhosp(); | 
 |  |  |             //获取需要出院部门随访,未处理的数据 | 
 |  |  |             pmbq.setWardcheckFlag("0"); | 
 |  |  | 
 |  |  |         st.setTaskid(taskid); | 
 |  |  |         st.setSendState(2L); | 
 |  |  |         List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st); | 
 |  |  |         if (CollectionUtils.isEmpty(serviceTasks)) { | 
 |  |  |         if (CollectionUtils.isEmpty(serviceTasks) && type == 1) { | 
 |  |  |             log.info("该患者出院随访长期任务不存在,任务ID为:{}", taskid); | 
 |  |  |             patMedInhosp1.setDeptcheckFlag("2"); | 
 |  |  |             patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者出院随访长期任务不存在,任务ID为:" + taskid); | 
 |  |  |             patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院科室长期任务不存在,任务ID为:" + taskid); | 
 |  |  |             patMedInhospMapper.updatePatMedInhosp(patMedInhosp1); | 
 |  |  |             return; | 
 |  |  |         } else if (CollectionUtils.isEmpty(serviceTasks) && type == 2) { | 
 |  |  |             patMedInhosp1.setWardcheckFlag("2"); | 
 |  |  |             patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院病区长期任务不存在,任务ID为:" + taskid); | 
 |  |  |             patMedInhospMapper.updatePatMedInhosp(patMedInhosp1); | 
 |  |  |             return; | 
 |  |  |         } else if (CollectionUtils.isEmpty(serviceTasks) && type == 3) { | 
 |  |  |             patMedInhosp1.setDiagcheckFlag("2"); | 
 |  |  |             patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者疾病长期任务不存在,任务ID为:" + taskid); | 
 |  |  |             patMedInhospMapper.updatePatMedInhosp(patMedInhosp1); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  | 
 |  |  |                         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); | 
 |  |  |                         //重新新增子任务 | 
 |  |  |                         i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); | 
 |  |  |                         //这里需要全失败 | 
 |  |  |                         addServiceSubtaskPreachform(serviceSubtask, "5"); | 
 |  |  |  | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 if (StringUtils.isEmpty(serviceSubtask.getPhone())) { | 
 |  |  |                     serviceSubtask.setRemark("手机号为空"); | 
 |  |  |                     serviceSubtask.setSendstate(4L); | 
 |  |  |                     serviceSubtask.setResult("error"); | 
 |  |  | //                    serviceSubtask.setFinishtime(new Date()); | 
 |  |  |                 } | 
 |  |  |                 serviceSubtask.setCreateBy(serviceTask.getCreateBy()); | 
 |  |  |                 serviceSubtask.setCreateTime(new Date()); | 
 |  |  |                 i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             if (StringUtils.isEmpty(serviceSubtask.getPhone())) { | 
 |  |  |                 serviceSubtask.setRemark("手机号为空"); | 
 |  |  |                 serviceSubtask.setSendstate(4L); | 
 |  |  |                 serviceSubtask.setResult("error"); | 
 |  |  | //                serviceSubtask.setFinishtime(new Date()); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             serviceSubtask.setCreateBy(serviceTask.getCreateBy()); | 
 |  |  |             serviceSubtask.setCreateTime(new Date()); | 
 |  |  |             i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); | 
 |  |  |             addServiceSubtaskPreachform(serviceSubtask, null); | 
 |  |  |         } | 
 |  |  |         if (i == 1) { | 
 |  |  |             //将check_flag改成1(已处理) | 
 |  |  | 
 |  |  |             patMedInhospMapper.updatePatMedInhosp(patMedInhosp2); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) { | 
 |  |  |         //将preachform的json对象,放到list集合中 | 
 |  |  |         String preachform = serviceSubtask.getPreachform(); | 
 |  |  |         ObjectMapper objectMapper = new ObjectMapper(); | 
 |  |  |         if (org.apache.commons.lang3.StringUtils.isNotEmpty(preachform)) { | 
 |  |  |             List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = null; | 
 |  |  |             try { | 
 |  |  |                 serviceSubtaskPreachformList = objectMapper.readValue(preachform, new TypeReference<List<ServiceSubtaskPreachform>>() { | 
 |  |  |                 }); | 
 |  |  |             } catch (JsonProcessingException e) { | 
 |  |  |                 log.error("preachform转List<ServiceSubtaskPreachform>报错了:{}", e.getMessage()); | 
 |  |  |             } | 
 |  |  |             for (ServiceSubtaskPreachform serviceSubtaskPreachform : serviceSubtaskPreachformList) { | 
 |  |  |                 serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid()); | 
 |  |  |                 serviceSubtaskPreachform.setSubid(serviceSubtask.getId()); | 
 |  |  |                 //这个sendstate需要在数据库设置一个默认值为“1” | 
 |  |  |                 serviceSubtaskPreachform.setSendstate("1"); | 
 |  |  |                 if (StringUtils.isNotEmpty(sendstate)) serviceSubtaskPreachform.setSendstate(sendstate); | 
 |  |  |  | 
 |  |  |                 serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid()); | 
 |  |  |                 return serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return 0; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     //封装serviceSubtask | 
 |  |  |     private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive) { | 
 |  |  | 
 |  |  |         serviceSubtask.setSex(patArchive.getSex()); | 
 |  |  |         serviceSubtask.setAge(patArchive.getAge()); | 
 |  |  |         serviceSubtask.setSendstate(2L); | 
 |  |  |         serviceSubtask.setManagementDoctor(patMedInhosp1.getManagementDoctor()); | 
 |  |  |         serviceSubtask.setManagementDoctorCode(patMedInhosp1.getManagementDoctorCode()); | 
 |  |  |         serviceSubtask.setStarttime(patMedInhosp1.getStarttime()); | 
 |  |  |         serviceSubtask.setEndtime(patMedInhosp1.getEndtime()); | 
 |  |  |         serviceSubtask.setServiceType(serviceTask.getServiceType()); | 
 |  |  | 
 |  |  |         Date newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue()); | 
 |  |  |         serviceSubtask.setLongSendTime(newDate); | 
 |  |  |         serviceSubtask.setVisitTime(newDate); | 
 |  |  |         //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中) | 
 |  |  |         if ("3".equals(serviceTask.getType())) { | 
 |  |  |             serviceSubtask.setVisitTime(minusDay(newDate, 2)); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         //患者发送时间 | 
 |  |  |         if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { | 
 |  |  | //            log.error("serviceSubtask99999999的值为:{}",serviceSubtask); | 
 |  |  |             String remark = patArchive.getNotrequiredreason(); | 
 |  |  |             serviceSubtask.setRemark(remark); | 
 |  |  |             serviceSubtask.setResult("error"); | 
 |  |  | //            serviceSubtask.setFinishtime(new Date()); | 
 |  |  |             //不执行 | 
 |  |  |             serviceSubtask.setSendstate(4L); | 
 |  |  |         } | 
 |  |  |         return serviceSubtask; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 减去相应天数 | 
 |  |  |      * | 
 |  |  |      * @param originalDate | 
 |  |  |      * @param day | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Date minusDay(Date originalDate, Integer day) { | 
 |  |  |         // 1. 将 Date 转换为 Instant | 
 |  |  |         Instant instant = originalDate.toInstant(); | 
 |  |  |  | 
 |  |  |         // 2. 在 Instant 上减去2天 | 
 |  |  |         Instant twoDaysAgoInstant = instant.minus(2, ChronoUnit.DAYS); | 
 |  |  |  | 
 |  |  |         // 3. 将计算后的 Instant 转回 Date | 
 |  |  |         return Date.from(twoDaysAgoInstant); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //处理入院信息 | 
 |  |  |     private void dealInHospInfo(List<PatMedInhosp> patMedInhospList) { | 
 |  |  |         for (PatMedInhosp patMedInhosp1 : patMedInhospList) { |