|  |  | 
 |  |  | package com.smartor.service.impl; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson2.JSON; | 
 |  |  | import com.alibaba.fastjson2.JSONObject; | 
 |  |  | import com.fasterxml.jackson.core.JsonProcessingException; | 
 |  |  | import com.fasterxml.jackson.databind.ObjectMapper; | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.ruoyi.common.core.redis.RedisCache; | 
 |  |  | import com.ruoyi.common.dx.MessageSend; | 
 |  |  | import com.ruoyi.common.exception.base.BaseException; | 
 |  |  | import com.ruoyi.common.utils.*; | 
 |  |  | import com.smartor.common.FtpService; | 
 |  |  | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.commons.collections4.CollectionUtils; | 
 |  |  | import org.apache.commons.lang3.ObjectUtils; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.data.redis.core.ListOperations; | 
 |  |  | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.text.DecimalFormat; | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.time.Duration; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalTime; | 
 |  |  | import java.time.ZoneId; | 
 |  |  | import java.time.*; | 
 |  |  | import java.time.format.DateTimeFormatter; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.concurrent.TimeUnit; | 
 |  |  | 
 |  |  | public class ServiceSubtaskServiceImpl implements IServiceSubtaskService { | 
 |  |  |     @Autowired | 
 |  |  |     private ServiceSubtaskMapper serviceSubtaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper; | 
 |  |  | 
 |  |  |         return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO) { | 
 |  |  |         return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskVO); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) { | 
 |  |  |         //定义患者与单一任务关联表集合 | 
 |  |  | 
 |  |  |  | 
 |  |  |         ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); | 
 |  |  |         if (CollectionUtils.isEmpty(list) || list.size() == 0) { | 
 |  |  |             return DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class); | 
 |  |  |         } | 
 |  |  |             ServiceTaskVO serviceTaskVO = DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class); | 
 |  |  |             ObjectMapper objectMapper = new ObjectMapper(); | 
 |  |  |             try { | 
 |  |  |                 List<Map<String, Object>> mapList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class); | 
 |  |  |                 serviceTaskVO.setPreachformList(mapList); | 
 |  |  | // | 
 |  |  | //                String result = mapList.stream().map(mapList1 -> mapList1.get("preachform")).map(String::valueOf).collect(Collectors.joining(",")); | 
 |  |  | //                serviceTaskVO.setPreachform(result); | 
 |  |  |             } catch (JsonProcessingException e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return serviceTaskVO; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //将查出来的数据倒入ServiceSubtaskVO中 | 
 |  |  |         ServiceTaskVO serviceTaskVO = DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class); | 
 |  |  | 
 |  |  |                 patTaskRelevance.setNurseName(serviceSubtask1.getNurseName()); | 
 |  |  |                 patTaskRelevances.add(patTaskRelevance); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //获取该患者所有的执行状态 | 
 |  |  |             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |             serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid()); | 
 |  |  |             serviceSubtaskPreachform.setSubid(serviceSubtask1.getId()); | 
 |  |  |             List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); | 
 |  |  |             List<Map<String, Object>> resultList = serviceSubtaskPreachformList.stream().map(item -> { | 
 |  |  |                 Map<String, Object> map = new HashMap<>(); | 
 |  |  |                 map.put("sort", item.getSort()); | 
 |  |  |                 map.put("preachform", item.getPreachform()); | 
 |  |  |                 map.put("compensateTime", item.getCompensateTime()); | 
 |  |  |                 return map; | 
 |  |  |             }).collect(Collectors.toList()); | 
 |  |  |             serviceTaskVO.setPreachformList(resultList); | 
 |  |  |  | 
 |  |  | //            String result = resultList.stream().map(mapList1 -> mapList1.get("preachform")).map(String::valueOf).collect(Collectors.joining(",")); | 
 |  |  | //            serviceTaskVO.setPreachform(result); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         serviceTaskVO.setPatTaskRelevances(patTaskRelevances); | 
 |  |  | 
 |  |  |         Integer fssb = 0; | 
 |  |  |         Integer yfs = 0; | 
 |  |  |         Integer blq = 0; | 
 |  |  |         Integer dsf = 0; | 
 |  |  |         for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { | 
 |  |  |             if (serviceSubtask.getSendstate() == 4L) wzx = wzx + 1; | 
 |  |  |             else if (serviceSubtask.getSendstate() != 4L) ysf = ysf + 1; | 
 |  |  |             else if (serviceSubtask.getSendstate() != 4L && serviceSubtask.getSendstate() != 2L) ysf = ysf + 1; | 
 |  |  |             if (serviceSubtask.getSendstate() == 5L) fssb = fssb + 1; | 
 |  |  |             if (serviceSubtask.getSendstate() >= 3L || serviceSubtask.getSendstate() == 1L) yfs = yfs + 1; | 
 |  |  |             if (serviceSubtask.getSendstate() == 2L) dsf = dsf + 1; | 
 |  |  |             if (serviceSubtask.getSendstate() == 1L) blq = blq + 1; | 
 |  |  |             if (serviceSubtask.getExcep().equals("1")) yc = yc + 1; | 
 |  |  |             if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && !serviceSubtask.getExcep().equals("0")) | 
 |  |  |                 yc = yc + 1; | 
 |  |  |         } | 
 |  |  |         map.put("wzx", wzx); | 
 |  |  |         map.put("ysf", ysf); | 
 |  |  | 
 |  |  |         map.put("fssb", fssb); | 
 |  |  |         map.put("yfs", yfs); | 
 |  |  |         map.put("blq", blq); | 
 |  |  |         map.put("dsf", dsf); | 
 |  |  |  | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  | 
 |  |  |             serviceSubtask1.setIsVisitAgain(2); | 
 |  |  |             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); | 
 |  |  |             return "无需再次随访,任务被标记不在执行"; | 
 |  |  |         } else if (patArchive.getNotrequiredFlag().equals("1")) { | 
 |  |  |         } else if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { | 
 |  |  |             serviceSubtask1.setIsVisitAgain(2); | 
 |  |  |             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); | 
 |  |  |             return "无需再次随访,患者被标记不需要被服务"; | 
 |  |  | 
 |  |  |         //新增再次随访任务 | 
 |  |  |         ServiceSubtask serviceSubtask2 = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class); | 
 |  |  |         serviceSubtask2.setId(null); | 
 |  |  |         serviceSubtask2.setUpid(serviceSubtask1.getUpid()); | 
 |  |  |         serviceSubtask2.setUpid(serviceSubtask1.getId().intValue()); | 
 |  |  |         serviceSubtask2.setVisitCount(serviceSubtask1.getVisitCount() + 1); | 
 |  |  |         serviceSubtask2.setSendstate(2L); | 
 |  |  |         serviceSubtask2.setCreateTime(new Date()); | 
 |  |  |         serviceSubtask2.setUpdateTime(new Date()); | 
 |  |  |         serviceSubtask2.setVisitType(serviceSubtask.getVisitType()); | 
 |  |  |         serviceSubtask2.setVisitDeptCode(serviceSubtask.getVisitDeptCode()); | 
 |  |  |         serviceSubtask2.setVisitDeptName(serviceSubtask.getVisitDeptName()); | 
 |  |  |         int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask2); | 
 |  |  |         if (i == 1) { | 
 |  |  |             //新增成功后,需要将之前的任务设置为不要再随访(防止重复点,然后重复生成) | 
 |  |  | 
 |  |  |             throw new BaseException("任务入参为空,请检查入参"); | 
 |  |  |         } | 
 |  |  |         ServiceTask serviceTask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceTask.class); | 
 |  |  |         if (CollectionUtils.isEmpty(serviceTaskVO.getPreachformList())) throw new BaseException("任务的发送方式为空"); | 
 |  |  |         //将preachfromList放到serviceTask中的preachfrom中 | 
 |  |  |         ObjectMapper mapper = new ObjectMapper(); | 
 |  |  |         try { | 
 |  |  |             String preachformList = mapper.writeValueAsString(serviceTaskVO.getPreachformList()); | 
 |  |  |             serviceTask.setPreachformDesc(preachformList); | 
 |  |  |         } catch (JsonProcessingException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         serviceTask.setTextParam(JSON.toJSONString(serviceTaskVO.getTextParam())); | 
 |  |  |         if (serviceTaskVO.getIsoperation() != null && serviceTaskVO.getIsoperation() == 1) { | 
 |  |  |             //新增模板信息 | 
 |  |  | 
 |  |  |             serviceTask.setCreateTime(new Date()); | 
 |  |  |             serviceTask.setUpdateTime(new Date()); | 
 |  |  |             serviceTaskService.insertServiceTask(serviceTask); | 
 |  |  |             log.error("----serviceTaskVO.getAppltype()的值为:{}", serviceTaskVO.getAppltype()); | 
 |  |  |             log.info("----serviceTaskVO.getAppltype()的值为:{}", serviceTaskVO.getAppltype()); | 
 |  |  |             if (StringUtils.isNotEmpty(serviceTaskVO.getAppltype())) { | 
 |  |  |                 if (serviceTaskVO.getAppltype().equals("3")) { | 
 |  |  |                     ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag(); | 
 |  |  |                     serviceTaskdiag.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                     serviceTaskdiag.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                     serviceTaskdiag.setLongtask(0L); | 
 |  |  |                     serviceTaskdiag.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                     if (serviceTaskVO.getLongTask() == 1) serviceTaskdiag.setLongtask(1L); | 
 |  |  |                     serviceTaskdiag.setIcd10code(serviceTaskVO.getIcd10code()); | 
 |  |  |                     serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name()); | 
 |  |  |                     serviceTaskdiag.setGuid(serviceTask.getGuid()); | 
 |  |  |                     serviceTaskdiag.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                     serviceTaskdiag.setCreateTime(new Date()); | 
 |  |  |                     log.error("----serviceTaskdiag的值为:{}", serviceTaskdiag); | 
 |  |  |                     log.info("----serviceTaskdiag的值为:{}", serviceTaskdiag); | 
 |  |  |                     if (StringUtils.isNotEmpty(serviceTaskVO.getIcd10code())) { | 
 |  |  |                         String[] Icd10codes = serviceTaskVO.getIcd10code().split(","); | 
 |  |  |                         for (String icd10code : Icd10codes) { | 
 |  |  | 
 |  |  |                     serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc()); | 
 |  |  |                     serviceTaskoper.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                     serviceTaskoper.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                     serviceTaskoper.setLongtask(0L); | 
 |  |  |                     serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                     serviceTaskoper.setGuid(serviceTask.getGuid()); | 
 |  |  |                     serviceTaskoper.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                     serviceTaskoper.setCreateTime(new Date()); | 
 |  |  |                     if (serviceTaskVO.getLongTask() == 1) serviceTaskoper.setLongtask(1L); | 
 |  |  |                     if (StringUtils.isNotEmpty(serviceTaskVO.getOpcode())) { | 
 |  |  |                         String[] opcodes = serviceTaskVO.getOpcode().split(","); | 
 |  |  |                         for (String opcode : opcodes) { | 
 |  |  |                             serviceTaskoper.setOpcode(opcode); | 
 |  |  |                             log.error("----serviceTaskoper的值为:{}", serviceTaskoper); | 
 |  |  |                             log.info("----serviceTaskoper的值为:{}", serviceTaskoper); | 
 |  |  |                             serviceTaskoperService.insertServiceTaskoper(serviceTaskoper); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  | 
 |  |  |                     ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); | 
 |  |  |                     serviceTaskdept.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                     serviceTaskdept.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                     serviceTaskdept.setLongtask(0L); | 
 |  |  |                     if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); | 
 |  |  |                     serviceTaskdept.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                     serviceTaskdept.setLongtask(Long.valueOf(serviceTaskVO.getLongTask())); | 
 |  |  |                     if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) { | 
 |  |  |                         String[] deptcodes = serviceTaskVO.getDeptcode().split(","); | 
 |  |  |                         for (String deptCode : deptcodes) { | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1 && serviceTaskVO.getPatCycle() == 0L) { | 
 |  |  |                 Map<String, Integer> map = new HashMap<>(); | 
 |  |  |                 map.put("taskId", serviceTask.getTaskid().intValue()); | 
 |  |  |                 return map; | 
 |  |  |             } | 
 |  |  | //长期任务,也允许加人了 | 
 |  |  | //            if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1 && serviceTaskVO.getPatCycle() == 0L) { | 
 |  |  | //                Map<String, Integer> map = new HashMap<>(); | 
 |  |  | //                map.put("taskId", serviceTask.getTaskid().intValue()); | 
 |  |  | //                return map; | 
 |  |  | //            } | 
 |  |  |  | 
 |  |  |             //将任务信息放到服务表中 | 
 |  |  |             ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); | 
 |  |  | 
 |  |  |                     serviceSubtask.setDeptname(patTaskRelevance.getDeptName()); | 
 |  |  |                     serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); | 
 |  |  |                     serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); | 
 |  |  |                     serviceSubtask.setType(serviceTaskVO.getHospType()); | 
 |  |  |                     serviceSubtask.setType(serviceTaskVO.getType()); | 
 |  |  |                     serviceSubtask.setHospType(patTaskRelevance.getHospType()); | 
 |  |  |                     serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); | 
 |  |  |                     serviceSubtask.setDrname(patTaskRelevance.getDrname()); | 
 |  |  | 
 |  |  |                     serviceSubtask.setNurseName(patTaskRelevance.getNurseName()); | 
 |  |  |                     serviceSubtask.setCreateBy(serviceTask.getCreateBy()); | 
 |  |  |                     serviceSubtask.setUpdateBy(serviceTask.getCreateBy()); | 
 |  |  |                     serviceSubtask.setVisitTime(patTaskRelevance.getVisittime()); | 
 |  |  |                     if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1) | 
 |  |  |                         serviceSubtask.setLongSendTime(patTaskRelevance.getLongSendTime()); | 
 |  |  |                     serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); | 
 |  |  |                     serviceSubtask.getId().intValue(); | 
 |  |  |  | 
 |  |  |                     //需要按service_task里的preachform的顺序将发送方式保存到service_subtask_preachform表中 | 
 |  |  |                     if (StringUtils.isNotEmpty(serviceTaskVO.getPreachformList())) { | 
 |  |  |                         List<Map<String, Object>> pfList = serviceTaskVO.getPreachformList(); | 
 |  |  |                         for (Map<String, Object> map : pfList) { | 
 |  |  |                             ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |                             serviceSubtaskPreachform.setSort(ObjectUtils.isEmpty(map.get("sort")) ? 0 : Long.valueOf(map.get("sort").toString())); | 
 |  |  |                             serviceSubtaskPreachform.setPreachform(ObjectUtils.isEmpty(map.get("preachform")) ? "" : map.get("preachform").toString()); | 
 |  |  |                             serviceSubtaskPreachform.setCompensateTime(ObjectUtils.isEmpty(map.get("compensateTime")) ? "" : map.get("compensateTime").toString()); | 
 |  |  |                             serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid()); | 
 |  |  |                             serviceSubtaskPreachform.setSubid(serviceSubtask.getId()); | 
 |  |  |                             //这个sendstate需要在数据库设置一个默认值为“1” | 
 |  |  |                             serviceSubtaskPreachform.setSendstate("1"); | 
 |  |  |                             serviceSubtaskPreachform.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                             serviceSubtaskPreachform.setCreateTime(new Date()); | 
 |  |  |                             serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | 
 |  |  |                 serviceTask.setSendTimeSlot(JSON.toJSONString(serviceTaskVO.getSendTimeslot())); | 
 |  |  |             //修改操作,需要将stopState状态+1 | 
 |  |  |             ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid()); | 
 |  |  | //            long l = serviceTask1.getStopState() + 1; | 
 |  |  | //            serviceTask.setStopState(l); | 
 |  |  |             //获取到该任务所有的服务,并从队列里删除 | 
 |  |  |             ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO(); | 
 |  |  |             serviceSubtaskVO.setTaskid(serviceTask1.getTaskid()); | 
 |  |  | 
 |  |  |             } else { | 
 |  |  |                 if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList = serviceSubtaskList1; | 
 |  |  |             } | 
 |  |  |             if (CollectionUtils.isNotEmpty(serviceSubtaskList)) { | 
 |  |  |                 for (ServiceSubtask serviceSubtask : serviceSubtaskList) { | 
 |  |  |                     log.error("insertOrUpdateTask需要移除的subId为:{}", serviceSubtask.getId().toString()); | 
 |  |  |                     serviceSubtaskMapper.deleteServiceSubtaskById(serviceSubtask.getId()); | 
 |  |  |                     redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString()); | 
 |  |  |                     redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString()); | 
 |  |  |                     redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString()); | 
 |  |  |                     redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString()); | 
 |  |  |                     redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString()); | 
 |  |  |                     redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (serviceTaskVO.getLibtemplateid() != null) | 
 |  |  |                 serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid().toString()); | 
 |  |  | 
 |  |  |             serviceTask.setUpdateTime(new Date()); | 
 |  |  |             serviceTaskService.updateServiceTask(serviceTask); | 
 |  |  |             if (serviceTaskVO.getAppltype().equals("1") || serviceTaskVO.getAppltype().equals("2")) { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) { | 
 |  |  |                     String[] deptcodes = serviceTaskVO.getDeptcode().split(","); | 
 |  |  |                     for (String deptCode : deptcodes) { | 
 |  |  |                         ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); | 
 |  |  |                         serviceTaskdept.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                         serviceTaskdept.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                         serviceTaskdept.setLongtask(0L); | 
 |  |  |                         serviceTaskdept.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                         serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); | 
 |  |  |                         if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); | 
 |  |  |                         serviceTaskdept.setDeptCode(deptCode); | 
 |  |  |                         serviceTaskdept.setDeptType("1"); | 
 |  |  |                         serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); | 
 |  |  | 
 |  |  |                         ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); | 
 |  |  |                         serviceTaskdept.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                         serviceTaskdept.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                         serviceTaskdept.setLongtask(0L); | 
 |  |  |                         serviceTaskdept.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                         serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); | 
 |  |  |                         if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); | 
 |  |  |                         serviceTaskdept.setDeptCode(districtcode); | 
 |  |  |                         serviceTaskdept.setDeptType("2"); | 
 |  |  |                         serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); | 
 |  |  | 
 |  |  |                 if (StringUtils.isEmpty(serviceTaskVO.getIcd10code())) { | 
 |  |  |                     throw new BaseException("疾病编码为空"); | 
 |  |  |                 } | 
 |  |  | //                serviceTaskdiag.setIcd10code(serviceTaskVO.getIcd10code()); | 
 |  |  |  | 
 |  |  |                 serviceTaskdiag.setLongtask(1L); | 
 |  |  |                 serviceTaskdiag.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                 serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name()); | 
 |  |  |                 serviceTaskdiag.setGuid(serviceTask.getGuid()); | 
 |  |  |                 serviceTaskdiag.setOrgid(serviceTask.getOrgid()); | 
 |  |  | 
 |  |  |                         serviceTaskdiag2.setIcd10code(icdcode); | 
 |  |  |                         List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagService.selectServiceTaskdiagList(serviceTaskdiag2); | 
 |  |  |                         serviceTaskdiag.setIcd10code(icdcode); | 
 |  |  |                         log.error("----serviceTaskdiag更新的值为:{}", serviceTaskdiag); | 
 |  |  |                         log.info("----serviceTaskdiag更新的值为:{}", serviceTaskdiag); | 
 |  |  |                         if (CollectionUtils.isNotEmpty(serviceTaskdiags)) { | 
 |  |  |                             serviceTaskdiag.setId(serviceTaskdiags.get(0).getId()); | 
 |  |  |                             serviceTaskdiagService.updateServiceTaskdiag(serviceTaskdiag); | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } else if (serviceTaskVO.getAppltype().equals("4")) { | 
 |  |  |                 ServiceTaskoper serviceTaskoper = new ServiceTaskoper(); | 
 |  |  | 
 |  |  |                 serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc()); | 
 |  |  |                 serviceTaskoper.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                 serviceTaskoper.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                 serviceTaskoper.setLongtask(1L); | 
 |  |  |                 serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask())); | 
 |  |  |                 serviceTaskoper.setGuid(serviceTask.getGuid()); | 
 |  |  |                 serviceTaskoper.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                 serviceTaskoper.setCreateTime(new Date()); | 
 |  |  | 
 |  |  |                         List<ServiceTaskoper> serviceTaskopers = serviceTaskoperService.selectServiceTaskoperList(serviceTaskoper2); | 
 |  |  |  | 
 |  |  |                         serviceTaskoper.setOpcode(opcode); | 
 |  |  |                         log.error("----serviceTaskoper的值为:{}", serviceTaskoper); | 
 |  |  |                         log.info("----serviceTaskoper的值为:{}", serviceTaskoper); | 
 |  |  |                         if (CollectionUtils.isNotEmpty(serviceTaskopers)) { | 
 |  |  |                             serviceTaskoper.setId(serviceTaskopers.get(0).getId()); | 
 |  |  |                             serviceTaskoperService.updateServiceTaskoper(serviceTaskoper); | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) { | 
 |  |  |                 IvrTaskTemplate ivrTaskTemplate = new IvrTaskTemplate(); | 
 |  |  | 
 |  |  |                     serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); | 
 |  |  |                     serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); | 
 |  |  |                     serviceSubtask.setDeptname(patTaskRelevance.getDeptName()); | 
 |  |  |                     serviceSubtask.setType(serviceTaskVO.getHospType()); | 
 |  |  |                     serviceSubtask.setType(serviceTaskVO.getType()); | 
 |  |  |                     serviceSubtask.setCreateTime(DateUtils.getNowDate()); | 
 |  |  |                     serviceSubtask.setDrname(patTaskRelevance.getDrname()); | 
 |  |  |                     serviceSubtask.setDrcode(patTaskRelevance.getDrcode()); | 
 |  |  | 
 |  |  |                     serviceSubtask.setEndtime(patTaskRelevance.getEndtime()); | 
 |  |  |                     serviceSubtask.setNurseId(patTaskRelevance.getNurseId()); | 
 |  |  |                     serviceSubtask.setNurseName(patTaskRelevance.getNurseName()); | 
 |  |  |                     serviceSubtask.setVisitTime(patTaskRelevance.getVisittime()); | 
 |  |  |                     serviceSubtask.setTextParam(new Gson().toJson(serviceTaskVO.getTextParam())); | 
 |  |  |                     if (patTaskRelevance.getIsoperation() != null) { | 
 |  |  |                         if (patTaskRelevance.getIsoperation() == 2) | 
 |  |  |                         if (patTaskRelevance.getIsoperation() == 2) { | 
 |  |  |                             serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); | 
 |  |  |                         serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); | 
 |  |  |                             serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); | 
 |  |  |                         } | 
 |  |  |                         if (patTaskRelevance.getIsoperation() == 1) { | 
 |  |  |                             serviceSubtask.setSendstate(1L); | 
 |  |  |                             serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); | 
 |  |  | 
 |  |  |                             serviceSubtaskMapper.deleteServiceSubtaskByCondition(serviceTaskVO.getTaskid(), patTaskRelevance.getPatid()); | 
 |  |  |                     } | 
 |  |  |                     serviceSubtask.getTaskid().intValue(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             // 有可能会把发送顺序也修改了(需要根据taskId将所有的sendstate!=4,5,6的subTask拉出来,进行修改一下) | 
 |  |  |             ServiceSubtaskVO ssVo = new ServiceSubtaskVO(); | 
 |  |  |             ssVo.setTaskid(serviceTaskVO.getTaskid()); | 
 |  |  |             ssVo.setDelFlag("0"); | 
 |  |  |             List<Long> ssList = new ArrayList<>(); | 
 |  |  |             ssList.add(1l); | 
 |  |  |             ssList.add(2L); | 
 |  |  |             ssList.add(3L); | 
 |  |  |             ssVo.setSendstates(ssList); | 
 |  |  |             List<ServiceSubtask> ssTaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(ssVo); | 
 |  |  |             for (int i = 0; i < ssTaskList.size(); i++) { | 
 |  |  |                 ServiceSubtask serviceSubtask = ssTaskList.get(i); | 
 |  |  |                 serviceSubtaskPreachformMapper.deleteServiceSubtaskPreachformBySubid(serviceSubtask.getId()); | 
 |  |  |                 if (StringUtils.isNotEmpty(serviceTaskVO.getPreachformList())) { | 
 |  |  |                     List<Map<String, Object>> pfList = serviceTaskVO.getPreachformList(); | 
 |  |  |                     for (Map<String, Object> map : pfList) { | 
 |  |  |                         ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |                         serviceSubtaskPreachform.setSort(ObjectUtils.isEmpty(map.get("sort")) ? 0 : Long.valueOf(map.get("sort").toString())); | 
 |  |  |                         serviceSubtaskPreachform.setPreachform(ObjectUtils.isEmpty(map.get("preachform")) ? "" : map.get("preachform").toString()); | 
 |  |  |                         serviceSubtaskPreachform.setCompensateTime(ObjectUtils.isEmpty(map.get("compensateTime")) ? "" : map.get("compensateTime").toString()); | 
 |  |  |                         serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid()); | 
 |  |  |                         serviceSubtaskPreachform.setSubid(serviceSubtask.getId()); | 
 |  |  |                         //这个sendstate需要在数据库设置一个默认值为“1” | 
 |  |  |                         serviceSubtaskPreachform.setSendstate("1"); | 
 |  |  |                         serviceSubtaskPreachform.setOrgid(serviceTask.getOrgid()); | 
 |  |  | //                        serviceSubtaskPreachform.setSort(Long.valueOf(i)); | 
 |  |  |                         serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |                     //有下一题 | 
 |  |  |                     redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); | 
 |  |  |                     IvrTaskTemplateScriptVO nextQuestion = getNextQuestion(IvrTaskTemplateScriptVOs, nowQuestion); | 
 |  |  |                     // 问题,  去调用“tts合成和播放”接口 | 
 |  |  |                     // 问题,  去调用"tts合成和播放"接口 | 
 |  |  |                     String date = simpleDateFormat1.format(new Date()); | 
 |  |  |                     log.info("去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid()); | 
 |  |  |                     phoneUtils.ttsPlayback(nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); | 
 |  |  | 
 |  |  |                 redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES); | 
 |  |  |                 //调用ivrLibaTemplateScriptVO中的slienceText(静默话术) | 
 |  |  |                 String slienceText = nowQuestion.getSlienceText(); | 
 |  |  |                 //静默话术  + 问题,  去调用“tts合成和播放”接口 | 
 |  |  |                 //静默话术  + 问题,  去调用"tts合成和播放"接口 | 
 |  |  |                 String date = simpleDateFormat1.format(new Date()); | 
 |  |  |                 log.info("静默话术  + 问题,去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid()); | 
 |  |  |                 phoneUtils.ttsPlayback(slienceText + nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); | 
 |  |  | 
 |  |  |                             redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); | 
 |  |  |                             redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES); | 
 |  |  |                         } | 
 |  |  |                         //调用“15、tts合成和播放, tts_playback”将结果传回 | 
 |  |  |                         //调用"15、tts合成和播放, tts_playback"将结果传回 | 
 |  |  |                         String date = simpleDateFormat1.format(new Date()); | 
 |  |  |                         log.info("调用“15、tts合成和播放------: {},uuid为:{}", date, phoneCallBackVO.getUuid()); | 
 |  |  |                         log.info("调用tts合成和播放------: {},uuid为:{}", date, phoneCallBackVO.getUuid()); | 
 |  |  |                         phoneUtils.ttsPlayback(nowQuestion.getIvrtext() + ivrTaskTemplateScriptVO.getSubmoduleText(), phoneCallBackVO.getUuid()); | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  | 
 |  |  |         //判断是否挂机 | 
 |  |  |         String hangupState = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- hangup"); | 
 |  |  |         Object cacheObject1 = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |         if (StringUtils.isNotEmpty(hangupState) && hangup.equals("1") || ObjectUtils.isNotEmpty(cacheObject1) && String.valueOf(cacheObject1).equals("1")) { | 
 |  |  |         if (StringUtils.isNotEmpty(hangupState) && hangupState.equals("1") || ObjectUtils.isNotEmpty(cacheObject1) && String.valueOf(cacheObject1).equals("1")) { | 
 |  |  |             return new PhoneCallBackYQVO(); | 
 |  |  |         } | 
 |  |  |         if ("AsrCallback".equals(phoneCallReqYQVO.getOperate()) && phoneCallReqYQVO.getEnd_time() != null && phoneCallReqYQVO.getEnd_time() != -1) { | 
 |  |  |             //处理挂断 | 
 |  |  |             if (phoneCallReqYQVO.getAsrtext().contains("拨叫的用户正忙")) { | 
 |  |  |                 //判断 recordAccept-hungup 是否有值,如果有,则说明不用处理了,之前已经处理过了(recordAccept-hungup这个主要是给“通话记录用的,”) | 
 |  |  |                 //判断 recordAccept-hungup 是否有值,如果有,则说明不用处理了,之前已经处理过了(recordAccept-hungup这个主要是给"通话记录用的,") | 
 |  |  |                 Object cacheObject = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |                 if (ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) { | 
 |  |  |                     ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  |                     setFailPreachForm(serviceSubtask, "3", "拨叫的用户正忙", "4"); | 
 |  |  |                     return new PhoneCallBackYQVO(); | 
 |  |  |                 } | 
 |  |  |                 //如果发送状态为6,就说明已经打完了,也没有必要继续往下走了 | 
 |  |  | 
 |  |  |                 //先把默认的recordAccept-hungup删除,再更新 | 
 |  |  |                 redisCache.deleteObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |                 redisCache.setCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES); | 
 |  |  |  | 
 |  |  |                 //记录电话发送状态 | 
 |  |  |                 setFailPreachForm(serviceSubtask2, "3", "电话发送成功(患者挂断)", "4"); | 
 |  |  |  | 
 |  |  |                 //这个时候就需要走补偿机制了,先暂定走短信 | 
 |  |  |                 getSmsCompensate(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  | //                getSmsCompensate(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  |                 return new PhoneCallBackYQVO(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |                     req.put("caller", phoneCallReqYQVO.getPhone()); | 
 |  |  | //                    HttpUtils.sendPost(hangup, new Gson().toJson(req)); | 
 |  |  |                     HttpUtil.postJsonRequest(hangup, new Gson().toJson(req)); | 
 |  |  |                     ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  |                     //记录电话发送状态 | 
 |  |  |                     setFailPreachForm(serviceSubtask, "3", "通话正常结束", "9"); | 
 |  |  |                     //删除结束语的患存 | 
 |  |  |                     redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "- jsy"); | 
 |  |  |                 } else { | 
 |  |  | 
 |  |  |                     log.error("-------PlayEventCallbackPlaystop的值为:{}", true); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return phoneCallBackYQVO; | 
 |  |  |         } | 
 |  |  |         //获取放音是否结束 | 
 |  |  | 
 |  |  |                 serviceSubtask.setUpdateTime(new Date()); | 
 |  |  |                 log.error("先更新一下分数,电话的serviceSubtask的值为:{}", serviceSubtask); | 
 |  |  |                 serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |                 //记录状态 | 
 |  |  |                 setFailPreachForm(serviceSubtask, "3", "静默次数达到" + num + "次", "4"); | 
 |  |  |  | 
 |  |  |                 Map<String, String> map = delRedisValue(null, id.toString()); | 
 |  |  |                 if (ObjectUtils.isNotEmpty(map)) redisCache.setCacheObject(map.get("cacheName"), map.get("val")); | 
 |  |  |                 redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |                 log.info("是否需要挂机:{}", les); | 
 |  |  |                 if (ObjectUtils.isNotEmpty(les)) { | 
 |  |  |                     //对匹配的结果处理一下(看看是不是需要挂机) | 
 |  |  |                     if (les.getIsEnd() != null && les.getIsEnd() == 1) { | 
 |  |  | 
 |  |  |                         ss.setSendstate(6L); | 
 |  |  |                         ss.setRemark("电话拨打已完成"); | 
 |  |  |                         serviceSubtaskMapper.updateServiceSubtask(ss); | 
 |  |  |                         //记录状态 | 
 |  |  |                         setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                         //可以挂机了 | 
 |  |  |                         redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  |                         redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); | 
 |  |  | 
 |  |  |                     if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() || StringUtils.isEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) { | 
 |  |  |                         //说明匹配正确了 | 
 |  |  |                         //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法 | 
 |  |  |                         log.info("匹配正确了吗--------------"); | 
 |  |  |                         ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).setIsUserOperation(1); | 
 |  |  |                         serviceTaskScriptTargetoptionMapper.updateIvrTaskTemplateTargetoption(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j)); | 
 |  |  |  | 
 |  |  | 
 |  |  |                             redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); | 
 |  |  |                             phoneCallBackYQVO.setType("text"); | 
 |  |  |                             phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask.getJsy()); | 
 |  |  |                             //记录状态 | 
 |  |  |                             setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                             return phoneCallBackYQVO; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  | 
 |  |  |                                 ss.setSendstate(6L); | 
 |  |  |                                 ss.setRemark("电话拨打已完成"); | 
 |  |  |                                 serviceSubtaskMapper.updateServiceSubtask(ss); | 
 |  |  |                                 //记录状态 | 
 |  |  |                                 setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |  | 
 |  |  |                                 redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  |                                 redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); | 
 |  |  |                                 redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); | 
 |  |  | 
 |  |  |                                 if (script.getSort() == nextQuestion.intValue()) { | 
 |  |  |                                     phoneCallBackYQVO.setType("text"); | 
 |  |  |                                     phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); | 
 |  |  |                                     String scriptContent = script.getIvrtext(); | 
 |  |  |                                     String scriptContent = StringUtils.isNotEmpty(script.getIvrtext()) ? script.getIvrtext() : script.getScriptContent(); | 
 |  |  |                                     log.error("下一题问题:{}", scriptContent); | 
 |  |  |                                     log.error("下一题的子任务是:{}", serviceSubtask); | 
 |  |  |                                     phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + getObject(serviceSubtask, scriptContent)); | 
 |  |  |                                     //将该患者的Redis中的题目ID,进行修改 | 
 |  |  |                                     redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "-" + phoneCallReqYQVO.getPhone().trim(), script.getId().toString(), 120, TimeUnit.MINUTES); | 
 |  |  | 
 |  |  |                             serviceSubtask.setSendstate(6L); | 
 |  |  |                             serviceSubtask.setRemark("电话拨打已完成"); | 
 |  |  |                             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |                             //记录状态 | 
 |  |  |                             setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                             //设置结束语 | 
 |  |  |                             phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); | 
 |  |  |                             Long id = serviceSubtask.getId(); | 
 |  |  | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         log.info("没有匹配上----------------------------"); | 
 |  |  |                         //flag=0,说明没 匹配上,也要把患者说的话记录下来 | 
 |  |  |                         if (j == ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size() - 1 && flag == 0) { | 
 |  |  |                             ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); | 
 |  |  | 
 |  |  |                 } | 
 |  |  |                 //都没有匹配到 | 
 |  |  |                 if (StringUtils.isEmpty(phoneCallBackYQVO.getValue())) { | 
 |  |  |                     log.info("都没有匹配到-------------------------"); | 
 |  |  |                     Integer count = null; | 
 |  |  |                     Object countObj = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid()); | 
 |  |  |                     if (ObjectUtils.isNotEmpty(countObj)) count = (Integer) countObj; | 
 |  |  | 
 |  |  |                             serviceSubtask.setSendstate(6L); | 
 |  |  |                             serviceSubtask.setRemark("电话拨打已完成"); | 
 |  |  |                             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |  | 
 |  |  |                             //记录状态 | 
 |  |  |                             setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                             //在redis中保存一下结束语,在调用挂电话的方法时删除 | 
 |  |  |                             ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); | 
 |  |  |                             redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); | 
 |  |  |                             //去redis中,把该子任务ID删除 | 
 |  |  |                             Long id = serviceSubtask.getId(); | 
 |  |  |                             Map<String, String> map = delRedisValue(null, id.toString()); | 
 |  |  |                             redisCache.setCacheObject(map.get("cacheName"), map.get("val")); | 
 |  |  |                             redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  |                             redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); | 
 |  |  |                             if (ObjectUtils.isNotEmpty(map)) { | 
 |  |  |                                 redisCache.setCacheObject(map.get("cacheName"), map.get("val")); | 
 |  |  |                                 redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  |                                 redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); | 
 |  |  |                             } | 
 |  |  | //                            return phoneCallBackYQVO; | 
 |  |  |                         } else { | 
 |  |  |                             //根据ivrTaskTemplateScriptVO.getNextScriptno()获取下一题进行提问 | 
 |  |  | 
 |  |  |                                 if (script.getSort() == ivrTaskTemplateScriptVO.getNextScriptno().intValue()) { | 
 |  |  |                                     phoneCallBackYQVO.setType("text"); | 
 |  |  |                                     phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); | 
 |  |  |                                     String scriptContent = script.getIvrtext(); | 
 |  |  |                                     String scriptContent = StringUtils.isNotEmpty(script.getIvrtext()) ? script.getIvrtext() : script.getScriptContent(); | 
 |  |  |                                     phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + getObject(serviceSubtask, scriptContent)); | 
 |  |  |                                     //将该患者的Redis中的题目ID,进行修改 | 
 |  |  |                                     redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "-" + phoneCallReqYQVO.getPhone().trim(), script.getId().toString(), 120, TimeUnit.MINUTES); | 
 |  |  | 
 |  |  |                         if (ivrTaskTemplateScriptVO.getNextScriptno().intValue() == ivrTaskTemplateScript1.getSort()) { | 
 |  |  |                             phoneCallBackYQVO.setType("text"); | 
 |  |  |                             phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); | 
 |  |  |                             String scriptContent = ivrTaskTemplateScript1.getIvrtext(); | 
 |  |  |                             String scriptContent = StringUtils.isNotEmpty(ivrTaskTemplateScript1.getIvrtext()) ? ivrTaskTemplateScript1.getIvrtext() : ivrTaskTemplateScript1.getScriptContent(); | 
 |  |  |  | 
 |  |  |                             phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + getObject(serviceSubtask, scriptContent)); | 
 |  |  |                             redisCache.deleteObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid()); | 
 |  |  |                             redisCache.setCacheObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone(), ivrTaskTemplateScript1.getId().toString()); | 
 |  |  | 
 |  |  |                     serviceSubtask.setRemark("电话拨打已完成"); | 
 |  |  |                     serviceSubtask.setSendstate(6L); | 
 |  |  |                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |  | 
 |  |  |                     //记录状态 | 
 |  |  |                     setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                     //去redis中,把该子任务ID删除 | 
 |  |  |                     Long id = serviceSubtask.getId(); | 
 |  |  |                     Map<String, String> map = delRedisValue(null, id.toString()); | 
 |  |  | 
 |  |  |             for (String key : map.keySet()) { | 
 |  |  |                 scriptContent = scriptContent.replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (StringUtils.isEmpty(scriptContent)) { | 
 |  |  |             return scriptContent; | 
 |  |  |         } | 
 |  |  |         scriptContent = scriptContent.replace("${name}", StringUtils.isNotEmpty(serviceSubtask.getSendname()) ? serviceSubtask.getSendname() : ""); | 
 |  |  |         scriptContent = scriptContent.replace("${dzz}", StringUtils.isNotEmpty(serviceSubtask.getAddr()) ? serviceSubtask.getAddr() : ""); | 
 |  |  | 
 |  |  |         //必须等ache-exist全部打完才能拉取下一批(主要是怕所有的数据都堆在电话的缓存里,在规定的时间打不完) | 
 |  |  |         long existSize = listOps.size("cache-exist"); | 
 |  |  |         if (existSize > 0) return pullTaskVOList; | 
 |  |  |  | 
 |  |  |         int count = 0; | 
 |  |  |         long size = listOps.size("cache-0"); | 
 |  |  |         log.error("---------打电话之前缓存中的数据量:{}", size); | 
 |  |  |         int count = 0; | 
 |  |  |         if (size > 0) { | 
 |  |  |             //phoneCount()  通过给出的每个小时需要打出的电话量,算出到晚上8点一点能打出多少个电话,获取到总量 | 
 |  |  |             //如果需要立即执行的数据量大于一天要执行的上限,则只取上限的数量,其它的则放回redis中 | 
 |  |  | 
 |  |  |                 cacheList = listOps.range("cache-0", 0, count - 1); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         log.error("任务拉取cache-0的值是多少:{}", cacheList); | 
 |  |  |         //  cache-0为立即发起的,其它的先推迟 | 
 |  |  | 
 |  |  |         } else { | 
 |  |  |             for (int i = 1; i < 6; i++) { | 
 |  |  |                 //取出从cache-1 到 cache-5的第一个子任务信息 | 
 |  |  |                 Long size1 = listOps.size("cache-" + i); | 
 |  |  |                 if (size1 == null || size1 == 0) continue; | 
 |  |  |                 int count1 = Math.min(phoneCount(), size1.intValue()); | 
 |  |  |                 List<String> value = listOps.range("cache-0" + i, 0, count1 - 1); | 
 |  |  |                 try { | 
 |  |  |                     Long size1 = listOps.size("cache-" + i); | 
 |  |  |                     if (size1 == null || size1 == 0) continue; | 
 |  |  |                     int count1 = Math.min(phoneCount(), size1.intValue()); | 
 |  |  |                     List<String> value = listOps.range("cache-0" + i, 0, count1 - 1); | 
 |  |  |  | 
 |  |  |                 List<PullTaskVO> pullTaskVOList2 = getPullTaskList(value, "cache-" + i); | 
 |  |  |                 if (CollectionUtils.isNotEmpty(pullTaskVOList2) && pullTaskVOList2.size() > 0) { | 
 |  |  |                     pullTaskVOList.addAll(pullTaskVOList2); | 
 |  |  |                     List<PullTaskVO> pullTaskVOList2 = getPullTaskList(value, "cache-" + i); | 
 |  |  |                     if (CollectionUtils.isNotEmpty(pullTaskVOList2) && pullTaskVOList2.size() > 0) { | 
 |  |  |                         pullTaskVOList.addAll(pullTaskVOList2); | 
 |  |  |                     } | 
 |  |  |                     //将处理过的数据删除 | 
 |  |  |                     listOps.trim("cache-0" + i, count1, -1); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  | //                    log.error("看着烦"); | 
 |  |  |                 } | 
 |  |  |                 //将处理过的数据删除 | 
 |  |  |                 listOps.trim("cache-0" + i, count1, -1); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         //existList用来记录接下来需要执行的子任务ID | 
 |  |  | 
 |  |  |                     serviceSubtask.setRemark("手机号为空"); | 
 |  |  |                     serviceSubtask.setSendstate(4L); | 
 |  |  |                     serviceSubtask.setResult("error"); | 
 |  |  |                     serviceSubtask.setFinishtime(new Date()); | 
 |  |  | //                    serviceSubtask.setFinishtime(new Date()); | 
 |  |  |                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     //下面的代码不能删除,上面的方法只是配合电话端联调用的, | 
 |  |  | //    @Override | 
 |  |  | //    public PhoneCallBackVO phoneCallBack(PhoneCallBackVO phoneCallBackVO) { | 
 |  |  | //        log.error("phoneCallBackVO的入参:{},{},{},{},{},{},{}", phoneCallBackVO.getResultType(), phoneCallBackVO.getUuid(), phoneCallBackVO.getErrResult(), phoneCallBackVO.getTextResult(), phoneCallBackVO.getHangUpResult(), phoneCallBackVO.getEnumState(), phoneCallBackVO.getUint8()); | 
 |  |  | //        //获取数据 | 
 |  |  | //        Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid()); | 
 |  |  | //        if (!aBoolean) { | 
 |  |  | //            throw new BaseException("该uuid不存在"); | 
 |  |  | //        } | 
 |  |  | //        Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup"); | 
 |  |  | //        if (hangupValue != null && hangupValue == 1) { | 
 |  |  | //            //hangupValue == 1  随访结束,直接可以挂电话 | 
 |  |  | //            PhoneUtils phoneUtils = new PhoneUtils(); | 
 |  |  | //            phoneUtils.hangup(phoneCallBackVO.getUuid(), null, null, null, null, null, null, null); | 
 |  |  | // | 
 |  |  | //        } | 
 |  |  | // | 
 |  |  | //        Map<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid()); | 
 |  |  | ////        ObjectMapper objectMapper = new ObjectMapper(); | 
 |  |  | ////        Map<String, Object> map = null; | 
 |  |  | ////        try { | 
 |  |  | ////            map = objectMapper.readValue(cacheObject, Map.class); | 
 |  |  | ////        } catch (JsonProcessingException e) { | 
 |  |  | ////            e.printStackTrace(); | 
 |  |  | ////        } | 
 |  |  | // | 
 |  |  | //        ServiceSubtask ServiceSubtask = (ServiceSubtask) map.get("ServiceSubtask"); | 
 |  |  | //        List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOs = (List<IvrLibaTemplateScriptVO>) map.get("ivrLibaTemplateScriptVO"); | 
 |  |  | //        //将uuid更新到数据库中 | 
 |  |  | //        ServiceSubtask.setSenduuid(phoneCallBackVO.getUuid()); | 
 |  |  | //        ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); | 
 |  |  | // | 
 |  |  | //        //获取模板信息 | 
 |  |  | //        IvrLibaTemplateVO ivrLibaTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "ivrLibaTemplateVO"); | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //        //首先判断resultType | 
 |  |  | //        if (phoneCallBackVO.getResultType() == 1) { | 
 |  |  | //            //呼叫结果接口: 1 | 
 |  |  | //            if (phoneCallBackVO.getUint8() == 1) { | 
 |  |  | //                //呼叫失败,去redis中记录一下失败次数,进行再次呼叫 | 
 |  |  | //                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "uint8"); | 
 |  |  | //                if (integer != null) { | 
 |  |  | //                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", integer + 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                } else { | 
 |  |  | //                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) { | 
 |  |  | //                    log.info("无人接听:{},   {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid()); | 
 |  |  | //                    //连续打规定次,如果要没人接,那就结束 | 
 |  |  | //                    ServiceSubtask.setResult(phoneCallBackVO.getErrResult()); | 
 |  |  | //                    ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); | 
 |  |  | //                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8"); | 
 |  |  | //                } else if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) { | 
 |  |  | //                    //进行重拨 | 
 |  |  | //                    PhoneUtils phoneUtils = new PhoneUtils(); | 
 |  |  | //                    phoneUtils.ob(null, null, null, null, null, null, null, ServiceSubtask.getPhone(), phoneCallBackVO.getUuid(), true); | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | // | 
 |  |  | //        } else if (phoneCallBackVO.getResultType() == 2) { | 
 |  |  | //            //通话状态更新接口: 2 | 
 |  |  | //            if (phoneCallBackVO.getEnumState() == 0) { | 
 |  |  | //                // 0-振铃 | 
 |  |  | //                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "enumState"); | 
 |  |  | // | 
 |  |  | //                if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) { | 
 |  |  | //                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", integer + 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                } else if (integer == null) { | 
 |  |  | //                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                } else if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) { | 
 |  |  | //                    ServiceSubtask.setResult("无人接听"); | 
 |  |  | //                    ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); | 
 |  |  | //                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState"); | 
 |  |  | //                } | 
 |  |  | //            } else if (phoneCallBackVO.getEnumState() == 2) { | 
 |  |  | //                //患者挂断电话 | 
 |  |  | //                log.info("患者挂断电话:{}", phoneCallBackVO.getUuid()); | 
 |  |  | //                ServiceSubtask.setResult(phoneCallBackVO.getHangUpResult()); | 
 |  |  | //                ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); | 
 |  |  | //                redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState"); | 
 |  |  | //            } | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //        } else if (phoneCallBackVO.getResultType() == 3) { | 
 |  |  | //            //语音识别结果上报接口: 3 | 
 |  |  | //            Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice"); | 
 |  |  | //            QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues"); | 
 |  |  | //            IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion(); | 
 |  |  | //            PhoneUtils phoneUtils = new PhoneUtils(); | 
 |  |  | // | 
 |  |  | //            if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) { | 
 |  |  | //                //无回话 | 
 |  |  | //                //判断noVoice是否已经到了最大值 | 
 |  |  | //                if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) { | 
 |  |  | //                    //已经问了对应的遍数,就判断是否还有下一题 | 
 |  |  | //                    if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) { | 
 |  |  | //                        //没有下一题了,就挂断电话,播放结束语 | 
 |  |  | //                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                        phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); | 
 |  |  | //                    } else { | 
 |  |  | //                        //有下一题 | 
 |  |  | //                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); | 
 |  |  | //                        IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion); | 
 |  |  | //                        // 问题,  去调用“tts合成和播放”接口 | 
 |  |  | //                        phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid()); | 
 |  |  | //                    } | 
 |  |  | //                } else { | 
 |  |  | //                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                    //调用ivrLibaTemplateScriptVO中的slienceText(静默话术) | 
 |  |  | //                    String slienceText = nowQuestion.getSlienceText(); | 
 |  |  | //                    //静默话术  + 问题,  去调用“tts合成和播放”接口 | 
 |  |  | //                    phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid()); | 
 |  |  | //                    return new PhoneCallBackVO(); | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //            } else { | 
 |  |  | //                //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行) | 
 |  |  | //                for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) { | 
 |  |  | //                    //包含 | 
 |  |  | //                    Matcher matcher = null; | 
 |  |  | //                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) { | 
 |  |  | //                        Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()); | 
 |  |  | //                        matcher = pattern.matcher(phoneCallBackVO.getTextResult()); | 
 |  |  | //                    } | 
 |  |  | //                    //不包含 | 
 |  |  | //                    Matcher matcher2 = null; | 
 |  |  | //                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) { | 
 |  |  | //                        Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()); | 
 |  |  | //                        matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult()); | 
 |  |  | //                    } | 
 |  |  | //                    log.info("phoneCallBack--Targetregex的值为:{}, phoneCallBack--Targetregex2的值为:{}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()); | 
 |  |  | //                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) { | 
 |  |  | //                        //说明匹配正确了 | 
 |  |  | //                        //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法 | 
 |  |  | //                        nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true); | 
 |  |  | //                        ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j)); | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //                        //将静默置为0 | 
 |  |  | //                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); | 
 |  |  | //                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); | 
 |  |  | //                        //获取下一题 | 
 |  |  | //                        Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion(); | 
 |  |  | //                        for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) { | 
 |  |  | //                            if (script.getTargetid() == nextQuestion) { | 
 |  |  | //                                QuestionMessage questionMessage = new QuestionMessage(); | 
 |  |  | //                                questionMessage.setNowQuestion(script); | 
 |  |  | //                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs); | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); | 
 |  |  | //                                break; | 
 |  |  | //                            } | 
 |  |  | //                        } | 
 |  |  | //                        break; | 
 |  |  | //                    } else { | 
 |  |  | //                        //没有匹配到 | 
 |  |  | //                        Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum"); | 
 |  |  | //                        //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了 | 
 |  |  | //                        if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) { | 
 |  |  | //                            //如果下一题为空.则新的数据返回,并加上感谢语 | 
 |  |  | //                            if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) { | 
 |  |  | //                                QuestionMessage questionMessage = new QuestionMessage(); | 
 |  |  | //                                IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion); | 
 |  |  | //                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs); | 
 |  |  | //                                questionMessage.setNowQuestion(nextQuestion); | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); | 
 |  |  | //                            } else { | 
 |  |  | //                                //就可以挂断电话了 | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                                phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); | 
 |  |  | //                                break; | 
 |  |  | //                            } | 
 |  |  | //                        } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) { | 
 |  |  | //                            //没有问到规定次数 | 
 |  |  | //                            mateNum = mateNum + 1; | 
 |  |  | //                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES); | 
 |  |  | //                        } | 
 |  |  | //                    } | 
 |  |  | // | 
 |  |  | //                } | 
 |  |  | //                //选项匹配完成后,需要再去通过库再进行匹配一次 | 
 |  |  | //                String extemplateID = ivrLibaTemplateVO.getSubmoduleID(); | 
 |  |  | //                String[] split = extemplateID.split(","); | 
 |  |  | //                List<String> list = Arrays.asList(split); | 
 |  |  | //                List<Long> list1 = new ArrayList<>(); | 
 |  |  | //                if (StringUtils.isNotEmpty(extemplateID)) { | 
 |  |  | //                    for (String str : list) { | 
 |  |  | //                        list1.add(Long.valueOf(str)); | 
 |  |  | //                    } | 
 |  |  | //                    List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1); | 
 |  |  | //                    for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) { | 
 |  |  | //                        Matcher matcher = null; | 
 |  |  | //                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) { | 
 |  |  | //                            Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex()); | 
 |  |  | //                            matcher = pattern.matcher(returnQues.getContent()); | 
 |  |  | //                        } | 
 |  |  | // | 
 |  |  | //                        Matcher matcher2 = null; | 
 |  |  | //                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) { | 
 |  |  | //                            Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2()); | 
 |  |  | //                            matcher2 = pattern2.matcher(returnQues.getContent()); | 
 |  |  | //                        } | 
 |  |  | //                        log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2()); | 
 |  |  | //                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) { | 
 |  |  | //                            QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues"); | 
 |  |  | //                            IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion(); | 
 |  |  | //                            ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText()); | 
 |  |  | //                            ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav()); | 
 |  |  | //                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); | 
 |  |  | //                            if (ivrLibaExtemplatescript.getIsEnd() == 1) { | 
 |  |  | //                                //将问题置空 | 
 |  |  | //                                IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion(); | 
 |  |  | //                                nowQuestion1.setQuestionText(null); | 
 |  |  | //                                nowQuestion1.setQuestionVoice(null); | 
 |  |  | //                                questionMessage.setNowQuestion(nowQuestion1); | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); | 
 |  |  | // | 
 |  |  | //                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES); | 
 |  |  | //                            } | 
 |  |  | // | 
 |  |  | //                            //调用“15、tts合成和播放, tts_playback”将结果传回 | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //                        } | 
 |  |  | //                        break; | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  | //        return phoneCallBackVO; | 
 |  |  | //    } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) { | 
 |  |  |         int i = 0; | 
 |  |  | 
 |  |  |             //随访 | 
 |  |  |             for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) { | 
 |  |  |                 serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId()); | 
 |  |  |                 serviceSubtaskDetail.setId(UUID.randomUUID().toString()); | 
 |  |  | //                serviceSubtaskDetail.setId(UUID.randomUUID().toString()); | 
 |  |  |                 serviceSubtaskDetail.setCreateTime(new Date()); | 
 |  |  |                 serviceSubtaskDetail.setGuid(selectServiceSubtaskList.get(0).getGuid()); | 
 |  |  |                 serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid()); | 
 |  |  | 
 |  |  |                     ServiceSubtaskDetail ssd = new ServiceSubtaskDetail(); | 
 |  |  |                     ssd.setSubId(serviceSubtaskDetail.getSubId()); | 
 |  |  |                     ssd.setTaskid(serviceSubtaskDetail.getTaskid()); | 
 |  |  |                     ssd.setTemplatequestionnum(serviceSubtaskDetail.getTemplatequestionnum()); | 
 |  |  |                     ssd.setScriptid(serviceSubtaskDetail.getScriptid()); | 
 |  |  |                     if (serviceSubtaskDetail.getSubId() != null) { | 
 |  |  |                         ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId()); | 
 |  |  |                         ssd.setGuid(serviceSubtask.getGuid()); | 
 |  |  | 
 |  |  |         Object cacheObject = redisCache.getCacheObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |         if (phoneCallRecordVO.getHangup_cause().equals("NO_USER_RESPONSE") || ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) { | 
 |  |  |             //无人接听 | 
 |  |  |             getSmsCompensate(Long.valueOf(phoneCallRecordVO.getTaskid())); | 
 |  |  |             //记录电话发送状态 | 
 |  |  |             ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallRecordVO.getTaskid())); | 
 |  |  |             setFailPreachForm(serviceSubtask, "3", "无人接听", "4"); | 
 |  |  |             //进行短信补偿 | 
 |  |  | //            getSmsCompensate(Long.valueOf(phoneCallRecordVO.getTaskid())); | 
 |  |  |             redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |             redisCache.removeElementFromList("cache-exist", phoneCallRecordVO.getTaskid()); | 
 |  |  |         } else if (ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("2")) { | 
 |  |  | 
 |  |  |             serviceSubtask.setUpdateTime(new Date()); | 
 |  |  |             log.error("电话拨打已完成serviceSubtask的值为:{}", serviceSubtask); | 
 |  |  |             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |             setFailPreachForm(serviceSubtask, StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) ? serviceSubtask.getCurrentPreachform() : "3", "电话拨打已完成", "9"); | 
 |  |  |             //下载文件 | 
 |  |  |             ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString()); | 
 |  |  |             redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  | 
 |  |  | //            int endIndex = phoneCallRecordVO.getRecord_path().lastIndexOf("/"); | 
 |  |  | //            String result = phoneCallRecordVO.getRecord_path().substring(startIndex, endIndex); | 
 |  |  |             //下载文件 | 
 |  |  |             ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString()); | 
 |  |  | //            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString()); | 
 |  |  |             redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); | 
 |  |  |             ServiceSubtask ss = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtask.getId()); | 
 |  |  |             setFailPreachForm(ss, StringUtils.isNotEmpty(ss.getCurrentPreachform()) ? ss.getCurrentPreachform() : "3", "电话接通成功,患者拒绝随访", "5"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return 1; | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 服务统计查询 - 按时间维度统计出院/门诊随访数据 | 
 |  |  |      * | 
 |  |  |      * @param request 统计请求参数 | 
 |  |  |      * @return 统计结果列表 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<ServiceStatisticsResponse> getServiceStatistics(ServiceStatisticsRequest request) { | 
 |  |  |         log.info("getServiceStatistics的入参为:{}", request); | 
 |  |  |  | 
 |  |  |         // 参数校验 | 
 |  |  |         if (request.getStartDate() == null || request.getEndDate() == null) { | 
 |  |  |             throw new IllegalArgumentException("开始日期和结束日期不能为空"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (request.getStartDate().after(request.getEndDate())) { | 
 |  |  |             throw new IllegalArgumentException("开始日期不能晚于结束日期"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 如果timeType为空,默认按天统计 | 
 |  |  |         if (StringUtils.isEmpty(request.getTimeType())) { | 
 |  |  |             request.setTimeType("day"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<ServiceStatisticsResponse> result = serviceSubtaskMapper.getServiceStatistics(request); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         log.info("getServiceStatistics返回结果数量:{}", result.size()); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<PatArchiveSrmVO> sendMsgTemplate(List<PatArchiveSrmVO> patArchiveSrmVOS) { | 
 |  |  |         //用来记录发送失败的 | 
 |  |  |         List<PatArchiveSrmVO> sendError = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |         for (PatArchiveSrmVO patArchiveSrmVO : patArchiveSrmVOS) { | 
 |  |  |             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY年MM月dd日HH:mm"); | 
 |  |  |             String timestamp = simpleDateFormat.format(patArchiveSrmVO.getVisitTime()); | 
 |  |  |  | 
 |  |  |             StringBuilder stringBuilder = new StringBuilder(); | 
 |  |  |             if (patArchiveSrmVO.getSrmTemplate().equals("入院准备中心-无检查")) { | 
 |  |  |                 stringBuilder.append(patArchiveSrmVO.getName() + ",您好!主管医生已为您安排住院,请于当天"); | 
 |  |  |             } else if (patArchiveSrmVO.getSrmTemplate().equals("入院准备中心-空腹检查")) { | 
 |  |  |                 stringBuilder.append(patArchiveSrmVO.getName() + ",您好!主管医生已为您安排住院,请当天空腹并于"); | 
 |  |  |             } else if (patArchiveSrmVO.getSrmTemplate().equals("日间病房—择期病人检查")) { | 
 |  |  |                 stringBuilder.append(patArchiveSrmVO.getName() + ",您好!主管医生已为您安排住院前检查,请当天空腹并于"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             stringBuilder.append(timestamp + ",之前携带医保卡或电子医保卡身份证凭此条短信到1号楼3楼南入院准备中心入院登记窗口,办理正式住院手续,完成各项检查后再到相应病区护士站报到。"); | 
 |  |  |             stringBuilder.append("入院准备中心电话:89975977。入院办理须知:https://mp.weixin.qq.com/s/OCkotuRyQ8Ld2owFF0YErw"); | 
 |  |  |  | 
 |  |  |             JSONObject data = MessageSend.sendMsg(stringBuilder.toString(), "2", patArchiveSrmVO.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); | 
 |  |  |             String code = data.get("code").toString(); | 
 |  |  |             if (StringUtils.isNotEmpty(code) && !code.equals("00000")) { | 
 |  |  |                 sendError.add(patArchiveSrmVO); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return sendError; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取随访统计比例 | 
 |  |  |      * | 
 |  |  |      * @param serviceSubtaskCountReq | 
 |  |  | 
 |  |  |     public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |         log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq); | 
 |  |  |         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>(); | 
 |  |  |         Map<String, List<ServiceSubtask>> collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown"))); | 
 |  |  | //        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq); | 
 |  |  |  | 
 |  |  |         // 根据条件进行分组 | 
 |  |  |         Map<String, List<ServiceSubtask>> collect = new HashMap<>(); | 
 |  |  |  | 
 |  |  |         if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) { | 
 |  |  |             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown"))); | 
 |  |  |             } else { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown"))); | 
 |  |  |             } | 
 |  |  |         } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) { | 
 |  |  |             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown"))); | 
 |  |  |             } else { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown"))); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         for (List<ServiceSubtask> serviceSubtaskList : collect.values()) { | 
 |  |  |             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()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             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 | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<ServiceSubtaskStatistic> getSfStatisticsJoy(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |         log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq); | 
 |  |  |         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |         // 根据条件进行分组 | 
 |  |  |         Map<String, List<ServiceSubtask>> collect = new HashMap<>(); | 
 |  |  |  | 
 |  |  |         if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) { | 
 |  |  |             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown"))); | 
 |  |  |  | 
 |  |  |             } else { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown"))); | 
 |  |  |             } | 
 |  |  |         } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) { | 
 |  |  |             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown"))); | 
 |  |  |             } else { | 
 |  |  |                 collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown"))); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         List<ServiceSubtaskCount> joySubCount = serviceSubtaskMapper.getSfStatisticsJoy(serviceSubtaskCountReq); | 
 |  |  |         for (List<ServiceSubtask> serviceSubtaskList : collect.values()) { | 
 |  |  |             if (CollectionUtils.isEmpty(serviceSubtaskList)) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             ServiceSubtaskStatistic statistic = getStatisticJoy(serviceSubtaskList, joySubCount); | 
 |  |  |             if (statistic.getJoyCount() != 0 && statistic.getJoyAllCount() != 0) { | 
 |  |  |                 Double joyTotal = Double.parseDouble(statistic.getJoyCount() + "") / Double.parseDouble(statistic.getJoyAllCount() + "") * 100; | 
 |  |  |                 statistic.setJoyTotal(String.format("%.2f", joyTotal) + "%"); | 
 |  |  |             } | 
 |  |  |             //及时率 | 
 |  |  |             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()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             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); | 
 |  |  |             } | 
 |  |  | 
 |  |  |  | 
 |  |  |     private ServiceSubtaskStatistic getStatistic(List<ServiceSubtask> serviceSubtaskList) { | 
 |  |  |         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic(); | 
 |  |  |         //格式化为两位小数的百分比 | 
 |  |  |         DecimalFormat percentFormat = new DecimalFormat("##.##%"); | 
 |  |  |         serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname()); | 
 |  |  |         serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode()); | 
 |  |  |         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname()); | 
 |  |  |         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode()); | 
 |  |  |         serviceSubtaskStatistic.setServiceCount(serviceSubtaskList.size()); | 
 |  |  |         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode()); | 
 |  |  |         serviceSubtaskStatistic.setDrname(serviceSubtaskList.get(0).getDrname()); | 
 |  |  |         //出院人次 | 
 |  |  |         serviceSubtaskStatistic.setDischargeCount(serviceSubtaskList.size()); | 
 |  |  |         for (ServiceSubtask serviceSubtask : serviceSubtaskList) { | 
 |  |  |             //不随访数量 | 
 |  |  |             //无需随访人次 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) { | 
 |  |  |                 serviceSubtaskStatistic.setBzxCount(serviceSubtaskStatistic.getBzxCount() + 1L); | 
 |  |  |                 serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L); | 
 |  |  |             } | 
 |  |  |             //应随访数量 | 
 |  |  |             //应随访人次 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                 serviceSubtaskStatistic.setYsfCount(serviceSubtaskStatistic.getYsfCount() + 1L); | 
 |  |  |             } | 
 |  |  |             //发送失败数量 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { | 
 |  |  |                 serviceSubtaskStatistic.setFssbCount(serviceSubtaskStatistic.getFssbCount() + 1L); | 
 |  |  |             } | 
 |  |  |             //待发送数量 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                 serviceSubtaskStatistic.setDfsCount(serviceSubtaskStatistic.getDfsCount() + 1L); | 
 |  |  |             } | 
 |  |  |             //已发送数量 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 3) { | 
 |  |  |                 serviceSubtaskStatistic.setYfsCount(serviceSubtaskStatistic.getYfsCount() + 1L); | 
 |  |  |             } | 
 |  |  |             //已完成数量 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 6) { | 
 |  |  |                 //已发送,包含已完成 | 
 |  |  |                 serviceSubtaskStatistic.setYfsCount(serviceSubtaskStatistic.getYfsCount() + 1L); | 
 |  |  |                 serviceSubtaskStatistic.setYwcCount(serviceSubtaskStatistic.getYwcCount() + 1L); | 
 |  |  |                 serviceSubtaskStatistic.setFollowUpNeeded(serviceSubtaskStatistic.getFollowUpNeeded() + 1L); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && serviceSubtask.getExcep().equals("1")) { | 
 |  |  |                 //异常标识 | 
 |  |  |                 serviceSubtaskStatistic.setYczs(serviceSubtaskStatistic.getYczs() + 1L); | 
 |  |  |             //首次出院随访 | 
 |  |  |             if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() == 1) { | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                     serviceSubtaskStatistic.setNeedFollowUp(serviceSubtaskStatistic.getNeedFollowUp() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                     serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6)) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpFail(serviceSubtaskStatistic.getFollowUpFail() + 1L); | 
 |  |  |                 } | 
 |  |  |                 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); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) { | 
 |  |  |                     serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) { | 
 |  |  |                     serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) { | 
 |  |  |                     serviceSubtaskStatistic.setAbnormal(serviceSubtaskStatistic.getAbnormal() + 1L); | 
 |  |  |                 } | 
 |  |  |             }//二次出院随访 | 
 |  |  |             else if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() > 1) { | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                     serviceSubtaskStatistic.setNeedFollowUpAgain(serviceSubtaskStatistic.getNeedFollowUpAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                     serviceSubtaskStatistic.setPendingFollowUpAgain(serviceSubtaskStatistic.getPendingFollowUpAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 1 || serviceSubtask.getSendstate() == 3 || serviceSubtask.getSendstate() == 6)) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpFailAgain(serviceSubtaskStatistic.getFollowUpFailAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 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); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) { | 
 |  |  |                     serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) { | 
 |  |  |                     serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) { | 
 |  |  |                     serviceSubtaskStatistic.setAbnormalAgain(serviceSubtaskStatistic.getAbnormalAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             //随访情况 | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 1) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation1(serviceSubtaskStatistic.getTaskSituation1() + 1); | 
 |  |  |             } | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 2) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation2(serviceSubtaskStatistic.getTaskSituation2() + 1); | 
 |  |  |             } | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 3) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation3(serviceSubtaskStatistic.getTaskSituation3() + 1); | 
 |  |  |             } | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 4) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation4(serviceSubtaskStatistic.getTaskSituation4() + 1); | 
 |  |  |             } | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 5) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation5(serviceSubtaskStatistic.getTaskSituation5() + 1); | 
 |  |  |             } | 
 |  |  |             if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 6) { | 
 |  |  |                 serviceSubtaskStatistic.setTaskSituation6(serviceSubtaskStatistic.getTaskSituation6() + 1); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         //随访完成率=已完成/应随访量 | 
 |  |  |         if (serviceSubtaskStatistic.getYwcCount() == 0 || CollectionUtils.isEmpty(serviceSubtaskList)) { | 
 |  |  |             serviceSubtaskStatistic.setSfwcl("0"); | 
 |  |  |         } else { | 
 |  |  | //            BigDecimal multiply = BigDecimal.valueOf(serviceSubtaskStatistic.getYfsCount()).divide(BigDecimal.valueOf(serviceSubtaskList.size()), 2, BigDecimal.ROUND_HALF_UP); | 
 |  |  |             BigDecimal multiply = new BigDecimal(serviceSubtaskStatistic.getYwcCount().toString()).divide(new BigDecimal(serviceSubtaskStatistic.getYsfCount().toString()), 2, BigDecimal.ROUND_HALF_UP); | 
 |  |  |             serviceSubtaskStatistic.setSfwcl(multiply.toString()); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         return serviceSubtaskStatistic; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private ServiceSubtaskStatistic getStatisticJoy(List<ServiceSubtask> serviceSubtaskList, List<ServiceSubtaskCount> joySubCount) { | 
 |  |  |         ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic(); | 
 |  |  |         //格式化为两位小数的百分比 | 
 |  |  |         DecimalFormat percentFormat = new DecimalFormat("##.##%"); | 
 |  |  |         serviceSubtaskStatistic.setDeptname(serviceSubtaskList.get(0).getDeptname()); | 
 |  |  |         serviceSubtaskStatistic.setDeptcode(serviceSubtaskList.get(0).getDeptcode()); | 
 |  |  |         serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname()); | 
 |  |  |         serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode()); | 
 |  |  |         serviceSubtaskStatistic.setDrcode(serviceSubtaskList.get(0).getDrcode()); | 
 |  |  |         serviceSubtaskStatistic.setDrname(serviceSubtaskList.get(0).getDrname()); | 
 |  |  |         //出院人次 | 
 |  |  |         serviceSubtaskStatistic.setDischargeCount(serviceSubtaskList.size()); | 
 |  |  |         serviceSubtaskStatistic.setJoyCount(0); | 
 |  |  |         serviceSubtaskStatistic.setJoyAllCount(0); | 
 |  |  |         for (ServiceSubtask serviceSubtask : serviceSubtaskList) { | 
 |  |  |             //满意度 | 
 |  |  |             List<ServiceSubtaskCount> joyCountTemp = joySubCount.stream().filter(r -> r.getSubTaskId().equals(serviceSubtask.getId())).collect(Collectors.toList()); | 
 |  |  |             if (joyCountTemp != null && joyCountTemp.size() > 0) { | 
 |  |  |                 if (ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyCount())) | 
 |  |  |                     serviceSubtaskStatistic.setJoyCount(serviceSubtaskStatistic.getJoyCount() + joyCountTemp.get(0).getJoyCount()); | 
 |  |  |                 if (ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyAllCount())) | 
 |  |  |                     serviceSubtaskStatistic.setJoyAllCount(serviceSubtaskStatistic.getJoyAllCount() + joyCountTemp.get(0).getJoyAllCount()); | 
 |  |  |             } | 
 |  |  |             //无需随访人次 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) { | 
 |  |  |                 serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L); | 
 |  |  |             } | 
 |  |  |             //应随访人次 | 
 |  |  |             if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                 serviceSubtaskStatistic.setFollowUpNeeded(serviceSubtaskStatistic.getFollowUpNeeded() + 1L); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //首次出院随访 | 
 |  |  |             if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() == 1) { | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                     serviceSubtaskStatistic.setNeedFollowUp(serviceSubtaskStatistic.getNeedFollowUp() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                     serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6)) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpFail(serviceSubtaskStatistic.getFollowUpFail() + 1L); | 
 |  |  |                 } | 
 |  |  |                 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); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) { | 
 |  |  |                     serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) { | 
 |  |  |                     serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) { | 
 |  |  |                     serviceSubtaskStatistic.setAbnormal(serviceSubtaskStatistic.getAbnormal() + 1L); | 
 |  |  |                 } | 
 |  |  |             }//二次出院随访 | 
 |  |  |             else if (serviceSubtask.getVisitCount() != null && serviceSubtask.getVisitCount() > 1) { | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { | 
 |  |  |                     serviceSubtaskStatistic.setNeedFollowUpAgain(serviceSubtaskStatistic.getNeedFollowUpAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                     serviceSubtaskStatistic.setPendingFollowUpAgain(serviceSubtaskStatistic.getPendingFollowUpAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 1 || serviceSubtask.getSendstate() == 3 || serviceSubtask.getSendstate() == 6)) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { | 
 |  |  |                     serviceSubtaskStatistic.setFollowUpFailAgain(serviceSubtaskStatistic.getFollowUpFailAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 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); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) { | 
 |  |  |                     serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) { | 
 |  |  |                     serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getExcep().equals("1")) { | 
 |  |  |                     serviceSubtaskStatistic.setAbnormalAgain(serviceSubtaskStatistic.getAbnormalAgain() + 1L); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         return serviceSubtaskStatistic; | 
 |  |  |     } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private ServiceSubtaskDetail getServiceSubtaskDetail(PhoneCallReqYQVO phoneCallReqYQVO, IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, ServiceSubtask serviceSubtask, IvrTaskTemplate ivrTaskTemplate) { | 
 |  |  |         log.info("-----------------phoneCallReqYQVO的值为:{}", phoneCallReqYQVO); | 
 |  |  |  | 
 |  |  |         ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail(); | 
 |  |  |         serviceSubtaskDetail.setSubId(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  |         ServiceSubtask serviceSubtask1 = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid())); | 
 |  |  | 
 |  |  |         serviceSubtaskDetail.setSentEnd(1L); | 
 |  |  |         serviceSubtaskDetail.setTemplateid(ivrTaskTemplate.getId().toString()); | 
 |  |  |         serviceSubtaskDetail.setTemplatequestionnum(ivrTaskTemplateScriptVO.getScriptno()); | 
 |  |  |         serviceSubtaskDetail.setQuestiontext(ivrTaskTemplateScriptVO.getIvrtext()); | 
 |  |  |         serviceSubtaskDetail.setQuestiontext(StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext()) ? ivrTaskTemplateScriptVO.getIvrtext() : ivrTaskTemplateScriptVO.getScriptContent()); | 
 |  |  |         serviceSubtaskDetail.setQuestionvoice(phoneCallReqYQVO.getRecordpath()); | 
 |  |  |         serviceSubtaskDetail.setCategoryname(ivrTaskTemplateScriptVO.getScriptType()); | 
 |  |  |         serviceSubtaskDetail.setTargetoptions(ivrTaskTemplateScriptVO.getTargetOptions()); | 
 |  |  | 
 |  |  |         return serviceSubtaskDetail; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 电话的补偿方法(老) | 
 |  |  |      * | 
 |  |  |      * @param subTaskId | 
 |  |  |      */ | 
 |  |  |     private void getSmsCompensate(Long subTaskId) { | 
 |  |  |         ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(subTaskId); | 
 |  |  |         RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); | 
 |  |  | 
 |  |  |         serviceSubtask.setSendstate(3L); | 
 |  |  |         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |  | 
 |  |  |         //需要在servicePreachform里记录一下短信状态 | 
 |  |  |         ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |         serviceSubtaskPreachform.setPreachform("4"); | 
 |  |  |         serviceSubtaskPreachform.setSubid(subTaskId); | 
 |  |  |         serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid()); | 
 |  |  |         serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid()); | 
 |  |  |         List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); | 
 |  |  |         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) { | 
 |  |  |             ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0); | 
 |  |  |             serviceSubtaskPreachform1.setSendstate("9"); | 
 |  |  |             serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1); | 
 |  |  |         } else if (CollectionUtils.isEmpty(serviceSubtaskPreachforms)) { | 
 |  |  |             //如果为空的话,说明用户没有选短信发送方式,这个时候需要强制新增一条 | 
 |  |  |             //获取sort的最大值 | 
 |  |  |             ServiceSubtaskPreachform ssp = new ServiceSubtaskPreachform(); | 
 |  |  |             ssp.setSubid(subTaskId); | 
 |  |  |             ssp.setTaskid(serviceSubtask.getTaskid()); | 
 |  |  |             ssp.setOrgid(serviceSubtask.getOrgid()); | 
 |  |  |             List<ServiceSubtaskPreachform> sspf2 = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(ssp); | 
 |  |  |  | 
 |  |  |             serviceSubtaskPreachform.setSort(0L); | 
 |  |  |             if (CollectionUtils.isNotEmpty(sspf2)) { | 
 |  |  |                 serviceSubtaskPreachform.setSort(Long.valueOf(sspf2.size())); | 
 |  |  |             } | 
 |  |  |             serviceSubtaskPreachform.setSendstate("2"); | 
 |  |  |             serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //通过当前时间,拉取电话总数 | 
 |  |  | 
 |  |  |         int remainingCalls = (int) (remainingHours * phoneUpEveryHour); | 
 |  |  |         return remainingCalls; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<ServiceSubtaskCount> getSfStatisticsJoydetails(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |         return serviceSubtaskMapper.getSfStatisticsJoydetails(serviceSubtaskCountReq); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @param serviceSubtask | 
 |  |  |      * @param preachform | 
 |  |  |      * @param remark | 
 |  |  |      * @param failSendstate | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) { | 
 |  |  |         //将状态设置为失败 | 
 |  |  |         ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |         serviceSubtaskPreachform.setSubid(serviceSubtask.getId()); | 
 |  |  |         serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid()); | 
 |  |  |         serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid()); | 
 |  |  |         //获取该患者的发送方式总数 | 
 |  |  |         List<ServiceSubtaskPreachform> spSize = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); | 
 |  |  |  | 
 |  |  |         serviceSubtaskPreachform.setPreachform(preachform); | 
 |  |  |         //1:未发送状态 | 
 |  |  |         serviceSubtaskPreachform.setSendstate("1"); | 
 |  |  |         if (preachform.equals("3")) { | 
 |  |  |             //电话进入队列后,状态会变成2 | 
 |  |  |             serviceSubtaskPreachform.setSendstate("2"); | 
 |  |  |         } | 
 |  |  |         List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); | 
 |  |  |         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) { | 
 |  |  |             ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0); | 
 |  |  |             serviceSubtaskPreachform1.setSendstate(failSendstate); | 
 |  |  |             serviceSubtaskPreachform1.setRemark(remark); | 
 |  |  |             serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1); | 
 |  |  |  | 
 |  |  |             //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了) | 
 |  |  |             if (serviceSubtaskPreachform1.getSort() == spSize.size() && failSendstate.equals("4")) { | 
 |  |  |                 serviceSubtask.setCurrentPreachform(preachform); | 
 |  |  |                 serviceSubtask.setSendstate(5L); | 
 |  |  |                 serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |                 return true; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         serviceSubtask.setCurrentPreachform(preachform); | 
 |  |  |         serviceSubtask.setSendstate(3L); | 
 |  |  |         //如果等于9,则说明电话正常结束了 | 
 |  |  |         if (failSendstate.equals("9")) serviceSubtask.setSendstate(6L); | 
 |  |  |         serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime())); | 
 |  |  |         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) { | 
 |  |  |         ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); | 
 |  |  |         serviceSubtaskPreachform.setSubid(subid); | 
 |  |  |         serviceSubtaskPreachform.setTaskid(taskid); | 
 |  |  |         List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform); | 
 |  |  |         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) { | 
 |  |  |             String compensateTime = serviceSubtaskPreachforms.get(0).getCompensateTime(); | 
 |  |  |             int hoursToAdd = Integer.valueOf(compensateTime) * 24; | 
 |  |  |             Calendar calendar = Calendar.getInstance(); | 
 |  |  |             calendar.setTime(visitTime); | 
 |  |  |             calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd); | 
 |  |  |             Date newDate = calendar.getTime(); | 
 |  |  |             return newDate; | 
 |  |  |         } | 
 |  |  |         return visitTime; | 
 |  |  |     } | 
 |  |  | } |