|  |  | 
 |  |  | 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 org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.math.RoundingMode; | 
 |  |  | 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; | 
 |  |  | 
 |  |  |  | 
 |  |  |         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); | 
 |  |  | 
 |  |  |             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); | 
 |  |  | 
 |  |  |             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) { | 
 |  |  |             //新增模板信息 | 
 |  |  | 
 |  |  |                     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()); | 
 |  |  | 
 |  |  |                     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) { | 
 |  |  | 
 |  |  |                     serviceTaskdept.setTaskId(serviceTask.getTaskid()); | 
 |  |  |                     serviceTaskdept.setTaskName(serviceTask.getTaskName()); | 
 |  |  |                     serviceTaskdept.setOrgid(serviceTask.getOrgid()); | 
 |  |  |                     serviceTaskdept.setLongtask(0L); | 
 |  |  |                     if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); | 
 |  |  |                     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.setNurseName(patTaskRelevance.getNurseName()); | 
 |  |  |                     serviceSubtask.setCreateBy(serviceTask.getCreateBy()); | 
 |  |  |                     serviceSubtask.setUpdateBy(serviceTask.getCreateBy()); | 
 |  |  |                     serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime()); | 
 |  |  |                     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.info("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()); | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } else if (serviceTaskVO.getAppltype().equals("4")) { | 
 |  |  |                 ServiceTaskoper serviceTaskoper = new ServiceTaskoper(); | 
 |  |  |                 if (StringUtils.isEmpty(serviceTaskVO.getOpcode())) { | 
 |  |  | 
 |  |  |                 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()); | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) { | 
 |  |  |                 IvrTaskTemplate ivrTaskTemplate = new IvrTaskTemplate(); | 
 |  |  | 
 |  |  |                     serviceSubtask.setEndtime(patTaskRelevance.getEndtime()); | 
 |  |  |                     serviceSubtask.setNurseId(patTaskRelevance.getNurseId()); | 
 |  |  |                     serviceSubtask.setNurseName(patTaskRelevance.getNurseName()); | 
 |  |  |                     serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime()); | 
 |  |  |                     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); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         //判断是否挂机 | 
 |  |  |         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) { | 
 |  |  | 
 |  |  |                 //判断 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()); | 
 |  |  | 
 |  |  |                         ss.setSendstate(6L); | 
 |  |  |                         ss.setRemark("电话拨打已完成"); | 
 |  |  |                         serviceSubtaskMapper.updateServiceSubtask(ss); | 
 |  |  |                         //记录状态 | 
 |  |  |                         setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                         //可以挂机了 | 
 |  |  |                         redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); | 
 |  |  |                         redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); | 
 |  |  | 
 |  |  |                             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"); | 
 |  |  | 
 |  |  |                             serviceSubtask.setSendstate(6L); | 
 |  |  |                             serviceSubtask.setRemark("电话拨打已完成"); | 
 |  |  |                             serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); | 
 |  |  |                             //记录状态 | 
 |  |  |                             setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); | 
 |  |  |                             //设置结束语 | 
 |  |  |                             phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); | 
 |  |  |                             Long id = serviceSubtask.getId(); | 
 |  |  | 
 |  |  |                             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); | 
 |  |  | 
 |  |  |                     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()); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     //下面的代码不能删除,上面的方法只是配合电话端联调用的, | 
 |  |  | //    @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()); | 
 |  |  | 
 |  |  |         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; | 
 |  |  | 
 |  |  |         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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取随访统计比例 | 
 |  |  |      * | 
 |  |  | 
 |  |  |     public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |         log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq); | 
 |  |  |         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>(); | 
 |  |  |         List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq); | 
 |  |  |          | 
 |  |  | //        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"))); | 
 |  |  | 
 |  |  |                 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; | 
 |  |  | 
 |  |  |             // 如果有医生编码,设置医生编码用于及时率查询 | 
 |  |  |             if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) { | 
 |  |  |                 ss.setDrcode(serviceSubtaskList.get(0).getDrcode()); | 
 |  |  |             }else { | 
 |  |  |             } 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())) { | 
 |  |  | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<ServiceSubtaskStatistic> getSfStatisticsAsk(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |     public List<ServiceSubtaskStatistic> getSfStatisticsJoy(ServiceSubtaskCountReq serviceSubtaskCountReq) { | 
 |  |  |         log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq); | 
 |  |  |         List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>(); | 
 |  |  |         List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq); | 
 |  |  |  | 
 |  |  |         // 根据条件进行分组 | 
 |  |  |         Map<String, List<ServiceSubtask>> collect = new HashMap<>(); | 
 |  |  | 
 |  |  |         if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) { | 
 |  |  |             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"))); | 
 |  |  |             } | 
 |  |  | 
 |  |  |                 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 = getStatistic(serviceSubtaskList); | 
 |  |  |  | 
 |  |  |             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 { | 
 |  |  |             } else { | 
 |  |  |                 if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) { | 
 |  |  |                     ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode()); | 
 |  |  |                 } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) { | 
 |  |  | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { | 
 |  |  |                     serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L); | 
 |  |  |                 } | 
 |  |  |                 if (serviceSubtask.getSendstate() != null && ( serviceSubtask.getSendstate() == 6)) { | 
 |  |  |                 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); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         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) { | 
 |  |  | 
 |  |  |         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; | 
 |  |  |     } | 
 |  |  | } |