liusheng
2025-09-29 55f5271f893a25a7be671b24938e49976936a67b
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -1,5 +1,8 @@
package com.smartor.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
@@ -14,6 +17,8 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@@ -44,7 +49,7 @@
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Value("${visitHosp}")
    private Integer visitHosp;
@@ -74,6 +79,19 @@
            patMedInhosp1.setTagname(tagname);
        }
        return patMedInhospList;
    }
    @Override
    public Map<String, Integer> queryPersonCount(PatServiceCount patServiceCount) {
        if (patServiceCount.getInterval() == 1) {
            //周
        } else if (patServiceCount.getInterval() == 2) {
            //月
        } else if (patServiceCount.getInterval() == 3) {
            //年
        }
        return null;
    }
    /**
@@ -117,15 +135,16 @@
        PatMedRes patMedRes = null;
        // 获取当前登陆人的部门权限
        if (org.springframework.util.CollectionUtils.isEmpty(patMedReq.getDeptcodeList())) {
            Long userId = SecurityUtils.getUserId();
            List<SysDept> sysDepts = sysUserDeptMapper.selectDeptListByUserId(userId);
            List<String> deptCode = new ArrayList<>();
            for (SysDept sysDept : sysDepts) {
                deptCode.add(sysDept.getDeptId().toString());
            }
            patMedReq.setDeptcodeList(deptCode);
            patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
//            Long userId = SecurityUtils.getUserId();
//            List<SysDept> sysDepts = sysUserDeptMapper.selectDeptListByUserId(userId);
//            List<String> deptCode = new ArrayList<>();
//            for (SysDept sysDept : sysDepts) {
//                deptCode.add(sysDept.getDeptId().toString());
//            }
//            patMedReq.setDeptcodeList(deptCode);
//            patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        }
        patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
@@ -196,7 +215,7 @@
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        log.error("dealOutHospInfo需要处理的出院部门患者信息:{}", patMedInhosps);
        log.info("dealOutHospInfo需要处理的出院部门患者信息:{}", patMedInhosps);
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
@@ -249,7 +268,7 @@
            pmbq.setInhospstate("1");
            pmbq.setFuflag("1");
            List<PatMedInhosp> patMedInhospBQs = patMedInhospMapper.selectPatMedInhospList(pmbq);
            log.error("dealOutHospInfo需要处理的出院病区患者信息:{}", patMedInhosps);
            log.info("dealOutHospInfo需要处理的出院病区患者信息:{}", patMedInhosps);
            for (PatMedInhosp patMedInhosp1 : patMedInhospBQs) {
                String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
                patMedInhosp1.setTagname(tagname);
@@ -299,7 +318,7 @@
            pmjb.setInhospstate("1");
            pmjb.setFuflag("1");
            List<PatMedInhosp> patMedInhospJBs = patMedInhospMapper.selectPatMedInhospList(pmjb);
            log.error("dealOutHospInfo需要处理的出院疾病患者信息:{}", patMedInhosps);
            log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", patMedInhosps);
            for (PatMedInhosp patMedInhosp1 : patMedInhospJBs) {
                String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
                patMedInhosp1.setTagname(tagname);
@@ -469,7 +488,7 @@
    @Override
    public List<PatMedRes> getDeptRanking(PatMedReq patMedReq) {
        return patMedInhospMapper.getDeptRanking(patMedReq);
        return serviceSubtaskMapper.getDeptRanking(patMedReq);
    }
    @Override
@@ -524,16 +543,36 @@
        st.setTaskid(taskid);
        st.setSendState(2L);
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
        if (CollectionUtils.isEmpty(serviceTasks)) {
            log.error("该患者出院随访长期任务不存在,任务ID为:{}", taskid);
        if (CollectionUtils.isEmpty(serviceTasks) && type == 1) {
            log.info("该患者出院随访长期任务不存在,任务ID为:{}", taskid);
            patMedInhosp1.setDeptcheckFlag("2");
            patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者出院随访长期任务不存在,任务ID为:" + taskid);
            patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院科室长期任务不存在,任务ID为:" + taskid);
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            return;
        } else if (CollectionUtils.isEmpty(serviceTasks) && type == 2) {
            patMedInhosp1.setWardcheckFlag("2");
            patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者离院病区长期任务不存在,任务ID为:" + taskid);
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            return;
        } else if (CollectionUtils.isEmpty(serviceTasks) && type == 3) {
            patMedInhosp1.setDiagcheckFlag("2");
            patMedInhosp1.setLongTaskReason(longTaskReason + " & 该患者疾病长期任务不存在,任务ID为:" + taskid);
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            return;
        }
        ServiceTask serviceTask = serviceTasks.get(0);
        //封装serviceSubtask
        ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp1, patArchive);
        if (type != 2) {
            //科室和疾病 都用 科室填充
            serviceSubtask.setVisitDeptCode(patMedInhosp1.getLeaveldeptcode());
            serviceSubtask.setVisitDeptName(patMedInhosp1.getLeaveldeptname());
        } else if (type == 2) {
            serviceSubtask.setVisitDeptCode(patMedInhosp1.getLeavehospitaldistrictcode());
            serviceSubtask.setVisitDeptName(patMedInhosp1.getLeavehospitaldistrictname());
        }
        Integer i = 0;
        //先判断一下,是否需要校验
        if (check) {
@@ -543,7 +582,7 @@
            subtask.setSendstate(2L);
            subtask.setTaskid(taskid);
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
            log.error("该患者待执行的任务:{}", selectServiceSubtaskList);
            log.info("该患者待执行的任务:{}", selectServiceSubtaskList);
            if (CollectionUtils.isNotEmpty(selectServiceSubtaskList) && selectServiceSubtaskList.size() > 0) {
                for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) {
                    if (Objects.isNull(serviceSubtask1.getLongSendTime())) {
@@ -557,7 +596,7 @@
                            serviceSubtask1.setSendstate(4L);
                            serviceSubtask1.setRemark("患者再入院");
                            serviceSubtask1.setResult("error");
                            serviceSubtask1.setFinishtime(new Date());
//                            serviceSubtask1.setFinishtime(new Date());
                            serviceSubtask1.setUpdateBy(serviceTask.getUpdateBy());
                            serviceSubtask1.setUpdateTime(new Date());
                            Boolean aBoolean = serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
@@ -565,7 +604,7 @@
                        } else {
                            //相反,则将当有的数据停掉
                            serviceSubtask.setResult("error");
                            serviceSubtask.setFinishtime(new Date());
//                            serviceSubtask.setFinishtime(new Date());
                            serviceSubtask.setSendstate(4L);
                            serviceSubtask.setRemark("当前患者出院时间后有待执行的出院随访长期任务");
                            serviceSubtask.setCreateBy(serviceTask.getCreateBy());
@@ -578,36 +617,22 @@
                        serviceSubtask1.setSendstate(4L);
                        serviceSubtask1.setRemark("疾病患者再入院");
                        serviceSubtask1.setResult("error");
                        serviceSubtask1.setFinishtime(new Date());
//                        serviceSubtask1.setFinishtime(new Date());
                        serviceSubtask1.setUpdateBy(serviceTask.getUpdateBy());
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                        //重新新增子任务
                        i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                        //这里需要全失败
                        addServiceSubtaskPreachform(serviceSubtask, "5");
                    }
                }
            } else {
                if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                    serviceSubtask.setRemark("手机号为空");
                    serviceSubtask.setSendstate(4L);
                    serviceSubtask.setResult("error");
                    serviceSubtask.setFinishtime(new Date());
                }
                serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                serviceSubtask.setCreateTime(new Date());
                i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            }
        } else {
            if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                serviceSubtask.setRemark("手机号为空");
                serviceSubtask.setSendstate(4L);
                serviceSubtask.setResult("error");
                serviceSubtask.setFinishtime(new Date());
            }
            serviceSubtask.setCreateBy(serviceTask.getCreateBy());
            serviceSubtask.setCreateTime(new Date());
            i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            addServiceSubtaskPreachform(serviceSubtask, null);
        }
        if (i == 1) {
            //将check_flag改成1(已处理)
@@ -620,7 +645,7 @@
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
        } else {
            //生成子任务失败,
            log.error("生成子任务失败serviceSubtask为:{}", serviceSubtask);
            log.info("生成子任务失败serviceSubtask为:{}", serviceSubtask);
            PatMedInhosp patMedInhosp2 = new PatMedInhosp();
            patMedInhosp2.setInhospid(patMedInhosp1.getInhospid());
            if (type == 1) patMedInhosp2.setDeptcheckFlag("2");
@@ -630,6 +655,36 @@
            patMedInhospMapper.updatePatMedInhosp(patMedInhosp2);
        }
    }
    private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) {
        //将preachform的json对象,放到list集合中
        String preachform = serviceSubtask.getPreachform();
        ObjectMapper objectMapper = new ObjectMapper();
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(preachform)) {
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = null;
            try {
                serviceSubtaskPreachformList = objectMapper.readValue(preachform, new TypeReference<List<ServiceSubtaskPreachform>>() {
                });
            } catch (JsonProcessingException e) {
                log.error("preachform转List<ServiceSubtaskPreachform>报错了:{}", e.getMessage());
            }
            for (ServiceSubtaskPreachform serviceSubtaskPreachform : serviceSubtaskPreachformList) {
                serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
                serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
                //这个sendstate需要在数据库设置一个默认值为“1”
                serviceSubtaskPreachform.setSendstate("1");
                if (StringUtils.isNotEmpty(sendstate)) serviceSubtaskPreachform.setSendstate(sendstate);
                serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
                return serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
            }
        }
        return 0;
    }
    //封装serviceSubtask
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive) {
@@ -644,6 +699,8 @@
        serviceSubtask.setDrname(patMedInhosp1.getDrname());
        serviceSubtask.setDeptcode(patMedInhosp1.getLeaveldeptcode());
        serviceSubtask.setDeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code());
        serviceSubtask.setLeavediagname(patMedInhosp1.getDiagname());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());
        serviceSubtask.setPatid(patArchive.getId());
@@ -654,6 +711,8 @@
        serviceSubtask.setSex(patArchive.getSex());
        serviceSubtask.setAge(patArchive.getAge());
        serviceSubtask.setSendstate(2L);
        serviceSubtask.setManagementDoctor(patMedInhosp1.getManagementDoctor());
        serviceSubtask.setManagementDoctorCode(patMedInhosp1.getManagementDoctorCode());
        serviceSubtask.setStarttime(patMedInhosp1.getStarttime());
        serviceSubtask.setEndtime(patMedInhosp1.getEndtime());
        serviceSubtask.setServiceType(serviceTask.getServiceType());
@@ -670,16 +729,40 @@
        if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L);
        Date newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue());
        serviceSubtask.setLongSendTime(newDate);
        serviceSubtask.setVisitTime(newDate);
        //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中)
        if ("3".equals(serviceTask.getType())) {
            serviceSubtask.setVisitTime(minusDay(newDate, 2));
        }
        //患者发送时间
        if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
            String remark = patArchive.getNotrequiredreason();
            serviceSubtask.setRemark(remark);
            serviceSubtask.setResult("error");
            serviceSubtask.setFinishtime(new Date());
            //不执行
            serviceSubtask.setSendstate(4L);
        }
        return serviceSubtask;
    }
    /**
     * 减去相应天数
     *
     * @param originalDate
     * @param day
     * @return
     */
    public Date minusDay(Date originalDate, Integer day) {
        // 1. 将 Date 转换为 Instant
        Instant instant = originalDate.toInstant();
        // 2. 在 Instant 上减去2天
        Instant twoDaysAgoInstant = instant.minus(2, ChronoUnit.DAYS);
        // 3. 将计算后的 Instant 转回 Date
        return Date.from(twoDaysAgoInstant);
    }
    //处理入院信息
@@ -691,7 +774,7 @@
                subtask.setPatid(patMedInhosp1.getPatid());
                subtask.setSendstate(2L);
                List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
                log.error("入院的患者待执行的任务:{}", selectServiceSubtaskList);
//                log.error("入院的患者待执行的任务:{}", selectServiceSubtaskList);
                if (CollectionUtils.isNotEmpty(selectServiceSubtaskList) && selectServiceSubtaskList.size() > 0) {
                    for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) {
                        if (Objects.isNull(serviceSubtask1.getLongSendTime())) {
@@ -700,11 +783,11 @@
                        }
                        if (serviceSubtask1.getEndtime().before(patMedInhosp1.getStarttime())) {
                            //如果当前循环的子任务的出院时间在“准备新增的子任务”的出院时间之前,则将循环的子任务停掉
                            log.error("患者再入院的serviceSubtask1为:{}", serviceSubtask1);
//                            log.error("患者再入院的serviceSubtask1为:{}", serviceSubtask1);
                            serviceSubtask1.setSendstate(4L);
                            serviceSubtask1.setRemark("患者再入院");
                            serviceSubtask1.setResult("error");
                            serviceSubtask1.setFinishtime(new Date());
//                            serviceSubtask1.setFinishtime(new Date());
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                        }
                    }