liusheng
13 小时以前 ab2884ade73fed97d1e7d7daf4b9b5b6dee83fdd
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -1,18 +1,17 @@
package com.smartor.service.impl;
import com.ruoyi.othervisit.api.OtherVisitFacade;
import com.ruoyi.inhospvisit.api.InhospVisitFacade;
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.core.service.dto.PatMedReq;
import com.ruoyi.common.core.service.dto.PatMedRes;
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.common.ScheduleSubtaskBuilder;
import com.smartor.domain.*;
import com.smartor.domain.DTO.PatMedInhospDTO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.inhospvisit.domain.PatMedInhospDTO;
import com.smartor.mapper.*;
import com.smartor.service.IPatMedInhospService;
import lombok.extern.slf4j.Slf4j;
@@ -22,12 +21,36 @@
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.*;
import java.util.stream.Collectors;
import com.ruoyi.othervisit.domain.PatMedOperationItem;
import com.ruoyi.inhospvisit.domain.PatMedInhospVO;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.domain.ServiceTaskdept;
import com.ruoyi.task.domain.ServiceTaskdiag;
import com.ruoyi.task.domain.ServiceTaskoper;
import com.ruoyi.task.domain.ServiceTaskRule;
import com.ruoyi.task.domain.ServiceTaskSchedule;
import com.ruoyi.task.domain.ServiceTaskScheduleDetail;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.task.mapper.ServiceTaskdeptMapper;
import com.ruoyi.task.mapper.ServiceTaskdiagMapper;
import com.ruoyi.task.mapper.ServiceTaskMapper;
import com.ruoyi.task.mapper.ServiceTaskoperMapper;
import com.ruoyi.task.mapper.ServiceTaskRuleMapper;
import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper;
import com.ruoyi.task.mapper.ServiceTaskScheduleMapper;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.common.ScheduleSubtaskBuilder;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import com.ruoyi.patarchive.mapper.PatArchiveImportMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
/**
 * 患者住院记录Service业务层处理
 *
@@ -37,8 +60,15 @@
@Slf4j
@Service
public class PatMedInhospServiceImpl implements IPatMedInhospService {
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    private InhospVisitFacade inhospVisitFacade;
    /**
     * 手术数据一律经 ruoyi-othervisit 的门面取用(跨模块数据访问原则)。
     */
    @Autowired
    private OtherVisitFacade otherVisitFacade;
    @Autowired
    private ServiceTaskdeptMapper serviceTaskdeptMapper;
    @Autowired
@@ -56,16 +86,10 @@
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private ServiceTaskmedicalMapper serviceTaskmedicalMapper;
    @Autowired
    private PatMedOperationItemMapper patMedOperationItemMapper;
    @Autowired
    private ServiceTaskRuleMapper serviceTaskRuleMapper;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private IConfigService iSysConfigService;
    @Autowired
    private ServiceTaskScheduleMapper serviceTaskScheduleMapper;
@@ -74,21 +98,9 @@
    @Autowired
    private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper;
    /**
     * 查询患者住院记录
     *
     * @param inhospid 患者住院记录主键
     * @return 患者住院记录
     */
    @Override
    public PatMedInhosp selectPatMedInhospByInhospid(Long inhospid) {
        return patMedInhospMapper.selectPatMedInhospByInhospid(inhospid);
    }
    @Override
    public List<PatMedInhosp> selectPatMedInhosp(PatMedInhosp patMedInhosp) {
        return patMedInhospMapper.selectPatMedInhosp(patMedInhosp);
        return inhospVisitFacade.selectPatMedInhosp(patMedInhosp);
    }
    /**
@@ -115,7 +127,7 @@
            patMedInhosp.setInhospstate("3");
        }
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        fillTagname(patMedInhospList);
        return patMedInhospList;
    }
@@ -149,7 +161,7 @@
        int batchSize = 1000;
        for (int i = 0; i < patidList.size(); i += batchSize) {
            List<Long> batch = patidList.subList(i, Math.min(i + batchSize, patidList.size()));
            List<Map<String, Object>> rows = patMedInhospMapper.getTagnameByPatids(batch);
            List<Map<String, Object>> rows = inhospVisitFacade.getTagnameByPatids(batch);
            if (CollectionUtils.isEmpty(rows)) {
                continue;
            }
@@ -205,19 +217,6 @@
        return patMedInhospDTOList;
    }
    @Override
    public Map<String, Integer> queryPersonCount(PatServiceCount patServiceCount) {
        if (patServiceCount.getInterval() == 1) {
            //周
        } else if (patServiceCount.getInterval() == 2) {
            //月
        } else if (patServiceCount.getInterval() == 3) {
            //年
        }
        return null;
    }
    /**
     * 查询当前登陆人自己(病区、部门)的患者住院记录列表
     *
@@ -225,7 +224,7 @@
     * @return
     */
    public List<PatMedInhosp> selectPatMedInhospListByCondition(PatMedInhospVO patMedInhospVO) {
        return patMedInhospMapper.selectPatMedInhospListByCondition(patMedInhospVO);
        return inhospVisitFacade.selectPatMedInhospListByCondition(patMedInhospVO);
    }
@@ -249,20 +248,6 @@
    }
    /**
     * 查询出入院人次
     *
     * @param patMedReq
     * @return
     */
    @Override
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq) {
        PatMedRes patMedRes = null;
        // 获取当前登陆人的部门权限
        patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
    /**
     * 新增患者住院记录
     *
     * @param patMedInhosp 患者住院记录
@@ -272,7 +257,7 @@
    public int insertPatMedInhosp(PatMedInhosp patMedInhosp) {
        patMedInhosp.setCreateTime(DateUtils.getNowDate());
        patMedInhosp.setUpdateTime(DateUtils.getNowDate());
        return patMedInhospMapper.insertPatMedInhosp(patMedInhosp);
        return inhospVisitFacade.insertPatMedInhosp(patMedInhosp);
    }
    /**
@@ -284,333 +269,8 @@
    @Override
    public int updatePatMedInhosp(PatMedInhosp patMedInhosp) {
        patMedInhosp.setUpdateTime(DateUtils.getNowDate());
        return patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
        return inhospVisitFacade.updatePatMedInhosp(patMedInhosp);
    }
    /**
     * 批量删除患者住院记录
     *
     * @param inhospids 需要删除的患者住院记录主键
     * @return 结果
     */
    @Override
    public int deletePatMedInhospByInhospids(Long[] inhospids) {
        return patMedInhospMapper.deletePatMedInhospByInhospids(inhospids);
    }
    /**
     * 删除患者住院记录信息
     *
     * @param inhospid 患者住院记录主键
     * @return 结果
     */
    @Override
    public int deletePatMedInhospByInhospid(Long inhospid) {
        return patMedInhospMapper.deletePatMedInhospByInhospid(inhospid);
    }
    /**
     * 删除患者住院记录信息
     *
     * @param inhospno 患者住院编码
     * @return 结果
     */
    @Override
    public int deletePatMedInhospByInhospno(String inhospno) {
        return patMedInhospMapper.deletePatMedInhospByInhospno(inhospno);
    }
    @Override
    public int dealOutHospInfo(String config) {
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        //1.入院宣教
        String helibrarySwitch = iSysConfigService.selectConfigByKey("in.helibrary.switch");
        if (StringUtils.isNotEmpty(helibrarySwitch) && "2".equals(helibrarySwitch)) {
            //1.1 科室
            for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
                //获取患者信息
                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("人员入院科室处理出异常了");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                }
            }
            //1.2 病区
            pmks.setInDeptcheckFlag(null);
            pmks.setInWardcheckFlag("0");
            pmks.setDeptcheckFlag(null);
            List<PatMedInhosp> inPatMedInhospsWard = patMedInhospMapper.selectPatMedInhospList(pmks);
            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.药品宣教(省立同德的需求,其它地方没提)
        if (active.equals("sltd")) {
            for (PatMedInhosp patMedInhosp : patMedInhosps) {
                String medicalCode = patMedInhosp.getMedicalCode();
                if (StringUtils.isNotEmpty(medicalCode)) {
                    String[] split = medicalCode.split(",");
                    // 防御性编程:确保 medicalCompany 和 medicalName 不为 null
                    String medicalCompanyStr = patMedInhosp.getMedicalCompany() != null ? patMedInhosp.getMedicalCompany() : "";
                    String medicalNameStr = patMedInhosp.getMedicalName() != null ? patMedInhosp.getMedicalName() : "";
                    String[] medicalCompanyArray = medicalCompanyStr.split(",");
                    String[] medicalNameArray = medicalNameStr.split(",");
                    for (int i = 0; i < split.length; i++) {
                        ServiceTaskmedical serviceTaskmedical = new ServiceTaskmedical();
                        //拿药品编码和公司去查
                        serviceTaskmedical.setMedicalCode(split[i]);
                        // 防止下标越界:如果数组长度不一致,取最小长度
                        if (i < medicalCompanyArray.length) {
                            serviceTaskmedical.setMedicalCompany(medicalCompanyArray[i]);
                        } else {
                            log.warn("【药品宣教】药品编码{}对应的公司信息下标越界,medicalCompany 数组长度={}, 当前索引={}", split[i], medicalCompanyArray.length, i);
                            serviceTaskmedical.setMedicalName(""); // 越界时设置为空
                        }
                        List<ServiceTaskmedical> serviceTaskmedicals = serviceTaskmedicalMapper.selectServiceTaskmedicalList(serviceTaskmedical);
                        if (CollectionUtils.isNotEmpty(serviceTaskmedicals)) {
                            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
                            // check=true,让 writeInSubTask 内部做去重校验
                            writeInSubTask(serviceTaskmedicals.get(0).getTaskId(), true, patMedInhosp, patArchive, 0, config);
                        }
                        //查不到的药品就是不需要宣教的,就不管了
                    }
                }
            }
        }
        //3.出院随访 - 基于规则的任务生成
        // 获取所有需要处理的出院患者(科室维度未处理)
        addSubTaskByRule(config, patMedInhosps);
        if (!active.equals("xh")) {
            addOperationSubTask(config);
        }
        //获取未处理在院的数据(如果刚刚出院的患者数据的出院时间,在下面查询出的入院时间之前,那之前的出院患者的数据,也得停掉,因为又入院了)
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setDeptcheckFlag("0");
        patMedInhosp.setInhospstate("0");
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        if (CollectionUtils.isNotEmpty(patMedInhospList) && patMedInhospList.size() > 0) {
            dealInHospInfo(patMedInhospList);
        }
        return 1;
    }
    /**
     * 任务组随访
     *
     * @param config
     * @return
     */
    public int dealOutHospInfoBySchedule(String config) {
        ServiceTask serviceTaskVo = new ServiceTask();
        serviceTaskVo.setLongTask(1);
        serviceTaskVo.setAppltype("5");
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(serviceTaskVo);
        if (CollectionUtils.isNotEmpty(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();
                        List<String> icd10CodeList = new ArrayList<>();
                        List<String> opLevelCodeList = new ArrayList<>();
                        List<String> deptCodeList = new ArrayList<>();
                        List<String> wardCodeList = new ArrayList<>();
                        /**
                         * 随访类型(1-科室,2-病区,3-疾病 4-入院科室 5-入院病区 6-手术)
                         */
                        Integer type = 1;
                        if (StringUtils.isNotEmpty(deptCodes)) {
                            type = 1;
                            deptCodeList = new ArrayList<>(Arrays.asList(deptCodes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(wardCodes)) {
                            type = 2;
                            wardCodeList = new ArrayList<>(Arrays.asList(wardCodes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(icd10Codes)) {
                            type = 3;
                            icd10CodeList = new ArrayList<>(Arrays.asList(icd10Codes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(opLevelCodes)) {
                            type = 6;
                            opLevelCodeList = new ArrayList<>(Arrays.asList(opLevelCodes.split(",")));
                        }
                        //非手术处理方式
                        if (type != 6) {
                            PatMedInhosp patMedInhospVo = new PatMedInhosp();
                            patMedInhospVo.setScheduleCheckFlag("0");
                            patMedInhospVo.setInhospstate("1");
                            patMedInhospVo.setFuflag("1");
//                            patMedInhospVo.setDeptcodeList(deptCodeList);
                            patMedInhospVo.setLeaveldeptcodes(deptCodeList);
                            patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList);
                            patMedInhospVo.setIcd10codeList(icd10CodeList);
                            List<PatMedInhosp> patList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo);
                            log.info("dealOutHospInfoBySchedule 任务组随访, taskid = {}, 扫描患者人数 {}", serviceTask.getTaskid(), patList.size());
                            for (PatMedInhosp patMedInhosp : patList) {
                                ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                                scheduleDetailVo.setTaskid(serviceTask.getTaskid());
                                scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
                                List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
                                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
                                if (Objects.isNull(patArchive)) {
                                    continue;
                                }
                                //封装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) {
                                        log.error("任务组preachformDesc解析失败,taskid={},inhospid={}", serviceTask.getTaskid(), patMedInhosp.getInhospid());
                                    }
                                }
                                scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList);
                                //置首轮纳入标记,避免下次扫描重复生成(后续轮次由 rollTaskGroupCycle 负责)
                                PatMedInhosp flagUpd = new PatMedInhosp();
                                flagUpd.setInhospid(patMedInhosp.getInhospid());
                                flagUpd.setScheduleCheckFlag("1");
                                patMedInhospMapper.updatePatMedInhosp(flagUpd);
                            }
                        } else {
                            //任务组 - 手术随访
                            if (CollectionUtils.isNotEmpty(opLevelCodeList)) {
                                PatMedOperationItem pmoi = new PatMedOperationItem();
                                //获取需要出院疾病随访,未处理的数据
                                pmoi.setOpercheckFlag("0");
                                pmoi.setMainFlag("1");
                                pmoi.setDeptCodes(deptCodeList);
                                pmoi.setWardCodes(wardCodeList);
                                pmoi.setOpLevelCodes(opLevelCodeList);
                                List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi);
                                for (PatMedOperationItem patMedOperationItem : patMedOperationItems) {
                                    PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperationItem.getPatid());
                                    if (Objects.isNull(patArchive)) {
                                        continue;
                                    }
                                    PatMedInhosp patMedInhospVo = new PatMedInhosp();
                                    patMedInhospVo.setPatid((patMedOperationItem.getPatid()));
                                    patMedInhospVo.setScheduleCheckFlag("0");
                                    patMedInhospVo.setInhospstate("1");
                                    patMedInhospVo.setFuflag("1");
                                    List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo);
                                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                                        ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                                        scheduleDetailVo.setTaskid(serviceTask.getTaskid());
                                        scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
                                        List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
                                        //封装serviceSubtask
                                        ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedInhospList.get(0), patMedOperationItem, patArchive, config);
                                        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) {
                                                log.error("任务组(手术)preachformDesc解析失败,taskid={}", serviceTask.getTaskid());
                                            }
                                        }
                                        scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList);
                                        //置首轮纳入标记,避免重复生成
                                        PatMedInhosp flagUpd = new PatMedInhosp();
                                        flagUpd.setInhospid(patMedInhospList.get(0).getInhospid());
                                        flagUpd.setScheduleCheckFlag("1");
                                        patMedInhospMapper.updatePatMedInhosp(flagUpd);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return 1;
    }
    /**
     * 获取出院,住院,门诊服务人次
@@ -626,9 +286,9 @@
    @Override
    public List<PatMedInhosp> getDocAndPat(PatMedInhosp patMedInhosp) {
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        for (PatMedInhosp patMedInhosp1 : patMedInhospList) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        if (StringUtils.isNotEmpty(patMedInhosp.getPatname()) || StringUtils.isNotEmpty(patMedInhosp.getNurseName()) || StringUtils.isNotEmpty(patMedInhosp.getDrname())) {
@@ -691,34 +351,34 @@
                log.info("该患者药品宣教长期任务不存在,任务ID为:{}", taskid);
                patMedInhosp1.setMedcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者药品宣教长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            }
            if (type == 1) {
                log.info("该患者出院随访长期任务不存在,任务ID为:{}", taskid);
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院科室长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 2) {
                patMedInhosp1.setWardcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院病区长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 3) {
                patMedInhosp1.setDiagcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者疾病长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 4) {
                patMedInhosp1.setInDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者入院科室长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            } else if (type == 5) {
                patMedInhosp1.setInWardcheckFlag("2");
                patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者入院病区长期任务不存在,任务ID为:" + taskid);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                return;
            }
        } else {
@@ -881,7 +541,7 @@
                if (type == 3) patMedInhosp2.setDiagcheckFlag("1");
                if (type == 4) patMedInhosp2.setInDeptcheckFlag("1");
                if (type == 5) patMedInhosp2.setInWardcheckFlag("1");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp2);
            } else {
                //生成子任务失败,
                log.info("生成子任务失败serviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid());
@@ -893,7 +553,7 @@
                if (type == 4) patMedInhosp2.setInDeptcheckFlag("2");
                if (type == 5) patMedInhosp2.setInWardcheckFlag("2");
                patMedInhosp2.setRemark("生成子任务失败 " + type);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp2);
            }
        } catch (Exception e) {
            //出错回滚事务
@@ -905,7 +565,7 @@
            if (type == 3) patMedInhosp2.setDiagcheckFlag("2");
            if (type == 0) patMedInhosp2.setMedcheckFlag("2");
            patMedInhosp2.setRemark("生成子任务报错回滚 " + type);
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp2);
            e.printStackTrace();
        }
    }
@@ -932,7 +592,7 @@
            log.info("该手术对应手术等级的长期任务不存在,任务ID为:{}", taskid);
            patMedOperationItem.setOpercheckFlag("2");
            patMedOperationItem.setLongTaskReason(" & 该手术对应手术等级的长期任务不存在,任务ID为:" + taskid +";");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
            otherVisitFacade.updateOperationItem(patMedOperationItem);
            return;
        } else {
            serviceTask = serviceTasks.get(0);
@@ -955,7 +615,7 @@
        if(!active.equals("hzszlyy")){
            patMedInhosp.setSerialnum(patMedOperationItem.getSerialnum());
        }
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        if (CollectionUtils.isEmpty(patMedInhospList)) {
            return;
@@ -1030,7 +690,7 @@
                PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
                patMedOperationItem2.setId(patMedOperationItem.getId());
                patMedOperationItem2.setOpercheckFlag("1");
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
                otherVisitFacade.updateOperationItem(patMedOperationItem2);
            } else {
                //生成子任务失败,
                log.info("生成子任务失败serviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid());
@@ -1039,7 +699,7 @@
                patMedOperationItem2.setOpercheckFlag("2");
                patMedOperationItem2.setLongTaskReason("生成子任务失败 4;");
                patMedOperationItem2.setUpdateTime(new Date());
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
                otherVisitFacade.updateOperationItem(patMedOperationItem2);
            }
        } catch (Exception e) {
            //出错回滚事务
@@ -1051,7 +711,7 @@
            patMedOperationItem2.setOpercheckFlag("2");
            patMedOperationItem2.setUpdateTime(new Date());
            patMedOperationItem2.setLongTaskReason("生成子任务报错回滚 4;");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            otherVisitFacade.updateOperationItem(patMedOperationItem2);
            e.printStackTrace();
        }
    }
@@ -1119,14 +779,14 @@
        serviceSubtask.setInhospid(patMedInhosp1.getInhospid());
        serviceSubtask.setDrcode(patMedInhosp1.getDrcode());
        serviceSubtask.setDrname(patMedInhosp1.getDrname());
        serviceSubtask.setDeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setDeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeaveldeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setLeaveldeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode());
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
        if (type == 4 || type == 5) {
            //设置入院的
            serviceSubtask.setDeptcode(patMedInhosp1.getDeptcode());
            serviceSubtask.setDeptname(patMedInhosp1.getDeptname());
            serviceSubtask.setLeaveldeptcode(patMedInhosp1.getDeptcode());
            serviceSubtask.setLeaveldeptname(patMedInhosp1.getDeptname());
            serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getHospitaldistrictcode());
            serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getHospitaldistrictname());
        }
@@ -1171,7 +831,7 @@
            if (type != 4 && type != 5) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者疾病出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid());
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                //如果出院时间为空,则返回一个新对象
                return new ServiceSubtask();
            }
@@ -1232,8 +892,8 @@
        serviceSubtask.setInhospid(patMedInhosp1.getInhospid());
        serviceSubtask.setDrcode(patMedInhosp1.getDrcode());
        serviceSubtask.setDrname(patMedInhosp1.getDrname());
        serviceSubtask.setDeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setDeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeaveldeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setLeaveldeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode());
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
@@ -1271,10 +931,10 @@
        } else {
            patMedOperationItem.setOpercheckFlag("2");
            patMedOperationItem.setLongTaskReason("该患者手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId() + ";");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
            otherVisitFacade.updateOperationItem(patMedOperationItem);
//            patMedInhosp1.setDeptcheckFlag("2");
//            patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者手术出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid());
//            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
//            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            //如果出院时间为空,则返回一个新对象
            return null;
        }
@@ -1356,296 +1016,6 @@
        }
    }
    @Override
    public void addOperationSubTask(String config) {
        //            手术随访
        PatMedOperationItem pmoi = new PatMedOperationItem();
        //获取需要出院手术随访,未处理的数据
        if(!active.equals("hzszlyy")){
            pmoi.setInhospstate("1");
        }
        pmoi.setOpercheckFlag("0");
        pmoi.setMainFlag("1");
        List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi);
        log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null);
        for (PatMedOperationItem opItem : patMedOperationItems) {
            try {
                if (StringUtils.isEmpty(opItem.getOplevelcode())) {
                    continue;
                }
                // 根据患者的疾病,获取该疾病的长期任务
                List<ServiceTaskoper> serviceTaskopersDept = new ArrayList<>();
                if(StringUtils.isNotEmpty(opItem.getLeaveldeptcode())){
                    ServiceTaskoper serviceTaskoper1 = new ServiceTaskoper();
                    serviceTaskoper1.setLongtask(1L);
                    serviceTaskoper1.setOrgid(opItem.getOrgid());
                    serviceTaskoper1.setOplevelcode(opItem.getOplevelcode());
                    serviceTaskoper1.setDeptCode(opItem.getLeaveldeptcode());
                    serviceTaskopersDept = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper1);
                }
                List<ServiceTaskoper> serviceTaskopersWard = new ArrayList<>();
                if(StringUtils.isNotEmpty(opItem.getLeavehospitaldistrictcode())){
                    ServiceTaskoper serviceTaskoper2 = new ServiceTaskoper();
                    serviceTaskoper2.setLongtask(1L);
                    serviceTaskoper2.setOrgid(opItem.getOrgid());
                    serviceTaskoper2.setOplevelcode(opItem.getOplevelcode());
                    serviceTaskoper2.setWardCode(opItem.getLeavehospitaldistrictcode());
                    serviceTaskopersWard = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper2);
                }
                List<ServiceTaskoper> serviceTaskopers = new ArrayList<>();
                serviceTaskopers.addAll(serviceTaskopersDept);
                serviceTaskopers.addAll(serviceTaskopersWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                    PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId());
                    patMedOperationItem.setOpercheckFlag("2");
                    patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;");
                    patMedOperationItem.setUpdateTime(new Date());
                    patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
                } else {
                    for (ServiceTaskoper serviceTaskoper : serviceTaskopers) {
                        writeInSubTaskForOp(serviceTaskoper.getTaskId(), true, opItem, config);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员手术处理出异常了:{}", e.getMessage());
                opItem.setUpdateTime(new Date());
                opItem.setOpercheckFlag("2");
                opItem.setLongTaskReason("人员手术处理异常");
                patMedOperationItemMapper.updatePatMedOperationItem(opItem);
            }
        }
    }
    private void addIcd10SubTask(String config) {
        PatMedInhosp pmjb = new PatMedInhosp();
        //获取需要出院疾病随访,未处理的数据
        pmjb.setDiagcheckFlag("0");
        pmjb.setInhospstate("1");
        pmjb.setFuflag("1");
        List<PatMedInhosp> patMedInhospJBs = patMedInhospMapper.selectPatMedInhospList(pmjb);
        log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospJBs) ? patMedInhospJBs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospJBs) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        for (PatMedInhosp pmiJB : patMedInhospJBs) {
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiJB.getPatid());
            if (Objects.isNull(patArchive)) {
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(pmiJB);
                continue;
            }
            try {
                String errorIcd = null;
                if (StringUtils.isEmpty(pmiJB.getLeaveicd10code())) {
                    continue;
                }
                // 根据患者的疾病,获取该疾病的长期任务
                ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag();
                serviceTaskdiag.setLongtask(1L);
//                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.selectServiceTaskdiagListByIcdName(serviceTaskdiag);
                //如果部门模板为空(将deptIsNull设置为true)
                if (StringUtils.isNotEmpty(errorIcd)) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    pmiJB.setDiagcheckFlag("2");
                    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 {
                    int flag = 0;
                    for (ServiceTaskdiag serviceTaskdept1 : serviceTaskdiags) {
                        //必须科室或病区能匹配上,才可以用这个疾病创建子任务(主要处理一个疾病在多个病区或科室出现)
                        if (StringUtils.isNotEmpty(serviceTaskdept1.getDeptCode()) && serviceTaskdept1.getDeptCode().equals(pmiJB.getLeaveldeptcode())) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiJB, patArchive, 3, config);
                            flag = 1;
                        } else if (StringUtils.isNotEmpty(serviceTaskdept1.getWardCode()) && serviceTaskdept1.getWardCode().equals(pmiJB.getLeavehospitaldistrictcode())) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiJB, patArchive, 3, config);
                            flag = 1;
                        }
                    }
                    if (flag == 0) {
                        log.error("该科室或病区对于患者所患疾病未配置长期任务,患者:{}", pmiJB.getInhospid());
                        errorIcd = "该科室或病区对于患者所患疾病未配置长期任务;";
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        pmiJB.setDiagcheckFlag("2");
                        pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员疾病处理出异常了:{}", e.getMessage());
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("人员疾病处理异常");
                patMedInhospMapper.updatePatMedInhosp(pmiJB);
            }
        }
    }
    private void addWardSubTask(String config) {
        PatMedInhosp pmbq = new PatMedInhosp();
        //获取需要出院部门随访,未处理的数据
        pmbq.setWardcheckFlag("0");
        pmbq.setInhospstate("1");
        pmbq.setFuflag("1");
        List<PatMedInhosp> patMedInhospBQs = patMedInhospMapper.selectPatMedInhospList(pmbq);
        log.info("dealOutHospInfo需要处理的出院病区患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospBQs) ? patMedInhospBQs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospBQs) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        //病区数据处理
        for (PatMedInhosp pmiBQ1 : patMedInhospBQs) {
            if ("1".equals(pmiBQ1.getLeavehospitaldistrictcode()) && pmiBQ1.getDiagcheckFlag().equals("1")) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("根据交叉生成随访任务规则,病区任务可以不用生成");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                continue;
            }
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiBQ1.getPatid());
            if (Objects.isNull(patArchive)) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                continue;
            }
            try {
                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 (StringUtils.isNotEmpty(errorreason)) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiBQ1.getInhospid());
                    pmiBQ1.setWardcheckFlag("2");
                    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);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员病区处理出异常了:{}", e.getMessage());
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("人员病区处理异常");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
            }
        }
    }
    private void addDeptSubTask(String config) {
        //获取需要出院部门随访,未处理的数据
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        log.info("dealOutHospInfo需要处理的出院部门患者信息:{}", CollectionUtils.isNotEmpty(patMedInhosps) ? patMedInhosps.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        //科室
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            if ("1".equals(patMedInhosp1.getLeavehospitaldistrictcode()) && patMedInhosp1.getDiagcheckFlag().equals("1")) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("根据交叉生成随访任务规则,部门任务可以不用生成");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            try {
                //根据患者所在科室,获取该科室的长期任务
                ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                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() + "该患者所在科室未配置离院长期任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员科室处理出异常了:{}", e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("人员科室处理异常");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
    /**
     * 统一更新pat_med_inhosp的check_flag
     *
@@ -1677,7 +1047,7 @@
        if (StringUtils.isNotEmpty(remark)) {
            updateObj.setRemark(remark + " (type=" + type + ")");
        }
        patMedInhospMapper.updatePatMedInhosp(updateObj);
        inhospVisitFacade.updatePatMedInhosp(updateObj);
    }
    /**
@@ -1692,7 +1062,7 @@
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
@@ -1838,7 +1208,7 @@
                log.error("【基于规则】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("基于规则处理异常");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
@@ -1861,12 +1231,12 @@
            List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
            if (CollectionUtils.isEmpty(serviceTaskdepts)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setWardcheckFlag(patMedInhosp.getWardcheckFlag());
                patMedInhosp1.setDiagcheckFlag(patMedInhosp.getDiagcheckFlag());
                patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置离院长期任务;");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            } else {
                for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                    writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
@@ -1878,7 +1248,7 @@
            log.error("【科室任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDeptcheckFlag("2");
            patMedInhosp1.setLongTaskReason("科室任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
@@ -1909,12 +1279,12 @@
            }
            if (StringUtils.isNotEmpty(errorreason)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp1.setWardcheckFlag("2");
                patMedInhosp1.setDeptcheckFlag(patMedInhosp.getDeptcheckFlag());
                patMedInhosp1.setDiagcheckFlag(patMedInhosp.getDiagcheckFlag());
                patMedInhosp1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorreason : errorreason);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            } else {
                for (ServiceTaskdept serviceTaskdept1 : serviceTaskdeptList) {
                    writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 2, config);
@@ -1926,7 +1296,7 @@
            log.error("【病区任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setWardcheckFlag("2");
            patMedInhosp1.setLongTaskReason("病区任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
@@ -1949,10 +1319,10 @@
            if (active.equals("nhfy")) {
                serviceTaskdiag.setIcd10name(patMedInhosp1.getLeavediagname());
                if (StringUtils.isEmpty(patMedInhosp1.getLeavediagname())) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDiagcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("该患者主诊断名称为空;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    return 0;
                }
            } else {
@@ -1962,10 +1332,10 @@
            List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagMapper.selectServiceTaskdiagListByIcdName(serviceTaskdiag);
            if (CollectionUtils.isEmpty(serviceTaskdiags)) {
                PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                patMedInhosp.setDiagcheckFlag("2");
                patMedInhosp.setLongTaskReason("该患者所患疾病未配置长期任务;");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp);
            } else {
                int flag = 0;
                for (ServiceTaskdiag serviceTaskdiag1 : serviceTaskdiags) {
@@ -1981,10 +1351,10 @@
                }
                if (flag == 0) {
                    log.error("该科室或病区对于患者所患疾病未配置长期任务,患者:{}", patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp.setDiagcheckFlag("2");
                    patMedInhosp.setLongTaskReason("该科室或病区对于患者所患疾病未配置长期任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp);
                }
            }
        } catch (Exception e) {
@@ -1992,10 +1362,9 @@
            log.error("【疾病任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDiagcheckFlag("2");
            patMedInhosp1.setLongTaskReason("疾病任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
}