liusheng
8 天以前 f0a09ee996ab2605869844d6a3d812709e2bf0fa
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -1,18 +1,20 @@
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;
@@ -28,6 +30,31 @@
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.ServiceTaskmedical;
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.ServiceTaskmedicalMapper;
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;
/**
 * 患者住院记录Service业务层处理
 *
@@ -38,7 +65,13 @@
@Service
public class PatMedInhospServiceImpl implements IPatMedInhospService {
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    private InhospVisitFacade inhospVisitFacade;
    /**
     * 手术数据一律经 ruoyi-othervisit 的门面取用(跨模块数据访问原则)。
     */
    @Autowired
    private OtherVisitFacade otherVisitFacade;
    @Autowired
    private ServiceTaskdeptMapper serviceTaskdeptMapper;
    @Autowired
@@ -57,8 +90,6 @@
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private ServiceTaskmedicalMapper serviceTaskmedicalMapper;
    @Autowired
    private PatMedOperationItemMapper patMedOperationItemMapper;
    @Autowired
    private ServiceTaskRuleMapper serviceTaskRuleMapper;
@@ -83,12 +114,12 @@
     */
    @Override
    public PatMedInhosp selectPatMedInhospByInhospid(Long inhospid) {
        return patMedInhospMapper.selectPatMedInhospByInhospid(inhospid);
        return inhospVisitFacade.selectPatMedInhospByInhospid(inhospid);
    }
    @Override
    public List<PatMedInhosp> selectPatMedInhosp(PatMedInhosp patMedInhosp) {
        return patMedInhospMapper.selectPatMedInhosp(patMedInhosp);
        return inhospVisitFacade.selectPatMedInhosp(patMedInhosp);
    }
    /**
@@ -115,7 +146,7 @@
            patMedInhosp.setInhospstate("3");
        }
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        fillTagname(patMedInhospList);
        return patMedInhospList;
    }
@@ -149,7 +180,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 +236,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 +243,7 @@
     * @return
     */
    public List<PatMedInhosp> selectPatMedInhospListByCondition(PatMedInhospVO patMedInhospVO) {
        return patMedInhospMapper.selectPatMedInhospListByCondition(patMedInhospVO);
        return inhospVisitFacade.selectPatMedInhospListByCondition(patMedInhospVO);
    }
@@ -258,7 +276,7 @@
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq) {
        PatMedRes patMedRes = null;
        // 获取当前登陆人的部门权限
        patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        patMedRes = inhospVisitFacade.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
@@ -272,7 +290,7 @@
    public int insertPatMedInhosp(PatMedInhosp patMedInhosp) {
        patMedInhosp.setCreateTime(DateUtils.getNowDate());
        patMedInhosp.setUpdateTime(DateUtils.getNowDate());
        return patMedInhospMapper.insertPatMedInhosp(patMedInhosp);
        return inhospVisitFacade.insertPatMedInhosp(patMedInhosp);
    }
    /**
@@ -284,7 +302,7 @@
    @Override
    public int updatePatMedInhosp(PatMedInhosp patMedInhosp) {
        patMedInhosp.setUpdateTime(DateUtils.getNowDate());
        return patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
        return inhospVisitFacade.updatePatMedInhosp(patMedInhosp);
    }
    /**
@@ -295,7 +313,7 @@
     */
    @Override
    public int deletePatMedInhospByInhospids(Long[] inhospids) {
        return patMedInhospMapper.deletePatMedInhospByInhospids(inhospids);
        return inhospVisitFacade.deletePatMedInhospByInhospids(inhospids);
    }
    /**
@@ -306,7 +324,7 @@
     */
    @Override
    public int deletePatMedInhospByInhospid(Long inhospid) {
        return patMedInhospMapper.deletePatMedInhospByInhospid(inhospid);
        return inhospVisitFacade.deletePatMedInhospByInhospid(inhospid);
    }
    /**
@@ -317,7 +335,7 @@
     */
    @Override
    public int deletePatMedInhospByInhospno(String inhospno) {
        return patMedInhospMapper.deletePatMedInhospByInhospno(inhospno);
        return inhospVisitFacade.deletePatMedInhospByInhospno(inhospno);
    }
    @Override
@@ -326,7 +344,7 @@
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        List<PatMedInhosp> patMedInhosps = inhospVisitFacade.selectPatMedInhospList(pmks);
        //1.入院宣教
        String helibrarySwitch = iSysConfigService.selectConfigByKey("in.helibrary.switch");
@@ -339,7 +357,7 @@
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                try {
@@ -353,10 +371,10 @@
                    List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                        PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                        patMedInhosp1.setInDeptcheckFlag("2");
                        patMedInhosp1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + "该患者所在科室未配置入院长期宣教任务;" : "该患者所在科室未配置入院长期宣教任务;");
                        patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                        inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    } else {
                        for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 4, config);
@@ -367,7 +385,7 @@
                    log.error("人员入院科室处理出异常了:{}", e.getMessage());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                }
            }
@@ -376,14 +394,14 @@
            pmks.setInDeptcheckFlag(null);
            pmks.setInWardcheckFlag("0");
            pmks.setDeptcheckFlag(null);
            List<PatMedInhosp> inPatMedInhospsWard = patMedInhospMapper.selectPatMedInhospList(pmks);
            List<PatMedInhosp> inPatMedInhospsWard = inhospVisitFacade.selectPatMedInhospList(pmks);
            for (PatMedInhosp patMedInhosp1 : inPatMedInhospsWard) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                //根据患者所在病区,获取该病区的入院长期宣教任务(会出现一个问题,科室和病区发的同一个模板)
@@ -396,10 +414,10 @@
                List<ServiceTaskdept> serviceTaskWardList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskWardList) || serviceTaskWardList.size() == 0) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在病区未配置入院长期宣教任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskWardList) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 5, config);
@@ -455,7 +473,7 @@
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setDeptcheckFlag("0");
        patMedInhosp.setInhospstate("0");
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        if (CollectionUtils.isNotEmpty(patMedInhospList) && patMedInhospList.size() > 0) {
            dealInHospInfo(patMedInhospList);
        }
@@ -524,7 +542,7 @@
                            patMedInhospVo.setLeaveldeptcodes(deptCodeList);
                            patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList);
                            patMedInhospVo.setIcd10codeList(icd10CodeList);
                            List<PatMedInhosp> patList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo);
                            List<PatMedInhosp> patList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo);
                            log.info("dealOutHospInfoBySchedule 任务组随访, taskid = {}, 扫描患者人数 {}", serviceTask.getTaskid(), patList.size());
                            for (PatMedInhosp patMedInhosp : patList) {
@@ -554,7 +572,7 @@
                                PatMedInhosp flagUpd = new PatMedInhosp();
                                flagUpd.setInhospid(patMedInhosp.getInhospid());
                                flagUpd.setScheduleCheckFlag("1");
                                patMedInhospMapper.updatePatMedInhosp(flagUpd);
                                inhospVisitFacade.updatePatMedInhosp(flagUpd);
                            }
                        } else {
                            //任务组 - 手术随访
@@ -566,7 +584,9 @@
                                pmoi.setDeptCodes(deptCodeList);
                                pmoi.setWardCodes(wardCodeList);
                                pmoi.setOpLevelCodes(opLevelCodeList);
                                List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi);
                                //每次查询只查最大的手术等级记录
                                List<PatMedOperationItem> patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi);
                                for (PatMedOperationItem patMedOperationItem : patMedOperationItems) {
                                    PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperationItem.getPatid());
                                    if (Objects.isNull(patArchive)) {
@@ -577,7 +597,7 @@
                                    patMedInhospVo.setScheduleCheckFlag("0");
                                    patMedInhospVo.setInhospstate("1");
                                    patMedInhospVo.setFuflag("1");
                                    List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo);
                                    List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo);
                                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                                        ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                                        scheduleDetailVo.setTaskid(serviceTask.getTaskid());
@@ -599,7 +619,7 @@
                                        PatMedInhosp flagUpd = new PatMedInhosp();
                                        flagUpd.setInhospid(patMedInhospList.get(0).getInhospid());
                                        flagUpd.setScheduleCheckFlag("1");
                                        patMedInhospMapper.updatePatMedInhosp(flagUpd);
                                        inhospVisitFacade.updatePatMedInhosp(flagUpd);
                                    }
                                }
                            }
@@ -626,9 +646,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 +711,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 +901,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 +913,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 +925,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 +952,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 +975,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 +1050,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 +1059,7 @@
                patMedOperationItem2.setOpercheckFlag("2");
                patMedOperationItem2.setLongTaskReason("生成子任务失败 4;");
                patMedOperationItem2.setUpdateTime(new Date());
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
                otherVisitFacade.updateOperationItem(patMedOperationItem2);
            }
        } catch (Exception e) {
            //出错回滚事务
@@ -1051,7 +1071,7 @@
            patMedOperationItem2.setOpercheckFlag("2");
            patMedOperationItem2.setUpdateTime(new Date());
            patMedOperationItem2.setLongTaskReason("生成子任务报错回滚 4;");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            otherVisitFacade.updateOperationItem(patMedOperationItem2);
            e.printStackTrace();
        }
    }
@@ -1171,7 +1191,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();
            }
@@ -1271,10 +1291,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;
        }
@@ -1367,7 +1387,8 @@
        pmoi.setOpercheckFlag("0");
        pmoi.setMainFlag("1");
        List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi);
        //每次查询只查最大的手术等级记录
        List<PatMedOperationItem> patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi);
        log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null);
        for (PatMedOperationItem opItem : patMedOperationItems) {
@@ -1404,11 +1425,11 @@
                serviceTaskopers.addAll(serviceTaskopersWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                    PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId());
                    PatMedOperationItem patMedOperationItem = otherVisitFacade.selectOperationItemById(opItem.getId());
                    patMedOperationItem.setOpercheckFlag("2");
                    patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;");
                    patMedOperationItem.setUpdateTime(new Date());
                    patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
                    otherVisitFacade.updateOperationItem(patMedOperationItem);
                } else {
                    for (ServiceTaskoper serviceTaskoper : serviceTaskopers) {
                        writeInSubTaskForOp(serviceTaskoper.getTaskId(), true, opItem, config);
@@ -1421,7 +1442,7 @@
                opItem.setUpdateTime(new Date());
                opItem.setOpercheckFlag("2");
                opItem.setLongTaskReason("人员手术处理异常");
                patMedOperationItemMapper.updatePatMedOperationItem(opItem);
                otherVisitFacade.updateOperationItem(opItem);
            }
        }
    }
@@ -1432,10 +1453,10 @@
        pmjb.setDiagcheckFlag("0");
        pmjb.setInhospstate("1");
        pmjb.setFuflag("1");
        List<PatMedInhosp> patMedInhospJBs = patMedInhospMapper.selectPatMedInhospList(pmjb);
        List<PatMedInhosp> patMedInhospJBs = inhospVisitFacade.selectPatMedInhospList(pmjb);
        log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospJBs) ? patMedInhospJBs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospJBs) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
@@ -1445,7 +1466,7 @@
            if (Objects.isNull(patArchive)) {
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(pmiJB);
                inhospVisitFacade.updatePatMedInhosp(pmiJB);
                continue;
            }
            try {
@@ -1474,16 +1495,16 @@
                //如果部门模板为空(将deptIsNull设置为true)
                if (StringUtils.isNotEmpty(errorIcd)) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    pmiJB.setDiagcheckFlag("2");
                    pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                    patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    inhospVisitFacade.updatePatMedInhosp(pmiJB);
                } else if (CollectionUtils.isEmpty(serviceTaskdiags)) {
                    errorIcd = "该患者所患疾病未配置长期任务;";
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    pmiJB.setDiagcheckFlag("2");
                    pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                    patMedInhospMapper.updatePatMedInhosp(pmiJB);
                    inhospVisitFacade.updatePatMedInhosp(pmiJB);
                } else {
                    int flag = 0;
                    for (ServiceTaskdiag serviceTaskdept1 : serviceTaskdiags) {
@@ -1499,10 +1520,10 @@
                    if (flag == 0) {
                        log.error("该科室或病区对于患者所患疾病未配置长期任务,患者:{}", pmiJB.getInhospid());
                        errorIcd = "该科室或病区对于患者所患疾病未配置长期任务;";
                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        pmiJB.setDiagcheckFlag("2");
                        pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                        patMedInhospMapper.updatePatMedInhosp(pmiJB);
                        inhospVisitFacade.updatePatMedInhosp(pmiJB);
                    }
                }
@@ -1512,7 +1533,7 @@
                log.error("人员疾病处理出异常了:{}", e.getMessage());
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("人员疾病处理异常");
                patMedInhospMapper.updatePatMedInhosp(pmiJB);
                inhospVisitFacade.updatePatMedInhosp(pmiJB);
            }
        }
    }
@@ -1523,10 +1544,10 @@
        pmbq.setWardcheckFlag("0");
        pmbq.setInhospstate("1");
        pmbq.setFuflag("1");
        List<PatMedInhosp> patMedInhospBQs = patMedInhospMapper.selectPatMedInhospList(pmbq);
        List<PatMedInhosp> patMedInhospBQs = inhospVisitFacade.selectPatMedInhospList(pmbq);
        log.info("dealOutHospInfo需要处理的出院病区患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospBQs) ? patMedInhospBQs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospBQs) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
@@ -1535,7 +1556,7 @@
            if ("1".equals(pmiBQ1.getLeavehospitaldistrictcode()) && pmiBQ1.getDiagcheckFlag().equals("1")) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("根据交叉生成随访任务规则,病区任务可以不用生成");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                continue;
            }
@@ -1544,7 +1565,7 @@
            if (Objects.isNull(patArchive)) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                continue;
            }
            try {
@@ -1566,10 +1587,10 @@
                }
                //如果部门模板为空(将deptIsNull设置为true)
                if (StringUtils.isNotEmpty(errorreason)) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiBQ1.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiBQ1.getInhospid());
                    pmiBQ1.setWardcheckFlag("2");
                    pmiBQ1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorreason : errorreason);
                    patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                    inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdeptList) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiBQ1, patArchive, 2, config);
@@ -1581,7 +1602,7 @@
                log.error("人员病区处理出异常了:{}", e.getMessage());
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("人员病区处理异常");
                patMedInhospMapper.updatePatMedInhosp(pmiBQ1);
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
            }
        }
    }
@@ -1592,10 +1613,10 @@
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        List<PatMedInhosp> patMedInhosps = inhospVisitFacade.selectPatMedInhospList(pmks);
        log.info("dealOutHospInfo需要处理的出院部门患者信息:{}", CollectionUtils.isNotEmpty(patMedInhosps) ? patMedInhosps.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
@@ -1604,7 +1625,7 @@
            if ("1".equals(patMedInhosp1.getLeavehospitaldistrictcode()) && patMedInhosp1.getDiagcheckFlag().equals("1")) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("根据交叉生成随访任务规则,部门任务可以不用生成");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            //获取患者信息
@@ -1612,7 +1633,7 @@
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            try {
@@ -1626,10 +1647,10 @@
                List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                    PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置离院长期任务;");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
@@ -1641,7 +1662,7 @@
                log.error("人员科室处理出异常了:{}", e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("人员科室处理异常");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
@@ -1677,7 +1698,7 @@
        if (StringUtils.isNotEmpty(remark)) {
            updateObj.setRemark(remark + " (type=" + type + ")");
        }
        patMedInhospMapper.updatePatMedInhosp(updateObj);
        inhospVisitFacade.updatePatMedInhosp(updateObj);
    }
    /**
@@ -1692,7 +1713,7 @@
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
@@ -1838,7 +1859,7 @@
                log.error("【基于规则】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("基于规则处理异常");
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
@@ -1861,12 +1882,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 +1899,7 @@
            log.error("【科室任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDeptcheckFlag("2");
            patMedInhosp1.setLongTaskReason("科室任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
@@ -1909,12 +1930,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 +1947,7 @@
            log.error("【病区任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setWardcheckFlag("2");
            patMedInhosp1.setLongTaskReason("病区任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
@@ -1949,10 +1970,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 +1983,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 +2002,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 +2013,52 @@
            log.error("【疾病任务】患者{}处理异常:{}", patMedInhosp1.getInhospid(), e.getMessage());
            patMedInhosp1.setDiagcheckFlag("2");
            patMedInhosp1.setLongTaskReason("疾病任务处理异常");
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
    // ==========================================================================
    // 出入院随访模块化(第一批)—— 3 个过渡期入口(纯转发,零业务逻辑)
    //
    // ⚠️ 这 3 个方法是刻意新增的,不是误加:
    //    见 IPatMedInhospService 里同名的接口声明注释,以及
    //    sql/_probe/verify_step16_service_restore.py 的 expected_added 断言。
    // ==========================================================================
    /**
     * 【过渡期用】手术随访扫描 —— 与 {@link #addOperationSubTask(String)} 完全等价。
     * <p>
     * ⚠️ {@code addOperationSubTask} 原实现返回 {@code void},所以这里按"处理了 1 轮"返回 1,
     * 仅用于日志;<b>调用方不得依赖该返回值的业务含义</b>。
     */
    @Override
    public int runOperationVisit(String config) {
        addOperationSubTask(config);
        return 1;
    }
    /**
     * 【过渡期用】科室维度未处理的在院患者。
     * <p>
     * 条件与原 {@code dealOutHospInfo} 第一段查询逐字一致:
     * {@code deptcheckFlag="0"} + {@code inhospstate="1"} + {@code fuflag="1"}。
     */
    @Override
    public List<PatMedInhosp> selectPendingDeptPatientsForVisit() {
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        return inhospVisitFacade.selectPatMedInhospList(pmks);
    }
    /**
     * 【过渡期用】把一条已组装好的子任务落库(原 {@code serviceSubtaskMapper.insertServiceSubtask})。
     */
    @Override
    public boolean persistSubtask(ServiceSubtask serviceSubtask) {
        return serviceSubtaskMapper.insertServiceSubtask(serviceSubtask) == 1;
    }
}