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.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; 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 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 selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO) { return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); } @Override public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) { //定义患者与单一任务关联表集合 List patTaskRelevances = new ArrayList<>(); ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class); List list = selectServiceSubtaskList(serviceSubtaskVO); ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); if (CollectionUtils.isEmpty(list) || list.size() == 0) { return DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class); } //将查出来的数据倒入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 taskSendTimeVOList = objectMapper.readValue(sendTimeSlot, List.class); serviceTaskVO.setSendTimeslot(taskSendTimeVOList); serviceTaskVO.setSendType(serviceTask.getSendType()); } //文本变量参数 if (com.ruoyi.common.utils.StringUtils.isNotEmpty(serviceTask.getTextParam())) { Map> 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); } } serviceTaskVO.setPatTaskRelevances(patTaskRelevances); return serviceTaskVO; } @Override public List patItem(ServiceSubtaskVO serviceSubtaskVO) { List selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO); return selectServiceSubtaskList; } @Override public List patItem2(ServiceSubtaskVO serviceSubtaskVO) { List serviceSubtaskList = new ArrayList<>(); for (Long sendstate : serviceSubtaskVO.getSendstates()) { serviceSubtaskVO.setSendstate(sendstate); List serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); serviceSubtaskList.addAll(serviceSubtasks); } return serviceSubtaskList; } @Override public Map patItemCount(ServiceSubtaskVO serviceSubtaskVO) { serviceSubtaskVO.setPageSize(99999999); serviceSubtaskVO.setPageNum(1); List selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO); Map map = new HashMap<>(); Integer wzx = 0; Integer ysf = 0; Integer yc = 0; Integer fssb = 0; Integer yfs = 0; Integer blq = 0; for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { if (serviceSubtask.getSendstate() == 4L) wzx = wzx + 1; else if (serviceSubtask.getSendstate() != 4L) ysf = ysf + 1; if (serviceSubtask.getSendstate() == 5L) fssb = fssb + 1; if (serviceSubtask.getSendstate() >= 3L || serviceSubtask.getSendstate() == 1L) yfs = yfs + 1; if (serviceSubtask.getSendstate() == 1L) blq = blq + 1; if (serviceSubtask.getExcep().equals("1")) 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); 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 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 (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()); 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 insertOrUpdateTask(ServiceTaskVO serviceTaskVO) { if (ObjectUtils.isEmpty(serviceTaskVO)) { log.info("任务入参为空,请检查入参"); throw new BaseException("任务入参为空,请检查入参"); } ServiceTask serviceTask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceTask.class); 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.error("----serviceTaskVO.getAppltype()的值为:{}", serviceTaskVO.getAppltype()); if (StringUtils.isNotEmpty(serviceTaskVO.getAppltype())) { if (serviceTaskVO.getAppltype().equals("3")) { ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag(); serviceTaskdiag.setTaskId(serviceTask.getTaskid()); serviceTaskdiag.setTaskName(serviceTask.getTaskName()); serviceTaskdiag.setLongtask(0L); if (serviceTaskVO.getLongTask() == 1) serviceTaskdiag.setLongtask(1L); serviceTaskdiag.setIcd10code(serviceTaskVO.getIcd10code()); serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name()); serviceTaskdiag.setGuid(serviceTask.getGuid()); serviceTaskdiag.setOrgid(serviceTask.getOrgid()); serviceTaskdiag.setCreateTime(new Date()); log.error("----serviceTaskdiag的值为:{}", serviceTaskdiag); 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(0L); serviceTaskoper.setGuid(serviceTask.getGuid()); serviceTaskoper.setOrgid(serviceTask.getOrgid()); serviceTaskoper.setCreateTime(new Date()); if (serviceTaskVO.getLongTask() == 1) serviceTaskoper.setLongtask(1L); if (StringUtils.isNotEmpty(serviceTaskVO.getOpcode())) { String[] opcodes = serviceTaskVO.getOpcode().split(","); for (String opcode : opcodes) { serviceTaskoper.setOpcode(opcode); log.error("----serviceTaskoper的值为:{}", serviceTaskoper); serviceTaskoperService.insertServiceTaskoper(serviceTaskoper); } } } else { ServiceTaskdept serviceTaskdept = new ServiceTaskdept(); serviceTaskdept.setTaskId(serviceTask.getTaskid()); serviceTaskdept.setTaskName(serviceTask.getTaskName()); serviceTaskdept.setOrgid(serviceTask.getOrgid()); serviceTaskdept.setLongtask(0L); if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); 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 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.getHospType()); 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()); if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1) serviceSubtask.setLongSendTime(patTaskRelevance.getLongSendTime()); serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); serviceSubtask.getId().intValue(); } } } 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()); // long l = serviceTask1.getStopState() + 1; // serviceTask.setStopState(l); //获取到该任务所有的服务,并从队列里删除 ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO(); serviceSubtaskVO.setTaskid(serviceTask1.getTaskid()); serviceSubtaskVO.setSendstate(2L); List serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); serviceSubtaskVO.setSendstate(1L); List serviceSubtaskList1 = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); if (CollectionUtils.isNotEmpty(serviceSubtaskList)) { if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList.addAll(serviceSubtaskList1); } else { if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList = serviceSubtaskList1; } if (CollectionUtils.isNotEmpty(serviceSubtaskList)) { for (ServiceSubtask serviceSubtask : serviceSubtaskList) { log.error("insertOrUpdateTask需要移除的subId为:{}", serviceSubtask.getId().toString()); serviceSubtaskMapper.deleteServiceSubtaskById(serviceSubtask.getId()); redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString()); } } if (serviceTaskVO.getLibtemplateid() != null) serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid().toString()); serviceTask.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(0L); serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); serviceTaskdept.setDeptCode(deptCode); serviceTaskdept.setDeptType("1"); serviceTaskdept.setServiceType(serviceTaskVO.getServiceType()); ServiceTaskdept st = new ServiceTaskdept(); st.setDeptCode(deptCode); st.setTaskId(serviceTask.getTaskid()); List 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(0L); serviceTaskdept.setOrgid(serviceTaskVO.getOrgid()); if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L); 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 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.setIcd10code(serviceTaskVO.getIcd10code()); serviceTaskdiag.setLongtask(1L); 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 serviceTaskdiags = serviceTaskdiagService.selectServiceTaskdiagList(serviceTaskdiag2); serviceTaskdiag.setIcd10code(icdcode); log.error("----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(1L); 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 serviceTaskopers = serviceTaskoperService.selectServiceTaskoperList(serviceTaskoper2); serviceTaskoper.setOpcode(opcode); log.error("----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 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.getHospType()); 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.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(); } } } Map 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 map = redisCache.getCacheObject(phoneCallBackVO.getUuid()); ServiceSubtask serviceSubtask = (ServiceSubtask) map.get("ServiceSubtask"); List IvrTaskTemplateScriptVOs = (List) 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 list = Arrays.asList(split); List list1 = new ArrayList<>(); if (StringUtils.isNotEmpty(extemplateID)) { for (String str : list) { list1.add(Long.valueOf(str)); } List 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("调用“15、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) && hangup.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")) { 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 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); //这个时候就需要走补偿机制了,先暂定走短信 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 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)); //删除结束语的患存 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 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 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); Map 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 list = Arrays.asList(split); List list1 = new ArrayList<>(); for (String str : list) { list1.add(Long.valueOf(str)); } List 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; } 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); //可以挂机了 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 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是单选题的改法 ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).setIsUserOperation(1); serviceTaskScriptTargetoptionMapper.updateIvrTaskTemplateTargetoption(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j)); //将患者的回签写进service_subtask_detail中 ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); List 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()); 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); 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 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 = script.getIvrtext(); log.error("下一题问题:{}", scriptContent); 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); //设置结束语 phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy()); Long id = serviceSubtask.getId(); Map 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 { //flag=0,说明没 匹配上,也要把患者说的话记录下来 if (j == ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size() - 1 && flag == 0) { ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq(); List 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())) { 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); //在redis中保存一下结束语,在调用挂电话的方法时删除 ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES); //去redis中,把该子任务ID删除 Long id = serviceSubtask.getId(); Map map = delRedisValue(null, id.toString()); 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 = script.getIvrtext(); 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 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 = ivrTaskTemplateScript1.getIvrtext(); 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); //去redis中,把该子任务ID删除 Long id = serviceSubtask.getId(); Map 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> param = getParam(serviceSubtask.getTaskid()); for (Map map : param.values()) { for (String key : map.keySet()) { scriptContent = scriptContent.replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""); } } 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> getParam(Long taskId) { ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskId); ObjectMapper objectMapper = new ObjectMapper(); Map> serviceTaskMap = null; try { serviceTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class); } catch (JsonProcessingException e) { e.printStackTrace(); } return serviceTaskMap; } private Map delRedisValue(String cache, String id) { id = "," + id + ","; String val = ""; String cacheName = ""; Map 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 taskPull() { //pullTaskVOList用于数据返回 List pullTaskVOList = new ArrayList<>(); List cacheList = new ArrayList<>(); ListOperations listOps = redisTemplate.opsForList(); //必须等ache-exist全部打完才能拉取下一批(主要是怕所有的数据都堆在电话的缓存里,在规定的时间打不完) long existSize = listOps.size("cache-exist"); if (existSize > 0) return pullTaskVOList; long size = listOps.size("cache-0"); log.error("---------打电话之前缓存中的数据量:{}", size); int count = 0; 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的第一个子任务信息 Long size1 = listOps.size("cache-" + i); if (size1 == null || size1 == 0) continue; int count1 = Math.min(phoneCount(), size1.intValue()); List value = listOps.range("cache-0" + i, 0, count1 - 1); List pullTaskVOList2 = getPullTaskList(value, "cache-" + i); if (CollectionUtils.isNotEmpty(pullTaskVOList2) && pullTaskVOList2.size() > 0) { pullTaskVOList.addAll(pullTaskVOList2); } //将处理过的数据删除 listOps.trim("cache-0" + i, count1, -1); } } //existList用来记录接下来需要执行的子任务ID List 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 getPullTaskList(List subIds, String cacheName) { log.error("任务拉取subIds的值是多少:{}", subIds); //pullTaskVOList用于数据返回 List pullTaskVOList = new ArrayList<>(); //newValue0用于保存没有处理的子 任务 // String newValue0 = ""; List 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 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 PhoneCallBackVO phoneCallBack(PhoneCallBackVO phoneCallBackVO) { // log.error("phoneCallBackVO的入参:{},{},{},{},{},{},{}", phoneCallBackVO.getResultType(), phoneCallBackVO.getUuid(), phoneCallBackVO.getErrResult(), phoneCallBackVO.getTextResult(), phoneCallBackVO.getHangUpResult(), phoneCallBackVO.getEnumState(), phoneCallBackVO.getUint8()); // //获取数据 // Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid()); // if (!aBoolean) { // throw new BaseException("该uuid不存在"); // } // Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup"); // if (hangupValue != null && hangupValue == 1) { // //hangupValue == 1 随访结束,直接可以挂电话 // PhoneUtils phoneUtils = new PhoneUtils(); // phoneUtils.hangup(phoneCallBackVO.getUuid(), null, null, null, null, null, null, null); // // } // // Map map = redisCache.getCacheObject(phoneCallBackVO.getUuid()); //// ObjectMapper objectMapper = new ObjectMapper(); //// Map map = null; //// try { //// map = objectMapper.readValue(cacheObject, Map.class); //// } catch (JsonProcessingException e) { //// e.printStackTrace(); //// } // // ServiceSubtask ServiceSubtask = (ServiceSubtask) map.get("ServiceSubtask"); // List ivrLibaTemplateScriptVOs = (List) map.get("ivrLibaTemplateScriptVO"); // //将uuid更新到数据库中 // ServiceSubtask.setSenduuid(phoneCallBackVO.getUuid()); // ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); // // //获取模板信息 // IvrLibaTemplateVO ivrLibaTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "ivrLibaTemplateVO"); // // // //首先判断resultType // if (phoneCallBackVO.getResultType() == 1) { // //呼叫结果接口: 1 // if (phoneCallBackVO.getUint8() == 1) { // //呼叫失败,去redis中记录一下失败次数,进行再次呼叫 // Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "uint8"); // if (integer != null) { // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", integer + 1, 120, TimeUnit.MINUTES); // } else { // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", 1, 120, TimeUnit.MINUTES); // } // // if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) { // log.info("无人接听:{}, {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid()); // //连续打规定次,如果要没人接,那就结束 // ServiceSubtask.setResult(phoneCallBackVO.getErrResult()); // ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); // redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8"); // } else if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) { // //进行重拨 // PhoneUtils phoneUtils = new PhoneUtils(); // phoneUtils.ob(null, null, null, null, null, null, null, ServiceSubtask.getPhone(), phoneCallBackVO.getUuid(), true); // } // } // // } else if (phoneCallBackVO.getResultType() == 2) { // //通话状态更新接口: 2 // if (phoneCallBackVO.getEnumState() == 0) { // // 0-振铃 // Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "enumState"); // // if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) { // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", integer + 1, 120, TimeUnit.MINUTES); // } else if (integer == null) { // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", 1, 120, TimeUnit.MINUTES); // } else if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) { // ServiceSubtask.setResult("无人接听"); // ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); // redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState"); // } // } else if (phoneCallBackVO.getEnumState() == 2) { // //患者挂断电话 // log.info("患者挂断电话:{}", phoneCallBackVO.getUuid()); // ServiceSubtask.setResult(phoneCallBackVO.getHangUpResult()); // ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask); // redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState"); // } // // // } else if (phoneCallBackVO.getResultType() == 3) { // //语音识别结果上报接口: 3 // Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice"); // QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues"); // IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion(); // PhoneUtils phoneUtils = new PhoneUtils(); // // if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) { // //无回话 // //判断noVoice是否已经到了最大值 // if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) { // //已经问了对应的遍数,就判断是否还有下一题 // if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) { // //没有下一题了,就挂断电话,播放结束语 // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); // phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); // } else { // //有下一题 // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); // IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion); // // 问题, 去调用“tts合成和播放”接口 // phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid()); // } // } else { // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES); // //调用ivrLibaTemplateScriptVO中的slienceText(静默话术) // String slienceText = nowQuestion.getSlienceText(); // //静默话术 + 问题, 去调用“tts合成和播放”接口 // phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid()); // return new PhoneCallBackVO(); // } // // } else { // //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行) // for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) { // //包含 // Matcher matcher = null; // if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) { // Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()); // matcher = pattern.matcher(phoneCallBackVO.getTextResult()); // } // //不包含 // Matcher matcher2 = null; // if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) { // Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()); // matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult()); // } // log.info("phoneCallBack--Targetregex的值为:{}, phoneCallBack--Targetregex2的值为:{}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()); // if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) { // //说明匹配正确了 // //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法 // nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true); // ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j)); // // // //将静默置为0 // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); // //获取下一题 // Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion(); // for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) { // if (script.getTargetid() == nextQuestion) { // QuestionMessage questionMessage = new QuestionMessage(); // questionMessage.setNowQuestion(script); // questionMessage.setQuestionList(ivrLibaTemplateScriptVOs); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); // break; // } // } // break; // } else { // //没有匹配到 // Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum"); // //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了 // if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) { // //如果下一题为空.则新的数据返回,并加上感谢语 // if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) { // QuestionMessage questionMessage = new QuestionMessage(); // IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion); // questionMessage.setQuestionList(ivrLibaTemplateScriptVOs); // questionMessage.setNowQuestion(nextQuestion); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES); // } else { // //就可以挂断电话了 // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES); // phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid()); // break; // } // } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) { // //没有问到规定次数 // mateNum = mateNum + 1; // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES); // } // } // // } // //选项匹配完成后,需要再去通过库再进行匹配一次 // String extemplateID = ivrLibaTemplateVO.getSubmoduleID(); // String[] split = extemplateID.split(","); // List list = Arrays.asList(split); // List list1 = new ArrayList<>(); // if (StringUtils.isNotEmpty(extemplateID)) { // for (String str : list) { // list1.add(Long.valueOf(str)); // } // List ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1); // for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) { // Matcher matcher = null; // if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) { // Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex()); // matcher = pattern.matcher(returnQues.getContent()); // } // // Matcher matcher2 = null; // if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) { // Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2()); // matcher2 = pattern2.matcher(returnQues.getContent()); // } // log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2()); // if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) { // QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues"); // IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion(); // ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText()); // ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav()); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); // if (ivrLibaExtemplatescript.getIsEnd() == 1) { // //将问题置空 // IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion(); // nowQuestion1.setQuestionText(null); // nowQuestion1.setQuestionVoice(null); // questionMessage.setNowQuestion(nowQuestion1); // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES); // // redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES); // } // // //调用“15、tts合成和播放, tts_playback”将结果传回 // // // } // break; // } // } // // } // } // return phoneCallBackVO; // } @Override public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) { int i = 0; 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 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.setTemplatequestionnum(serviceSubtaskDetail.getTemplatequestionnum()); if (serviceSubtaskDetail.getSubId() != null) { ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId()); ssd.setGuid(serviceSubtask.getGuid()); ssd.setOrgid(serviceSubtask.getOrgid()); } List 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")) { //无人接听 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); //下载文件 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"); } return 1; } @Override public List 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 sfFzInfoEveryMonth = serviceSubtaskMapper.getSfFzInfoEveryMonth(serviceSubtaskCountReq); List 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 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 serviceSubtaskCountReq * @return */ @Override public List getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) { log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq); List serviceSubtaskStatistics = new ArrayList<>(); Map> collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown"))); for (List serviceSubtaskList : collect.values()) { if (CollectionUtils.isEmpty(serviceSubtaskList)) { continue; } ServiceSubtaskStatistic statistic = getStatistic(serviceSubtaskList); if (ObjectUtils.isNotEmpty(statistic)) { serviceSubtaskStatistics.add(statistic); } } return serviceSubtaskStatistics; } private ServiceSubtaskStatistic getStatistic(List serviceSubtaskList) { ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic(); serviceSubtaskStatistic.setLeavehospitaldistrictname(serviceSubtaskList.get(0).getLeavehospitaldistrictname()); serviceSubtaskStatistic.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode()); serviceSubtaskStatistic.setServiceCount(serviceSubtaskList.size()); for (ServiceSubtask serviceSubtask : serviceSubtaskList) { //不随访数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) { serviceSubtaskStatistic.setBzxCount(serviceSubtaskStatistic.getBzxCount() + 1L); } //应随访数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() != 4) { serviceSubtaskStatistic.setYsfCount(serviceSubtaskStatistic.getYsfCount() + 1L); } //发送失败数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) { serviceSubtaskStatistic.setFssbCount(serviceSubtaskStatistic.getFssbCount() + 1L); } //待发送数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) { serviceSubtaskStatistic.setDfsCount(serviceSubtaskStatistic.getDfsCount() + 1L); } //已发送数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 3) { serviceSubtaskStatistic.setYfsCount(serviceSubtaskStatistic.getYfsCount() + 1L); } //已完成数量 if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 6) { //已发送,包含已完成 serviceSubtaskStatistic.setYfsCount(serviceSubtaskStatistic.getYfsCount() + 1L); serviceSubtaskStatistic.setYwcCount(serviceSubtaskStatistic.getYwcCount() + 1L); } if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && serviceSubtask.getExcep().equals("1")) { //异常标识 serviceSubtaskStatistic.setYczs(serviceSubtaskStatistic.getYczs() + 1L); } } //随访完成率=已完成/应随访量 if (serviceSubtaskStatistic.getYwcCount() == 0 || CollectionUtils.isEmpty(serviceSubtaskList)) { serviceSubtaskStatistic.setSfwcl("0"); } else { // BigDecimal multiply = BigDecimal.valueOf(serviceSubtaskStatistic.getYfsCount()).divide(BigDecimal.valueOf(serviceSubtaskList.size()), 2, BigDecimal.ROUND_HALF_UP); BigDecimal multiply = new BigDecimal(serviceSubtaskStatistic.getYwcCount().toString()).divide(new BigDecimal(serviceSubtaskStatistic.getYsfCount().toString()), 2, BigDecimal.ROUND_HALF_UP); serviceSubtaskStatistic.setSfwcl(multiply.toString()); } return serviceSubtaskStatistic; } private IvrTaskTemplateScriptVO getNextQuestion(List 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) { 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(ivrTaskTemplateScriptVO.getIvrtext()); 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; } 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 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); } //通过当前时间,拉取电话总数 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; } }