liusheng
2026-05-01 336d113220f675976f864ad3eab7df7cd432808d
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -3,12 +3,12 @@
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.core.service.IConfigService;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IPatMedInhospService;
import lombok.extern.slf4j.Slf4j;
@@ -18,7 +18,6 @@
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
@@ -51,6 +50,8 @@
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private IConfigService iSysConfigService;
    /**
@@ -77,6 +78,16 @@
     */
    @Override
    public List<PatMedInhosp> selectPatMedInhospList(PatMedInhosp patMedInhosp) {
        if (patMedInhosp.getCry() == 0) {
            patMedInhosp.setDeptcodeList(patMedInhosp.getLeaveldeptcodes());
            patMedInhosp.setHospitaldistrictcodeList(patMedInhosp.getLeavehospitaldistrictcodes());
            patMedInhosp.setLeaveldeptcodes(null);
            patMedInhosp.setLeavehospitaldistrictcodes(null);
            patMedInhosp.setInhospstate("0");
        } else if (patMedInhosp.getCry() == 1) {
            patMedInhosp.setInhospstate("1");
        }
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        for (PatMedInhosp patMedInhosp1 : patMedInhospList) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
@@ -138,16 +149,6 @@
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq) {
        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);
        }
        patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
@@ -212,7 +213,91 @@
    @Override
    public int dealOutHospInfo(String config) {
        //1.入院宣教
        String helibrarySwitch = iSysConfigService.selectConfigByKey("in.helibrary.switch");
        if (StringUtils.isNotEmpty(helibrarySwitch) && "2".equals(helibrarySwitch)) {
            PatMedInhosp inhosp = new PatMedInhosp();
            inhosp.setInDeptcheckFlag("0");
            inhosp.setInhospstate("0");
            inhosp.setFuflag("1");
            List<PatMedInhosp> inPatMedInhosps = patMedInhospMapper.selectPatMedInhospList(inhosp);
            //1.1 科室
            for (PatMedInhosp patMedInhosp1 : inPatMedInhosps) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                try {
                    //根据患者所在科室,获取该科室的入院长期宣教任务
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                    serviceTaskdept.setLongtask(1L);
                    serviceTaskdept.setDeptCode(patMedInhosp1.getDeptcode());
                    serviceTaskdept.setDeptType("1");
                    serviceTaskdept.setServiceType("17");
                    serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
                    List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                        patMedInhosp1.setInDeptcheckFlag("2");
                        patMedInhosp1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + "该患者所在科室未配置入院长期宣教任务;" : "该患者所在科室未配置入院长期宣教任务;");
                        patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    } else {
                        for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 4, config);
                        }
                    }
                } catch (Exception e) {
                    log.error("人员入院科室处理出异常了:{}", e.getMessage());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了:" + e.getMessage());
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                }
            }
            //1.2 病区
            inhosp.setInDeptcheckFlag(null);
            inhosp.setInWardcheckFlag("0");
            List<PatMedInhosp> inPatMedInhospsWard = patMedInhospMapper.selectPatMedInhospList(inhosp);
            for (PatMedInhosp patMedInhosp1 : inPatMedInhospsWard) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                //根据患者所在病区,获取该病区的入院长期宣教任务(会出现一个问题,科室和病区发的同一个模板)
                ServiceTaskdept serviceTaskWard = new ServiceTaskdept();
                serviceTaskWard.setLongtask(1L);
                serviceTaskWard.setDeptCode(patMedInhosp1.getHospitaldistrictcode());
                serviceTaskWard.setDeptType("2");
                serviceTaskWard.setServiceType("17");
                serviceTaskWard.setOrgid(patMedInhosp1.getOrgid());
                List<ServiceTaskdept> serviceTaskWardList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskWardList) || serviceTaskWardList.size() == 0) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在病区未配置入院长期宣教任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskWardList) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 5, config);
                    }
                }
            }
        }
        //2.出院随访
        PatMedInhosp pmks = new PatMedInhosp();
        //获取需要出院部门随访,未处理的数据
        pmks.setDeptcheckFlag("0");
@@ -241,25 +326,29 @@
                serviceTaskdept.setLongtask(1L);
                serviceTaskdept.setDeptCode(patMedInhosp1.getLeaveldeptcode());
                serviceTaskdept.setDeptType("1");
                serviceTaskdept.setServiceType("2");
                serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
                List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置长期任务;");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置离院长期任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
                    }
                    patMedInhosp1.setDeptcheckFlag("1");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
//                    patMedInhosp1.setDeptcheckFlag("1");
//                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员处理出异常了:{}", e.getMessage());
                log.error("人员科室处理出异常了:{}", e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("人员科室处理异常:" + e.getMessage());
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            }
        }
@@ -288,30 +377,43 @@
                    continue;
                }
                try {
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                    serviceTaskdept.setLongtask(1L);
                    serviceTaskdept.setDeptCode(pmiBQ1.getLeavehospitaldistrictcode());
                    serviceTaskdept.setDeptType("2");
                    serviceTaskdept.setOrgid(pmiBQ1.getOrgid());
                    List<ServiceTaskdept> serviceTaskdeptList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                    String errorreason = null;
                    List<ServiceTaskdept> serviceTaskdeptList = null;
                    if (!StringUtils.isEmpty(pmiBQ1.getLeavehospitaldistrictcode())) {
                        ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                        serviceTaskdept.setLongtask(1L);
                        serviceTaskdept.setDeptCode(pmiBQ1.getLeavehospitaldistrictcode());
                        serviceTaskdept.setDeptType("2");
                        serviceTaskdept.setServiceType("2");
                        serviceTaskdept.setOrgid(pmiBQ1.getOrgid());
                        serviceTaskdeptList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                        if (CollectionUtils.isEmpty(serviceTaskdeptList)) {
                            errorreason = "该患者所在病区未配置长期任务;";
                        }
                    } else {
                        errorreason = "离院病区为空;";
                    }
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskdeptList) || serviceTaskdeptList.size() == 0) {
                    if (StringUtils.isNotEmpty(errorreason)) {
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiBQ1.getInhospid());
                        pmiBQ1.setWardcheckFlag("2");
                        pmiBQ1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在病区未配置长期任务;");
                        pmiBQ1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorreason : errorreason);
                        patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                    } else {
                        for (ServiceTaskdept serviceTaskdept1 : serviceTaskdeptList) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiBQ1, patArchive, 2, config);
                        }
                        pmiBQ1.setWardcheckFlag("1");
                        patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
//                        pmiBQ1.setWardcheckFlag("1");
//                        patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("人员处理出异常了:{}", e.getMessage());
                    log.error("人员病区处理出异常了:{}", e.getMessage());
                    pmiBQ1.setWardcheckFlag("2");
                    pmiBQ1.setLongTaskReason("人员病区处理异常:" + e.getMessage());
                    patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                }
            }
@@ -337,35 +439,111 @@
                    continue;
                }
                try {
                    String errorIcd = null;
                    if (StringUtils.isEmpty(pmiJB.getLeaveicd10code())) {
                        continue;
                    }
                    // 根据患者的疾病,获取该疾病的长期任务
                    ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag();
                    serviceTaskdiag.setLongtask(1L);
                    serviceTaskdiag.setIcd10code(pmiJB.getLeaveicd10code());
                    serviceTaskdiag.setServiceType("2");
                    if (active.equals("nhfy")) {
                        //南华附一的icd10code有重复,所以用主诊断名称去查询
                        serviceTaskdiag.setIcd10name(pmiJB.getLeavediagname());
                        if (StringUtils.isEmpty(pmiJB.getLeavediagname())) {
                            errorIcd = "该患者主诊断名称为空;";
                        }
                    } else {
                        serviceTaskdiag.setIcd10code(pmiJB.getLeaveicd10code());
                        if (StringUtils.isEmpty(pmiJB.getLeaveicd10code())) {
                            errorIcd = "该患者主诊断ICD10码为空;";
                        }
                    }
                    serviceTaskdiag.setOrgid(pmiJB.getOrgid());
                    List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagMapper.selectServiceTaskdiagList(serviceTaskdiag);
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskdiags) || serviceTaskdiags.size() == 0) {
                    if (StringUtils.isNotEmpty(errorIcd)) {
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        pmiJB.setDiagcheckFlag("2");
                        pmiJB.setLongTaskReason(patMedInhosp.getLongTaskReason() + "所患的疾病未配置长期任务;");
                        pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    } else if (CollectionUtils.isEmpty(serviceTaskdiags)) {
                        errorIcd = "该患者所在病区未配置长期任务;";
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        pmiJB.setDiagcheckFlag("2");
                        pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    } else {
                        for (ServiceTaskdiag serviceTaskdept1 : serviceTaskdiags) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiJB, patArchive, 3, config);
                        }
                        pmiJB.setDiagcheckFlag("1");
                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
//                        pmiJB.setDiagcheckFlag("1");
//                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("人员处理出异常了:{}", e.getMessage());
                    log.error("人员疾病处理出异常了:{}", e.getMessage());
                    pmiJB.setDiagcheckFlag("2");
                    pmiJB.setLongTaskReason("人员疾病处理异常:" + e.getMessage());
                    patMedInhospMapper.updatePatMedInhosp(pmiJB);
                }
            }
//            手术随访
//            PatMedInhosp pmss = new PatMedInhosp();
//            //获取需要出院疾病随访,未处理的数据
//            pmss.setOpercheckFlag("0");
//            pmss.setInhospstate("1");
//            pmss.setFuflag("1");
//            List<PatMedInhosp> patMedInhospSSs = patMedInhospMapper.selectPatMedInhospList(pmss);
//            log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospSSs) ? patMedInhospSSs.size() : null);
//            for (PatMedInhosp patMedInhosp1 : patMedInhospSSs) {
//                String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
//                patMedInhosp1.setTagname(tagname);
//            }
//
//            for (PatMedInhosp pmiSS : patMedInhospSSs) {
//                //获取患者信息
//                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiSS.getPatid());
//                if (Objects.isNull(patArchive)) {
//                    pmiSS.setDiagcheckFlag("2");
//                    pmiSS.setLongTaskReason("患者基本信息为空");
//                    patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                    continue;
//                }
//                try {
////                    if (StringUtils.isEmpty(pmiSS.getLeaveicd10code())) {
////                        continue;
////                    }
//                    // 根据患者的疾病,获取该疾病的长期任务
//                    ServiceTaskoper serviceTaskoper = new ServiceTaskoper();
//                    serviceTaskoper.setLongtask(1L);
//                    serviceTaskoper.setOrgid(pmiSS.getOrgid());
//                    //todo
//                    serviceTaskoper.setOplevelcode("");
//
//                    List<ServiceTaskoper> serviceTaskopers = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper);
//                    //如果部门模板为空(将deptIsNull设置为true)
//                    if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
//                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiSS.getInhospid());
//                        pmiSS.setOpercheckFlag("2");
//                        pmiSS.setLongTaskReason(patMedInhosp.getLongTaskReason() + "所患的手术未配置长期任务;");
//                        patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                    } else {
//                        for (ServiceTaskoper serviceTaskoper1 : serviceTaskopers) {
//                            writeInSubTask(serviceTaskoper1.getTaskId(), true, pmiSS, patArchive, 3, config);
//                        }
//                    }
//
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    log.error("人员手术处理出异常了:{}", e.getMessage());
//                    pmiSS.setOpercheckFlag("2");
//                    pmiSS.setLongTaskReason("人员手术处理异常:" + e.getMessage());
//                    patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                }
//            }
        }
        //获取未处理在院的数据(如果刚刚出院的患者数据的出院时间,在下面查询出的入院时间之前,那之前的出院患者的数据,也得停掉,因为又入院了)
@@ -379,6 +557,143 @@
        }
        return 1;
    }
    /**
     * 多维度随访
     *
     * @param config
     * @return
     */
    public int dealOutHospInfoByDimension(String config) {
        // 一次性查出所有需要处理的出院患者(三个维度任意一个未完成)
        List<PatMedInhosp> patList = patMedInhospMapper.selectNeedProcessList();
        log.info("【统一扫描】待处理患者数:{}", patList.size());
        for (PatMedInhosp patMedInhosp1 : patList) {
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
            if (Objects.isNull(patArchive)) {
                // 三个维度都标记为失败
                markAllFlagsAsError(patMedInhosp1, "患者基本信息为空");
                continue;
            }
            // ── 维度1:科室 ──
            if ("0".equals(patMedInhosp1.getDeptcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 1);
            }
            // ── 维度2:病区 ──(新华医院跳过)
            if (!active.equals("xh") && "0".equals(patMedInhosp1.getWardcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 2);
            }
            // ── 维度3:疾病 ──(新华医院跳过)
            if (!active.equals("xh") && "0".equals(patMedInhosp1.getDiagcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 3);
            }
        }
        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();
    }
//
//    @Override
@@ -538,16 +853,25 @@
        return calendar.getTime();
    }
    /**
     * @param taskid        任务id
     * @param check         是否需要校验
     * @param patMedInhosp1 病人出入院信息
     * @param patArchive    病人信息
     * @param type          随访类型(1-科室,2-病区,3-疾病 4-入院科室 5-入院病区)
     * @param config        配置信息 visit.early.day
     */
    //将患者放到subtask中
    private void writeInSubTask(Long taskid, Boolean check, PatMedInhosp patMedInhosp1, PatArchive patArchive, Integer type, String config) {
        String longTaskReason = patMedInhosp1.getLongTaskReason();
        String orgId = patMedInhosp1.getOrgid();
        if (StringUtils.isEmpty(longTaskReason)) longTaskReason = "";
        ServiceTask st = new ServiceTask();
        st.setTaskid(taskid);
        st.setSendState(2L);
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
        ServiceTask serviceTask = null;
        if(CollectionUtils.isEmpty(serviceTasks)){
        if (CollectionUtils.isEmpty(serviceTasks)) {
            if (type == 1) {
                log.info("该患者出院随访长期任务不存在,任务ID为:{}", taskid);
                patMedInhosp1.setDeptcheckFlag("2");
@@ -564,22 +888,37 @@
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者疾病长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 4) {
                patMedInhosp1.setInDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者入院科室长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 5) {
                patMedInhosp1.setInWardcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者入院病区长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                return;
            }
        }else {
        } else {
            serviceTask = serviceTasks.get(0);
        }
        if (Objects.isNull(patMedInhosp1.getEndtime())) {
            return;
        }
        //封装serviceSubtask
        ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp1, patArchive, config);
        if(ObjectUtils.isEmpty(serviceSubtask)){
        ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp1, patArchive, config, type);
        if (ObjectUtils.isEmpty(serviceSubtask)) {
            return;
        }
        if (type != 2) {
            //科室和疾病 都用 科室填充
            serviceSubtask.setVisitDeptCode(patMedInhosp1.getLeaveldeptcode());
            serviceSubtask.setVisitDeptName(patMedInhosp1.getLeaveldeptname());
            if (patMedInhosp1.getInhospstate().equals("1")) {
                serviceSubtask.setVisitDeptCode(patMedInhosp1.getLeaveldeptcode());
                serviceSubtask.setVisitDeptName(patMedInhosp1.getLeaveldeptname());
            } else if (patMedInhosp1.getInhospstate().equals("0")) {
                serviceSubtask.setVisitDeptCode(patMedInhosp1.getDeptcode());
                serviceSubtask.setVisitDeptName(patMedInhosp1.getDeptname());
            }
        } else if (type == 2) {
            serviceSubtask.setVisitDeptCode(patMedInhosp1.getLeavehospitaldistrictcode());
            serviceSubtask.setVisitDeptName(patMedInhosp1.getLeavehospitaldistrictname());
@@ -590,12 +929,12 @@
            //先判断一下,是否需要校验
            if (check && (Objects.isNull(serviceSubtask.getTaskSituation()) || serviceSubtask.getTaskSituation() != 6)) {
                //在新增之前,先通过患者ID,sendstate=2查询一下,在所有长期任务中,是不是还有该患者待执行的任务,有的话,比较之前的endtime是否小于当前的endtaime,如果之前的小于现在的,则直接将之前的停掉(原因再入院)
                ServiceSubtaskVO subtask = new ServiceSubtaskVO();
                ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
                subtask.setPatid(patArchive.getId());
                subtask.setSendstate(2L);
                subtask.setTaskid(taskid);
                List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
                log.info("该患者待执行的任务:{}", CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.size() : null);
//                log.info("该患者待执行的任务:{}", CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.size() : null);
                if (CollectionUtils.isNotEmpty(selectServiceSubtaskList) && selectServiceSubtaskList.size() > 0) {
                    for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) {
                        if (Objects.isNull(serviceSubtask1.getLongSendTime())) {
@@ -607,7 +946,7 @@
                            Date endTime = serviceSubtask.getEndtime();
                            Date endTime1 = serviceSubtask1.getEndtime();
                            //出院时间判空,如果为空跳过
                            if(ObjectUtils.isEmpty(endTime)){
                            if (ObjectUtils.isEmpty(endTime)) {
                                serviceSubtask.setResult("error");
                                serviceSubtask.setRemark("出院时间为空,serviceSubtask的Id为" + serviceSubtask.getId());
                                serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
@@ -616,7 +955,7 @@
                                if (aBoolean) i = 1;
                                continue;
                            }
                            if(ObjectUtils.isEmpty(endTime1)){
                            if (ObjectUtils.isEmpty(endTime1)) {
                                serviceSubtask1.setResult("error");
                                serviceSubtask1.setRemark("出院时间为空,serviceSubtask的Id为" + serviceSubtask1.getId());
                                serviceSubtask1.setUpdateBy(serviceTask.getUpdateBy());
@@ -625,27 +964,36 @@
                                if (aBoolean) i = 1;
                                continue;
                            }
                            if (endTime1.before(endTime) && serviceSubtask1.getServiceType().equals("2")) {
                                //如果当前循环的子任务的出院时间在“准备新增的子任务”的出院时间之前,则将循环的子任务停掉
                                serviceSubtask1.setSendstate(4L);
                                if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                                    serviceSubtask.setRemark(serviceSubtask.getRemark() + ",科室/病区患者再入院");
                                else serviceSubtask.setRemark("科室/病区患者再入院");
                                serviceSubtask1.setResult("error");
                                serviceSubtask1.setUpdateBy(serviceTask.getUpdateBy());
                                serviceSubtask1.setUpdateTime(new Date());
                                Boolean aBoolean = serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                                if (aBoolean) i = 1;
                            } else {
                                //相反,则将当有的数据停掉
                                serviceSubtask.setResult("error");
                                serviceSubtask.setSendstate(4L);
                                if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                                    serviceSubtask.setRemark(serviceSubtask.getRemark() + ",当前患者出院时间后有待执行的出院随访长期任务");
                                else serviceSubtask.setRemark("当前患者出院时间后有待执行的出院随访长期任务");
                                serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                                serviceSubtask.setCreateTime(new Date());
                                i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                            //再入院逻辑
                            //景宁 出院首次(7天)随访一定要做
                            boolean firstVisit = false;
                            if (orgId.equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                                firstVisit = true;
                            }
                            if (!firstVisit) {
                                //景宁的不需要将之前的任务停掉,全生成
                                if (endTime1.before(endTime) && serviceSubtask1.getServiceType().equals("2")) {
                                    //如果当前循环的子任务的出院时间在“准备新增的子任务”的出院时间之前,则将循环的子任务停掉
                                    serviceSubtask1.setSendstate(4L);
                                    if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                                        serviceSubtask.setRemark(serviceSubtask.getRemark() + ",科室/病区患者再入院");
                                    else serviceSubtask.setRemark("科室/病区患者再入院");
                                    serviceSubtask1.setResult("error");
                                    serviceSubtask1.setUpdateBy(serviceTask.getUpdateBy());
                                    serviceSubtask1.setUpdateTime(new Date());
                                    Boolean aBoolean = serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                                    if (aBoolean) i = 1;
                                } else {
                                    //相反,则将当有的数据停掉
                                    serviceSubtask.setResult("error");
                                    serviceSubtask.setSendstate(4L);
                                    if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                                        serviceSubtask.setRemark(serviceSubtask.getRemark() + ",当前患者出院时间后有待执行的出院随访长期任务");
                                    else serviceSubtask.setRemark("当前患者出院时间后有待执行的出院随访长期任务");
                                    serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                                    serviceSubtask.setCreateTime(new Date());
                                    i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                                }
                            }
                        } else if (type == 3) {
                            //type=3 表示疾病
@@ -698,14 +1046,16 @@
            }
            //将check_flag改成1(已处理)
            if(i == 1){
            if (i == 1) {
                PatMedInhosp patMedInhosp2 = new PatMedInhosp();
                patMedInhosp2.setInhospid(patMedInhosp1.getInhospid());
                if (type == 1) patMedInhosp2.setDeptcheckFlag("1");
                if (type == 2) patMedInhosp2.setWardcheckFlag("1");
                if (type == 3) patMedInhosp2.setDiagcheckFlag("1");
                if (type == 4) patMedInhosp2.setInDeptcheckFlag("1");
                if (type == 5) patMedInhosp2.setInWardcheckFlag("1");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
            }else {
            } else {
                //生成子任务失败,
                log.info("生成子任务失败serviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid());
                PatMedInhosp patMedInhosp2 = new PatMedInhosp();
@@ -713,6 +1063,8 @@
                if (type == 1) patMedInhosp2.setDeptcheckFlag("2");
                if (type == 2) patMedInhosp2.setWardcheckFlag("2");
                if (type == 3) patMedInhosp2.setDiagcheckFlag("2");
                if (type == 4) patMedInhosp2.setInDeptcheckFlag("2");
                if (type == 5) patMedInhosp2.setInWardcheckFlag("2");
                patMedInhosp2.setRemark("生成子任务失败 " + type);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
            }
@@ -767,7 +1119,7 @@
    //封装serviceSubtask
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config) {
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type) {
        //增加serviceTask判空
//        if(Objects.isNull(serviceTask)){
//            return null;
@@ -783,6 +1135,15 @@
        serviceSubtask.setDrname(patMedInhosp1.getDrname());
        serviceSubtask.setDeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setDeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode());
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
        if(type == 4||type == 5){
            //设置入院的
            serviceSubtask.setDeptcode(patMedInhosp1.getDeptcode());
            serviceSubtask.setDeptname(patMedInhosp1.getDeptname());
            serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getHospitaldistrictcode());
            serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getHospitaldistrictname());
        }
        serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code());
        serviceSubtask.setLeavediagname(patMedInhosp1.getDiagname());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
@@ -802,36 +1163,51 @@
        serviceSubtask.setServiceType(serviceTask.getServiceType());
        serviceSubtask.setPreachform(serviceTask.getPreachform());
        serviceSubtask.setHospType("2");
        if (type == 4 || type == 5) serviceSubtask.setHospType("6");
        serviceSubtask.setCreateTime(new Date());
        serviceSubtask.setUpdateTime(new Date());
        serviceSubtask.setCreateBy(patMedInhosp1.getNurseName());
        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode());
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
        serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
        serviceSubtask.setUpdateTime(new Date());
        //如果是宣教就设置为7
        if (serviceTask.getServiceType().equals("17")) serviceSubtask.setTaskSituation(7);
        //设置发送时间
        if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L);
        Date newDate = null;
        if (!Objects.isNull(patMedInhosp1.getEndtime())) {
            newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue());
        } else {
            //如果出院时间为空,则返回一个新对象
            return new ServiceSubtask();
            //如果等于4,说明是入院宣教,入院不可能有endTime
            if (type != 4 && type != 5) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者疾病出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid());
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                //如果出院时间为空,则返回一个新对象
                return new ServiceSubtask();
            }
            //入院宣教,基本当天或隔天就要发出
            newDate = addDays(new Date(), serviceTask.getSendDay().intValue());
        }
        serviceSubtask.setLongSendTime(newDate);
        serviceSubtask.setVisitTime(newDate);
        if (patMedInhosp1.getFudate() != null) serviceSubtask.setVisitTime(patMedInhosp1.getFudate());
//        if (patMedInhosp1.getFudate() != null && !patMedInhosp1.getOrgid().equals("47255004333112711A1001")) serviceSubtask.setVisitTime(patMedInhosp1.getFudate());
        //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中)
        if ("3".equals(serviceTask.getType())) {
            serviceSubtask.setVisitTime(minusDay(newDate, StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0));
            //判断是不是景宁
            if (patMedInhosp1.getOrgid().equals("47255004333112711A1001"))
                serviceSubtask.setVisitTime(null);
            //如果该出院记录有随访时间,则用他自己的随访时间
            if (patMedInhosp1.getFudate() != null)
            if (patMedInhosp1.getFudate() != null) {
                serviceSubtask.setVisitTime(minusDay(patMedInhosp1.getFudate(), StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0));
            } else {
                //判断是不是景宁
                if (patMedInhosp1.getOrgid().equals("47255004333112711A1001")) {
                    serviceSubtask.setVisitTime(null);
                    //不执行
                    serviceSubtask.setSendstate(4L);
                    serviceSubtask.setRemark("景宁没有给随访时间,不发送通知短信");
                }
            }
        }
        //患者发送时间
@@ -869,7 +1245,7 @@
        for (PatMedInhosp patMedInhosp1 : patMedInhospList) {
            try {
                //获取当前入院患者的待执行的出院子任务随访信息
                ServiceSubtaskVO subtask = new ServiceSubtaskVO();
                ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
                subtask.setPatid(patMedInhosp1.getPatid());
                subtask.setSendstate(2L);
                List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
@@ -880,20 +1256,25 @@
                            //不是长期任务,不处理
                            continue;
                        }
                        if (serviceSubtask1.getEndtime().before(patMedInhosp1.getStarttime())) {
                            //如果当前循环的子任务的出院时间在“准备新增的子任务”的出院时间之前,则将循环的子任务停掉
//                            log.error("患者再入院的serviceSubtask1为:{}", serviceSubtask1);
                            serviceSubtask1.setSendstate(4L);
                            serviceSubtask1.setRemark("患者再入院");
                            serviceSubtask1.setResult("error");
//                            serviceSubtask1.setFinishtime(new Date());
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                        //景宁 出院首次(7天)随访一定要做
                        boolean firstVisit = false;
                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                            firstVisit = true;
                        }
                        if (!firstVisit) {
                            if (serviceSubtask1.getEndtime().before(patMedInhosp1.getStarttime())) {
                                //如果当前循环的子任务的出院时间在“准备新增的子任务”的出院时间之前,则将循环的子任务停掉
//                            log.error("患者再入院的serviceSubtask1为:{}", serviceSubtask1);
                                serviceSubtask1.setSendstate(4L);
                                serviceSubtask1.setIsVisitAgain(2);
                                serviceSubtask1.setRemark("患者再入院");
                                serviceSubtask1.setResult("error");
                                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                            }
                        }
                    }
                }
                //将患入的入院数据设置为已处理
                //更新状态值 patMedInhosp1.setDeptcheckFlag("0");
                //patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            } catch (Exception e) {
                log.error("入院数据信息出异常了:{},{}", patMedInhosp1, e.getMessage());
            }