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.smartor.config.PhoneUtils;
|
import com.smartor.domain.*;
|
import com.smartor.mapper.*;
|
import com.smartor.service.IIvrTaskService;
|
import com.smartor.service.IIvrTaskSingleService;
|
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.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 IvrTaskSingleServiceImpl implements IIvrTaskSingleService {
|
@Autowired
|
private IvrTaskSingleMapper ivrTaskSingleMapper;
|
|
@Autowired
|
private IIvrTaskService ivrTaskService;
|
|
@Autowired
|
private IvrTaskTemplateTargetoptionMapper ivrTaskScriptTargetoptionMapper;
|
|
@Autowired
|
private IvrLibaTemplateScriptMapper ivrTaskTemplateScriptMapper;
|
|
@Autowired
|
private IvrTaskVisitResultMapper ivrTaskVisitResultMapper;
|
|
@Autowired
|
private RedisCache redisCache;
|
|
@Autowired
|
private IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper;
|
|
|
/**
|
* 查询单一任务(随访)
|
*
|
* @param id 单一任务(随访)主键
|
* @return 单一任务(随访)
|
*/
|
@Override
|
public IvrTaskSingle selectIvrTaskcallById(Long id) {
|
return ivrTaskSingleMapper.selectIvrTaskcallById(id);
|
}
|
|
/**
|
* 查询单一任务(随访)列表
|
*
|
* @param ivrTaskcall 单一任务(随访)
|
* @return 单一任务(随访)
|
*/
|
@Override
|
public List<IvrTaskSingle> selectIvrTaskcallList(IvrTaskSingle ivrTaskcall) {
|
return ivrTaskSingleMapper.selectIvrTaskcallList(ivrTaskcall);
|
}
|
|
@Override
|
public IvrTaskVO queryTaskByCondition(IvrTaskSingle ivrTaskcall) {
|
//定义患者与单一任务关联表集合
|
List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
|
List<IvrTaskSingle> list = selectIvrTaskcallList(ivrTaskcall);
|
if (CollectionUtils.isEmpty(list) || list.size() == 0) {
|
return new IvrTaskVO();
|
}
|
IvrTask ivrTask = ivrTaskService.selectIvrTaskByTaskid(ivrTaskcall.getTaskid());
|
//将查出来的数据倒入ivrTasksingleVO中
|
IvrTaskVO ivrTaskVO = DtoConversionUtils.sourceToTarget(list.get(0), IvrTaskVO.class);
|
ivrTaskVO.setShowDate(ivrTask.getShowDate());
|
ivrTaskVO.setShowTimeMorn(ivrTask.getShowTimeMorn());
|
ivrTaskVO.setShowTimeNoon(ivrTask.getShowTimeNoon());
|
ivrTaskVO.setShowTimeNight(ivrTask.getShowTimeNight());
|
ivrTaskVO.setPreachform(ivrTask.getPreachform());
|
String sendTimeSlot = ivrTask.getSendTimeSlot();
|
ObjectMapper objectMapper = new ObjectMapper();
|
try {
|
//获取到发送时间的集合
|
if (com.ruoyi.common.utils.StringUtils.isNotEmpty(sendTimeSlot)) {
|
List<TaskSendTimeVO> taskSendTimeVOList = objectMapper.readValue(sendTimeSlot, List.class);
|
ivrTaskVO.setSendTimeslot(taskSendTimeVOList);
|
ivrTaskVO.setSendType(ivrTask.getSendType());
|
}
|
//文本变量参数
|
if (com.ruoyi.common.utils.StringUtils.isNotEmpty(ivrTask.getTextParam())) {
|
Map<String, Map<String, String>> textParam = objectMapper.readValue(ivrTask.getTextParam(), Map.class);
|
ivrTaskVO.setTextParam(textParam);
|
}
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
}
|
|
for (IvrTaskSingle ivrTaskcall1 : list) {
|
PatTaskRelevance patTaskRelevance = new PatTaskRelevance();
|
if (!ivrTaskcall1.getHospType().equals("2")) {
|
log.info("随访查询不为出院,{}", ivrTaskcall1.getHospType());
|
//获取到患者信息,并放入到集合中
|
patTaskRelevance.setName(ivrTaskcall1.getSendname());
|
patTaskRelevance.setAge(ivrTaskcall1.getAge());
|
patTaskRelevance.setSfzh(ivrTaskcall1.getSfzh());
|
patTaskRelevance.setPhone(ivrTaskcall1.getPhone());
|
patTaskRelevance.setAddr(ivrTaskcall1.getAddr());
|
patTaskRelevance.setDiagname(ivrTaskcall1.getDiagname());
|
patTaskRelevance.setPatid(ivrTaskcall1.getPatid());
|
patTaskRelevances.add(patTaskRelevance);
|
}
|
if (ivrTaskcall1.getHospType().equals("2")) {
|
log.info("随访查询为出院,{}", ivrTaskcall1.getHospType());
|
patTaskRelevance.setName(ivrTaskcall1.getSendname());
|
patTaskRelevance.setAge(ivrTaskcall1.getAge());
|
patTaskRelevance.setSfzh(ivrTaskcall1.getSfzh());
|
patTaskRelevance.setPhone(ivrTaskcall1.getPhone());
|
patTaskRelevance.setAddr(ivrTaskcall1.getAddr());
|
patTaskRelevance.setDeptName(ivrTaskcall1.getDeptname());
|
patTaskRelevance.setBedNo(ivrTaskcall1.getBedNo());
|
patTaskRelevance.setDiagname(ivrTaskcall1.getDiagname());
|
patTaskRelevance.setPatid(ivrTaskcall1.getPatid());
|
patTaskRelevances.add(patTaskRelevance);
|
}
|
}
|
|
ivrTaskVO.setPatTaskRelevances(patTaskRelevances);
|
return ivrTaskVO;
|
}
|
|
@Override
|
public List<IvrTaskSingle> patItem(IvrTaskSingle ivrTaskSingle) {
|
|
|
return this.selectIvrTaskcallList(ivrTaskSingle);
|
}
|
|
/**
|
* 新增单一任务(随访)
|
*
|
* @param ivrTaskcall 单一任务(随访)
|
* @return 结果
|
*/
|
@Override
|
public int insertIvrTaskcall(IvrTaskSingle ivrTaskcall) {
|
ivrTaskcall.setCreateTime(DateUtils.getNowDate());
|
return ivrTaskSingleMapper.insertIvrTaskcall(ivrTaskcall);
|
}
|
|
/**
|
* 修改单一任务(随访)
|
*
|
* @param ivrTaskcall 单一任务(随访)
|
* @return 结果
|
*/
|
@Override
|
public Boolean updateIvrTaskcall(IvrTaskSingle ivrTaskcall) {
|
ivrTaskcall.setUpdateTime(DateUtils.getNowDate());
|
return ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
}
|
|
/**
|
* 批量删除单一任务(随访)
|
*
|
* @return 结果
|
*/
|
@Override
|
public int deleteIvrTaskcallByIds(Long[] ids) {
|
Integer i = 0;
|
for (Long id : ids) {
|
i = ivrTaskSingleMapper.deleteIvrTaskcallById(id);
|
}
|
return i;
|
}
|
|
/**
|
* 单一任务
|
*
|
* @return 结果
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public int insertOrUpdateTask(IvrTaskVO ivrTaskVO) {
|
if (ObjectUtils.isEmpty(ivrTaskVO)) {
|
log.info("任务入参为空,请检查入参");
|
throw new BaseException("任务入参为空,请检查入参");
|
}
|
Integer integer = 1;
|
IvrTask ivrTask = DtoConversionUtils.sourceToTarget(ivrTaskVO, IvrTask.class);
|
ivrTask.setTextParam(JSON.toJSONString(ivrTaskVO.getTextParam()));
|
if (ivrTaskVO.getIsoperation() != null && ivrTaskVO.getIsoperation() == 1) {
|
//往任务表中,新增任务
|
if (ObjectUtils.isNotEmpty(ivrTaskVO.getSendTimeslot()))
|
ivrTask.setSendTimeSlot(JSON.toJSONString(ivrTaskVO.getSendTimeslot()));
|
if (ivrTask.getSendState() == null) ivrTask.setSendState(1);
|
ivrTask.setTemplateid(ivrTaskVO.getLibtemplateid());
|
ivrTaskService.insertIvrTask(ivrTask);
|
|
//将任务信息放到服务表中
|
IvrTaskSingle ivrTaskcall = DtoConversionUtils.sourceToTarget(ivrTaskVO, IvrTaskSingle.class);
|
ivrTaskcall.setTaskid(ivrTask.getTaskid().longValue());
|
//新增
|
if (CollectionUtils.isNotEmpty(ivrTaskVO.getPatTaskRelevances())) {
|
for (PatTaskRelevance patTaskRelevance : ivrTaskVO.getPatTaskRelevances()) {
|
//将任务信息新增到随访服务表中
|
ivrTaskcall.setSendname(patTaskRelevance.getName());
|
ivrTaskcall.setAge(patTaskRelevance.getAge());
|
ivrTaskcall.setSfzh(patTaskRelevance.getSfzh());
|
ivrTaskcall.setPhone(patTaskRelevance.getPhone());
|
ivrTaskcall.setAddr(patTaskRelevance.getAddr());
|
ivrTaskcall.setPatid(patTaskRelevance.getPatid());
|
ivrTaskcall.setCreateTime(DateUtils.getNowDate());
|
ivrTaskcall.setCreateTime(DateUtils.getNowDate());
|
ivrTaskcall.setType(ivrTaskVO.getHospType());
|
ivrTaskSingleMapper.insertIvrTaskcall(ivrTaskcall);
|
integer = ivrTaskcall.getId().intValue();
|
}
|
}
|
|
} else if (ivrTaskVO.getIsoperation() != null && ivrTaskVO.getIsoperation() == 2) {
|
//任务修改
|
if (ObjectUtils.isNotEmpty(ivrTaskVO.getSendTimeslot()))
|
ivrTask.setSendTimeSlot(JSON.toJSONString(ivrTaskVO.getSendTimeslot()));
|
//修改操作,需要将stopState状态+1
|
IvrTask ivrTask1 = ivrTaskService.selectIvrTaskByTaskid(ivrTask.getTaskid());
|
ivrTask.setStopState(ivrTask1.getStopState() + 1);
|
ivrTask.setTemplateid(ivrTaskVO.getLibtemplateid());
|
ivrTaskService.updateIvrTask(ivrTask);
|
|
if (CollectionUtils.isNotEmpty(ivrTaskVO.getPatTaskRelevances())) {
|
for (PatTaskRelevance patTaskRelevance : ivrTaskVO.getPatTaskRelevances()) {
|
|
IvrTaskSingle ivrTaskcall = DtoConversionUtils.sourceToTarget(ivrTaskVO, IvrTaskSingle.class);
|
ivrTaskcall.setSendname(patTaskRelevance.getName());
|
ivrTaskcall.setAge(patTaskRelevance.getAge());
|
ivrTaskcall.setSfzh(patTaskRelevance.getSfzh());
|
ivrTaskcall.setPhone(patTaskRelevance.getPhone());
|
ivrTaskcall.setAddr(patTaskRelevance.getAddr());
|
ivrTaskcall.setPatid(patTaskRelevance.getPatid());
|
ivrTaskcall.setType(ivrTaskVO.getHospType());
|
ivrTaskcall.setCreateTime(DateUtils.getNowDate());
|
ivrTaskcall.setTextParam(new Gson().toJson(ivrTaskVO.getTextParam()));
|
if (patTaskRelevance.getIsoperation() != null) {
|
if (patTaskRelevance.getIsoperation() == 2)
|
ivrTaskSingleMapper.updateIvrTaskcallByCondition(ivrTaskcall);
|
if (patTaskRelevance.getIsoperation() == 1) ivrTaskSingleMapper.insertIvrTaskcall(ivrTaskcall);
|
if (patTaskRelevance.getIsoperation() == 3)
|
// 通过taskid和patid去删除该条数据
|
ivrTaskSingleMapper.deleteIvrTaskcallByCondition(ivrTaskVO.getTaskid(), patTaskRelevance.getPatid());
|
}
|
integer = ivrTaskcall.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<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid());
|
IvrTaskSingle ivrTaskcall = (IvrTaskSingle) map.get("ivrTaskSingle");
|
List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOs = (List<IvrTaskTemplateScriptVO>) map.get("ivrTaskTemplateScriptVO");
|
//将uuid更新到数据库中
|
ivrTaskcall.setSenduuid(phoneCallBackVO.getUuid());
|
ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
|
//获取模板信息
|
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.getQuestionText(), 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.getQuestionText(), 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.getQuestionText(), 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);
|
ivrTaskScriptTargetoptionMapper.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 ivrTaskVisitResult = DtoConversionUtils.sourceToTarget(ivrTaskcall, IvrTaskVisitResult.class);
|
ivrTaskVisitResult.setId(null);
|
ivrTaskVisitResult.setQuestion(nowQuestion.getQuestionText());
|
ivrTaskVisitResult.setPatientAnswer(phoneCallBackVO.getTextResult());
|
ivrTaskVisitResult.setCreateTime(new Date());
|
ivrTaskVisitResult.setOptionResult(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetvalue());
|
ivrTaskVisitResultMapper.insertIvrTaskVisitResult(ivrTaskVisitResult);
|
|
//将匹配到的标识改成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.getQuestionText(), 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.getQuestionText(), 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<String> list = Arrays.asList(split);
|
List<Long> list1 = new ArrayList<>();
|
if (StringUtils.isNotEmpty(extemplateID)) {
|
for (String str : list) {
|
list1.add(Long.valueOf(str));
|
}
|
List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
|
for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
|
Matcher matcher = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
|
Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
|
matcher = pattern.matcher(returnQues.getContent());
|
}
|
|
Matcher matcher2 = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
|
Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
|
matcher2 = pattern2.matcher(returnQues.getContent());
|
}
|
log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
|
QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
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.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”将结果传回
|
String date = simpleDateFormat1.format(new Date());
|
log.info("调用“15、tts合成和播放------: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
phoneUtils.ttsPlayback(nowQuestion.getQuestionText() + ivrTaskTemplateScriptVO.getSubmoduleText(), phoneCallBackVO.getUuid());
|
}
|
break;
|
}
|
String date = simpleDateFormat1.format(new Date());
|
log.info("最后的信息回复-: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), 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<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid());
|
//// ObjectMapper objectMapper = new ObjectMapper();
|
//// Map<String, Object> map = null;
|
//// try {
|
//// map = objectMapper.readValue(cacheObject, Map.class);
|
//// } catch (JsonProcessingException e) {
|
//// e.printStackTrace();
|
//// }
|
//
|
// IvrTaskSingle ivrTaskcall = (IvrTaskSingle) map.get("ivrTaskcall");
|
// List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOs = (List<IvrLibaTemplateScriptVO>) map.get("ivrLibaTemplateScriptVO");
|
// //将uuid更新到数据库中
|
// ivrTaskcall.setSenduuid(phoneCallBackVO.getUuid());
|
// ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
//
|
// //获取模板信息
|
// 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 == ivrTaskcall.getRecallcount().intValue()) {
|
// log.info("无人接听:{}, {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid());
|
// //连续打规定次,如果要没人接,那就结束
|
// ivrTaskcall.setResult(phoneCallBackVO.getErrResult());
|
// ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8");
|
// } else if (integer != null && integer < ivrTaskcall.getRecallcount().intValue()) {
|
// //进行重拨
|
// PhoneUtils phoneUtils = new PhoneUtils();
|
// phoneUtils.ob(null, null, null, null, null, null, null, ivrTaskcall.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 < ivrTaskcall.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 == ivrTaskcall.getRecallcount().intValue()) {
|
// ivrTaskcall.setResult("无人接听");
|
// ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
|
// }
|
// } else if (phoneCallBackVO.getEnumState() == 2) {
|
// //患者挂断电话
|
// log.info("患者挂断电话:{}", phoneCallBackVO.getUuid());
|
// ivrTaskcall.setResult(phoneCallBackVO.getHangUpResult());
|
// ivrTaskSingleMapper.updateIvrTaskcall(ivrTaskcall);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
|
// }
|
//
|
//
|
// } else if (phoneCallBackVO.getResultType() == 3) {
|
// //语音识别结果上报接口: 3
|
// Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice");
|
// QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
// IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
|
// PhoneUtils phoneUtils = new PhoneUtils();
|
//
|
// if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) {
|
// //无回话
|
// //判断noVoice是否已经到了最大值
|
// if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) {
|
// //已经问了对应的遍数,就判断是否还有下一题
|
// if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) {
|
// //没有下一题了,就挂断电话,播放结束语
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
// phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
// } else {
|
// //有下一题
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
// IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
|
// // 问题, 去调用“tts合成和播放”接口
|
// phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
|
// }
|
// } else {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES);
|
// //调用ivrLibaTemplateScriptVO中的slienceText(静默话术)
|
// String slienceText = nowQuestion.getSlienceText();
|
// //静默话术 + 问题, 去调用“tts合成和播放”接口
|
// phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
|
// return new PhoneCallBackVO();
|
// }
|
//
|
// } else {
|
// //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行)
|
// for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) {
|
// //包含
|
// Matcher matcher = null;
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) {
|
// Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
|
// matcher = pattern.matcher(phoneCallBackVO.getTextResult());
|
// }
|
// //不包含
|
// Matcher matcher2 = null;
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) {
|
// Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
|
// matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult());
|
// }
|
// log.info("phoneCallBack--Targetregex的值为:{}, phoneCallBack--Targetregex2的值为:{}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
|
// //说明匹配正确了
|
// //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法
|
// nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true);
|
// ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j));
|
//
|
//
|
// //将静默置为0
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
// //获取下一题
|
// Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion();
|
// for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) {
|
// if (script.getTargetid() == nextQuestion) {
|
// QuestionMessage questionMessage = new QuestionMessage();
|
// questionMessage.setNowQuestion(script);
|
// questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// break;
|
// }
|
// }
|
// break;
|
// } else {
|
// //没有匹配到
|
// Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum");
|
// //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了
|
// if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
|
// //如果下一题为空.则新的数据返回,并加上感谢语
|
// if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) {
|
// QuestionMessage questionMessage = new QuestionMessage();
|
// IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
|
// questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
|
// questionMessage.setNowQuestion(nextQuestion);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
// } else {
|
// //就可以挂断电话了
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
// phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
// break;
|
// }
|
// } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
|
// //没有问到规定次数
|
// mateNum = mateNum + 1;
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES);
|
// }
|
// }
|
//
|
// }
|
// //选项匹配完成后,需要再去通过库再进行匹配一次
|
// String extemplateID = ivrLibaTemplateVO.getSubmoduleID();
|
// String[] split = extemplateID.split(",");
|
// List<String> list = Arrays.asList(split);
|
// List<Long> list1 = new ArrayList<>();
|
// if (StringUtils.isNotEmpty(extemplateID)) {
|
// for (String str : list) {
|
// list1.add(Long.valueOf(str));
|
// }
|
// List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
|
// for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
|
// Matcher matcher = null;
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
|
// Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
|
// matcher = pattern.matcher(returnQues.getContent());
|
// }
|
//
|
// Matcher matcher2 = null;
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
|
// Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
|
// matcher2 = pattern2.matcher(returnQues.getContent());
|
// }
|
// log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
|
// QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
// IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion();
|
// ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
|
// ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// if (ivrLibaExtemplatescript.getIsEnd() == 1) {
|
// //将问题置空
|
// IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion();
|
// nowQuestion1.setQuestionText(null);
|
// nowQuestion1.setQuestionVoice(null);
|
// questionMessage.setNowQuestion(nowQuestion1);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
//
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES);
|
// }
|
//
|
// //调用“15、tts合成和播放, tts_playback”将结果传回
|
//
|
//
|
// }
|
// break;
|
// }
|
// }
|
//
|
// }
|
// }
|
// return phoneCallBackVO;
|
// }
|
|
|
private IvrTaskTemplateScriptVO getNextQuestion(List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOList, IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO) {
|
|
for (int j = 0; j < ivrTaskTemplateScriptVOList.size(); j++) {
|
if (ivrTaskTemplateScriptVOList.get(j).getTargetid() == ivrTaskTemplateScriptVO.getTargetid() + 1) {
|
// 对该条templateScriptVO进行处理
|
return ivrTaskTemplateScriptVOList.get(j);
|
}
|
}
|
return null;
|
}
|
|
}
|