| | |
| | | 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()); |
| | |
| | | } |
| | | String config = configService.selectConfigByKey("visit.early.day"); |
| | | Integer type = 1; |
| | | String visitType = resolveAgainVisitType(request, serviceSubtask); |
| | | if (StringUtils.isEmpty(visitType)) { |
| | | String requestVisitType = request == null ? null : request.getVisitType(); |
| | | log.error("再次随访任务创建失败,随访方式不合法, visitType = {}, subTaskId = {}", requestVisitType, serviceSubtask.getId()); |
| | | return "再次随访任务创建失败,随访方式不合法, visitType = " + requestVisitType + ", 再请次重试"; |
| | | String resource = resolveAgainResource(request); |
| | | if (StringUtils.isEmpty(resource)) { |
| | | String requestResource = request == null ? null : request.getResource(); |
| | | log.error("再次随访任务创建失败,再次随访方式不合法, resource = {}, subTaskId = {}", requestResource, serviceSubtask.getId()); |
| | | return "再次随访任务创建失败,再次随访方式不合法, resource = " + requestResource + ", 再请次重试"; |
| | | } |
| | | String visitDeptCode; |
| | | String visitDeptName; |
| | | if ("1".equals(visitType)) { |
| | | // 本科室随访:请求值 > 原任务本科室随访科室 > 原任务出院科室 |
| | | String requestDeptCode = request == null ? null : request.getVisitDeptCode(); |
| | | String requestDeptName = request == null ? null : request.getVisitDeptName(); |
| | | String oldVisitType = serviceSubtask.getVisitType(); |
| | | String oldOwnDeptCode = "1".equals(oldVisitType) ? serviceSubtask.getVisitDeptCode() : null; |
| | | String oldOwnDeptName = "1".equals(oldVisitType) ? serviceSubtask.getVisitDeptName() : null; |
| | | String preferredDeptCode = firstNonBlank(requestDeptCode, oldOwnDeptCode); |
| | | if (StringUtils.isNotEmpty(preferredDeptCode)) { |
| | | visitDeptCode = preferredDeptCode; |
| | | visitDeptName = firstNonBlank(requestDeptName, oldOwnDeptName); |
| | | if ("1".equals(resource)) { |
| | | // 本科室随访:请求科室优先,未传时使用原任务出院科室;不依赖原任务 visitType |
| | | String requestDeptCode = firstNonBlank(request == null ? null : request.getVisitDeptCode()); |
| | | String requestDeptName = firstNonBlank(request == null ? null : request.getVisitDeptName()); |
| | | if (StringUtils.isNotEmpty(requestDeptCode)) { |
| | | visitDeptCode = requestDeptCode; |
| | | visitDeptName = requestDeptName; |
| | | } else { |
| | | visitDeptCode = serviceSubtask.getDeptcode(); |
| | | visitDeptName = serviceSubtask.getDeptname(); |
| | |
| | | |
| | | // 二次随访时间:上次随访完成时间(未完成则当前时间)+ 下一任务发送天数;过去时间兜底为当前时间 |
| | | applyAgainVisitTime(serviceSubtaskAgain, serviceSubtask, nextServiceTask, config, now); |
| | | serviceSubtaskAgain.setVisitType(visitType); |
| | | // 新任务的随访方式记录本次选择的再次随访方式;resource 本身不落库 |
| | | serviceSubtaskAgain.setVisitType(resource); |
| | | serviceSubtaskAgain.setVisitDeptCode(visitDeptCode); |
| | | serviceSubtaskAgain.setVisitDeptName(visitDeptName); |
| | | int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 解析再次随访方式:请求参数优先,原任务兜底,未配置时默认随访中心。 |
| | | * 解析再次随访方式:仅取请求参数 resource,不使用原任务 visitType;未传时默认随访中心。 |
| | | * |
| | | * @return 1-本科室随访;2-随访中心随访;null-非法值 |
| | | */ |
| | | private String resolveAgainVisitType(ServiceSubtask request, ServiceSubtask old) { |
| | | String visitType = request == null ? null : request.getVisitType(); |
| | | if (StringUtils.isEmpty(visitType) || StringUtils.isEmpty(visitType.trim())) { |
| | | visitType = old == null ? null : old.getVisitType(); |
| | | } |
| | | if (StringUtils.isEmpty(visitType) || StringUtils.isEmpty(visitType.trim())) { |
| | | private String resolveAgainResource(ServiceSubtask request) { |
| | | String resource = request == null ? null : request.getResource(); |
| | | if (StringUtils.isEmpty(resource) || StringUtils.isEmpty(resource.trim())) { |
| | | return "2"; |
| | | } |
| | | visitType = visitType.trim(); |
| | | return ("1".equals(visitType) || "2".equals(visitType)) ? visitType : null; |
| | | resource = resource.trim(); |
| | | return ("1".equals(resource) || "2".equals(resource)) ? resource : null; |
| | | } |
| | | |
| | | private String firstNonBlank(String... values) { |
| | |
| | | * 首次随访任务超时后,按下一任务自动生成再次随访任务。 |
| | | * <p> |
| | | * 定时任务入口 {@code RyTask#dealSubtaskDeadline} 使用。与手动入口一致的部分: |
| | | * 表单/发送方式取下一任务、链路 upid + visit_count、发送方式明细初始化、按 visitType 选择随访科室; |
| | | * 差异:随访中心科室未配置时回退原任务科室,原任务置为发送失败(sendstate=5)。 |
| | | * 表单/发送方式取下一任务、链路 upid + visit_count、发送方式明细初始化; |
| | | * 差异:超时再次随访固定走随访中心科室(随访中心未配置时回退原任务科室),原任务置为发送失败(sendstate=5)。 |
| | | * <p> |
| | | * 幂等:同一原任务只允许生成一条再次随访(Redis 锁 + upid 校验 + 原任务条件更新), |
| | | * 多节点/多线程同时扫描时,后到的事务会在条件更新处拿到 0 行并回滚本次插入。 |
| | |
| | | return "再次随访任务创建失败,未找到患者档案, subTaskId = " + serviceSubtask.getId(); |
| | | } |
| | | String config = configService.selectConfigByKey("visit.early.day"); |
| | | String visitType = resolveAgainVisitType(null, serviceSubtask); |
| | | if (StringUtils.isEmpty(visitType)) { |
| | | return "再次随访任务创建失败,随访方式不合法, visitType = " + serviceSubtask.getVisitType(); |
| | | } |
| | | String visitDeptCode; |
| | | String visitDeptName; |
| | | if ("1".equals(visitType)) { |
| | | // 本科室随访:原任务随访科室 > 原任务出院科室 |
| | | String ownDeptCode = firstNonBlank(serviceSubtask.getVisitDeptCode()); |
| | | if (StringUtils.isNotEmpty(ownDeptCode)) { |
| | | visitDeptCode = ownDeptCode; |
| | | // 随访中心科室:未配置(或科室不存在)时回退原任务科室,保持超时入口原有行为 |
| | | SysDept centerDept = selectCenterDept(serviceSubtask.getOrgid()); |
| | | if (ObjectUtils.isNotEmpty(centerDept)) { |
| | | visitDeptCode = centerDept.getDeptCode(); |
| | | visitDeptName = centerDept.getDeptName(); |
| | | } else { |
| | | String fallbackDeptCode = firstNonBlank(serviceSubtask.getVisitDeptCode()); |
| | | if (StringUtils.isNotEmpty(fallbackDeptCode)) { |
| | | visitDeptCode = fallbackDeptCode; |
| | | visitDeptName = serviceSubtask.getVisitDeptName(); |
| | | } else { |
| | | visitDeptCode = serviceSubtask.getDeptcode(); |
| | | visitDeptName = serviceSubtask.getDeptname(); |
| | | } |
| | | if (StringUtils.isEmpty(visitDeptCode)) { |
| | | return "再次随访任务创建失败,本科室随访未找到随访科室, subTaskId = " + serviceSubtask.getId(); |
| | | } |
| | | SysDept ownDept = selectDeptByCode(serviceSubtask.getOrgid(), visitDeptCode); |
| | | if (ObjectUtils.isNotEmpty(ownDept)) { |
| | | visitDeptCode = ownDept.getDeptCode(); |
| | | visitDeptName = ownDept.getDeptName(); |
| | | } else if (StringUtils.isEmpty(visitDeptName)) { |
| | | return "再次随访任务创建失败,本科室随访科室不存在, deptCode = " + visitDeptCode + ", subTaskId = " + serviceSubtask.getId(); |
| | | } |
| | | } else { |
| | | // 随访中心科室:未配置(或科室不存在)时回退原任务科室,保持超时入口原有行为 |
| | | SysDept centerDept = selectCenterDept(serviceSubtask.getOrgid()); |
| | | if (ObjectUtils.isNotEmpty(centerDept)) { |
| | | visitDeptCode = centerDept.getDeptCode(); |
| | | visitDeptName = centerDept.getDeptName(); |
| | | } else { |
| | | String fallbackDeptCode = firstNonBlank(serviceSubtask.getVisitDeptCode()); |
| | | if (StringUtils.isNotEmpty(fallbackDeptCode)) { |
| | | visitDeptCode = fallbackDeptCode; |
| | | visitDeptName = serviceSubtask.getVisitDeptName(); |
| | | } else { |
| | | visitDeptCode = serviceSubtask.getDeptcode(); |
| | | visitDeptName = serviceSubtask.getDeptname(); |
| | | } |
| | | } |
| | | } |
| | | ServiceSubtask serviceSubtaskAgain = patMedInhospService.boxedServiceSubtask(nextServiceTask, |
| | |
| | | serviceSubtaskAgain.setIsVisitAgain(1); |
| | | serviceSubtaskAgain.setCreateTime(now); |
| | | serviceSubtaskAgain.setUpdateTime(now); |
| | | serviceSubtaskAgain.setVisitType(visitType); |
| | | // 超时再次随访固定为随访中心随访 |
| | | serviceSubtaskAgain.setVisitType("2"); |
| | | serviceSubtaskAgain.setVisitDeptCode(visitDeptCode); |
| | | serviceSubtaskAgain.setVisitDeptName(visitDeptName); |
| | | if (serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain) != 1) { |
| | |
| | | sysDeptVo.setDeptType("1"); |
| | | sysDeptVo.setOrgid(orgid); |
| | | sysDeptVo.setDeptCode(centerDept); |
| | | List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDeptVo); |
| | | // 定时任务线程没有登录上下文,不能调用带 @DataScope 的 selectDeptList,否则会抛“获取用户信息异常”。 |
| | | List<SysDept> sysDepts = sysDeptService.selectSysDeptList(sysDeptVo); |
| | | return CollectionUtils.isEmpty(sysDepts) ? null : sysDepts.get(0); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 科室编码去重,保持原顺序,避免 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 结果 |
| | |
| | | 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中 |
| | |
| | | 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()); |
| | |
| | | ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid()); |
| | | ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity(); |
| | | serviceSubtaskVO.setTaskid(serviceTask1.getTaskid()); |
| | | //只删除首次随访未完成的 |
| | | serviceSubtaskVO.setVisitCount(1); |
| | | serviceSubtaskVO.setSendstate(2L); |
| | | List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); |
| | | serviceSubtaskVO.setSendstate(1L); |
| | |
| | | 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(); |
| | |
| | | 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) { |
| | |
| | | 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); |
| | | } |
| | | |
| | | //人工已拨通总量 |
| | | if (ObjectUtils.isNotEmpty(serviceSubtask.getIsManuallyCalled()) |
| | | && serviceSubtask.getIsManuallyCalled().equals(1L)) { |
| | |
| | | |
| | | //首次出院随访 |
| | | if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() == 1) { |
| | | applyFirstFollowUpExtraStatistics(serviceSubtaskStatistic, serviceSubtask); |
| | | //首次应随访 |
| | | if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L)) { |
| | | serviceSubtaskStatistic.setNeedFollowUp(serviceSubtaskStatistic.getNeedFollowUp() + 1L); |
| | |
| | | } |
| | | }//二次出院随访 |
| | | else if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() > 1) { |
| | | applyAgainFollowUpExtraStatistics(serviceSubtaskStatistic, serviceSubtask); |
| | | //再次应随访 |
| | | if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { |
| | | serviceSubtaskStatistic.setNeedFollowUpAgain(serviceSubtaskStatistic.getNeedFollowUpAgain() + 1L); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 市一统计口径:首次待随访、已发送及人工电话超时。 |
| | | */ |
| | | private void applyFirstFollowUpExtraStatistics(ServiceSubtaskStatistic statistic, ServiceSubtask serviceSubtask) { |
| | | if (serviceSubtask.getVisitCount() == null || serviceSubtask.getVisitCount() != 1 || serviceSubtask.getSendstate() == null) { |
| | | return; |
| | | } |
| | | Long sendstate = serviceSubtask.getSendstate(); |
| | | if (sendstate.equals(3L)) { |
| | | statistic.setSent(statistic.getSent() + 1L); |
| | | } |
| | | if (sendstate.equals(7L) && isManuallyNotCalled(serviceSubtask)) { |
| | | statistic.setManualCallTimeout(statistic.getManualCallTimeout() + 1L); |
| | | } |
| | | if (sendstate.equals(1L) || sendstate.equals(2L) || sendstate.equals(3L) || sendstate.equals(7L)) { |
| | | statistic.setPendingFollowUpAll(statistic.getPendingFollowUpAll() + 1L); |
| | | } |
| | | if (sendstate.equals(1L) || sendstate.equals(2L)) { |
| | | statistic.setPendingFollowUpWaitSend(statistic.getPendingFollowUpWaitSend() + 1L); |
| | | } |
| | | if (sendstate.equals(3L) || sendstate.equals(7L)) { |
| | | statistic.setPendingFollowUpSent(statistic.getPendingFollowUpSent() + 1L); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 再次随访附加统计:待随访、已发送、人工电话超时及回院复诊复查(suggest=6)。 |
| | | */ |
| | | private void applyAgainFollowUpExtraStatistics(ServiceSubtaskStatistic statistic, ServiceSubtask serviceSubtask) { |
| | | if (serviceSubtask.getVisitCount() == null || serviceSubtask.getVisitCount() <= 1) { |
| | | return; |
| | | } |
| | | if (serviceSubtask.getSendstate() == null) { |
| | | return; |
| | | } |
| | | Long sendstate = serviceSubtask.getSendstate(); |
| | | // 回院复诊复查:再次随访中按处理意见 suggest=6 统计 |
| | | if (StringUtils.equals("6", StringUtils.trim(serviceSubtask.getSuggest()))) { |
| | | statistic.setSuggest6CountAgain(statistic.getSuggest6CountAgain() + 1L); |
| | | } |
| | | if (sendstate.equals(3L)) { |
| | | statistic.setSentAgain(statistic.getSentAgain() + 1L); |
| | | } |
| | | if (sendstate.equals(7L) && isManuallyNotCalled(serviceSubtask)) { |
| | | statistic.setManualCallTimeoutAgain(statistic.getManualCallTimeoutAgain() + 1L); |
| | | } |
| | | if (sendstate.equals(1L) || sendstate.equals(2L) || sendstate.equals(3L) || sendstate.equals(7L)) { |
| | | statistic.setPendingFollowUpAllAgain(statistic.getPendingFollowUpAllAgain() + 1L); |
| | | } |
| | | if (sendstate.equals(1L) || sendstate.equals(2L)) { |
| | | statistic.setPendingFollowUpWaitSendAgain(statistic.getPendingFollowUpWaitSendAgain() + 1L); |
| | | } |
| | | if (sendstate.equals(3L) || sendstate.equals(7L)) { |
| | | statistic.setPendingFollowUpSentAgain(statistic.getPendingFollowUpSentAgain() + 1L); |
| | | } |
| | | } |
| | | |
| | | private boolean isManuallyNotCalled(ServiceSubtask serviceSubtask) { |
| | | return serviceSubtask.getIsManuallyCalled() != null && serviceSubtask.getIsManuallyCalled().equals(0L); |
| | | } |
| | | |
| | | /** |
| | | * 首次随访统计 |
| | | * |
| | | * @param serviceSubtaskList |
| | |
| | | serviceSubtaskStatistic.setDischargeCount(serviceSubtaskList.size()); |
| | | |
| | | for (ServiceSubtask serviceSubtask : serviceSubtaskList) { |
| | | applyFirstFollowUpExtraStatistics(serviceSubtaskStatistic, serviceSubtask); |
| | | //无需随访人次 |
| | | if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) { |
| | | serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L); |
| | |
| | | //出院人次 |
| | | serviceSubtaskStatistic.setDischargeCount(serviceSubtaskList.size()); |
| | | for (ServiceSubtask serviceSubtask : serviceSubtaskList) { |
| | | applyAgainFollowUpExtraStatistics(serviceSubtaskStatistic, serviceSubtask); |
| | | //无需随访人次 |
| | | if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) { |
| | | serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L); |
| | |
| | | * 获取随访统计超链接 |
| | | * 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 |
| | |
| | | * taskSituation5Info - taskSituation = 5 |
| | | * taskSituation6Info - taskSituation = 7 |
| | | * manuallyCalledInfo - isManuallyCalled = 1L |
| | | * manualCallTimeoutInfo - visitCount = 1 && sendstate = 7 && isManuallyCalled = 0 |
| | | * manualCallTimeoutAgainInfo - visitCount > 1 && sendstate = 7 && isManuallyCalled = 0 |
| | | * pendingFollowUpAllInfo - visitCount = 1 && sendstate in (1,2,3,7) |
| | | * pendingFollowUpAllAgainInfo - visitCount > 1 && sendstate in (1,2,3,7) |
| | | * pendingFollowUpWaitSendInfo - visitCount = 1 && sendstate in (1,2) |
| | | * pendingFollowUpWaitSendAgainInfo - visitCount > 1 && sendstate in (1,2) |
| | | * pendingFollowUpSentInfo - visitCount = 1 && sendstate in (3,7) |
| | | * pendingFollowUpSentAgainInfo - visitCount > 1 && sendstate in (3,7) |
| | | * sentInfo - visitCount = 1 && sendstate = 3 |
| | | * sentAgainInfo - visitCount > 1 && sendstate = 3 |
| | | * suggest6CountAgainInfo - visitCount > 1 && suggest = 6 |
| | | * filterCountList - taskSituation = 6 && sendstate = 4 |
| | | * |
| | | */ |
| | |
| | | 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(); |
| | |
| | | return serviceSubtasks; |
| | | } |
| | | |
| | | private void applyHyperLinkInfoType(ServiceSubtaskCountReq serviceSubtaskCountReq, String hyperLinkInfoType) { |
| | | private boolean applyHyperLinkInfoType(ServiceSubtaskCountReq serviceSubtaskCountReq, String hyperLinkInfoType) { |
| | | //及时随访明细需要沿用请求的首次/再次口径 |
| | | Integer originVisitCount = serviceSubtaskCountReq.getVisitCount(); |
| | | serviceSubtaskCountReq.setVisitCount(null); |
| | |
| | | serviceSubtaskCountReq.setExcep(null); |
| | | serviceSubtaskCountReq.setTaskSituation(null); |
| | | serviceSubtaskCountReq.setFinishState(null); |
| | | serviceSubtaskCountReq.setSuggest(null); |
| | | |
| | | 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))); |
| | |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setExcep("1"); |
| | | break; |
| | | case "suggest6CountAgainInfo": |
| | | // 再次随访回院复诊复查:visitCount > 1 且 suggest = 6 |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSuggest("6"); |
| | | break; |
| | | case "taskSituation1Info": |
| | | serviceSubtaskCountReq.setTaskSituation(1); |
| | | break; |
| | |
| | | case "manuallyCalledInfo": |
| | | serviceSubtaskCountReq.setIsManuallyCalled(1L); |
| | | break; |
| | | case "manualCallTimeoutInfo": |
| | | serviceSubtaskCountReq.setVisitCount(1); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(7L))); |
| | | serviceSubtaskCountReq.setIsManuallyCalled(0L); |
| | | break; |
| | | case "manualCallTimeoutAgainInfo": |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(7L))); |
| | | serviceSubtaskCountReq.setIsManuallyCalled(0L); |
| | | break; |
| | | case "pendingFollowUpAllInfo": |
| | | serviceSubtaskCountReq.setVisitCount(1); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 7L))); |
| | | break; |
| | | case "pendingFollowUpAllAgainInfo": |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 7L))); |
| | | break; |
| | | case "pendingFollowUpWaitSendInfo": |
| | | serviceSubtaskCountReq.setVisitCount(1); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L))); |
| | | break; |
| | | case "pendingFollowUpWaitSendAgainInfo": |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L))); |
| | | break; |
| | | case "pendingFollowUpSentInfo": |
| | | serviceSubtaskCountReq.setVisitCount(1); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(3L, 7L))); |
| | | break; |
| | | case "pendingFollowUpSentAgainInfo": |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Arrays.asList(3L, 7L))); |
| | | break; |
| | | case "sentInfo": |
| | | serviceSubtaskCountReq.setVisitCount(1); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(3L))); |
| | | break; |
| | | case "sentAgainInfo": |
| | | serviceSubtaskCountReq.setVisitCount(2); |
| | | serviceSubtaskCountReq.setSendstates(new ArrayList<>(Collections.singletonList(3L))); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | // 初始化数值字段 |
| | | total.setDischargeCount(0); |
| | | total.setFirstDischargeCount(0L); |
| | | total.setAgainFollowUpPushCount(0L); |
| | | total.setNonFollowUp(0L); |
| | | total.setFilterCount(0L); |
| | | total.setFollowUpNeeded(0L); |
| | |
| | | total.setAbnormal(0L); |
| | | total.setNeedFollowUpAgain(0L); |
| | | total.setPendingFollowUpAgain(0L); |
| | | total.setManualCallTimeout(0L); |
| | | total.setManualCallTimeoutAgain(0L); |
| | | total.setPendingFollowUpAll(0L); |
| | | total.setPendingFollowUpAllAgain(0L); |
| | | total.setPendingFollowUpWaitSend(0L); |
| | | total.setPendingFollowUpWaitSendAgain(0L); |
| | | total.setPendingFollowUpSent(0L); |
| | | total.setPendingFollowUpSentAgain(0L); |
| | | total.setSent(0L); |
| | | total.setSentAgain(0L); |
| | | total.setFollowUpSuccessAgain(0L); |
| | | total.setFollowUpFailAgain(0L); |
| | | total.setSuggest6CountAgain(0L); |
| | | total.setManualAgain(0L); |
| | | total.setSmsAgain(0L); |
| | | total.setWeChatAgain(0L); |
| | |
| | | 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)); |
| | |
| | | total.setAbnormal(total.getAbnormal() + (stat.getAbnormal() != null ? stat.getAbnormal() : 0L)); |
| | | total.setNeedFollowUpAgain(total.getNeedFollowUpAgain() + (stat.getNeedFollowUpAgain() != null ? stat.getNeedFollowUpAgain() : 0L)); |
| | | total.setPendingFollowUpAgain(total.getPendingFollowUpAgain() + (stat.getPendingFollowUpAgain() != null ? stat.getPendingFollowUpAgain() : 0L)); |
| | | total.setManualCallTimeout(total.getManualCallTimeout() + (stat.getManualCallTimeout() != null ? stat.getManualCallTimeout() : 0L)); |
| | | total.setManualCallTimeoutAgain(total.getManualCallTimeoutAgain() + (stat.getManualCallTimeoutAgain() != null ? stat.getManualCallTimeoutAgain() : 0L)); |
| | | total.setPendingFollowUpAll(total.getPendingFollowUpAll() + (stat.getPendingFollowUpAll() != null ? stat.getPendingFollowUpAll() : 0L)); |
| | | total.setPendingFollowUpAllAgain(total.getPendingFollowUpAllAgain() + (stat.getPendingFollowUpAllAgain() != null ? stat.getPendingFollowUpAllAgain() : 0L)); |
| | | total.setPendingFollowUpWaitSend(total.getPendingFollowUpWaitSend() + (stat.getPendingFollowUpWaitSend() != null ? stat.getPendingFollowUpWaitSend() : 0L)); |
| | | total.setPendingFollowUpWaitSendAgain(total.getPendingFollowUpWaitSendAgain() + (stat.getPendingFollowUpWaitSendAgain() != null ? stat.getPendingFollowUpWaitSendAgain() : 0L)); |
| | | total.setPendingFollowUpSent(total.getPendingFollowUpSent() + (stat.getPendingFollowUpSent() != null ? stat.getPendingFollowUpSent() : 0L)); |
| | | total.setPendingFollowUpSentAgain(total.getPendingFollowUpSentAgain() + (stat.getPendingFollowUpSentAgain() != null ? stat.getPendingFollowUpSentAgain() : 0L)); |
| | | total.setSent(total.getSent() + (stat.getSent() != null ? stat.getSent() : 0L)); |
| | | total.setSentAgain(total.getSentAgain() + (stat.getSentAgain() != null ? stat.getSentAgain() : 0L)); |
| | | total.setFollowUpSuccessAgain(total.getFollowUpSuccessAgain() + (stat.getFollowUpSuccessAgain() != null ? stat.getFollowUpSuccessAgain() : 0L)); |
| | | total.setFollowUpFailAgain(total.getFollowUpFailAgain() + (stat.getFollowUpFailAgain() != null ? stat.getFollowUpFailAgain() : 0L)); |
| | | total.setSuggest6CountAgain(total.getSuggest6CountAgain() + (stat.getSuggest6CountAgain() != null ? stat.getSuggest6CountAgain() : 0L)); |
| | | total.setManualAgain(total.getManualAgain() + (stat.getManualAgain() != null ? stat.getManualAgain() : 0L)); |
| | | total.setSmsAgain(total.getSmsAgain() + (stat.getSmsAgain() != null ? stat.getSmsAgain() : 0L)); |
| | | total.setWeChatAgain(total.getWeChatAgain() + (stat.getWeChatAgain() != null ? stat.getWeChatAgain() : 0L)); |
| | |
| | | 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; |