liusheng
23 小时以前 459aa78c84cf552ebea6ef056d978c2531d71ac8
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -1,5 +1,6 @@
package com.smartor.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
@@ -12,6 +13,7 @@
import com.smartor.common.FtpService;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
@@ -167,27 +169,27 @@
    /**
     * 查询单一任务(随访)列表
     *
     * @param serviceSubtaskVO 单一任务(随访)
     * @param serviceSubtaskEntity 单一任务(随访)
     * @return 单一任务(随访)
     */
    @Override
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO) {
        return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskEntity) {
        return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
    }
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO) {
        return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskEntity) {
        return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskEntity);
    }
    @Override
    public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) {
        //定义患者与单一任务关联表集合
        List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
        ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class);
        ServiceSubtaskEntity serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskEntity.class);
        List<ServiceSubtask> list = selectServiceSubtaskList(serviceSubtaskVO);
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
        if(ObjectUtils.isEmpty(serviceTask)){
        if (ObjectUtils.isEmpty(serviceTask)) {
            log.error("找不到对应的serviceTask, orgid:{}, taskid: {}", serviceSubtask.getOrgid(), serviceSubtask.getTaskid());
            return null;
        }
@@ -231,8 +233,7 @@
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        List<ServiceSubtaskPreachform> serviceSubtaskPreachformLists =
                    serviceSubtaskPreachformMapper.selectBySubtask(serviceSubtask);
        List<ServiceSubtaskPreachform> serviceSubtaskPreachformLists = serviceSubtaskPreachformMapper.selectBySubtask(serviceSubtask);
        for (ServiceSubtask serviceSubtask1 : list) {
            PatTaskRelevance patTaskRelevance = new PatTaskRelevance();
            if (!serviceSubtask1.getHospType().equals("2")) {
@@ -289,9 +290,7 @@
            }
            //获取该患者所有的执行状态
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList =
                serviceSubtaskPreachformLists.stream().filter((item -> item.getSubid().equals(serviceSubtask1.getId())
                            && item.getTaskid().equals(serviceTask.getTaskid()))).collect(Collectors.toList());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = serviceSubtaskPreachformLists.stream().filter((item -> item.getSubid().equals(serviceSubtask1.getId()) && item.getTaskid().equals(serviceTask.getTaskid()))).collect(Collectors.toList());
            List<Map<String, Object>> resultList = serviceSubtaskPreachformList.stream().map(item -> {
                Map<String, Object> map = new HashMap<>();
                map.put("sort", item.getSort());
@@ -310,17 +309,23 @@
    }
    @Override
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
        return selectServiceSubtaskList;
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
        List<ServiceSubtaskRes> serviceSubtaskResList = new ArrayList<>();
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            ServiceSubtaskRes serviceSubtaskRes = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskRes.class);
            serviceSubtaskRes.setContinueContent(JSONObject.parseObject(serviceSubtask.getContinueContent()));
        }
        return serviceSubtaskResList;
    }
    @Override
    public List<ServiceSubtask> patItem2(ServiceSubtaskVO serviceSubtaskVO) {
    public List<ServiceSubtask> patItem2(ServiceSubtaskEntity serviceSubtaskEntity) {
        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
        for (Long sendstate : serviceSubtaskVO.getSendstates()) {
            serviceSubtaskVO.setSendstate(sendstate);
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        for (Long sendstate : serviceSubtaskEntity.getSendstates()) {
            serviceSubtaskEntity.setSendstate(sendstate);
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
            serviceSubtaskList.addAll(serviceSubtasks);
        }
        return serviceSubtaskList;
@@ -370,15 +375,15 @@
     * 2. 性能提升 10-100 倍(取决于数据量)
     * 3. 降低内存占用和网络传输
     *
     * @param serviceSubtaskVO 查询条件
     * @param serviceSubtaskEntity 查询条件
     * @return 各状态统计结果
     */
    @Override
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
    public Map<String, Object> patItemCount(ServiceSubtaskEntity serviceSubtaskEntity) {
        // 直接调用数据库统计方法,在数据库层完成聚合计算
        Map<String, Object> result = serviceSubtaskMapper.countByCondition(serviceSubtaskVO);
        Map<String, Object> result = serviceSubtaskMapper.countByCondition(serviceSubtaskEntity);
        // 处理空异常
        if(MapUtils.isEmpty(result)){
        if (MapUtils.isEmpty(result)) {
            result = new HashMap<>();
        }
        // 确保所有 key 都有值,避免空指针异常
@@ -386,6 +391,7 @@
        result.putIfAbsent("wzx", 0);
        result.putIfAbsent("ysf", 0);
        result.putIfAbsent("yc", 0);
        result.putIfAbsent("jg", 0);
        result.putIfAbsent("fssb", 0);
        result.putIfAbsent("yfs", 0);
        result.putIfAbsent("blq", 0);
@@ -423,18 +429,18 @@
        if (patMedInhospList.size() > 0) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";患者再入院了");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";患者再入院了");
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            return "无需再次随访,患者再入院了";
        } else if (serviceSubtask1.getSendstate() == 4L) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";无需再次随访,任务被标记不在执行");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";无需再次随访,任务被标记不在执行");
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            return "无需再次随访,任务被标记不在执行";
        } else if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";无需再次随访,患者被标记不需要被服务");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";无需再次随访,患者被标记不需要被服务");
            return "无需再次随访,患者被标记不需要被服务";
        } else if (ObjectUtils.isNotEmpty(serviceSubtask1.getIsVisitAgain()) && serviceSubtask1.getIsVisitAgain() == 2) {
            return "无需再次随访,该任务已经再次随访过了";
@@ -670,6 +676,11 @@
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setContinueContent(ObjectUtils.isNotEmpty(patTaskRelevance.getContinueContent()) ? patTaskRelevance.getContinueContent().toString() : null);
                    serviceSubtask.setContinueCount(patTaskRelevance.getContinueCount());
                    serviceSubtask.setContinueFlag(patTaskRelevance.getContinueFlag());
                    serviceSubtask.setContinueTimeNext(patTaskRelevance.getContinueTimeNext());
                    serviceSubtask.setContinueTimeNow(patTaskRelevance.getContinueTimeNow());
                    serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                    serviceSubtask.setUpdateBy(serviceTask.getCreateBy());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
@@ -705,7 +716,7 @@
            //修改操作,需要将stopState状态+1
            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid());
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -887,6 +898,11 @@
                    serviceSubtask.setDrcode(patTaskRelevance.getDrcode());
                    serviceSubtask.setInhosptime(patTaskRelevance.getInhosptime());
                    serviceSubtask.setHospType(patTaskRelevance.getHospType());
                    serviceSubtask.setContinueContent(ObjectUtils.isNotEmpty(patTaskRelevance.getContinueContent()) ? patTaskRelevance.getContinueContent().toString() : null);
                    serviceSubtask.setContinueCount(patTaskRelevance.getContinueCount());
                    serviceSubtask.setContinueFlag(patTaskRelevance.getContinueFlag());
                    serviceSubtask.setContinueTimeNext(patTaskRelevance.getContinueTimeNext());
                    serviceSubtask.setContinueTimeNow(patTaskRelevance.getContinueTimeNow());
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
@@ -911,7 +927,7 @@
                }
            }
            // 有可能会把发送顺序也修改了(需要根据taskId将所有的sendstate!=4,5,6的subTask拉出来,进行修改一下)
            ServiceSubtaskVO ssVo = new ServiceSubtaskVO();
            ServiceSubtaskEntity ssVo = new ServiceSubtaskEntity();
            ssVo.setTaskid(serviceTaskVO.getTaskid());
            ssVo.setDelFlag("0");
            List<Long> ssList = new ArrayList<>();
@@ -1698,7 +1714,7 @@
                            redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid(), count + 1, 120, TimeUnit.MINUTES);
                        phoneCallBackYQVO.setType("text");
                        phoneCallBackYQVO.setValue(ivrTaskTemplateScriptVO.getNoMatchText() + getObject(serviceSubtask, StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext())?ivrTaskTemplateScriptVO.getIvrtext():ivrTaskTemplateScriptVO.getScriptContent()));
                        phoneCallBackYQVO.setValue(ivrTaskTemplateScriptVO.getNoMatchText() + getObject(serviceSubtask, StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext()) ? ivrTaskTemplateScriptVO.getIvrtext() : ivrTaskTemplateScriptVO.getScriptContent()));
                    }
                }
@@ -1993,11 +2009,12 @@
    @Override
    public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) {
        int i = 0;
        log.info("保存电话回调内容 saveQuestionAnswerPhone:{}", serviceSubTaskDetailReq);
        if (StringUtils.isNotEmpty(serviceSubTaskDetailReq.getParam1())) {
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            Long tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam1(), pri_key));
            Long pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam2(), pri_key));
            ServiceSubtaskVO ivrTaskSingle = new ServiceSubtaskVO();
            ServiceSubtaskEntity ivrTaskSingle = new ServiceSubtaskEntity();
            ivrTaskSingle.setTaskid(tid);
            ivrTaskSingle.setPatid(pid);
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ivrTaskSingle);
@@ -2229,60 +2246,100 @@
    @Cacheable(value = "sfStatistics", key = "T(org.springframework.util.DigestUtils).md5DigestAsHex(#serviceSubtaskCountReq.toString().getBytes())", unless = "#result == null or #result.isEmpty()")
    public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        log.info("getSfStatistics的入参为:{}", serviceSubtaskCountReq);
        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
//        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        // 根据条件进行分组
        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) {
        String groupKey = "drcode";
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && !serviceSubtaskCountReq.getLeavehospitaldistrictcodes().isEmpty()) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
                groupKey = "drcode";
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown")));
                groupKey = "leavehospitaldistrictcode";
            }
        } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) {
        } else if (serviceSubtaskCountReq.getDeptcodes() != null && !serviceSubtaskCountReq.getDeptcodes().isEmpty()) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
                groupKey = "drcode";
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
                groupKey = "deptcode";
            }
        }
        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
        // 根据条件进行分组
        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
        serviceSubtaskCountReq.setGroupKey(groupKey);
        List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
        serviceSubtaskCountReq.setGroupKeyList(groupKeyList);
        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        switch (groupKey) {
            case "deptcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
                break;
            case "drcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
            case "leavehospitaldistrictcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictcode()).orElse("Unknown")));
                break;
            default:
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
        }
        //获取及时率统计合集
        Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, collect);
        for (String collectKey : collect.keySet()) {
            List<ServiceSubtask> serviceSubtaskList = collect.get(collectKey);
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatistic(serviceSubtaskList);
            //及时率
            ServiceSubtask ss = new ServiceSubtask();
            ss.setOrgid(serviceSubtaskList.get(0).getOrgid());
            // 如果有医生编码,设置医生编码用于及时率查询
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
            ServiceSubtaskStatistic statistic = getStatistic(serviceSubtaskList, serviceSubtaskCountReq.getFollowUpCountStyle());
            if (ObjectUtils.isNotEmpty(jsRates)) {
                Map<String, Object> jsRateMap = jsRates.get(collectKey);
                BigDecimal jsRate = new BigDecimal("0");
                if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
                    jsRate = new BigDecimal(jsRateMap.get("rate").toString());
                }
                Double jsRateDouble = (jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue();
                statistic.setRate(jsRateDouble);
            }
            ss.setStarttime(serviceSubtaskCountReq.getStartTime());
            ss.setEndtime(serviceSubtaskCountReq.getEndTime());
            if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
                ss.setEndtime(new Date());
            }
            Double jsRate = serviceSubtaskMapper.selectTimelyRate(ss);
            statistic.setRate(jsRate);
            if (ObjectUtils.isNotEmpty(statistic)) {
                serviceSubtaskStatistics.add(statistic);
            }
        }
        return serviceSubtaskStatistics;
    }
    /**
     * 随访统计-及时率统计
     *
     * @param serviceSubtaskCountReq
     * @param collect
     * @return
     */
    public Map<String, Map<String, Object>> getSsRateForSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq, Map<String, List<ServiceSubtask>> collect) {
        if (ObjectUtils.isEmpty(serviceSubtaskCountReq)) {
            return null;
        }
        String groupKey = serviceSubtaskCountReq.getGroupKey();
        if (StringUtils.isEmpty(groupKey)) {
            return null;
        }
        List<String> groupKeyList = new ArrayList<>(collect.keySet());
        if (ObjectUtils.isEmpty(groupKeyList)) {
            return null;
        }
        //及时率统计
        ServiceSubtaskEntity ssRate = new ServiceSubtaskEntity();
        ssRate.setOrgid(serviceSubtaskCountReq.getOrgid());
        ssRate.setStarttime(serviceSubtaskCountReq.getStartTime());
        ssRate.setEndtime(serviceSubtaskCountReq.getEndTime());
        if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
            ssRate.setEndtime(new Date());
        }
        ssRate.setGroupKey(groupKey);
        ssRate.setGroupKeyList(groupKeyList);
        Map<String, Map<String, Object>> jsRates = new HashMap<>();
        if (!collect.isEmpty()) {
            jsRates = serviceSubtaskMapper.selectTimelyRateBatch(ssRate);
        }
        return jsRates;
    }
    @Override
@@ -2383,7 +2440,6 @@
    }
    /**
     * 获取满意度题目总量
     * type : 1-科室   2病区
@@ -2424,7 +2480,7 @@
                    List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
                    if (CollectionUtils.isNotEmpty(ivrTaskTemplateScripts)) {
                        //需要先计算出发送量,再乘以单个问券满意度题目数量,得到满意度题目总量(包含了未做的)
                        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                        serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
                        List<Long> sendstates = new ArrayList<>(Arrays.asList(3L, 5L, 6L));
                        serviceSubtaskVO.setSendstates(sendstates);
@@ -2443,11 +2499,11 @@
                    svyTaskTemplateScript.setCategoryid(svyCategoryid);
                    List<SvyTaskTemplateScript> svyTaskTemplateScriptList = svyTaskTemplateScriptService.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
                    if (CollectionUtils.isNotEmpty(svyTaskTemplateScriptList)) {
                        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                        serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
                        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
                        serviceSubtaskEntity.setTaskid(serviceTask.getTaskid());
                        List<Long> sendstates = new ArrayList<>(Arrays.asList(3L, 5L, 6L));
                        serviceSubtaskVO.setSendstates(sendstates);
                        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(serviceSubtaskVO);
                        serviceSubtaskEntity.setSendstates(sendstates);
                        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(serviceSubtaskEntity);
                        if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                            int mydtmzlCount = svyTaskTemplateScriptList.size() * serviceSubtaskList.size();
                            mydtmzlsum.add(new BigDecimal(mydtmzlCount));
@@ -2480,7 +2536,7 @@
    }
    private ServiceSubtaskStatistic getStatistic(List<ServiceSubtask> serviceSubtaskList) {
    private ServiceSubtaskStatistic getStatistic(List<ServiceSubtask> serviceSubtaskList, String followUpCountStyle) {
        ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
        //格式化为两位小数的百分比
        DecimalFormat percentFormat = new DecimalFormat("##.##%");
@@ -2514,7 +2570,7 @@
        //记录再次待随访详情
        List<ServiceSubtask> pendingFollowUpAgainInfo = new ArrayList<>();
        //记录再次随访成功详情
        List<ServiceSubtask> followUpSuccessAgainInfo= new ArrayList<>();
        List<ServiceSubtask> followUpSuccessAgainInfo = new ArrayList<>();
        //记录再次随访失败详情
        List<ServiceSubtask> followUpFailAgainInfo = new ArrayList<>();
        //记录首次随访人工详情
@@ -2522,13 +2578,13 @@
        //记录首次随访短信详情
        List<ServiceSubtask> smsAgainInfo = new ArrayList<>();
        //记录首次随访微信详情
        List<ServiceSubtask> wechatAgainInfo= new ArrayList<>();
        List<ServiceSubtask> wechatAgainInfo = new ArrayList<>();
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            //无需随访人次
            if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) {
                serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L);
                if (serviceSubtask.getTaskSituation() !=null && serviceSubtask.getTaskSituation() == 6) {
                if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 6) {
                    serviceSubtaskStatistic.setFilterCount(serviceSubtaskStatistic.getFilterCount() + 1L);
                    filterServiceSubtasks.add(serviceSubtask);
                }
@@ -2550,36 +2606,62 @@
                    serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L);
                    pendingFollowUpInfo.add(serviceSubtask);
                }
                //首次随访成功
                if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6)) {
                    serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                    followUpSuccessInfo.add(serviceSubtask);
                }
                //首次随访失败
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) {
                    serviceSubtaskStatistic.setFollowUpFail(serviceSubtaskStatistic.getFollowUpFail() + 1L);
                    followUpFailInfo.add(serviceSubtask);
                }
                /**
                 * 不同统计方式下不同的随访成功数 参数 followUpCountStyle 控制
                 */
                if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")) {
                    //首次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6L)) {
                        serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                        followUpSuccessInfo.add(serviceSubtask);
                    }
                    //首次随访人工 (不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManual(serviceSubtaskStatistic.getManual() + 1L);
                        manualInfo.add(serviceSubtask);
                    }
                    //首次随访短信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L);
                        smsInfo.add(serviceSubtask);
                    }
                    //首次随访微信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        wechatInfo.add(serviceSubtask);
                    }
                } else {
                    //首次随访成功 - 统计时候加上不执行的,已发送的
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L) || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                        serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                        followUpSuccessInfo.add(serviceSubtask);
                    }
                    //首次随访人工 (统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManual(serviceSubtaskStatistic.getManual() + 1L);
                        manualInfo.add(serviceSubtask);
                    }
                    //首次随访短信(统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L);
                        smsInfo.add(serviceSubtask);
                    }
                    //首次随访微信(统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        wechatInfo.add(serviceSubtask);
                    }
                }
                if (serviceSubtaskStatistic.getNeedFollowUp() > 0) {
                    double rate = (double) (serviceSubtaskStatistic.getFollowUpSuccess() + serviceSubtaskStatistic.getFollowUpFail()) / serviceSubtaskStatistic.getNeedFollowUp();
                    serviceSubtaskStatistic.setFollowUpRate(percentFormat.format(rate));
                } else {
                    serviceSubtaskStatistic.setFollowUpRate("0.00%");
                }
                //首次随访人工
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                    serviceSubtaskStatistic.setManual(serviceSubtaskStatistic.getManual() + 1L);
                    manualInfo.add(serviceSubtask);
                }
                //首次随访短信
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                    serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L);
                    smsInfo.add(serviceSubtask);
                }
                //首次随访微信
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                    serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                    wechatInfo.add(serviceSubtask);
                }
                //结果异常
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) {
@@ -2597,36 +2679,62 @@
                    serviceSubtaskStatistic.setPendingFollowUpAgain(serviceSubtaskStatistic.getPendingFollowUpAgain() + 1L);
                    pendingFollowUpAgainInfo.add(serviceSubtask);
                }
                //再次随访成功
                if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 1 || serviceSubtask.getSendstate() == 3 || serviceSubtask.getSendstate() == 6)) {
                    serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
                    followUpSuccessAgainInfo.add(serviceSubtask);
                }
                //再次随访失败
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) {
                    serviceSubtaskStatistic.setFollowUpFailAgain(serviceSubtaskStatistic.getFollowUpFailAgain() + 1L);
                    followUpFailAgainInfo.add(serviceSubtask);
                }
                /**
                 * 不同统计方式下不同的随访成功数 参数 followUpCountStyle 控制
                 */
                if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")) {
                    //再次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 1 || serviceSubtask.getSendstate() == 3 || serviceSubtask.getSendstate() == 6)) {
                        serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
                        followUpSuccessAgainInfo.add(serviceSubtask);
                    }
                    //再次随访人工(不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManualAgain(serviceSubtaskStatistic.getManualAgain() + 1L);
                        manualAgainInfo.add(serviceSubtask);
                    }
                    //再次随访短信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L);
                        smsAgainInfo.add(serviceSubtask);
                    }
                    //再次随访微信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                        wechatAgainInfo.add(serviceSubtask);
                    }
                } else {
                    //再次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(1L) || serviceSubtask.getSendstate().equals(6L) || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                        serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
                        followUpSuccessAgainInfo.add(serviceSubtask);
                    }
                    //再次随访人工(统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManualAgain(serviceSubtaskStatistic.getManualAgain() + 1L);
                        manualAgainInfo.add(serviceSubtask);
                    }
                    //再次随访短信(统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L);
                        smsAgainInfo.add(serviceSubtask);
                    }
                    //再次随访微信(统计不执行)
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                        wechatAgainInfo.add(serviceSubtask);
                    }
                }
                if (serviceSubtaskStatistic.getNeedFollowUp() > 0) {
                    double rate = (double) (serviceSubtaskStatistic.getFollowUpSuccessAgain() + serviceSubtaskStatistic.getFollowUpFailAgain()) / serviceSubtaskStatistic.getNeedFollowUpAgain();
                    serviceSubtaskStatistic.setFollowUpRateAgain(percentFormat.format(rate));
                } else {
                    serviceSubtaskStatistic.setFollowUpRateAgain("0.00%");
                }
                //再次随访人工
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                    serviceSubtaskStatistic.setManualAgain(serviceSubtaskStatistic.getManualAgain() + 1L);
                    manualAgainInfo.add(serviceSubtask);
                }
                //再次随访短信
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                    serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L);
                    smsAgainInfo.add(serviceSubtask);
                }
                //再次随访微信
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                    serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                    wechatAgainInfo.add(serviceSubtask);
                }
                //再次异常
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) {
@@ -2805,7 +2913,7 @@
        //获取随访统计
        List<Long> subTaskIds = new ArrayList<>();
        if(ObjectUtils.isNotEmpty(serviceSubtaskList)){
        if (ObjectUtils.isNotEmpty(serviceSubtaskList)) {
            subTaskIds = serviceSubtaskList.stream().map(ServiceSubtask::getId)      // 提取字段
                    .filter(Objects::nonNull)       // 过滤 null 值
                    .filter(id -> ObjectUtils.isNotEmpty(id))  // 过滤空字符串(可选)
@@ -3071,59 +3179,66 @@
    @Override
    @Cacheable(value = "getSfStatisticsScript", key = "T(org.springframework.util.DigestUtils).md5DigestAsHex(#serviceSubtaskCountReq.toString().getBytes())", unless = "#result == null or #result.isEmpty()")
    public List<ServiceSubtaskStatistic> getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        log.error("getSfStatisticsScript的入参为:{}", serviceSubtaskCountReq);
        log.info("getSfStatisticsScript的入参为:{}", serviceSubtaskCountReq);
        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
        // 根据条件进行分组
        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
        String orgid = null;
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) {
        String groupKey = "drcode";
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && !serviceSubtaskCountReq.getLeavehospitaldistrictcodes().isEmpty()) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
                groupKey = "drcode";
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown")));
                groupKey = "leavehospitaldistrictcode";
            }
        } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) {
        } else if (serviceSubtaskCountReq.getDeptcodes() != null && !serviceSubtaskCountReq.getDeptcodes().isEmpty()) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
                groupKey = "drcode";
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
                groupKey = "deptcode";
            }
        }
        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
        serviceSubtaskCountReq.setGroupKey(groupKey);
        List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
        serviceSubtaskCountReq.setGroupKeyList(groupKeyList);
        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        switch (groupKey) {
            case "deptcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
                break;
            case "drcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
            case "leavehospitaldistrictcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictcode()).orElse("Unknown")));
                break;
            default:
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
        }
        //获取及时率统计合集
        Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, collect);
        for (String collectKey : collect.keySet()) {
            List<ServiceSubtask> serviceSubtaskList = collect.get(collectKey);
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatisticCategory(serviceSubtaskList, serviceSubtaskCountReq);
            //及时率
            ServiceSubtask ss = new ServiceSubtask();
            orgid = serviceSubtaskList.get(0).getOrgid();
            ss.setOrgid(orgid);
            // 如果有医生编码,设置医生编码用于及时率查询
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
            if (ObjectUtils.isNotEmpty(jsRates)) {
                Map<String, Object> jsRateMap = jsRates.get(collectKey);
                BigDecimal jsRate = new BigDecimal("0");
                if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
                    jsRate = new BigDecimal(jsRateMap.get("rate").toString());
                }
                Double jsRateDouble = (jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue();
                statistic.setRate(jsRateDouble);
            }
            ss.setStarttime(serviceSubtaskCountReq.getStartTime());
            ss.setEndtime(serviceSubtaskCountReq.getEndTime());
            if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
                ss.setEndtime(new Date());
            }
            Double jsRate = serviceSubtaskMapper.selectTimelyRate(ss);
            statistic.setRate(jsRate);
            if (ObjectUtils.isNotEmpty(statistic)) {
                serviceSubtaskStatistics.add(statistic);
            }
        }
        //统计随访题目分类
        if (CollectionUtils.isNotEmpty(serviceSubtaskStatistics)) {
            for (ServiceSubtaskStatistic serviceSubtaskStatistic : serviceSubtaskStatistics) {
                //获取满意度题目总量
@@ -3132,14 +3247,14 @@
                BigDecimal finishedSum = new BigDecimal(0);
                //完成比例
                Double finishedPercentage = null;
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())){
                if (ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())) {
                    finishedSum = new BigDecimal(serviceSubtaskStatistic.getJoyCount());
                }
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())){
                if (ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())) {
                    sum = new BigDecimal(serviceSubtaskStatistic.getJoyAllCount());
                }
                if(sum.intValue() != 0){
                if (sum.intValue() != 0) {
                    finishedPercentage = finishedSum.divide(sum, 2, RoundingMode.HALF_UP).doubleValue();
                }
                serviceSubtaskStatistic.setJoyAllCount(sum.intValue());
@@ -3157,7 +3272,7 @@
        List<ServiceSubtaskScriptCount> allCounts = new ArrayList<>();
        List<ServiceSubtaskScriptCount> allItemCounts = new ArrayList<>();
        String type = serviceSubtaskCountReq.getType();
        if(ObjectUtils.isEmpty(type)){
        if (ObjectUtils.isEmpty(type)) {
            //查询语音统计明细
            serviceSubtaskCountReq.setType("1");
            List<ServiceSubtaskScriptCount> ivyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
@@ -3172,26 +3287,24 @@
            allCounts.addAll(svyCounts);
            allItemCounts.addAll(ivyItemCounts);
            allItemCounts.addAll(svyItemCounts);
        }else {
        } else {
            allCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
            allItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
        }
        for(ServiceSubtaskScriptCount count : allCounts){
        for (ServiceSubtaskScriptCount count : allCounts) {
            Map<String, ServiceSubtaskScriptCount> itemCountMap = new HashMap<>();
            //问卷加上空白选项
            if(ObjectUtils.isNotEmpty(count.getTemplateid())
                    && ObjectUtils.isNotEmpty(count.getSubtaskType())
                    && count.getSubtaskType().equals("2")){
            if (ObjectUtils.isNotEmpty(count.getTemplateid()) && ObjectUtils.isNotEmpty(count.getSubtaskType()) && count.getSubtaskType().equals("2")) {
                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = new SvyTaskTemplateScriptVO();
                svyTaskTemplateScriptVO.setId(count.getScriptid());
                svyTaskTemplateScriptVO.setOrgid(serviceSubtaskCountReq.getOrgid());
                SvyTaskTemplateScriptVO svyTaskTemplateScriptResultVo = svyTaskTemplateScriptService.selectInfoByCondition(svyTaskTemplateScriptVO);
                if(ObjectUtils.isNotEmpty(svyTaskTemplateScriptResultVo)){
                if (ObjectUtils.isNotEmpty(svyTaskTemplateScriptResultVo)) {
                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = svyTaskTemplateScriptResultVo.getSvyTaskTemplateTargetoptions();
                    if(ObjectUtils.isNotEmpty(svyTaskTemplateTargetoptions)){
                    if (ObjectUtils.isNotEmpty(svyTaskTemplateTargetoptions)) {
                        //填入空白信息
                        svyTaskTemplateTargetoptions.forEach(targetoption ->{
                        svyTaskTemplateTargetoptions.forEach(targetoption -> {
                            ServiceSubtaskScriptCount emptyCount = new ServiceSubtaskScriptCount();
                            emptyCount.setScriptid(count.getScriptid());
                            emptyCount.setScriptContent(count.getScriptContent());
@@ -3204,14 +3317,14 @@
                            emptyCount.setChosenQuantity(0);
                            emptyCount.setChosenPercentage("0.0");
                            emptyCount.setOptionText(targetoption.getOptioncontent());
                            itemCountMap.put(targetoption.getOptioncontent(),emptyCount);
                            itemCountMap.put(targetoption.getOptioncontent(), emptyCount);
                        });
                    }
                }
            }
            allItemCounts.forEach(itemCount ->{
                if(ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())){
                    if(count.getScriptid().equals(itemCount.getScriptid())){
            allItemCounts.forEach(itemCount -> {
                if (ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())) {
                    if (count.getScriptid().equals(itemCount.getScriptid())) {
                        //放入统计信息
                        itemCount.setScriptContent(count.getScriptContent());
                        itemCount.setScriptType(count.getScriptType());
@@ -3221,9 +3334,9 @@
                        itemCount.setCompletedPercentage(count.getCompletedPercentage());
                        itemCount.setTemplateid(count.getTemplateid());
                        //计算选择比例
                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity())?itemCount.getChosenQuantity():0;
                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity()) ? itemCount.getChosenQuantity() : 0;
                        int completedQuantity = itemCount.getCompletedQuantity();
                        if(ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0){
                        if (ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0) {
                            BigDecimal chosenPercentage = (new BigDecimal(chosenQuantity)).divide(new BigDecimal(completedQuantity), 2, RoundingMode.HALF_UP);
                            itemCount.setChosenPercentage(chosenPercentage.toString());
                        }
@@ -3233,7 +3346,7 @@
            });
            List<ServiceSubtaskScriptCount> itemCounts = new ArrayList<>(itemCountMap.values());
            count.setDetails(itemCounts);
            result.put(count.getScriptid().toString(),count);
            result.put(count.getScriptid().toString(), count);
        }
        return result;
    }
@@ -3247,6 +3360,7 @@
     * @return
     */
    public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
        log.info("setFailPreachForm 随访流程处理 serviceSubtask:{}, preachform:{}, remark:{}, failSendstate:{}", serviceSubtask, preachform, remark, failSendstate);
        //将状态设置为失败
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
@@ -3273,6 +3387,7 @@
            if (serviceSubtaskPreachform1.getSort() == spSize.size() && failSendstate.equals("4")) {
                serviceSubtask.setCurrentPreachform(preachform);
                serviceSubtask.setSendstate(5L);
                serviceSubtask.setRemark("setFailPreachForm方法 当前的preachform已经是最后一个了,全失败了");
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                return true;
            }
@@ -3312,6 +3427,7 @@
    /**
     * 计算总计行
     *
     * @param statistics 统计数据列表
     * @return 总计行数据
     */
@@ -3419,8 +3535,8 @@
            diagname.setLongSendTime(subtask.getLongSendTime());
            diagname.setEndtime(subtask.getEndtime());
            //计算出院天数
            if(!Objects.isNull(diagname.getEndtime())){
                Integer endDay = DateUtils.differentDaysByMillisecond(diagname.getEndtime(),new Date());
            if (!Objects.isNull(diagname.getEndtime())) {
                Integer endDay = DateUtils.differentDaysByMillisecond(diagname.getEndtime(), new Date());
                diagname.setEndDay(endDay);
            }
            diagname.setSfzh(subtask.getSfzh());