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.DateUtils; import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.RSAPublicKeyExample; import com.smartor.config.PhoneUtils; import com.smartor.domain.*; import com.smartor.mapper.*; import com.smartor.service.IServiceSubtaskService; import com.smartor.service.IServiceTaskService; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 单一任务(随访)Service业务层处理 * * @author ruoyi * @date 2024-02-02 */ @Slf4j @Service public class ServiceSubtaskServiceImpl implements IServiceSubtaskService { @Autowired private ServiceSubtaskMapper serviceSubtaskMapper; @Autowired private ServiceSubtaskDetailMapper ivrTaskcalldetailMapper; @Autowired private IServiceTaskService serviceTaskService; @Autowired private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper; @Autowired private IvrTaskVisitResultMapper serviceTaskVisitResultMapper; @Autowired private RedisCache redisCache; @Autowired private IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper; @Value("${pri_key}") private String pri_key; /** * 查询单一任务(随访) * * @param id 单一任务(随访)主键 * @return 单一任务(随访) */ @Override public ServiceSubtask selectServiceSubtaskById(Long id) { return serviceSubtaskMapper.selectServiceSubtaskById(id); } /** * 查询单一任务(随访)列表 * * @param ServiceSubtask 单一任务(随访) * @return 单一任务(随访) */ @Override public List selectServiceSubtaskList(ServiceSubtask ServiceSubtask) { return serviceSubtaskMapper.selectServiceSubtaskList(ServiceSubtask); } @Override public ServiceTaskVO queryTaskByCondition(ServiceSubtask ServiceSubtask) { //定义患者与单一任务关联表集合 List patTaskRelevances = new ArrayList<>(); List list = selectServiceSubtaskList(ServiceSubtask); if (CollectionUtils.isEmpty(list) || list.size() == 0) { return new ServiceTaskVO(); } ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(ServiceSubtask.getTaskid()); //将查出来的数据倒入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.setSfzh(serviceSubtask1.getSfzh()); patTaskRelevance.setPhone(serviceSubtask1.getPhone()); patTaskRelevance.setAddr(serviceSubtask1.getAddr()); patTaskRelevance.setDiagname(serviceSubtask1.getDiagname()); patTaskRelevance.setPatid(serviceSubtask1.getPatid()); patTaskRelevance.setSendStatus(serviceSubtask1.getSendstate()); 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.setAddr(serviceSubtask1.getAddr()); patTaskRelevance.setDeptName(serviceSubtask1.getDeptname()); patTaskRelevance.setBedNo(serviceSubtask1.getBedNo()); patTaskRelevance.setDiagname(serviceSubtask1.getDiagname()); patTaskRelevance.setPatid(serviceSubtask1.getPatid()); patTaskRelevance.setSendStatus(serviceSubtask1.getSendstate()); patTaskRelevances.add(patTaskRelevance); } } serviceTaskVO.setPatTaskRelevances(patTaskRelevances); return serviceTaskVO; } @Override public List patItem(ServiceSubtask serviceSubtask) { return this.selectServiceSubtaskList(serviceSubtask); } /** * 新增单一任务(随访) * * @param serviceSubtask 单一任务(随访) * @return 结果 */ @Override public int insertServiceSubtask(ServiceSubtask serviceSubtask) { serviceSubtask.setCreateTime(DateUtils.getNowDate()); return serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); } /** * 修改单一任务(随访) * * @param serviceSubtask 单一任务(随访) * @return 结果 */ @Override public Boolean updateServiceSubtask(ServiceSubtask serviceSubtask) { serviceSubtask.setUpdateTime(DateUtils.getNowDate()); 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 int insertOrUpdateTask(ServiceTaskVO serviceTaskVO) { if (ObjectUtils.isEmpty(serviceTaskVO)) { log.info("任务入参为空,请检查入参"); throw new BaseException("任务入参为空,请检查入参"); } Integer integer = 1; ServiceTask serviceTask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceTask.class); serviceTask.setTextParam(JSON.toJSONString(serviceTaskVO.getTextParam())); if (serviceTaskVO.getIsoperation() != null && serviceTaskVO.getIsoperation() == 1) { //往任务表中,新增任务 if (ObjectUtils.isNotEmpty(serviceTaskVO.getSendTimeslot())) serviceTask.setSendTimeSlot(JSON.toJSONString(serviceTaskVO.getSendTimeslot())); if (serviceTask.getSendState() == null) serviceTask.setSendState(1); serviceTask.setTemplateid(serviceTaskVO.getLibtemplateid()); serviceTaskService.insertServiceTask(serviceTask); //将任务信息放到服务表中 ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); serviceSubtask.setTaskid(serviceTask.getTaskid().longValue()); serviceSubtask.setTemplatename(serviceTaskVO.getTemplatename()); //新增 if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) { for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) { //将任务信息新增到随访服务表中 serviceSubtask.setSendname(patTaskRelevance.getName()); serviceSubtask.setAge(patTaskRelevance.getAge()); serviceSubtask.setSfzh(patTaskRelevance.getSfzh()); serviceSubtask.setPhone(patTaskRelevance.getPhone()); serviceSubtask.setAddr(patTaskRelevance.getAddr()); serviceSubtask.setPatid(patTaskRelevance.getPatid()); serviceSubtask.setCreateTime(DateUtils.getNowDate()); serviceSubtask.setSendstate(1L); serviceSubtask.setType(serviceTaskVO.getHospType()); serviceSubtask.setHospType(patTaskRelevance.getHospType()); serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); integer = 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()); serviceTask.setStopState(serviceTask1.getStopState() + 1); serviceTask.setTemplateid(serviceTaskVO.getLibtemplateid()); serviceTaskService.updateServiceTask(serviceTask); 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.getPhone()); serviceSubtask.setAddr(patTaskRelevance.getAddr()); serviceSubtask.setPatid(patTaskRelevance.getPatid()); serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); serviceSubtask.setType(serviceTaskVO.getHospType()); serviceSubtask.setCreateTime(DateUtils.getNowDate()); serviceSubtask.setHospType(patTaskRelevance.getHospType()); serviceSubtask.setTextParam(new Gson().toJson(serviceTaskVO.getTextParam())); if (patTaskRelevance.getIsoperation() != null) { if (patTaskRelevance.getIsoperation() == 2) serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); if (patTaskRelevance.getIsoperation() == 1) { serviceSubtask.setSendstate(1L); serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); } if (patTaskRelevance.getIsoperation() == 3) // 通过taskid和patid去删除该条数据 serviceSubtaskMapper.deleteServiceSubtaskByCondition(serviceTaskVO.getTaskid(), patTaskRelevance.getPatid()); } integer = serviceSubtask.getTaskid().intValue(); } } } return integer; } @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()) { //没有下一题了,就挂断电话,播放结束语 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.getScriptContent(), 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.getScriptContent(), 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.getScriptContent(), 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(true); 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.getScriptContent()); 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.getScriptContent(), phoneCallBackVO.getUuid()); return; } else if (nextQuestion > IvrTaskTemplateScriptVOs.size()) { //没有下一题了,就结束了 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.getScriptContent(), phoneCallBackVO.getUuid()); return; } else { //就可以挂断电话了 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.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"); 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.getScriptContent() + ivrTaskTemplateScriptVO.getSubmoduleText(), phoneCallBackVO.getUuid()); } break; } String date = simpleDateFormat1.format(new Date()); log.info("最后的信息回复-: {},uuid为:{}", date, phoneCallBackVO.getUuid()); phoneUtils.ttsPlayback(nowQuestion.getScriptContent(), phoneCallBackVO.getUuid()); } } } //下面的代码不能删除,上面的方法只是配合电话端联调用的, // @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) { RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); Long tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam1(), pri_key)); Long pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam2(), pri_key)); ServiceSubtask ivrTaskSingle = new ServiceSubtask(); ivrTaskSingle.setTaskid(tid); ivrTaskSingle.setPatid(pid); List selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ivrTaskSingle); if (CollectionUtils.isEmpty(selectServiceSubtaskList) || selectServiceSubtaskList.size() == 0) { log.error("报错了,selectServiceSubtaskList数据为空了:{}", ivrTaskSingle); return 0; } int i = 0; //随访 for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) { serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId()); serviceSubtaskDetail.setId(UUID.randomUUID().toString()); serviceSubtaskDetail.setCreateTime(new Date()); i = ivrTaskcalldetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail); } return i; } 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; } }