package com.smartor.service.impl; 
 | 
  
 | 
import com.alibaba.fastjson2.JSON; 
 | 
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.exception.base.BaseException; 
 | 
import com.ruoyi.common.utils.*; 
 | 
import com.smartor.common.FtpService; 
 | 
import com.smartor.config.PhoneUtils; 
 | 
import com.smartor.domain.*; 
 | 
import com.smartor.mapper.*; 
 | 
import com.smartor.service.*; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.commons.collections4.CollectionUtils; 
 | 
import org.apache.commons.lang3.ObjectUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.data.redis.core.ListOperations; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.stereotype.Service; 
 | 
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.format.DateTimeFormatter; 
 | 
import java.util.*; 
 | 
import java.util.concurrent.TimeUnit; 
 | 
import java.util.regex.Matcher; 
 | 
import java.util.regex.Pattern; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 单一任务(随访)Service业务层处理 
 | 
 * 
 | 
 * @author ruoyi 
 | 
 * @date 2024-02-02 
 | 
 */ 
 | 
@Slf4j 
 | 
@Service 
 | 
public class ServiceSubtaskServiceImpl implements IServiceSubtaskService { 
 | 
    @Autowired 
 | 
    private ServiceSubtaskMapper serviceSubtaskMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private IServiceTaskService serviceTaskService; 
 | 
  
 | 
    @Autowired 
 | 
    private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private IvrTaskVisitResultMapper serviceTaskVisitResultMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private IServiceTaskdeptService serviceTaskdeptService; 
 | 
  
 | 
    @Autowired 
 | 
    private IServiceTaskdiagService serviceTaskdiagService; 
 | 
  
 | 
    @Autowired 
 | 
    private IServiceTaskoperService serviceTaskoperService; 
 | 
  
 | 
    @Autowired 
 | 
    private RedisCache redisCache; 
 | 
  
 | 
    @Autowired 
 | 
    private IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private IIvrTaskTemplateService ivrTaskTemplateService; 
 | 
  
 | 
    @Autowired 
 | 
    private ISvyTaskTemplateService svyTaskTemplateService; 
 | 
  
 | 
    @Autowired 
 | 
    private IIvrTaskTemplateScriptService iIvrTaskTemplateScriptService; 
 | 
  
 | 
    @Autowired 
 | 
    private IServiceOutPathService iServiceOutPathService; 
 | 
  
 | 
    @Autowired 
 | 
    private FtpService ftpService; 
 | 
  
 | 
    @Autowired 
 | 
    private PatMedInhospMapper patMedInhospMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private PatArchiveMapper patArchiveMapper; 
 | 
  
 | 
    @Value("${pri_key}") 
 | 
    private String pri_key; 
 | 
  
 | 
    @Value("${pub_key}") 
 | 
    private String pub_key; 
 | 
  
 | 
    @Value("${ASRCallBackPath}") 
 | 
    private String ASRCallBackPath; 
 | 
  
 | 
    @Autowired 
 | 
    private RedisTemplate redisTemplate; 
 | 
  
 | 
    @Value("${hangup}") 
 | 
    private String hangup; 
 | 
  
 | 
    @Value("${app_key_yq}") 
 | 
    private String app_key_yq; 
 | 
  
 | 
    @Value("${ruoyi.profile}") 
 | 
    private String profile; 
 | 
  
 | 
    @Value("${voicePathPrefix}") 
 | 
    private String voicePathPrefix; 
 | 
  
 | 
    @Value("${localIP}") 
 | 
    private String localIP; 
 | 
  
 | 
    @Value("${req_path}") 
 | 
    private String req_path; 
 | 
  
 | 
    @Value("${xhsmsPath}") 
 | 
    private String xhsmsPath; 
 | 
  
 | 
    @Value("${phoneUpEveryHour}") 
 | 
    private Integer phoneUpEveryHour; 
 | 
    @Value("${phoneEndHour}") 
 | 
    private Integer phoneEndHour; 
 | 
  
 | 
    /** 
 | 
     * 查询单一任务(随访) 
 | 
     * 
 | 
     * @param id 单一任务(随访)主键 
 | 
     * @return 单一任务(随访) 
 | 
     */ 
 | 
    @Override 
 | 
    public ServiceSubtask selectServiceSubtaskById(Long id) { 
 | 
        return serviceSubtaskMapper.selectServiceSubtaskById(id); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询单一任务(随访)列表 
 | 
     * 
 | 
     * @param serviceSubtaskVO 单一任务(随访) 
 | 
     * @return 单一任务(随访) 
 | 
     */ 
 | 
    @Override 
 | 
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO) { 
 | 
        return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
    } 
 | 
  
 | 
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO) { 
 | 
        return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskVO); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) { 
 | 
        //定义患者与单一任务关联表集合 
 | 
        List<PatTaskRelevance> patTaskRelevances = new ArrayList<>(); 
 | 
        ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class); 
 | 
        List<ServiceSubtask> list = selectServiceSubtaskList(serviceSubtaskVO); 
 | 
  
 | 
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
        if (CollectionUtils.isEmpty(list) || list.size() == 0) { 
 | 
            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); 
 | 
        serviceTaskVO.setShowDate(serviceTask.getShowDate()); 
 | 
        serviceTaskVO.setShowTimeMorn(serviceTask.getShowTimeMorn()); 
 | 
        serviceTaskVO.setShowTimeNoon(serviceTask.getShowTimeNoon()); 
 | 
        serviceTaskVO.setShowTimeNight(serviceTask.getShowTimeNight()); 
 | 
        serviceTaskVO.setPreachform(serviceTask.getPreachform()); 
 | 
        String sendTimeSlot = serviceTask.getSendTimeSlot(); 
 | 
        ObjectMapper objectMapper = new ObjectMapper(); 
 | 
        try { 
 | 
            //获取到发送时间的集合 
 | 
            if (com.ruoyi.common.utils.StringUtils.isNotEmpty(sendTimeSlot)) { 
 | 
                List<TaskSendTimeVO> taskSendTimeVOList = objectMapper.readValue(sendTimeSlot, List.class); 
 | 
                serviceTaskVO.setSendTimeslot(taskSendTimeVOList); 
 | 
                serviceTaskVO.setSendType(serviceTask.getSendType()); 
 | 
            } 
 | 
            //文本变量参数 
 | 
            if (com.ruoyi.common.utils.StringUtils.isNotEmpty(serviceTask.getTextParam())) { 
 | 
                Map<String, Map<String, String>> textParam = objectMapper.readValue(serviceTask.getTextParam(), Map.class); 
 | 
                serviceTaskVO.setTextParam(textParam); 
 | 
            } 
 | 
        } catch (JsonProcessingException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
  
 | 
        for (ServiceSubtask serviceSubtask1 : list) { 
 | 
            PatTaskRelevance patTaskRelevance = new PatTaskRelevance(); 
 | 
            if (!serviceSubtask1.getHospType().equals("2")) { 
 | 
                log.info("随访查询不为出院,{}", serviceSubtask1.getHospType()); 
 | 
                //获取到患者信息,并放入到集合中 
 | 
                patTaskRelevance.setName(serviceSubtask1.getSendname()); 
 | 
                patTaskRelevance.setAge(serviceSubtask1.getAge()); 
 | 
                patTaskRelevance.setFinishtime(serviceSubtask1.getFinishtime()); 
 | 
                patTaskRelevance.setSfzh(serviceSubtask1.getSfzh()); 
 | 
                patTaskRelevance.setPhone(serviceSubtask1.getPhone()); 
 | 
                patTaskRelevance.setTelcode(serviceSubtask1.getPhone()); 
 | 
                patTaskRelevance.setAddr(serviceSubtask1.getAddr()); 
 | 
                patTaskRelevance.setDiagname(serviceSubtask1.getLeavediagname()); 
 | 
                patTaskRelevance.setPatid(serviceSubtask1.getPatid()); 
 | 
                patTaskRelevance.setSendStatus(serviceSubtask1.getSendstate()); 
 | 
                patTaskRelevance.setDeptCode(serviceSubtask1.getDeptcode()); 
 | 
                patTaskRelevance.setDeptName(serviceSubtask1.getDeptname()); 
 | 
                patTaskRelevance.setLeavehospitaldistrictcode(serviceSubtask1.getLeavehospitaldistrictcode()); 
 | 
                patTaskRelevance.setLeavehospitaldistrictname(serviceSubtask1.getLeavehospitaldistrictname()); 
 | 
                patTaskRelevance.setInhosptime(serviceSubtask1.getInhosptime()); 
 | 
                patTaskRelevance.setDrname(serviceSubtask1.getDrname()); 
 | 
                patTaskRelevance.setDrcode(serviceSubtask1.getDrcode()); 
 | 
                patTaskRelevance.setEndtime(serviceSubtask1.getEndtime()); 
 | 
                patTaskRelevance.setNurseId(serviceSubtask1.getNurseId()); 
 | 
                patTaskRelevance.setNurseName(serviceSubtask1.getNurseName()); 
 | 
                patTaskRelevances.add(patTaskRelevance); 
 | 
            } 
 | 
            if (serviceSubtask1.getHospType().equals("2")) { 
 | 
                log.info("随访查询为出院,{}", serviceSubtask1.getHospType()); 
 | 
                patTaskRelevance.setName(serviceSubtask1.getSendname()); 
 | 
                patTaskRelevance.setAge(serviceSubtask1.getAge()); 
 | 
                patTaskRelevance.setSfzh(serviceSubtask1.getSfzh()); 
 | 
                patTaskRelevance.setPhone(serviceSubtask1.getPhone()); 
 | 
                patTaskRelevance.setTelcode(serviceSubtask1.getPhone()); 
 | 
                patTaskRelevance.setFinishtime(serviceSubtask1.getFinishtime()); 
 | 
                patTaskRelevance.setAddr(serviceSubtask1.getAddr()); 
 | 
                patTaskRelevance.setDeptName(serviceSubtask1.getDeptname()); 
 | 
                patTaskRelevance.setDeptCode(serviceSubtask1.getDeptcode()); 
 | 
                patTaskRelevance.setBedNo(serviceSubtask1.getBedNo()); 
 | 
                patTaskRelevance.setDiagname(serviceSubtask1.getLeavediagname()); 
 | 
                patTaskRelevance.setPatid(serviceSubtask1.getPatid()); 
 | 
                patTaskRelevance.setSendStatus(serviceSubtask1.getSendstate()); 
 | 
                patTaskRelevance.setLeavehospitaldistrictcode(serviceSubtask1.getLeavehospitaldistrictcode()); 
 | 
                patTaskRelevance.setLeavehospitaldistrictname(serviceSubtask1.getLeavehospitaldistrictname()); 
 | 
                patTaskRelevance.setInhosptime(serviceSubtask1.getInhosptime()); 
 | 
                patTaskRelevance.setStarttime(serviceSubtask1.getStarttime()); 
 | 
                patTaskRelevance.setDrname(serviceSubtask1.getDrname()); 
 | 
                patTaskRelevance.setDrcode(serviceSubtask1.getDrcode()); 
 | 
                patTaskRelevance.setEndtime(serviceSubtask1.getEndtime()); 
 | 
                patTaskRelevance.setStarttime(serviceSubtask1.getStarttime()); 
 | 
                patTaskRelevance.setNurseId(serviceSubtask1.getNurseId()); 
 | 
                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); 
 | 
        return serviceTaskVO; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) { 
 | 
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
        return selectServiceSubtaskList; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<ServiceSubtask> patItem2(ServiceSubtaskVO serviceSubtaskVO) { 
 | 
        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>(); 
 | 
        for (Long sendstate : serviceSubtaskVO.getSendstates()) { 
 | 
            serviceSubtaskVO.setSendstate(sendstate); 
 | 
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
            serviceSubtaskList.addAll(serviceSubtasks); 
 | 
        } 
 | 
        return serviceSubtaskList; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) { 
 | 
        serviceSubtaskVO.setPageSize(99999999); 
 | 
        serviceSubtaskVO.setPageNum(1); 
 | 
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
        Map<String, Object> map = new HashMap<>(); 
 | 
        Integer wzx = 0; 
 | 
        Integer ysf = 0; 
 | 
        Integer yc = 0; 
 | 
        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 && 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 (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && !serviceSubtask.getExcep().equals("0")) 
 | 
                yc = yc + 1; 
 | 
        } 
 | 
        map.put("wzx", wzx); 
 | 
        map.put("ysf", ysf); 
 | 
        map.put("yc", yc); 
 | 
        map.put("fssb", fssb); 
 | 
        map.put("yfs", yfs); 
 | 
        map.put("blq", blq); 
 | 
        map.put("dsf", dsf); 
 | 
  
 | 
        return map; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 新增单一任务(随访) 
 | 
     * 
 | 
     * @param serviceSubtask 单一任务(随访) 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int insertServiceSubtask(ServiceSubtask serviceSubtask) { 
 | 
        serviceSubtask.setCreateTime(DateUtils.getNowDate()); 
 | 
        return serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 再次新增单一任务(随访) 
 | 
     * 
 | 
     * @param serviceSubtask 再次新增单一任务(随访) 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public String addSubTaskAgain(ServiceSubtask serviceSubtask) { 
 | 
        ServiceSubtask serviceSubtask1 = selectServiceSubtaskById(serviceSubtask.getId()); 
 | 
        PatMedInhosp patMedInhosp = new PatMedInhosp(); 
 | 
        patMedInhosp.setPatid(serviceSubtask1.getPatid()); 
 | 
        patMedInhosp.setInhospstate("0"); 
 | 
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp); 
 | 
        PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask1.getPatid()); 
 | 
  
 | 
        if (patMedInhospList.size() > 0) { 
 | 
            serviceSubtask1.setIsVisitAgain(2); 
 | 
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); 
 | 
            return "无需再次随访,患者再入院了"; 
 | 
        } else if (serviceSubtask1.getSendstate() == 4L) { 
 | 
            serviceSubtask1.setIsVisitAgain(2); 
 | 
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); 
 | 
            return "无需再次随访,任务被标记不在执行"; 
 | 
        } else if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { 
 | 
            serviceSubtask1.setIsVisitAgain(2); 
 | 
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); 
 | 
            return "无需再次随访,患者被标记不需要被服务"; 
 | 
        } else if (ObjectUtils.isNotEmpty(serviceSubtask1.getIsVisitAgain()) && serviceSubtask1.getIsVisitAgain() == 2) { 
 | 
            return "无需再次随访,该任务已经再次随访过了"; 
 | 
        } 
 | 
        //新增再次随访任务 
 | 
        ServiceSubtask serviceSubtask2 = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class); 
 | 
        serviceSubtask2.setId(null); 
 | 
        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) { 
 | 
            //新增成功后,需要将之前的任务设置为不要再随访(防止重复点,然后重复生成) 
 | 
            serviceSubtask1.setIsVisitAgain(2); 
 | 
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1); 
 | 
            return "再次随访任务创建成功"; 
 | 
        } 
 | 
        return "再次随访任务创建失败,再请次重试"; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 修改单一任务(随访) 
 | 
     * 
 | 
     * @param serviceSubtask 单一任务(随访) 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public Boolean updateServiceSubtask(ServiceSubtask serviceSubtask) { 
 | 
        serviceSubtask.setUpdateTime(DateUtils.getNowDate()); 
 | 
        if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 6) 
 | 
            serviceSubtask.setFinishtime(new Date()); 
 | 
        return serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 批量删除单一任务(随访) 
 | 
     * 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int deleteServiceSubtaskByIds(Long[] ids) { 
 | 
        Integer i = 0; 
 | 
        for (Long id : ids) { 
 | 
            i = serviceSubtaskMapper.deleteServiceSubtaskById(id); 
 | 
        } 
 | 
        return i; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 单一任务 
 | 
     * 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    @Override 
 | 
    public Map<String, Integer> insertOrUpdateTask(ServiceTaskVO serviceTaskVO) { 
 | 
        if (ObjectUtils.isEmpty(serviceTaskVO)) { 
 | 
            log.info("任务入参为空,请检查入参"); 
 | 
            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) { 
 | 
            //新增模板信息 
 | 
            Long tempid = null; 
 | 
            String tempName = null; 
 | 
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getSvyTaskTemplateVO())) { 
 | 
                tempid = Long.valueOf(svyTaskTemplateService.saveOrUpdateTemplate(serviceTaskVO.getSvyTaskTemplateVO())); 
 | 
                tempName = svyTaskTemplateService.selectSvyTaskTemplateBySvyid(tempid).getSvyname(); 
 | 
            } 
 | 
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) { 
 | 
                tempid = Long.valueOf(ivrTaskTemplateService.saveOrUpdateTempScript(serviceTaskVO.getIvrTaskTemplateVO())); 
 | 
                tempName = ivrTaskTemplateService.selectIvrTaskTemplateByID(tempid).getTemplateName(); 
 | 
            } 
 | 
  
 | 
            //往任务表中,新增任务 
 | 
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getSendTimeslot())) 
 | 
                serviceTask.setSendTimeSlot(JSON.toJSONString(serviceTaskVO.getSendTimeslot())); 
 | 
            if (serviceTask.getSendState() == null) { 
 | 
                serviceTask.setSendState(1L); 
 | 
                serviceTaskVO.setSendState(1L); 
 | 
            } else { 
 | 
                serviceTask.setSendState(serviceTaskVO.getSendState()); 
 | 
            } 
 | 
            if (StringUtils.isNotEmpty(serviceTaskVO.getLibtemplateid())) { 
 | 
                serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid()); 
 | 
                serviceTask.setLibtemplatename(serviceTaskVO.getLibtemplatename()); 
 | 
            } 
 | 
            if (serviceTaskVO.getTemplateid() != null) { 
 | 
                serviceTask.setTemplateid(serviceTaskVO.getTemplateid()); 
 | 
                serviceTask.setTemplatename(serviceTaskVO.getTemplatename()); 
 | 
            } else { 
 | 
                serviceTask.setTemplateid(tempid); 
 | 
                serviceTask.setTemplatename(tempName); 
 | 
            } 
 | 
            serviceTask.setLeaveldeptcodes(serviceTaskVO.getLeaveldeptcodes()); 
 | 
            serviceTask.setLeavehospitaldistrictcode(serviceTask.getLeavehospitaldistrictcode()); 
 | 
            if (serviceTaskVO.getLongTask() == 1) serviceTask.setSendState(2L); 
 | 
            serviceTask.setCreateTime(new Date()); 
 | 
            serviceTask.setUpdateTime(new Date()); 
 | 
            serviceTaskService.insertServiceTask(serviceTask); 
 | 
            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(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.info("----serviceTaskdiag的值为:{}", serviceTaskdiag); 
 | 
                    if (StringUtils.isNotEmpty(serviceTaskVO.getIcd10code())) { 
 | 
                        String[] Icd10codes = serviceTaskVO.getIcd10code().split(","); 
 | 
                        for (String icd10code : Icd10codes) { 
 | 
                            serviceTaskdiag.setIcd10code(icd10code); 
 | 
                            serviceTaskdiagService.insertServiceTaskdiag(serviceTaskdiag); 
 | 
                        } 
 | 
                    } 
 | 
                } else if (serviceTaskVO.getAppltype().equals("4")) { 
 | 
                    ServiceTaskoper serviceTaskoper = new ServiceTaskoper(); 
 | 
                    serviceTaskoper.setOpcode(serviceTaskVO.getOpcode()); 
 | 
                    serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc()); 
 | 
                    serviceTaskoper.setTaskId(serviceTask.getTaskid()); 
 | 
                    serviceTaskoper.setTaskName(serviceTask.getTaskName()); 
 | 
                    serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask())); 
 | 
                    serviceTaskoper.setGuid(serviceTask.getGuid()); 
 | 
                    serviceTaskoper.setOrgid(serviceTask.getOrgid()); 
 | 
                    serviceTaskoper.setCreateTime(new Date()); 
 | 
                    if (StringUtils.isNotEmpty(serviceTaskVO.getOpcode())) { 
 | 
                        String[] opcodes = serviceTaskVO.getOpcode().split(","); 
 | 
                        for (String opcode : opcodes) { 
 | 
                            serviceTaskoper.setOpcode(opcode); 
 | 
                            log.info("----serviceTaskoper的值为:{}", serviceTaskoper); 
 | 
                            serviceTaskoperService.insertServiceTaskoper(serviceTaskoper); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                } else { 
 | 
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); 
 | 
                    serviceTaskdept.setTaskId(serviceTask.getTaskid()); 
 | 
                    serviceTaskdept.setTaskName(serviceTask.getTaskName()); 
 | 
                    serviceTaskdept.setOrgid(serviceTask.getOrgid()); 
 | 
                    serviceTaskdept.setLongtask(Long.valueOf(serviceTaskVO.getLongTask())); 
 | 
                    if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) { 
 | 
                        String[] deptcodes = serviceTaskVO.getDeptcode().split(","); 
 | 
                        for (String deptCode : deptcodes) { 
 | 
                            serviceTaskdept.setDeptCode(deptCode); 
 | 
                            serviceTaskdept.setDeptType("1"); 
 | 
                            serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); 
 | 
                            serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept); 
 | 
                        } 
 | 
                    } 
 | 
                    if (StringUtils.isNotEmpty(serviceTaskVO.getLeavehospitaldistrictcode())) { 
 | 
                        String[] leavehospitaldistrictcodes = serviceTaskVO.getLeavehospitaldistrictcode().split(","); 
 | 
                        for (String districtcode : leavehospitaldistrictcodes) { 
 | 
                            serviceTaskdept.setDeptCode(districtcode); 
 | 
                            serviceTaskdept.setDeptType("2"); 
 | 
                            serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); 
 | 
                            serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
//长期任务,也允许加人了 
 | 
//            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.setTaskid(serviceTask.getTaskid().longValue()); 
 | 
            serviceSubtask.setTemplatename(tempName); 
 | 
            serviceSubtask.setTemplateid(tempid); 
 | 
            //新增 
 | 
            if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) { 
 | 
                for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) { 
 | 
                    //将任务信息新增到随访服务表中 
 | 
                    serviceSubtask.setSendname(patTaskRelevance.getName()); 
 | 
                    serviceSubtask.setAge(patTaskRelevance.getAge()); 
 | 
//                    serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); 
 | 
                    serviceSubtask.setSfzh(patTaskRelevance.getIdcardno()); 
 | 
                    serviceSubtask.setPhone(patTaskRelevance.getTelcode()); 
 | 
                    serviceSubtask.setAddr(patTaskRelevance.getAddr()); 
 | 
                    serviceSubtask.setPatid(patTaskRelevance.getPatid()); 
 | 
                    serviceSubtask.setCreateTime(DateUtils.getNowDate()); 
 | 
                    serviceSubtask.setSendstate(1L); 
 | 
                    if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1) 
 | 
                        serviceSubtask.setSendstate(2L); 
 | 
                    serviceSubtask.setDeptcode(patTaskRelevance.getDeptCode()); 
 | 
                    serviceSubtask.setDeptname(patTaskRelevance.getDeptName()); 
 | 
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); 
 | 
                    serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); 
 | 
                    serviceSubtask.setType(serviceTaskVO.getType()); 
 | 
                    serviceSubtask.setHospType(patTaskRelevance.getHospType()); 
 | 
                    serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); 
 | 
                    serviceSubtask.setDrname(patTaskRelevance.getDrname()); 
 | 
                    serviceSubtask.setDrcode(patTaskRelevance.getDrcode()); 
 | 
                    serviceSubtask.setInhosptime(patTaskRelevance.getInhosptime()); 
 | 
                    serviceSubtask.setLeaveicd10code(patTaskRelevance.getLeaveicd10code()); 
 | 
                    serviceSubtask.setLeavediagname(patTaskRelevance.getLeavediagname()); 
 | 
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime()); 
 | 
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId()); 
 | 
                    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); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
        } else if (serviceTaskVO.getIsoperation() != null && serviceTaskVO.getIsoperation() == 2) { 
 | 
            //任务修改 
 | 
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getSendTimeslot())) 
 | 
                serviceTask.setSendTimeSlot(JSON.toJSONString(serviceTaskVO.getSendTimeslot())); 
 | 
            //修改操作,需要将stopState状态+1 
 | 
            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid()); 
 | 
            //获取到该任务所有的服务,并从队列里删除 
 | 
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO(); 
 | 
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid()); 
 | 
            serviceSubtaskVO.setSendstate(2L); 
 | 
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
            serviceSubtaskVO.setSendstate(1L); 
 | 
            List<ServiceSubtask> serviceSubtaskList1 = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); 
 | 
            if (CollectionUtils.isNotEmpty(serviceSubtaskList)) { 
 | 
                if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList.addAll(serviceSubtaskList1); 
 | 
            } else { 
 | 
                if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList = serviceSubtaskList1; 
 | 
            } 
 | 
  
 | 
            if (serviceTaskVO.getLibtemplateid() != null) 
 | 
                serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid().toString()); 
 | 
            serviceTask.setTemplateid(serviceTaskVO.getTemplateid()); 
 | 
            serviceTask.setLongTask(serviceTaskVO.getLongTask()); 
 | 
            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(Long.valueOf(serviceTask.getLongTask())); 
 | 
                        serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); 
 | 
                        serviceTaskdept.setDeptCode(deptCode); 
 | 
                        serviceTaskdept.setDeptType("1"); 
 | 
                        serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); 
 | 
                        ServiceTaskdept st = new ServiceTaskdept(); 
 | 
                        st.setDeptCode(deptCode); 
 | 
                        st.setTaskId(serviceTask.getTaskid()); 
 | 
                        List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptService.selectServiceTaskdeptList(st); 
 | 
                        if (CollectionUtils.isEmpty(serviceTaskdepts)) { 
 | 
                            serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept); 
 | 
                        } else { 
 | 
                            serviceTaskdeptService.updateServiceTaskdept(serviceTaskdept); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
                if (StringUtils.isNotEmpty(serviceTaskVO.getLeavehospitaldistrictcode())) { 
 | 
                    String[] leavehospitaldistrictcodes = serviceTaskVO.getLeavehospitaldistrictcode().split(","); 
 | 
                    for (String districtcode : leavehospitaldistrictcodes) { 
 | 
                        ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); 
 | 
                        serviceTaskdept.setTaskId(serviceTask.getTaskid()); 
 | 
                        serviceTaskdept.setTaskName(serviceTask.getTaskName()); 
 | 
                        serviceTaskdept.setLongtask(Long.valueOf(serviceTask.getLongTask())); 
 | 
                        serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); 
 | 
                        serviceTaskdept.setDeptCode(districtcode); 
 | 
                        serviceTaskdept.setDeptType("2"); 
 | 
                        serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); 
 | 
                        //先通过任务ID、部门code,判断ServiceTaskdept是否存在,不存在则新增,存在则修改 
 | 
                        ServiceTaskdept st = new ServiceTaskdept(); 
 | 
                        st.setDeptCode(districtcode); 
 | 
                        st.setTaskId(serviceTask.getTaskid()); 
 | 
                        List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptService.selectServiceTaskdeptList(st); 
 | 
                        if (CollectionUtils.isEmpty(serviceTaskdepts)) { 
 | 
                            serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept); 
 | 
                        } else { 
 | 
                            serviceTaskdeptService.updateServiceTaskdept(serviceTaskdept); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } else if (serviceTaskVO.getAppltype().equals("3")) { 
 | 
                ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag(); 
 | 
                serviceTaskdiag.setTaskId(serviceTask.getTaskid()); 
 | 
                serviceTaskdiag.setTaskName(serviceTask.getTaskName()); 
 | 
                if (StringUtils.isEmpty(serviceTaskVO.getIcd10code())) { 
 | 
                    throw new BaseException("疾病编码为空"); 
 | 
                } 
 | 
                serviceTaskdiag.setLongtask(Long.valueOf(serviceTask.getLongTask())); 
 | 
                serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name()); 
 | 
                serviceTaskdiag.setGuid(serviceTask.getGuid()); 
 | 
                serviceTaskdiag.setOrgid(serviceTask.getOrgid()); 
 | 
                serviceTaskdiag.setUpdateTime(new Date()); 
 | 
                if (StringUtils.isNotEmpty(serviceTaskVO.getIcd10code())) { 
 | 
                    String[] icd10codes = serviceTaskVO.getIcd10code().split(","); 
 | 
                    for (String icdcode : icd10codes) { 
 | 
                        //先查询一下是否存在 
 | 
                        ServiceTaskdiag serviceTaskdiag2 = new ServiceTaskdiag(); 
 | 
                        serviceTaskdiag2.setTaskId(serviceTaskVO.getTaskid()); 
 | 
                        serviceTaskdiag2.setIcd10code(icdcode); 
 | 
                        List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagService.selectServiceTaskdiagList(serviceTaskdiag2); 
 | 
                        serviceTaskdiag.setIcd10code(icdcode); 
 | 
                        log.info("----serviceTaskdiag更新的值为:{}", serviceTaskdiag); 
 | 
                        if (CollectionUtils.isNotEmpty(serviceTaskdiags)) { 
 | 
                            serviceTaskdiag.setId(serviceTaskdiags.get(0).getId()); 
 | 
                            serviceTaskdiagService.updateServiceTaskdiag(serviceTaskdiag); 
 | 
                        } else { 
 | 
                            serviceTaskdiagService.insertServiceTaskdiag(serviceTaskdiag); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
  
 | 
            } else if (serviceTaskVO.getAppltype().equals("4")) { 
 | 
                ServiceTaskoper serviceTaskoper = new ServiceTaskoper(); 
 | 
                if (StringUtils.isEmpty(serviceTaskVO.getOpcode())) { 
 | 
                    throw new BaseException("手术编码为空"); 
 | 
                } 
 | 
//                serviceTaskoper.setOpcode(serviceTaskVO.getOpcode()); 
 | 
                serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc()); 
 | 
                serviceTaskoper.setTaskId(serviceTask.getTaskid()); 
 | 
                serviceTaskoper.setTaskName(serviceTask.getTaskName()); 
 | 
                serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask())); 
 | 
                serviceTaskoper.setGuid(serviceTask.getGuid()); 
 | 
                serviceTaskoper.setOrgid(serviceTask.getOrgid()); 
 | 
                serviceTaskoper.setCreateTime(new Date()); 
 | 
                if (StringUtils.isNotEmpty(serviceTaskVO.getOpcode())) { 
 | 
                    String[] opcodes = serviceTaskVO.getOpcode().split(","); 
 | 
                    for (String opcode : opcodes) { 
 | 
                        //先查询一下是否存在 
 | 
                        ServiceTaskoper serviceTaskoper2 = new ServiceTaskoper(); 
 | 
                        serviceTaskoper2.setTaskId(serviceTaskVO.getTaskid()); 
 | 
                        serviceTaskoper2.setOpcode(serviceTaskVO.getOpcode()); 
 | 
                        List<ServiceTaskoper> serviceTaskopers = serviceTaskoperService.selectServiceTaskoperList(serviceTaskoper2); 
 | 
  
 | 
                        serviceTaskoper.setOpcode(opcode); 
 | 
                        log.info("----serviceTaskoper的值为:{}", serviceTaskoper); 
 | 
                        if (CollectionUtils.isNotEmpty(serviceTaskopers)) { 
 | 
                            serviceTaskoper.setId(serviceTaskopers.get(0).getId()); 
 | 
                            serviceTaskoperService.updateServiceTaskoper(serviceTaskoper); 
 | 
                        } else { 
 | 
                            serviceTaskoperService.insertServiceTaskoper(serviceTaskoper); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) { 
 | 
                IvrTaskTemplate ivrTaskTemplate = new IvrTaskTemplate(); 
 | 
                ivrTaskTemplate.setTaskid(serviceTaskVO.getIvrTaskTemplateVO().getTaskid()); 
 | 
                ivrTaskTemplate.setId(serviceTaskVO.getIvrTaskTemplateVO().getId()); 
 | 
                ivrTaskTemplateService.updateIvrTaskTemplate(ivrTaskTemplate); 
 | 
            } else if (ObjectUtils.isNotEmpty(serviceTaskVO.getSvyTaskTemplateVO())) { 
 | 
                SvyTaskTemplate svyTaskTemplate = new SvyTaskTemplate(); 
 | 
                svyTaskTemplate.setTaskid(serviceTaskVO.getSvyTaskTemplateVO().getTaskid()); 
 | 
                svyTaskTemplate.setId(serviceTaskVO.getSvyTaskTemplateVO().getId()); 
 | 
                svyTaskTemplateService.updateSvyTaskTemplate(svyTaskTemplate); 
 | 
            } 
 | 
  
 | 
            if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1) { 
 | 
                //这里需要将任务id与任务模板ID,在任务模板中绑定 
 | 
                Map<String, Integer> map = new HashMap<>(); 
 | 
                map.put("taskId", serviceTask.getTaskid().intValue()); 
 | 
                return map; 
 | 
            } 
 | 
            if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) { 
 | 
                for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) { 
 | 
                    ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); 
 | 
                    serviceSubtask.setSendname(patTaskRelevance.getName()); 
 | 
                    serviceSubtask.setAge(patTaskRelevance.getAge()); 
 | 
                    serviceSubtask.setSfzh(patTaskRelevance.getSfzh()); 
 | 
                    serviceSubtask.setPhone(patTaskRelevance.getTelcode()); 
 | 
                    serviceSubtask.setAddr(patTaskRelevance.getAddr()); 
 | 
                    serviceSubtask.setPatid(patTaskRelevance.getPatid()); 
 | 
                    serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); 
 | 
                    serviceSubtask.setDeptcode(patTaskRelevance.getDeptCode()); 
 | 
                    serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); 
 | 
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); 
 | 
                    serviceSubtask.setDeptname(patTaskRelevance.getDeptName()); 
 | 
                    serviceSubtask.setType(serviceTaskVO.getType()); 
 | 
                    serviceSubtask.setCreateTime(DateUtils.getNowDate()); 
 | 
                    serviceSubtask.setDrname(patTaskRelevance.getDrname()); 
 | 
                    serviceSubtask.setDrcode(patTaskRelevance.getDrcode()); 
 | 
                    serviceSubtask.setInhosptime(patTaskRelevance.getInhosptime()); 
 | 
                    serviceSubtask.setHospType(patTaskRelevance.getHospType()); 
 | 
                    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) { 
 | 
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); 
 | 
                            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); 
 | 
                        } 
 | 
                        if (patTaskRelevance.getIsoperation() == 1) { 
 | 
                            serviceSubtask.setSendstate(1L); 
 | 
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy()); 
 | 
                            serviceSubtask.setCreateBy(serviceTask.getUpdateBy()); 
 | 
                            serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); 
 | 
                        } 
 | 
                        if (patTaskRelevance.getIsoperation() == 3) 
 | 
                            //  通过taskid和patid去删除该条数据 
 | 
                            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); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        Map<String, Integer> map = new HashMap<>(); 
 | 
        map.put("taskId", serviceTask.getTaskid().intValue()); 
 | 
        return map; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public void phoneCallBack(PhoneCallBackVO phoneCallBackVO) { 
 | 
        phoneCallBackVO.setTextResult(phoneCallBackVO.getTextResult().substring(0, phoneCallBackVO.getTextResult().length() - 1)); 
 | 
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); 
 | 
  
 | 
        //获取数据 
 | 
        Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid()); 
 | 
        if (!aBoolean) { 
 | 
            throw new BaseException("该uuid不存在"); 
 | 
        } 
 | 
        Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup"); 
 | 
        PhoneUtils phoneUtils = new PhoneUtils(); 
 | 
        if (hangupValue != null && hangupValue == 1) { 
 | 
            String date = simpleDateFormat1.format(new Date()); 
 | 
            log.info("电话要挂断了: {}", date); 
 | 
            //hangupValue == 1  随访结束,直接可以挂电话 
 | 
            phoneUtils.hangup("", "", "", "", "", "", "", phoneCallBackVO.getUuid()); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        Map<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid()); 
 | 
        ServiceSubtask serviceSubtask = (ServiceSubtask) map.get("ServiceSubtask"); 
 | 
        List<IvrTaskTemplateScriptVO> IvrTaskTemplateScriptVOs = (List<IvrTaskTemplateScriptVO>) map.get("IvrTaskTemplateScriptVO"); 
 | 
        //将uuid更新到数据库中 
 | 
        serviceSubtask.setSenduuid(phoneCallBackVO.getUuid()); 
 | 
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); 
 | 
  
 | 
        //获取模板信息 
 | 
        IvrTaskTemplateVO ivrTaskTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "IvrTaskTemplateVO"); 
 | 
  
 | 
        //语音识别结果上报接口: 3 
 | 
        Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice"); 
 | 
        QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues"); 
 | 
        //将传回的结果放到回复对象中 
 | 
        returnQues.setContent(phoneCallBackVO.getTextResult()); 
 | 
  
 | 
        IvrTaskTemplateScriptVO nowQuestion = returnQues.getNowQuestion(); 
 | 
  
 | 
        if (StringUtils.isEmpty(returnQues.getContent())) { 
 | 
            //无回话 
 | 
            //判断noVoice是否已经到了最大值 
 | 
            if (noVoice == ivrTaskTemplateVO.getNoVoiceNum().intValue()) { 
 | 
                //已经问了对应的遍数,就判断是否还有下一题 
 | 
                if (nowQuestion.getTargetid() == IvrTaskTemplateScriptVOs.size()) { 
 | 
                    ServiceSubtask ss = new ServiceSubtask(); 
 | 
                    ss.setId(serviceSubtask.getId()); 
 | 
                    ss.setSendstate(5L); 
 | 
                    ss.setRemark("电话无响应"); 
 | 
                    serviceSubtaskMapper.updateServiceSubtask(ss); 
 | 
                    //没有下一题了,就挂断电话,播放结束语 
 | 
                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); 
 | 
                    phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); 
 | 
                    return; 
 | 
                } else { 
 | 
                    //有下一题 
 | 
                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); 
 | 
                    IvrTaskTemplateScriptVO nextQuestion = getNextQuestion(IvrTaskTemplateScriptVOs, nowQuestion); 
 | 
                    // 问题,  去调用"tts合成和播放"接口 
 | 
                    String date = simpleDateFormat1.format(new Date()); 
 | 
                    log.info("去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                    phoneUtils.ttsPlayback(nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
                } 
 | 
            } else { 
 | 
                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES); 
 | 
                //调用ivrLibaTemplateScriptVO中的slienceText(静默话术) 
 | 
                String slienceText = nowQuestion.getSlienceText(); 
 | 
                //静默话术  + 问题,  去调用"tts合成和播放"接口 
 | 
                String date = simpleDateFormat1.format(new Date()); 
 | 
                log.info("静默话术  + 问题,去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                phoneUtils.ttsPlayback(slienceText + nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
                return; 
 | 
            } 
 | 
  
 | 
        } else { 
 | 
            //isppd用来记录是否匹配到 
 | 
            Boolean isppd = false; 
 | 
            //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行) 
 | 
            for (int j = 0; j < nowQuestion.getIvrTaskScriptTargetoptionList().size(); j++) { 
 | 
                //包含 
 | 
                Matcher matcher = null; 
 | 
                if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex())) { 
 | 
                    Pattern pattern = Pattern.compile(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()); 
 | 
                    matcher = pattern.matcher(phoneCallBackVO.getTextResult()); 
 | 
                } 
 | 
                //不包含 
 | 
                Matcher matcher2 = null; 
 | 
                if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2())) { 
 | 
                    Pattern pattern2 = Pattern.compile(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()); 
 | 
                    matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult()); 
 | 
                } 
 | 
                log.error("PCB--getQuestionText问题为:{},UUID:{}", nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
                if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() || StringUtils.isEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) { 
 | 
                    //说明匹配正确了 
 | 
                    //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法 
 | 
                    nowQuestion.getIvrTaskScriptTargetoptionList().get(j).setIsUserOperation(1); 
 | 
                    serviceTaskScriptTargetoptionMapper.updateIvrTaskTemplateTargetoption(nowQuestion.getIvrTaskScriptTargetoptionList().get(j)); 
 | 
  
 | 
                    //将静默置为0 
 | 
                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); 
 | 
                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); 
 | 
  
 | 
                    //将患者的回签写进表里 
 | 
                    IvrTaskVisitResult serviceTaskVisitResult = DtoConversionUtils.sourceToTarget(serviceSubtask, IvrTaskVisitResult.class); 
 | 
                    serviceTaskVisitResult.setId(null); 
 | 
                    serviceTaskVisitResult.setQuestion(nowQuestion.getIvrtext()); 
 | 
                    serviceTaskVisitResult.setPatientAnswer(phoneCallBackVO.getTextResult()); 
 | 
                    serviceTaskVisitResult.setCreateTime(new Date()); 
 | 
                    serviceTaskVisitResult.setOptionResult(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetvalue()); 
 | 
                    serviceTaskVisitResultMapper.insertIvrTaskVisitResult(serviceTaskVisitResult); 
 | 
  
 | 
                    //将匹配到的标识改成true 
 | 
                    isppd = true; 
 | 
  
 | 
                    //获取下一题 
 | 
                    Long nextQuestion = nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getNextQuestion(); 
 | 
                    for (IvrTaskTemplateScriptVO script : IvrTaskTemplateScriptVOs) { 
 | 
                        if (script.getTargetid() == nextQuestion) { 
 | 
                            QuestionMessage questionMessage = new QuestionMessage(); 
 | 
                            questionMessage.setNowQuestion(script); 
 | 
                            questionMessage.setQuestionList(IvrTaskTemplateScriptVOs); 
 | 
                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); 
 | 
                            phoneUtils.ttsPlayback(script.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
                            return; 
 | 
                        } else if (nextQuestion > IvrTaskTemplateScriptVOs.size()) { 
 | 
                            //没有下一题了,就结束了 
 | 
                            ServiceSubtask ss = new ServiceSubtask(); 
 | 
                            ss.setId(serviceSubtask.getId()); 
 | 
                            ss.setSendstate(6L); 
 | 
                            serviceSubtaskMapper.updateServiceSubtask(ss); 
 | 
                            String date = simpleDateFormat1.format(new Date()); 
 | 
                            log.error("没有下一题了,就结束了: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); 
 | 
                            phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); 
 | 
                            try { 
 | 
                                Thread.sleep(3000); 
 | 
                            } catch (InterruptedException e) { 
 | 
                                e.printStackTrace(); 
 | 
                            } 
 | 
                            phoneUtils.hangup("", "", ivrTaskTemplateVO.getRevisitAfter(), "", "", "", "", phoneCallBackVO.getUuid()); 
 | 
                            return; 
 | 
                        } 
 | 
                    } 
 | 
                    return; 
 | 
                } else { 
 | 
                    //没有匹配上当前option 
 | 
                    //Targetregex2 为false,表示在Targetregex2中存在  语句中的关键字,这个option就不用再继续匹配了,直接匹配下一个option 
 | 
                    continue; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            if (isppd != true) { 
 | 
                //没有匹配到 
 | 
                Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum"); 
 | 
                if (mateNum == null) mateNum = 0; 
 | 
                //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了 
 | 
                if (mateNum == ivrTaskTemplateVO.getMateNum().intValue()) { 
 | 
                    //如果下一题为空.则新的数据返回,并加上感谢语 
 | 
                    if (nowQuestion.getTargetid() < IvrTaskTemplateScriptVOs.size()) { 
 | 
                        QuestionMessage questionMessage = new QuestionMessage(); 
 | 
                        IvrTaskTemplateScriptVO nextQuestion = getNextQuestion(IvrTaskTemplateScriptVOs, nowQuestion); 
 | 
                        questionMessage.setQuestionList(IvrTaskTemplateScriptVOs); 
 | 
                        questionMessage.setNowQuestion(nextQuestion); 
 | 
                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); 
 | 
                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); 
 | 
                        String date = simpleDateFormat1.format(new Date()); 
 | 
                        log.info("如果下一题为空.则新的数据返回,并加上感谢语: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                        phoneUtils.ttsPlayback(nextQuestion.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
                        return; 
 | 
                    } else { 
 | 
                        //就可以挂断电话了 
 | 
                        ServiceSubtask ss = new ServiceSubtask(); 
 | 
                        ss.setId(serviceSubtask.getId()); 
 | 
                        ss.setSendstate(6L); 
 | 
                        serviceSubtaskMapper.updateServiceSubtask(ss); 
 | 
  
 | 
                        String date = simpleDateFormat1.format(new Date()); 
 | 
                        log.info("就可以挂断电话了------: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); 
 | 
                        phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); 
 | 
                        try { 
 | 
                            Thread.sleep(3000); 
 | 
                        } catch (InterruptedException e) { 
 | 
                            e.printStackTrace(); 
 | 
                        } 
 | 
                        phoneUtils.hangup("", "", ivrTaskTemplateVO.getRevisitAfter(), "", "", "", "", phoneCallBackVO.getUuid()); 
 | 
                        return; 
 | 
                    } 
 | 
                } else if (mateNum < ivrTaskTemplateVO.getMateNum().intValue()) { 
 | 
                    //没有问到规定次数 
 | 
                    mateNum = mateNum + 1; 
 | 
                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES); 
 | 
                } 
 | 
            } 
 | 
            //选项匹配完成后,需要再去通过库再进行匹配一次 
 | 
            String extemplateID = ivrTaskTemplateVO.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.error("++++++++++++++++++++++++++通用库是否为空: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"); 
 | 
                        IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = returnQues.getNowQuestion(); 
 | 
                        ivrTaskTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText()); 
 | 
                        ivrTaskTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav()); 
 | 
                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); 
 | 
                        if (ivrLibaExtemplatescript.getIsEnd() == 1) { 
 | 
                            //将问题置空 
 | 
                            IvrTaskTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion(); 
 | 
                            nowQuestion1.setScriptContent(null); 
 | 
                            nowQuestion1.setScriptVoice(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"将结果传回 
 | 
                        String date = simpleDateFormat1.format(new Date()); 
 | 
                        log.info("调用tts合成和播放------: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                        phoneUtils.ttsPlayback(nowQuestion.getIvrtext() + ivrTaskTemplateScriptVO.getSubmoduleText(), phoneCallBackVO.getUuid()); 
 | 
                    } 
 | 
                    break; 
 | 
                } 
 | 
                String date = simpleDateFormat1.format(new Date()); 
 | 
                log.info("最后的信息回复-: {},uuid为:{}", date, phoneCallBackVO.getUuid()); 
 | 
                phoneUtils.ttsPlayback(nowQuestion.getIvrtext(), phoneCallBackVO.getUuid()); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 电话ASR通话回调(雨绮) 
 | 
     * 
 | 
     * @param phoneCallReqYQVO 
 | 
     */ 
 | 
    @Override 
 | 
    public PhoneCallBackYQVO phoneCallBackYQ(PhoneCallReqYQVO phoneCallReqYQVO) { 
 | 
        //先把该subId从cache_exist中剔除,只要有回调就剔除(目的是,尽快让cache-exist为空,去缓存下一批要打的电话;这里剔除不影响电话的正常业务) 
 | 
        redisCache.removeElementFromList("cache-exist", phoneCallReqYQVO.getTaskid()); 
 | 
  
 | 
        //判断是否挂机 
 | 
        String hangupState = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- hangup"); 
 | 
        Object cacheObject1 = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup"); 
 | 
        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这个主要是给"通话记录用的,") 
 | 
                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,就说明已经打完了,也没有必要继续往下走了 
 | 
                if (StringUtils.isNotEmpty(phoneCallReqYQVO.getTaskid())) { 
 | 
                    ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid())); 
 | 
                    if (serviceSubtask.getSendstate() == 6L) return new PhoneCallBackYQVO(); 
 | 
                } 
 | 
  
 | 
                ServiceSubtask serviceSubtask2 = new ServiceSubtask(); 
 | 
                serviceSubtask2.setRemark("电话发送成功(患者挂断)"); 
 | 
                serviceSubtask2.setSenduuid(phoneCallReqYQVO.getUuid()); 
 | 
                serviceSubtask2.setId(Long.valueOf(phoneCallReqYQVO.getTaskid())); 
 | 
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask2); 
 | 
                Map<String, String> req = new HashMap<>(); 
 | 
                req.put("uuid", phoneCallReqYQVO.getUuid()); 
 | 
                req.put("caller", phoneCallReqYQVO.getPhone()); 
 | 
                HttpUtil.postJsonRequest(hangup, new Gson().toJson(req)); 
 | 
                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- hangup", "1", 2, TimeUnit.MINUTES); 
 | 
                //先把默认的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())); 
 | 
                return new PhoneCallBackYQVO(); 
 | 
            } 
 | 
        } 
 | 
        //定义一个分数的变量 
 | 
        Boolean aBoolean1 = redisCache.hasKey(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
        if (!aBoolean1) redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", 0.0, 120, TimeUnit.MINUTES); 
 | 
        PhoneCallBackYQVO phoneCallBackYQVO = new PhoneCallBackYQVO(); 
 | 
        //channel_create 通道创建的时候,可以执行一些其它操作,譬如发个短信之类的;  我们的业务可以不用管    PlayEventCallback 这个是播放语音的,暂时用不到     End_time()= -1或null表示当前的asrtext不是一句完整的话 
 | 
        if (phoneCallReqYQVO.getOperate().equals("channel_create")) { 
 | 
            return phoneCallBackYQVO; 
 | 
        } 
 | 
        //PlayEventCallback 这个是播放语音的    playstart:放音开始(问题播报开始)    playstop: 放音结束(问题播报结束) 
 | 
        if (phoneCallReqYQVO.getOperate().equals("PlayEventCallback")) { 
 | 
            String cacheJSY = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- jsy"); 
 | 
            if (phoneCallReqYQVO.getOperate().equals("PlayEventCallback") && phoneCallReqYQVO.getPlaystop() == false) { 
 | 
                //判断redis中是否有结束语 
 | 
                if (StringUtils.isEmpty(cacheJSY)) { 
 | 
                    redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop", false, 120, TimeUnit.MINUTES); 
 | 
                    log.error("PlayEventCallbackPlaystop的值为-------:{}", false); 
 | 
                } 
 | 
            } else { 
 | 
                //如果结束语不为空,则要挂电话了 
 | 
                if (StringUtils.isNotEmpty(cacheJSY)) { 
 | 
                    Map<String, String> req = new HashMap<>(); 
 | 
                    req.put("uuid", phoneCallReqYQVO.getUuid()); 
 | 
                    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 { 
 | 
                    redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop", true, 120, TimeUnit.MINUTES); 
 | 
                    log.error("-------PlayEventCallbackPlaystop的值为:{}", true); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            return phoneCallBackYQVO; 
 | 
        } 
 | 
        //获取放音是否结束 
 | 
        Object isPlayEventOverObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); 
 | 
        if (ObjectUtils.isNotEmpty(isPlayEventOverObj)) { 
 | 
            Boolean isPlayEventOver = (Boolean) isPlayEventOverObj; 
 | 
            if (!isPlayEventOver) { 
 | 
                return phoneCallBackYQVO; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //通过子任务ID获取到模板信息 
 | 
        ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid())); 
 | 
        IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid()); 
 | 
        //获取模板问题 
 | 
        IvrTaskTemplateScript ivrTaskTemplateScript = new IvrTaskTemplateScript(); 
 | 
        ivrTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid()); 
 | 
        List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript); 
 | 
        //获取问题ID 和 序号 
 | 
        String scriptId = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid().trim() + "-" + phoneCallReqYQVO.getPhone().trim()); 
 | 
        log.error("scriptId是多少:{}", scriptId); 
 | 
        //当前题的信息 
 | 
        IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = iIvrTaskTemplateScriptService.getTaskTempScriptInfoByid(Long.valueOf(scriptId)); 
 | 
        //判断UUID是否存在 
 | 
        Boolean aBoolean = redisCache.hasKey(phoneCallReqYQVO.getUuid()); 
 | 
        if (!aBoolean) { 
 | 
            //给静默设置一个默认次数在redis中 
 | 
            redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); 
 | 
            //如果不存在,就把当前的UUID做为key,放到对象中去 
 | 
            redisCache.setCacheObject(phoneCallReqYQVO.getUuid(), phoneCallReqYQVO, 120, TimeUnit.MINUTES); 
 | 
        } 
 | 
  
 | 
        if ("SilentCallback".equals(phoneCallReqYQVO.getOperate())) { 
 | 
            //如果是静默回调 
 | 
            Integer num = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "noVoice"); 
 | 
            //判断静默回调次数是否小与模板规定的次数 
 | 
            if (num < ivrTaskTemplate.getNoVoiceNum()) { 
 | 
                //小与的话,就继续问患者 
 | 
                phoneCallBackYQVO.setType("text"); 
 | 
                phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                String scriptContent = ivrTaskTemplateScriptVO.getIvrtext(); 
 | 
                log.error("SilentCallback的问题内容scriptContent:{}", scriptContent); 
 | 
                phoneCallBackYQVO.setValue(getObject(serviceSubtask, scriptContent)); 
 | 
                //将静默次数加1 
 | 
                Integer noVoiceNum = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "noVoice"); 
 | 
                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "noVoice", noVoiceNum + 1, 120, TimeUnit.MINUTES); 
 | 
                return phoneCallBackYQVO; 
 | 
            } else { 
 | 
                log.error("静默次数达到,挂掉电话:{}", num); 
 | 
                ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                ServiceSubtask ss = new ServiceSubtask(); 
 | 
                ss.setId(serviceSubtask.getId()); 
 | 
                ss.setSendstate(5L); 
 | 
                ss.setRemark("电话静默"); 
 | 
                serviceSubtaskMapper.updateServiceSubtask(ss); 
 | 
                //大与等于的话,直接挂断 
 | 
                phoneCallBackYQVO.setType("text"); 
 | 
                phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                phoneCallBackYQVO.setValue(serviceTask1.getJsy()); 
 | 
                //将结果写到detail中 
 | 
                ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); 
 | 
                List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>(); 
 | 
                serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate)); 
 | 
                serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList); 
 | 
                serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                saveQuestionAnswerPhone(serviceSubTaskDetailReq); 
 | 
                //去redis中,把该子任务ID删除 
 | 
                Long id = serviceSubtask.getId(); 
 | 
                //先更新一下分数 
 | 
                double score = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                serviceSubtask.setScore(BigDecimal.valueOf(score)); 
 | 
                serviceSubtask.setFinishtime(new Date()); 
 | 
                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()); 
 | 
                redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); 
 | 
                //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); 
 | 
            } 
 | 
            return phoneCallBackYQVO; 
 | 
        } else if ("AsrCallback".equals(phoneCallReqYQVO.getOperate()) && phoneCallReqYQVO.getEnd_time() != null && phoneCallReqYQVO.getEnd_time() != -1) { 
 | 
            //做一个标识,用来在通话详情接口里,判断是否有人接电话(value=2,表示有人接) 
 | 
            redisCache.deleteObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup"); 
 | 
            redisCache.setCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup", "2", 10, TimeUnit.MINUTES); 
 | 
            // 先对通话进行通用库匹配一次 
 | 
            String extemplateID = ivrTaskTemplate.getSubmoduleID(); 
 | 
            if (StringUtils.isNotEmpty(extemplateID)) { 
 | 
                String[] split = extemplateID.split(","); 
 | 
                List<String> list = Arrays.asList(split); 
 | 
                List<Long> list1 = new ArrayList<>(); 
 | 
                for (String str : list) { 
 | 
                    list1.add(Long.valueOf(str)); 
 | 
                } 
 | 
                List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1); 
 | 
                IvrLibaExtemplatescript les = null; 
 | 
                for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) { 
 | 
                    Matcher matcher = null; 
 | 
                    if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) { 
 | 
                        Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex()); 
 | 
                        matcher = pattern.matcher(phoneCallReqYQVO.getAsrtext()); 
 | 
                    } 
 | 
  
 | 
                    Matcher matcher2 = null; 
 | 
                    if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) { 
 | 
                        Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2()); 
 | 
                        matcher2 = pattern2.matcher(phoneCallReqYQVO.getAsrtext()); 
 | 
                    } 
 | 
                    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()) { 
 | 
                        //将通用库匹配的,放到返回值中 
 | 
//                        phoneCallBackYQVO.setValue(phoneCallBackYQVO.getValue() + ivrLibaExtemplatescript.getSwitchText()); 
 | 
                        phoneCallBackYQVO.setCommonValue(ivrLibaExtemplatescript.getSwitchText()); 
 | 
                        les = ivrLibaExtemplatescript; 
 | 
                    } 
 | 
                    break; 
 | 
                } 
 | 
                log.info("是否需要挂机:{}", les); 
 | 
                if (ObjectUtils.isNotEmpty(les)) { 
 | 
                    //对匹配的结果处理一下(看看是不是需要挂机) 
 | 
                    if (les.getIsEnd() != null && les.getIsEnd() == 1) { 
 | 
                        ServiceSubtask ss = new ServiceSubtask(); 
 | 
                        ss.setId(serviceSubtask.getId()); 
 | 
                        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"); 
 | 
                        redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "noVoice"); 
 | 
                        //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                        redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); 
 | 
                        phoneCallBackYQVO.setType("text"); 
 | 
                        phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + les.getSwitchText()); 
 | 
                        //将结果写进detail表 
 | 
                        ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); 
 | 
                        List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>(); 
 | 
                        ivrTaskTemplateScriptVO.setExtemplateText(les.getSwitchText()); 
 | 
                        serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate)); 
 | 
                        serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList); 
 | 
                        serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                        serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                        saveQuestionAnswerPhone(serviceSubTaskDetailReq); 
 | 
                        return phoneCallBackYQVO; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            //如果是文本回调 
 | 
            //根据问题ID获取该问题的类型 
 | 
            if (ivrTaskTemplateScriptVO.getScriptType().equals("1")) { 
 | 
                //用来标记,是否有匹配上的 
 | 
                Integer flag = 0; 
 | 
                //是选择题 
 | 
                for (int j = 0; j < ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size(); j++) { 
 | 
                    log.error("phoneCallReqYQVO.getAsrtext()的值为:{}", phoneCallReqYQVO.getAsrtext()); 
 | 
                    if (StringUtils.isEmpty(phoneCallReqYQVO.getAsrtext())) { 
 | 
                        continue; 
 | 
                    } 
 | 
                    //包含 
 | 
                    Matcher matcher = null; 
 | 
                    if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex())) { 
 | 
                        Pattern pattern = Pattern.compile(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()); 
 | 
                        matcher = pattern.matcher(phoneCallReqYQVO.getAsrtext()); 
 | 
                    } 
 | 
                    //不包含 
 | 
                    Matcher matcher2 = null; 
 | 
                    if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2())) { 
 | 
                        Pattern pattern2 = Pattern.compile(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()); 
 | 
                        matcher2 = pattern2.matcher(phoneCallReqYQVO.getAsrtext()); 
 | 
                    } 
 | 
                    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)); 
 | 
  
 | 
                        //将患者的回签写进service_subtask_detail中 
 | 
                        ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); 
 | 
                        List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>(); 
 | 
                        ivrTaskTemplateScriptVO.setQuestionResult(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getOptiondesc()); 
 | 
                        ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate); 
 | 
                        //修改一下语音路径(改成前端可以访问的,存到数据库中) 
 | 
                        if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) { 
 | 
                            String questionvoice = serviceSubtaskDetail.getQuestionvoice(); 
 | 
                            String[] split = questionvoice.split("\\\\"); 
 | 
                            if (split.length > 0) { 
 | 
                                String lastPart = split[split.length - 1]; 
 | 
                                serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart); 
 | 
                            } 
 | 
                        } 
 | 
                        serviceSubtaskDetailList.add(serviceSubtaskDetail); 
 | 
                        serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList); 
 | 
                        serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                        serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                        saveQuestionAnswerPhone(serviceSubTaskDetailReq); 
 | 
                        //判断一下,这个选项结果是不是还有继续问下去的必要,例如选项结果是别人不想继续回答问题,就要结束掉 
 | 
                        if (ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getIsEnd() == 1) { 
 | 
                            redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "noVoice"); 
 | 
                            //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                            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; 
 | 
                        } 
 | 
  
 | 
                        flag = 1; 
 | 
                        //将当前前的播报状态删除,给下一题让位 
 | 
                        redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); 
 | 
//                        //获取下一题 
 | 
                        log.error("获取下一题的信息:{}", ivrTaskTemplateScriptVO); 
 | 
                        if (ivrTaskTemplateScriptVO.getBranchFlag().equals("1") || ivrTaskTemplateScriptVO.getBranchFlag().equals("0") && ivrTaskTemplateScriptVO.getNextScriptno() != null && ivrTaskTemplateScriptVO.getNextScriptno() != 0) { 
 | 
                            Long nextQuestion = null; 
 | 
                            if (ivrTaskTemplateScriptVO.getBranchFlag().equals("1")) { 
 | 
                                nextQuestion = ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getNextQuestion(); 
 | 
                                //更新分数 
 | 
                                double score = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                                score = BigDecimal.valueOf(score).add(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getScore()).doubleValue(); 
 | 
                                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", score); 
 | 
                            } else { 
 | 
                                nextQuestion = ivrTaskTemplateScriptVO.getNextScriptno(); 
 | 
                                //更新分数 
 | 
                                Object obj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                                Double score = (obj == null ? new Double(0.00) : new Double(((Double) obj).doubleValue())); 
 | 
                                score = BigDecimal.valueOf(score).add(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getScore()).doubleValue(); 
 | 
                                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", score, 120, TimeUnit.MINUTES); 
 | 
                            } 
 | 
                            if (nextQuestion == null || nextQuestion == 0L) { 
 | 
                                //如果下一题为空,或者为0,则挂机 
 | 
                                ServiceSubtask ss = new ServiceSubtask(); 
 | 
                                ss.setId(serviceSubtask.getId()); 
 | 
                                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"); 
 | 
                                redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "noVoice"); 
 | 
                                //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                                ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                                redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); 
 | 
                                phoneCallBackYQVO.setType("text"); 
 | 
                                phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask.getJsy()); 
 | 
                                //将结果写进detail表 
 | 
                                ServiceSubTaskDetailReq ssdReq = new ServiceSubTaskDetailReq(); 
 | 
                                List<ServiceSubtaskDetail> serviceSubtaskDetailList2 = new ArrayList<>(); 
 | 
                                serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate)); 
 | 
                                serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList2); 
 | 
                                ssdReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                                ssdReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                                saveQuestionAnswerPhone(ssdReq); 
 | 
                                return phoneCallBackYQVO; 
 | 
                            } 
 | 
  
 | 
                            for (IvrTaskTemplateScript script : ivrTaskTemplateScripts) { 
 | 
                                if (script.getSort() == nextQuestion.intValue()) { 
 | 
                                    phoneCallBackYQVO.setType("text"); 
 | 
                                    phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                                    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); 
 | 
                                    //删除无响应 
 | 
                                    redisCache.deleteObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid()); 
 | 
                                } 
 | 
                            } 
 | 
                        } else if (ivrTaskTemplateScriptVO.getNextScriptno() == null || ivrTaskTemplateScriptVO.getNextScriptno() == 0) { 
 | 
                            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                            phoneCallBackYQVO.setType("text"); 
 | 
                            phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                            //更新一下分数 
 | 
                            double score = 0.0; 
 | 
                            Object scoreObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                            if (ObjectUtils.isNotEmpty(scoreObj)) score = (double) scoreObj; 
 | 
                            serviceSubtask.setScore(BigDecimal.valueOf(score)); 
 | 
                            serviceSubtask.setFinishtime(new Date()); 
 | 
                            serviceSubtask.setSendstate(6L); 
 | 
                            serviceSubtask.setRemark("电话拨打已完成"); 
 | 
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); 
 | 
                            //记录状态 
 | 
                            setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9"); 
 | 
                            //设置结束语 
 | 
                            phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); 
 | 
                            Long id = serviceSubtask.getId(); 
 | 
                            Map<String, String> map = delRedisValue(null, id.toString()); 
 | 
                            log.error("map的值为:{}", map); 
 | 
                            if (ObjectUtils.isNotEmpty(map)) 
 | 
                                redisCache.setCacheObject(map.get("cacheName"), map.get("val")); 
 | 
                            redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid()); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                            redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop"); 
 | 
                            //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                            redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); 
 | 
//                                return phoneCallBackYQVO; 
 | 
  
 | 
                        } 
 | 
                    } else { 
 | 
                        log.info("没有匹配上----------------------------"); 
 | 
                        //flag=0,说明没 匹配上,也要把患者说的话记录下来 
 | 
                        if (j == ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size() - 1 && flag == 0) { 
 | 
                            ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); 
 | 
                            List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>(); 
 | 
                            ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate); 
 | 
                            //修改一下语音路径(改成前端可以访问的,存到数据库中) 
 | 
                            if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) { 
 | 
                                String questionvoice = serviceSubtaskDetail.getQuestionvoice(); 
 | 
                                String[] split = questionvoice.split("\\\\"); 
 | 
                                if (split.length > 0) { 
 | 
                                    String lastPart = split[split.length - 1]; 
 | 
                                    serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart); 
 | 
                                } 
 | 
                            } 
 | 
                            serviceSubtaskDetailList.add(serviceSubtaskDetail); 
 | 
                            //如果没有 匹配上,这个必须为null 
 | 
                            serviceSubtaskDetailList.get(0).setMatchedtext(""); 
 | 
                            serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList); 
 | 
                            serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                            serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                            saveQuestionAnswerPhone(serviceSubTaskDetailReq); 
 | 
                        } 
 | 
                        continue; 
 | 
                    } 
 | 
                } 
 | 
                //都没有匹配到 
 | 
                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; 
 | 
                    if (count != null && count >= ivrTaskTemplate.getMateNum()) { 
 | 
                        //如果count已经大于或等于没有匹配次数 
 | 
                        if (ivrTaskTemplateScriptVO.getBranchFlag().equals("0") && ivrTaskTemplateScriptVO.getNextScriptno() == null || ivrTaskTemplateScriptVO.getBranchFlag().equals("0") && ivrTaskTemplateScriptVO.getNextScriptno() == 0 || ivrTaskTemplateScriptVO.getBranchFlag().equals("1") && ivrTaskTemplateScriptVO.getNextScriptno() == null || ivrTaskTemplateScriptVO.getBranchFlag().equals("1") && ivrTaskTemplateScriptVO.getNextScriptno() == 0) { 
 | 
                            //如果是最后一道题,或者没有下一题了,就直接挂机 
 | 
                            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                            phoneCallBackYQVO.setType("text"); 
 | 
                            phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                            if (StringUtils.isNotEmpty(phoneCallBackYQVO.getValue())) 
 | 
                                phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + phoneCallBackYQVO.getValue() + serviceTask1.getJsy()); 
 | 
                            else phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); 
 | 
  
 | 
                            //更新一下分数 
 | 
                            Double score = null; 
 | 
                            Object scoreObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                            if (ObjectUtils.isNotEmpty(scoreObj)) score = (Double) scoreObj; 
 | 
                            serviceSubtask.setScore(BigDecimal.valueOf(score)); 
 | 
                            serviceSubtask.setFinishtime(new Date()); 
 | 
                            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()); 
 | 
                            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()获取下一题进行提问 
 | 
                            for (IvrTaskTemplateScript script : ivrTaskTemplateScripts) { 
 | 
                                if (script.getSort() == ivrTaskTemplateScriptVO.getNextScriptno().intValue()) { 
 | 
                                    phoneCallBackYQVO.setType("text"); 
 | 
                                    phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                                    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); 
 | 
  
 | 
                                    //更新一下分数 
 | 
                                    Double score = null; 
 | 
                                    Object scoreObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                                    if (ObjectUtils.isNotEmpty(scoreObj)) score = (Double) scoreObj; 
 | 
                                    score = BigDecimal.valueOf(score).add(script.getScore()).doubleValue(); 
 | 
  
 | 
                                    redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", score, 120, TimeUnit.MINUTES); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    } else { 
 | 
                        if (count == null) 
 | 
                            redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid(), 1, 120, TimeUnit.MINUTES); 
 | 
                        else 
 | 
                            redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid(), count + 1, 120, TimeUnit.MINUTES); 
 | 
  
 | 
                        phoneCallBackYQVO.setType("text"); 
 | 
                        phoneCallBackYQVO.setValue(ivrTaskTemplateScriptVO.getNoMatchText() + getObject(serviceSubtask, ivrTaskTemplateScriptVO.getIvrtext())); 
 | 
                    } 
 | 
                } 
 | 
  
 | 
            } else { 
 | 
                //不是选择题,直接记录答案,将结果写到detail中 
 | 
                ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); 
 | 
                List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>(); 
 | 
                ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate); 
 | 
                //修改一下语音路径(改成前端可以访问的,存到数据库中) 
 | 
                if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) { 
 | 
                    String questionvoice = serviceSubtaskDetail.getQuestionvoice(); 
 | 
                    String[] split = questionvoice.split("\\\\"); 
 | 
                    if (split.length > 0) { 
 | 
                        String lastPart = split[split.length - 1]; 
 | 
                        serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart); 
 | 
                    } 
 | 
                } 
 | 
                serviceSubtaskDetailList.add(serviceSubtaskDetail); 
 | 
                serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList); 
 | 
                serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid()); 
 | 
                serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid()); 
 | 
                saveQuestionAnswerPhone(serviceSubTaskDetailReq); 
 | 
                //    String xh = idSort.split("-")[1]; 
 | 
  
 | 
                //如果选项分支为1的话,则需要根据问题上的nextScriptno进行跳转 
 | 
                //问答题没有跳转 
 | 
                if (ivrTaskTemplateScriptVO.getNextScriptno() != null && ivrTaskTemplateScriptVO.getNextScriptno() != 0) { 
 | 
                    for (IvrTaskTemplateScript ivrTaskTemplateScript1 : ivrTaskTemplateScripts) { 
 | 
                        if (ivrTaskTemplateScriptVO.getNextScriptno().intValue() == ivrTaskTemplateScript1.getSort()) { 
 | 
                            phoneCallBackYQVO.setType("text"); 
 | 
                            phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                            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()); 
 | 
  
 | 
                            //更新一下分数 
 | 
                            Double score = null; 
 | 
                            Object scoreObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                            if (ObjectUtils.isNotEmpty(scoreObj)) score = (Double) scoreObj; 
 | 
                            score = BigDecimal.valueOf(score).add(ivrTaskTemplateScriptVO.getScore()).doubleValue(); 
 | 
                            redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", score, 120, TimeUnit.MINUTES); 
 | 
  
 | 
                        } 
 | 
                    } 
 | 
                } else if (ivrTaskTemplateScriptVO.getNextScriptno() == null || ivrTaskTemplateScriptVO.getNextScriptno() == 0) { 
 | 
                    //没有下一题了,就结束了 
 | 
                    ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                    phoneCallBackYQVO.setType("text"); 
 | 
                    phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue()); 
 | 
                    phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); 
 | 
  
 | 
                    //更新一下分数 
 | 
                    Double score = null; 
 | 
                    Object scoreObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                    if (ObjectUtils.isNotEmpty(scoreObj)) score = (Double) scoreObj; 
 | 
                    serviceSubtask.setScore(BigDecimal.valueOf(score)); 
 | 
                    serviceSubtask.setFinishtime(new Date()); 
 | 
                    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()); 
 | 
                    redisCache.setCacheObject(map.get("cacheName"), map.get("val")); 
 | 
                    //在redis中保存一下结束语,在调用挂电话的方法时删除 
 | 
                    redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask1.getJsy(), 120, TimeUnit.MINUTES); 
 | 
                    redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone()); 
 | 
                    redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        log.error("phoneCallBackYQVO的返回值是:{}", phoneCallBackYQVO); 
 | 
        return phoneCallBackYQVO; 
 | 
    } 
 | 
  
 | 
  
 | 
    private String getObject(ServiceSubtask serviceSubtask, String scriptContent) { 
 | 
        Map<String, Map<String, String>> param = getParam(serviceSubtask.getTaskid()); 
 | 
        for (Map<String, String> map : param.values()) { 
 | 
            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() : ""); 
 | 
        scriptContent = scriptContent.replace("${phone}", StringUtils.isNotEmpty(serviceSubtask.getTelcode()) ? serviceSubtask.getTelcode() : ""); 
 | 
  
 | 
        return scriptContent; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获取任务里的通配符 
 | 
     * 
 | 
     * @param taskId 
 | 
     * @return 
 | 
     */ 
 | 
    private Map<String, Map<String, String>> getParam(Long taskId) { 
 | 
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskId); 
 | 
        ObjectMapper objectMapper = new ObjectMapper(); 
 | 
        Map<String, Map<String, String>> serviceTaskMap = null; 
 | 
        try { 
 | 
            serviceTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class); 
 | 
        } catch (JsonProcessingException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return serviceTaskMap; 
 | 
    } 
 | 
  
 | 
    private Map<String, String> delRedisValue(String cache, String id) { 
 | 
        id = "," + id + ","; 
 | 
        String val = ""; 
 | 
        String cacheName = ""; 
 | 
        Map<String, String> map = new HashMap<>(); 
 | 
  
 | 
        if (StringUtils.isNotEmpty(cache)) { 
 | 
            val = redisCache.getCacheObject(cache); 
 | 
            if (!StringUtils.isEmpty(val)) { 
 | 
                if (val.contains(id)) { 
 | 
                    val = val.replaceAll(id, ""); 
 | 
                } 
 | 
            } 
 | 
            map.put("val", val); 
 | 
            map.put("cacheName", cache); 
 | 
            return map; 
 | 
        } 
 | 
  
 | 
        for (int i = 0; i < 6; i++) { 
 | 
            val = redisCache.getCacheObject("cache-0" + i); 
 | 
            if (!StringUtils.isEmpty(val)) { 
 | 
                if (val.contains(id)) { 
 | 
                    val = val.replaceAll(id, ""); 
 | 
                    map.put("val", val); 
 | 
                    map.put("cacheName", "cache-0" + i); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return map; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 雨绮任务拉取 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public List<PullTaskVO> taskPull() { 
 | 
        //pullTaskVOList用于数据返回 
 | 
        List<PullTaskVO> pullTaskVOList = new ArrayList<>(); 
 | 
        List<String> cacheList = new ArrayList<>(); 
 | 
        ListOperations<String, String> listOps = redisTemplate.opsForList(); 
 | 
        //必须等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); 
 | 
        if (size > 0) { 
 | 
            //phoneCount()  通过给出的每个小时需要打出的电话量,算出到晚上8点一点能打出多少个电话,获取到总量 
 | 
            //如果需要立即执行的数据量大于一天要执行的上限,则只取上限的数量,其它的则放回redis中 
 | 
            count = Math.min(phoneCount(), (int) size); 
 | 
            if (count != 0) { 
 | 
                cacheList = listOps.range("cache-0", 0, count - 1); 
 | 
            } 
 | 
        } 
 | 
  
 | 
  
 | 
        log.error("任务拉取cache-0的值是多少:{}", cacheList); 
 | 
        //  cache-0为立即发起的,其它的先推迟 
 | 
        if (!CollectionUtils.isEmpty(cacheList)) { 
 | 
            pullTaskVOList = getPullTaskList(cacheList, "cache-0"); 
 | 
            // 删除已处理的数据 
 | 
            listOps.trim("cache-0", count, -1); 
 | 
            log.error("打电话之后缓存中的数据量---------:{}", listOps.size("cache-0")); 
 | 
        } else { 
 | 
            for (int i = 1; i < 6; i++) { 
 | 
                //取出从cache-1 到 cache-5的第一个子任务信息 
 | 
                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); 
 | 
                    } 
 | 
                    //将处理过的数据删除 
 | 
                    listOps.trim("cache-0" + i, count1, -1); 
 | 
                } catch (Exception e) { 
 | 
//                    log.error("看着烦"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        //existList用来记录接下来需要执行的子任务ID 
 | 
        List<String> existList = new ArrayList<>(); 
 | 
        if (CollectionUtils.isNotEmpty(pullTaskVOList)) { 
 | 
            //给回调参数赋值 
 | 
            for (PullTaskVO pullTaskVO : pullTaskVOList) { 
 | 
                existList.add(pullTaskVO.getTaskid()); 
 | 
                pullTaskVO.setAsrcallback(ASRCallBackPath); 
 | 
            } 
 | 
        } 
 | 
        if (existList.size() != 0) redisCache.setCacheListRight("cache-exist", existList); 
 | 
        log.error("-----------实际拉取的电话数据量:{}", CollectionUtils.isNotEmpty(pullTaskVOList) ? pullTaskVOList.size() : null); 
 | 
        return pullTaskVOList; 
 | 
    } 
 | 
  
 | 
  
 | 
    private List<PullTaskVO> getPullTaskList(List<String> subIds, String cacheName) { 
 | 
        log.error("任务拉取subIds的值是多少:{}", subIds); 
 | 
        //pullTaskVOList用于数据返回 
 | 
        List<PullTaskVO> pullTaskVOList = new ArrayList<>(); 
 | 
        //newValue0用于保存没有处理的子 任务 
 | 
//        String newValue0 = ""; 
 | 
        List<String> newValue0 = new ArrayList<>(); 
 | 
        //根据,获取子任务的ID 
 | 
//        String[] split = subIds.split(",,"); 
 | 
        for (int i = 0; i < subIds.size(); i++) { 
 | 
            if (cacheName.equals("cache-0") && i < subIds.size() || !cacheName.equals("cache-0") && i < 1) { 
 | 
                PullTaskVO pullTaskVO = new PullTaskVO(); 
 | 
                String subId = subIds.get(i).trim(); 
 | 
                ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(subId)); 
 | 
                if (ObjectUtils.isEmpty(serviceSubtask)) { 
 | 
                    log.error("该subId有问题,在表中查询不到:{}", subId); 
 | 
                    continue; 
 | 
                } 
 | 
                if (StringUtils.isEmpty(serviceSubtask.getPhone())) { 
 | 
                    serviceSubtask.setRemark("手机号为空"); 
 | 
                    serviceSubtask.setSendstate(4L); 
 | 
                    serviceSubtask.setResult("error"); 
 | 
//                    serviceSubtask.setFinishtime(new Date()); 
 | 
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); 
 | 
                    continue; 
 | 
                } 
 | 
                ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); 
 | 
                IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid()); 
 | 
                if (ObjectUtils.isEmpty(ivrTaskTemplate)) continue; 
 | 
                //通过任务模板中的"第一次问题编号"获取第一个问题; 
 | 
                IvrTaskTemplateScript ivrTaskTemplateScript = null; 
 | 
                IvrTaskTemplateScript ivrTaskTemplateScript1 = new IvrTaskTemplateScript(); 
 | 
                ivrTaskTemplateScript1.setTemplateID(ivrTaskTemplate.getId()); 
 | 
                List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript1); 
 | 
                aa: 
 | 
                for (IvrTaskTemplateScript ivrTaskTemplateScript2 : ivrTaskTemplateScripts) { 
 | 
                    if (ivrTaskTemplate.getFirstQuestionNum() == Long.valueOf(ivrTaskTemplateScript2.getSort())) { 
 | 
                        ivrTaskTemplateScript = ivrTaskTemplateScript2; 
 | 
                        break aa; 
 | 
                    } 
 | 
                } 
 | 
                //如果ivrTaskTemplateScript为空,也就没有往下执行的必要了 
 | 
                if (ObjectUtils.isEmpty(ivrTaskTemplateScript)) { 
 | 
                    log.error("---------这个ivrTaskTemplate.getId()的问题为空:{}", ivrTaskTemplate.getId()); 
 | 
                    continue; 
 | 
                } 
 | 
                //获取通配符匹配过后的问题 
 | 
                String scrContent = getObject(serviceSubtask, ivrTaskTemplateScript.getIvrtext()); 
 | 
                String kcb = serviceTask.getKcb() + "," + scrContent; 
 | 
  
 | 
                //封装返回数据 
 | 
                //taskId = 子任务ID + 问题ID +问题序号 
 | 
                pullTaskVO.setTaskid(subId); 
 | 
                pullTaskVO.setAppkey(app_key_yq); 
 | 
                pullTaskVO.setSections(LocalTime.now().format(DateTimeFormatter.ofPattern("hh:mm")) + "-" + LocalTime.now().plusMinutes(1).format(DateTimeFormatter.ofPattern("hh:mm"))); 
 | 
                pullTaskVO.setPhones(serviceSubtask.getPhone()); 
 | 
                pullTaskVO.setPrologue(kcb); 
 | 
                if (cacheName.equals("cache-0")) pullTaskVO.setDisplayNo("2"); 
 | 
                else pullTaskVO.setDisplayNo("2"); 
 | 
                pullTaskVOList.add(pullTaskVO); 
 | 
                redisCache.setCacheObject(subId.trim() + "-" + serviceSubtask.getPhone().trim(), ivrTaskTemplateScript.getId().toString(), 120, TimeUnit.MINUTES); 
 | 
            } else { 
 | 
                newValue0.add(subIds.get(i)); 
 | 
                redisCache.setCacheListRight(cacheName, newValue0); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return pullTaskVOList; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) { 
 | 
        int i = 0; 
 | 
        if (StringUtils.isNotEmpty(serviceSubTaskDetailReq.getParam1())) { 
 | 
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); 
 | 
            Long tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam1(), pri_key)); 
 | 
            Long pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam2(), pri_key)); 
 | 
            ServiceSubtaskVO ivrTaskSingle = new ServiceSubtaskVO(); 
 | 
            ivrTaskSingle.setTaskid(tid); 
 | 
            ivrTaskSingle.setPatid(pid); 
 | 
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ivrTaskSingle); 
 | 
            if (CollectionUtils.isEmpty(selectServiceSubtaskList) || selectServiceSubtaskList.size() == 0) { 
 | 
                log.error("报错了,selectServiceSubtaskList数据为空了:{}", ivrTaskSingle); 
 | 
                return 0; 
 | 
            } 
 | 
            //随访 
 | 
            for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) { 
 | 
                serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId()); 
 | 
//                serviceSubtaskDetail.setId(UUID.randomUUID().toString()); 
 | 
                serviceSubtaskDetail.setCreateTime(new Date()); 
 | 
                serviceSubtaskDetail.setGuid(selectServiceSubtaskList.get(0).getGuid()); 
 | 
                serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid()); 
 | 
                serviceSubtaskDetail.setGuid(serviceSubTaskDetailReq.getGuid()); 
 | 
                i = serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail); 
 | 
            } 
 | 
        } else { 
 | 
            if (serviceSubTaskDetailReq != null && CollectionUtils.isNotEmpty(serviceSubTaskDetailReq.getServiceSubtaskDetailList())) { 
 | 
                for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) { 
 | 
                    serviceSubtaskDetail.setCreateTime(new Date()); 
 | 
                    serviceSubtaskDetail.setGuid(serviceSubTaskDetailReq.getGuid()); 
 | 
                    serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid()); 
 | 
                    //先根据子任务id,任务ID和问题序号查询一下,该问题是否已经有值,如果有值,直接修改,如果为空,直接插入 
 | 
                    ServiceSubtaskDetail ssd = new ServiceSubtaskDetail(); 
 | 
                    ssd.setSubId(serviceSubtaskDetail.getSubId()); 
 | 
                    ssd.setTaskid(serviceSubtaskDetail.getTaskid()); 
 | 
                    ssd.setScriptid(serviceSubtaskDetail.getScriptid()); 
 | 
                    if (serviceSubtaskDetail.getSubId() != null) { 
 | 
                        ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId()); 
 | 
                        ssd.setGuid(serviceSubtask.getGuid()); 
 | 
                        ssd.setOrgid(serviceSubtask.getOrgid()); 
 | 
                    } 
 | 
                    List<ServiceSubtaskDetail> serviceSubtaskDetails = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(ssd); 
 | 
                    if (CollectionUtils.isNotEmpty(serviceSubtaskDetails) && StringUtils.isNotEmpty(serviceSubtaskDetails.get(0).getMatchedtext())) { 
 | 
                        serviceSubtaskDetail.setId(serviceSubtaskDetails.get(0).getId()); 
 | 
                        serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail); 
 | 
                    } else { 
 | 
                        if (serviceSubtaskDetail.getSubId() != null) { 
 | 
                            ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId()); 
 | 
                            serviceSubtaskDetail.setGuid(serviceSubtask.getGuid()); 
 | 
                            serviceSubtaskDetail.setOrgid(serviceSubtask.getOrgid()); 
 | 
                        } 
 | 
                        i = serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return i; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Integer recordAccept(PhoneCallRecordVO phoneCallRecordVO) { 
 | 
        Object cacheObject = redisCache.getCacheObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); 
 | 
        if (phoneCallRecordVO.getHangup_cause().equals("NO_USER_RESPONSE") || ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) { 
 | 
            //无人接听 
 | 
            //记录电话发送状态 
 | 
            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")) { 
 | 
//        if (phoneCallRecordVO.getAnswered() != null && phoneCallRecordVO.getAnswered() == true) { 
 | 
            log.error("有人接电话了,并且完了"); 
 | 
            //说明有人接了 
 | 
            int startIndex = phoneCallRecordVO.getRecord_path().indexOf("voice") + "voice".length() + 1;  // 加1是跳过/符号 
 | 
            int endIndex = phoneCallRecordVO.getRecord_path().lastIndexOf("/"); 
 | 
            String result = phoneCallRecordVO.getRecord_path().substring(startIndex, endIndex); 
 | 
            ServiceSubtask serviceSubtask = new ServiceSubtask(); 
 | 
            serviceSubtask.setRemark("电话拨打已完成"); 
 | 
            serviceSubtask.setSendstate(6L); 
 | 
            serviceSubtask.setId(Long.valueOf(phoneCallRecordVO.getTaskid())); 
 | 
            serviceSubtask.setFinishtime(new Date()); 
 | 
            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"); 
 | 
        } else { 
 | 
            //患者拒绝随访 
 | 
            //先把该subId从cache_exist中剔除,只要有回调就剔除(目的是,尽快让cache-exist为空,去缓存下一批要打的电话;这里剔除不影响电话的正常业务) 
 | 
            redisCache.removeElementFromList("cache-exist", phoneCallRecordVO.getTaskid()); 
 | 
            ServiceSubtask serviceSubtask = new ServiceSubtask(); 
 | 
            serviceSubtask.setRemark("电话接通成功,患者拒绝随访"); 
 | 
            serviceSubtask.setId(Long.valueOf(phoneCallRecordVO.getTaskid())); 
 | 
            serviceSubtask.setSendstate(6L); 
 | 
            serviceSubtask.setFinishtime(new Date()); 
 | 
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); 
 | 
//            int startIndex = phoneCallRecordVO.getRecord_path().indexOf("voice") + "voice".length() + 1;  // 加1是跳过/符号 
 | 
//            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()); 
 | 
            redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup"); 
 | 
            ServiceSubtask ss = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtask.getId()); 
 | 
            setFailPreachForm(ss, StringUtils.isNotEmpty(ss.getCurrentPreachform()) ? ss.getCurrentPreachform() : "3", "电话接通成功,患者拒绝随访", "5"); 
 | 
        } 
 | 
  
 | 
        return 1; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<ServiceSubtaskCount> getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq) { 
 | 
        if (serviceSubtaskCountReq.getUserId() == null) { 
 | 
            Long userId = SecurityUtils.getUserId(); 
 | 
            serviceSubtaskCountReq.setUserId(userId); 
 | 
        } 
 | 
        if (serviceSubtaskCountReq.getStartTime() == null) { 
 | 
            LocalDate of = LocalDate.of(LocalDate.now().getYear(), 1, 1); 
 | 
            serviceSubtaskCountReq.setStartTime(Date.from(of.atStartOfDay(ZoneId.systemDefault()).toInstant())); 
 | 
        } 
 | 
        if (serviceSubtaskCountReq.getEndTime() == null) { 
 | 
            serviceSubtaskCountReq.setEndTime(new Date()); 
 | 
        } 
 | 
        List<ServiceSubtaskCount> sfFzInfoEveryMonth = serviceSubtaskMapper.getSfFzInfoEveryMonth(serviceSubtaskCountReq); 
 | 
        List<ServiceSubtaskCount> result = sfFzInfoEveryMonth.stream().collect(Collectors.groupingBy(ServiceSubtaskCount::getMonth, Collectors.groupingBy(ServiceSubtaskCount::getServiceType, Collectors.summingLong(ServiceSubtaskCount::getCount)))).entrySet().stream().flatMap(monthEntry -> monthEntry.getValue().entrySet().stream().map(typeEntry -> new ServiceSubtaskCount(monthEntry.getKey(), typeEntry.getKey(), typeEntry.getValue()))).collect(Collectors.toList()); 
 | 
  
 | 
        List<ServiceSubtaskCount> result2 = new ArrayList<>(); 
 | 
        //根据服务类型进行筛选 
 | 
        if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getServiceType())) { 
 | 
            for (ServiceSubtaskCount serviceSubtaskCount : result) { 
 | 
                for (Long type : serviceSubtaskCountReq.getServiceType()) { 
 | 
                    if (type == serviceSubtaskCount.getServiceType()) { 
 | 
                        result2.add(serviceSubtaskCount); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } else { 
 | 
            result2 = result; 
 | 
        } 
 | 
        return result2; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 服务统计查询 - 按时间维度统计出院/门诊随访数据 
 | 
     * 
 | 
     * @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; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取随访统计比例 
 | 
     * 
 | 
     * @param serviceSubtaskCountReq 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public List<ServiceSubtaskStatistic> getSfStatistics(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"))); 
 | 
            } 
 | 
        } 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); 
 | 
            } 
 | 
        } 
 | 
        return serviceSubtaskStatistics; 
 | 
    } 
 | 
  
 | 
    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.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.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); 
 | 
                } 
 | 
            } 
 | 
            //随访情况 
 | 
            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) { 
 | 
                    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 IvrTaskTemplateScriptVO getNextQuestion(List<IvrTaskTemplateScriptVO> IvrTaskTemplateScriptVOList, IvrTaskTemplateScriptVO IvrTaskTemplateScriptVO) { 
 | 
  
 | 
        for (int j = 0; j < IvrTaskTemplateScriptVOList.size(); j++) { 
 | 
            if (IvrTaskTemplateScriptVOList.get(j).getTargetid() == IvrTaskTemplateScriptVO.getTargetid() + 1) { 
 | 
                // 对该条templateScriptVO进行处理 
 | 
                return IvrTaskTemplateScriptVOList.get(j); 
 | 
            } 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    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())); 
 | 
        if (serviceSubtask1 != null) { 
 | 
            serviceSubtaskDetail.setTaskid(serviceSubtask1.getTaskid()); 
 | 
            serviceSubtaskDetail.setPatid(serviceSubtask1.getPatid()); 
 | 
        } 
 | 
        serviceSubtaskDetail.setTargetid(ivrTaskTemplateScriptVO.getTargetid() != null ? ivrTaskTemplateScriptVO.getTargetid().intValue() : null); 
 | 
        serviceSubtaskDetail.setUuid(phoneCallReqYQVO.getUuid()); 
 | 
        serviceSubtaskDetail.setPhone(phoneCallReqYQVO.getPhone()); 
 | 
        serviceSubtaskDetail.setOperate(serviceSubtask.getCreateBy()); 
 | 
        serviceSubtaskDetail.setDisplayno(phoneCallReqYQVO.getPhone()); 
 | 
        serviceSubtaskDetail.setAssigntime(System.currentTimeMillis()); 
 | 
        serviceSubtaskDetail.setStarttime(System.currentTimeMillis()); 
 | 
        serviceSubtaskDetail.setAnswertime(System.currentTimeMillis()); 
 | 
        serviceSubtaskDetail.setAsrtext("无应答"); 
 | 
        if (StringUtils.isNotEmpty(phoneCallReqYQVO.getAsrtext())) 
 | 
            serviceSubtaskDetail.setAsrtext(phoneCallReqYQVO.getAsrtext()); 
 | 
        serviceSubtaskDetail.setBeginTime(System.currentTimeMillis()); 
 | 
        serviceSubtaskDetail.setEndTime(System.currentTimeMillis()); 
 | 
        serviceSubtaskDetail.setSentEnd(1L); 
 | 
        serviceSubtaskDetail.setTemplateid(ivrTaskTemplate.getId().toString()); 
 | 
        serviceSubtaskDetail.setTemplatequestionnum(ivrTaskTemplateScriptVO.getScriptno()); 
 | 
        serviceSubtaskDetail.setQuestiontext(StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext()) ? ivrTaskTemplateScriptVO.getIvrtext() : ivrTaskTemplateScriptVO.getScriptContent()); 
 | 
        serviceSubtaskDetail.setQuestionvoice(phoneCallReqYQVO.getRecordpath()); 
 | 
        serviceSubtaskDetail.setCategoryname(ivrTaskTemplateScriptVO.getScriptType()); 
 | 
        serviceSubtaskDetail.setTargetoptions(ivrTaskTemplateScriptVO.getTargetOptions()); 
 | 
        serviceSubtaskDetail.setExtemplateText(ivrTaskTemplateScriptVO.getExtemplateText()); 
 | 
        serviceSubtaskDetail.setScriptid(ivrTaskTemplateScriptVO.getId()); 
 | 
  
 | 
        int i = 1; 
 | 
        for (IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption : ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList()) { 
 | 
            if (ivrTaskTemplateTargetoption.getIsUserOperation() == 1) { 
 | 
                serviceSubtaskDetail.setMatchedtext(ivrTaskTemplateTargetoption.getTargetvalue()); 
 | 
            } 
 | 
            serviceSubtaskDetail.setTargetvalue(StringUtils.isEmpty(serviceSubtaskDetail.getTargetvalue()) ? ivrTaskTemplateTargetoption.getTargetvalue() : serviceSubtaskDetail.getTargetvalue() + "&" + ivrTaskTemplateTargetoption.getTargetvalue()); 
 | 
        } 
 | 
  
 | 
        serviceSubtaskDetail.setAddtime(new Date()); 
 | 
        serviceSubtaskDetail.setIsupload(0L); 
 | 
        serviceSubtaskDetail.setUploadTime(new Date()); 
 | 
        serviceSubtaskDetail.setDelFlag("0"); 
 | 
        serviceSubtaskDetail.setValueType(ivrTaskTemplateScriptVO.getScriptType()); 
 | 
        return serviceSubtaskDetail; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 电话的补偿方法(老) 
 | 
     * 
 | 
     * @param subTaskId 
 | 
     */ 
 | 
    private void getSmsCompensate(Long subTaskId) { 
 | 
        ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(subTaskId); 
 | 
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); 
 | 
        String taskId = rsaPublicKeyExample.encryptedData(serviceSubtask.getTaskid().toString(), pub_key); 
 | 
        String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key); 
 | 
        String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key); 
 | 
        ServiceOutPath serviceOutPath = new ServiceOutPath(); 
 | 
        serviceOutPath.setParam1(taskId); 
 | 
        serviceOutPath.setParam2(patid); 
 | 
        serviceOutPath.setCreateTime(new Date()); 
 | 
        serviceOutPath.setParam6(subId); 
 | 
        iServiceOutPathService.insertServiceOutPath(serviceOutPath); 
 | 
        //转成16进制 
 | 
        String format = String.format("%03X", serviceOutPath.getId()); 
 | 
        serviceOutPath.setRadix(format); 
 | 
        serviceOutPath.setUpdateTime(new Date()); 
 | 
        iServiceOutPathService.updateServiceOutPath(serviceOutPath); 
 | 
        SendMagParam sendMagParam = new SendMagParam(); 
 | 
        sendMagParam.setUrl(localIP + ":" + req_path + "/sf?p=" + format); 
 | 
        sendMagParam.setContent("【新华医院】您好,邀请您填写出院随访调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!"); 
 | 
        Map<String, String> map = new HashMap<>(); 
 | 
        map.put("phone", serviceSubtask.getPhone()); 
 | 
        map.put("content", sendMagParam.getContent()); 
 | 
        String result = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(map)); 
 | 
        redisCache.setCacheObject(subTaskId + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES); 
 | 
        if (StringUtils.isNotEmpty(serviceSubtask.getRemark())) serviceSubtask.setRemark("电话发送拒接,短信补偿发送成功"); 
 | 
        else serviceSubtask.setRemark("短信补偿发送成功"); 
 | 
        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); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    //通过当前时间,拉取电话总数 
 | 
    private Integer phoneCount() { 
 | 
        // 当前时间 
 | 
        LocalTime currentTime = LocalTime.now(); 
 | 
        // 目标时间(晚上 8 点) 
 | 
        LocalTime targetTime = LocalTime.of(phoneEndHour, 0); 
 | 
        // 计算当前时间到目标时间的时长 
 | 
        Duration duration = Duration.between(currentTime, targetTime); 
 | 
        // 获取剩余时间的小时数 
 | 
        long remainingHours = 0; 
 | 
        long remainingMinutes = duration.toMinutes(); 
 | 
        //如果超过8点,就设置为0 
 | 
        //距离结束时间小于20分钟,就不拉取了 
 | 
        if (remainingMinutes < 20) remainingHours = 0; 
 | 
        else if (remainingMinutes < 60 && remainingMinutes > 20) remainingHours = 1; 
 | 
        else if (remainingMinutes > 60) remainingHours = remainingMinutes / 60; 
 | 
        // 计算剩余可以打的电话数 
 | 
        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; 
 | 
    } 
 | 
} 
 |