陈昶聿
4 天以前 9b27e22beac4f247f0a703f1e8a8bb661dbc31f3
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -448,7 +448,7 @@
            if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
                if (StringUtils.isNotEmpty(serviceSubtask.getPreachform())) {
                    //默认取第一个
                    serviceSubtaskRes.setCurrentPreachform(serviceSubtask.getPreachform().split(",")[0]);
                    serviceSubtaskRes.setCurrentPreachform(serviceSubtask.getPreachform().split(",")[0].trim());
                }
            }
            PatMedInhosp inhosp = patMedInhospMapper.selectPatMedInhospByInhospid(serviceSubtask.getInhospid());
@@ -1312,6 +1312,20 @@
    }
    /**
     * 科室编码去重,保持原顺序,避免 service_task.deptcode 超长和 service_taskdept 重复绑定
     */
    private String normalizeDeptCodes(String deptCodes) {
        if (StringUtils.isEmpty(deptCodes)) {
            return deptCodes;
        }
        return Arrays.stream(deptCodes.split(","))
                .map(String::trim)
                .filter(code -> StringUtils.isNotEmpty(code))
                .distinct()
                .collect(Collectors.joining(","));
    }
    /**
     * 单一任务
     *
     * @return 结果
@@ -1323,6 +1337,8 @@
            log.info("任务入参为空,请检查入参");
            throw new BaseException("任务入参为空,请检查入参");
        }
        // 科室编码去重,避免 service_task.deptcode 超长及 service_taskdept 重复绑定
        serviceTaskVO.setDeptcode(normalizeDeptCodes(serviceTaskVO.getDeptcode()));
        ServiceTask serviceTask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceTask.class);
        if (CollectionUtils.isEmpty(serviceTaskVO.getPreachformList())) throw new BaseException("任务的发送方式为空");
        //将preachfromList放到serviceTask中的preachfrom中
@@ -1557,7 +1573,12 @@
                    serviceSubtask.setInhospid(patTaskRelevance.getHospid());
                    //新建完成就是待发送状态
                    serviceSubtask.setSendstate(2L);
                    serviceSubtask.setDeptcode(StringUtils.isNotEmpty(patTaskRelevance.getDeptcode()) ? patTaskRelevance.getDeptcode() : serviceTaskVO.getDeptcode());
                    String subtaskDeptCode = patTaskRelevance.getDeptcode();
                    if (StringUtils.isEmpty(subtaskDeptCode) && StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) {
                        // service_subtask.deptcode 为单值字段,不能写入任务的多科室拼接串,取第一个科室兜底
                        subtaskDeptCode = serviceTaskVO.getDeptcode().split(",")[0].trim();
                    }
                    serviceSubtask.setDeptcode(subtaskDeptCode);
                    serviceSubtask.setDeptname(StringUtils.isNotEmpty(patTaskRelevance.getDeptName()) ? patTaskRelevance.getDeptName() : serviceTaskVO.getDeptname());
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
                    serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
@@ -1697,6 +1718,11 @@
            if (StringUtils.isNotEmpty(serviceTaskVO.getAppltype())) {
                if (serviceTaskVO.getAppltype().equals("1") || serviceTaskVO.getAppltype().equals("2")) {
                    if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) {
                        // 修改任务时先软删除旧的科室绑定,避免旧科室残留
                        ServiceTaskdept oldDept = new ServiceTaskdept();
                        oldDept.setTaskId(serviceTask.getTaskid());
                        oldDept.setDeptType("1");
                        serviceTaskdeptService.deleteServiceTaskdeptByTaskId(oldDept);
                        String[] deptcodes = serviceTaskVO.getDeptcode().split(",");
                        for (String deptCode : deptcodes) {
                            ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
@@ -3735,6 +3761,8 @@
            serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
            serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode());
            serviceSubtaskStatistic.setDrname(serviceSubtaskList.get(0).getDrname());
            //随访中心科室,用于统计再次随访推送到随访中心的人数
            String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", serviceSubtaskList.get(0).getOrgid());
            //出院人次
            serviceSubtaskStatistic.setDischargeCount(serviceSubtaskList.size());
            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
@@ -3752,6 +3780,17 @@
                //及时随访人次:已完成且未超时
                if (isTimelyFollowUp(serviceSubtask)) {
                    serviceSubtaskStatistic.setTimelyFollowUp(serviceSubtaskStatistic.getTimelyFollowUp() + 1L);
                }
                //首次出院人次:visitCount = 1,作为再次随访推送率的分母
                if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() == 1) {
                    serviceSubtaskStatistic.setFirstDischargeCount(serviceSubtaskStatistic.getFirstDischargeCount() + 1L);
                }
                //再次随访推送人数:首个再次随访(visitCount = 2)且执行科室为随访中心科室
                if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() == 2
                        && StringUtils.isNotEmpty(centerDept)
                        && StringUtils.equals(StringUtils.trim(centerDept), StringUtils.trim(serviceSubtask.getVisitDeptCode()))) {
                    serviceSubtaskStatistic.setAgainFollowUpPushCount(serviceSubtaskStatistic.getAgainFollowUpPushCount() + 1L);
                }
                //人工已拨通总量
@@ -4768,6 +4807,8 @@
     * 获取随访统计超链接
     * dischargeCountInfo
     * followUpNeededAllInfo - sendstate != 4 (1,2,3,5,6,7)
     * firstDischargeCountInfo - visitCount = 1
     * againFollowUpPushCountInfo - visitCount = 2 && visitDeptCode = sys.smartor.center.dept(随访中心科室)
     * nonFollowUpInfo - sendstate = 4
     * needFollowUpInfo - visitCount = 1 && sendstate != 4
     * pendingFollowUpInfo - visitCount = 1 && sendstate = 2
@@ -4810,7 +4851,10 @@
    public List<ServiceSubtask> getSfStatisticsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        String hyperLinkInfoType = serviceSubtaskCountReq.getHyperLinkInfoType();
        if (StringUtils.isNotEmpty(hyperLinkInfoType)) {
            applyHyperLinkInfoType(serviceSubtaskCountReq, hyperLinkInfoType);
            if (!applyHyperLinkInfoType(serviceSubtaskCountReq, hyperLinkInfoType)) {
                // 下钻依赖的配置缺失时返回空明细,避免退化成无过滤条件的查询
                return new ArrayList<>();
            }
        }
        String followUpCountStyle = serviceSubtaskCountReq.getFollowUpCountStyle();
@@ -4831,7 +4875,7 @@
        return serviceSubtasks;
    }
    private void applyHyperLinkInfoType(ServiceSubtaskCountReq serviceSubtaskCountReq, String hyperLinkInfoType) {
    private boolean applyHyperLinkInfoType(ServiceSubtaskCountReq serviceSubtaskCountReq, String hyperLinkInfoType) {
        //及时随访明细需要沿用请求的首次/再次口径
        Integer originVisitCount = serviceSubtaskCountReq.getVisitCount();
        serviceSubtaskCountReq.setVisitCount(null);
@@ -4844,6 +4888,22 @@
        switch (hyperLinkInfoType) {
            case "dischargeCountInfo":
                break;
            case "firstDischargeCountInfo":
                //首次出院人次:visitCount = 1
                serviceSubtaskCountReq.setVisitCount(1);
                break;
            case "againFollowUpPushCountInfo": {
                //再次随访推送人数:visitCount = 2 且执行科室为随访中心科室
                String centerDept = configService.selectConfigByKey("sys.smartor.center.dept", serviceSubtaskCountReq.getOrgid());
                if (StringUtils.isBlank(centerDept)) {
                    log.warn("获取再次随访推送明细失败,未配置随访中心科室参数 sys.smartor.center.dept, orgid={}", serviceSubtaskCountReq.getOrgid());
                    return false;
                }
                serviceSubtaskCountReq.setVisitCount(2);
                serviceSubtaskCountReq.setVisitDeptCode(centerDept.trim());
                serviceSubtaskCountReq.setVisitDeptName(null);
                break;
            }
            case "timelyFollowUpInfo":
                serviceSubtaskCountReq.setVisitCount(originVisitCount);
                serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(6L)));
@@ -4995,6 +5055,7 @@
            default:
                break;
        }
        return true;
    }
@@ -5336,6 +5397,8 @@
        // 初始化数值字段
        total.setDischargeCount(0);
        total.setFirstDischargeCount(0L);
        total.setAgainFollowUpPushCount(0L);
        total.setNonFollowUp(0L);
        total.setFilterCount(0L);
        total.setFollowUpNeeded(0L);
@@ -5368,6 +5431,8 @@
            if (stat.getDischargeCount() != null) {
                total.setDischargeCount(total.getDischargeCount() + stat.getDischargeCount());
            }
            total.setFirstDischargeCount(total.getFirstDischargeCount() + (stat.getFirstDischargeCount() != null ? stat.getFirstDischargeCount() : 0L));
            total.setAgainFollowUpPushCount(total.getAgainFollowUpPushCount() + (stat.getAgainFollowUpPushCount() != null ? stat.getAgainFollowUpPushCount() : 0L));
            total.setNonFollowUp(total.getNonFollowUp() + (stat.getNonFollowUp() != null ? stat.getNonFollowUp() : 0L));
            total.setFilterCount(total.getFilterCount() + (stat.getFilterCount() != null ? stat.getFilterCount() : 0L));
            total.setFollowUpNeeded(total.getFollowUpNeeded() + (stat.getFollowUpNeeded() != null ? stat.getFollowUpNeeded() : 0L));
@@ -5762,7 +5827,15 @@
                return resultMap;
            }
            if (StringUtils.isEmpty(serviceSubtask.getPatidHis())) {
            if (patArchive == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "发送异常:" + "【公众号】未查询到患者档案信息,无法通过公众号发送");
                return resultMap;
            }
            // his系统的患者id取自患者档案pat_archive.patid_his,
            // service_subtask查询未关联该字段(serviceSubtask.getPatidHis()恒为空),不能用于校验
            if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                resultMap.put("code", -1);
                resultMap.put("message", "发送异常:" + "【公众号】公众号发送失败,his系统的患者id为空");
                return resultMap;