陈昶聿
4 天以前 2dde489e34f6116e6cc63f85baf24d3c546d1763
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -11,6 +11,7 @@
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.smartor.mapper.*;
import com.smartor.service.IPatMedInhospService;
@@ -55,7 +56,7 @@
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private PatMedOperationMapper patMedOperationMapper;
    private ServiceTaskmedicalMapper serviceTaskmedicalMapper;
    @Autowired
    private PatMedOperationItemMapper patMedOperationItemMapper;
    @Autowired
@@ -118,6 +119,24 @@
            patMedInhosp1.setTagname(tagname);
        }
        return patMedInhospList;
    }
    @Override
    public List<PatMedInhospDTO> selectPatMedInhospByApplication(PatMedInhosp patMedInhosp) {
        List<PatMedInhosp> patMedInhosps = selectPatMedInhospList(patMedInhosp);
        if (!org.springframework.util.CollectionUtils.isEmpty(patMedInhosps)) {
            return null;
        }
        List<PatMedInhospDTO> patMedInhospDTOList = DtoConversionUtils.sourceToTarget(patMedInhosps, PatMedInhospDTO.class);
        for (PatMedInhospDTO pmd : patMedInhospDTOList) {
            ServiceSubtaskEntity serviceSubtask = new ServiceSubtaskEntity();
            serviceSubtask.setServiceType("4");
            serviceSubtask.setInhospid(pmd.getInhospid());
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtask);
            if (CollectionUtils.isNotEmpty(serviceSubtasks)) pmd.setFinishFlag("1");
        }
        return patMedInhospDTOList;
    }
    @Override
@@ -237,17 +256,18 @@
    @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)) {
            PatMedInhosp inhosp = new PatMedInhosp();
            inhosp.setInDeptcheckFlag("0");
            inhosp.setInhospstate("0");
            inhosp.setFuflag("1");
            List<PatMedInhosp> inPatMedInhosps = patMedInhospMapper.selectPatMedInhospList(inhosp);
            //1.1 科室
            for (PatMedInhosp patMedInhosp1 : inPatMedInhosps) {
            for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
@@ -287,9 +307,10 @@
            //1.2 病区
            inhosp.setInDeptcheckFlag(null);
            inhosp.setInWardcheckFlag("0");
            List<PatMedInhosp> inPatMedInhospsWard = patMedInhospMapper.selectPatMedInhospList(inhosp);
            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());
@@ -321,9 +342,42 @@
            }
        }
        //2.出院随访 - 基于规则的任务生成
        addSubTaskByRule(config);
        //根据患者所在病区,获取该病区的长期任务,新华医院可以先不用根据病区和疾病来做
        //2.药品宣教
        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.setMedicalName(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());
                        writeInSubTask(serviceTaskmedicals.get(0).getTaskId(), false, patMedInhosp, patArchive, 0, config);
                    }
                    //查不到的药品就是不需要宣教的,就不管了
                }
            }
        }
        //3.出院随访 - 基于规则的任务生成
        // 获取所有需要处理的出院患者(科室维度未处理)
        addSubTaskByRule(config, patMedInhosps);
        if (!active.equals("xh")) {
            addOperationSubTask(config);
        }
@@ -551,7 +605,7 @@
     * @param check         是否需要校验
     * @param patMedInhosp1 病人出入院信息
     * @param patArchive    病人信息
     * @param type          随访类型(1-科室,2-病区,3-疾病 4-入院科室 5-入院病区)
     * @param type          随访类型(0-宣教,1-科室,2-病区,3-疾病 4-入院科室 5-入院病区)
     * @param config        配置信息 visit.early.day
     */
    //将患者放到subtask中
@@ -832,12 +886,12 @@
        if (ObjectUtils.isEmpty(serviceSubtask)) {
            return;
        }
        if(StringUtils.isNotEmpty(patMedOperationItem.getDeptcode())){
            serviceSubtask.setVisitDeptCode(patMedOperationItem.getDeptcode());
            serviceSubtask.setVisitDeptName(patMedOperationItem.getDeptname());
        }else {
            serviceSubtask.setVisitDeptCode(patMedOperationItem.getHospitaldistrictcode());
            serviceSubtask.setVisitDeptName(patMedOperationItem.getHospitaldistrictname());
        if (StringUtils.isNotEmpty(patMedOperationItem.getLeaveldeptcode())) {
            serviceSubtask.setVisitDeptCode(patMedOperationItem.getLeaveldeptcode());
            serviceSubtask.setVisitDeptName(patMedOperationItem.getLeaveldeptname());
        } else {
            serviceSubtask.setVisitDeptCode(patMedOperationItem.getLeavehospitaldistrictcode());
            serviceSubtask.setVisitDeptName(patMedOperationItem.getLeavehospitaldistrictname());
        }
        //记录insertServiceSubtask语句返回状态
        Integer i = 0;
@@ -956,7 +1010,8 @@
    //封装serviceSubtask
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type) {
    @Override
    public ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type) {
        //增加serviceTask判空
//        if(Objects.isNull(serviceTask)){
//            return null;
@@ -994,6 +1049,7 @@
        serviceSubtask.setSex(patArchive.getSex());
        serviceSubtask.setAge(patArchive.getAge());
        serviceSubtask.setSendstate(2L);
        serviceSubtask.setCampusid(patMedInhosp1.getCampusid());
        serviceSubtask.setManagementDoctor(patMedInhosp1.getManagementDoctor());
        serviceSubtask.setManagementDoctorCode(patMedInhosp1.getManagementDoctorCode());
        serviceSubtask.setStarttime(patMedInhosp1.getStarttime());
@@ -1224,8 +1280,11 @@
                serviceTaskoper.setOplevelcode(opItem.getOplevelcode());
                //根据科室、病区过滤
                serviceTaskoper.setDeptCode(opItem.getDeptcode());
                serviceTaskoper.setWardCode(opItem.getHospitaldistrictcode());
                if(StringUtils.isNotEmpty(opItem.getLeaveldeptcode())){
                    serviceTaskoper.setDeptCode(opItem.getLeaveldeptcode());
                }else {
                    serviceTaskoper.setWardCode(opItem.getLeavehospitaldistrictcode());
                }
                List<ServiceTaskoper> serviceTaskopers = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper);
                //如果部门模板为空(将deptIsNull设置为true)
@@ -1509,15 +1568,7 @@
     * 根据患者离院科室或病区查询service_task_rule,获取deptRule、wradRule、diagRule
     * 根据规则值决定调用哪个方法生成随访任务
     */
    private void addSubTaskByRule(String config) {
        // 获取所有需要处理的出院患者(科室维度未处理)
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
        log.info("【基于规则】需要处理的出院患者信息:{}", CollectionUtils.isNotEmpty(patMedInhosps) ? patMedInhosps.size() : null);
    private void addSubTaskByRule(String config, List<PatMedInhosp> patMedInhosps) {
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            // 获取患者基本信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());