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.common.SendService;
|
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.io.UnsupportedEncodingException;
|
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 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;
|
|
@Value("${pri_key}")
|
private String pri_key;
|
|
@Value("${pub_key}")
|
private String pub_key;
|
|
@Value("${ASRCallBackPath}")
|
private String ASRCallBackPath;
|
|
@Autowired
|
private RedisTemplate redisTemplate;
|
|
@Autowired
|
private SendService sendService;
|
|
@Value("${hangup}")
|
private String hangup;
|
|
@Value("${app_key_yq}")
|
private String app_key_yq;
|
|
@Value("${ruoyi.profile}")
|
private String profile;
|
|
@Value("${voicePathPrefix}")
|
private String voicePathPrefix;
|
|
@Value("${localIP}")
|
private String localIP;
|
|
@Value("${req_path}")
|
private String req_path;
|
|
@Value("${xhsmsPath}")
|
private String xhsmsPath;
|
|
@Value("${phoneUpEveryHour}")
|
private Integer phoneUpEveryHour;
|
@Value("${phoneEndHour}")
|
private Integer phoneEndHour;
|
|
/**
|
* 查询单一任务(随访)
|
*
|
* @param id 单一任务(随访)主键
|
* @return 单一任务(随访)
|
*/
|
@Override
|
public ServiceSubtask selectServiceSubtaskById(Long id) {
|
return serviceSubtaskMapper.selectServiceSubtaskById(id);
|
}
|
|
/**
|
* 查询单一任务(随访)列表
|
*
|
* @param serviceSubtaskVO 单一任务(随访)
|
* @return 单一任务(随访)
|
*/
|
@Override
|
public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO) {
|
return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
|
}
|
|
@Override
|
public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) {
|
//定义患者与单一任务关联表集合
|
List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
|
ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class);
|
List<ServiceSubtask> list = selectServiceSubtaskList(serviceSubtaskVO);
|
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
if (CollectionUtils.isEmpty(list) || list.size() == 0) {
|
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<TaskSendTimeVO> taskSendTimeVOList = objectMapper.readValue(sendTimeSlot, List.class);
|
serviceTaskVO.setSendTimeslot(taskSendTimeVOList);
|
serviceTaskVO.setSendType(serviceTask.getSendType());
|
}
|
//文本变量参数
|
if (com.ruoyi.common.utils.StringUtils.isNotEmpty(serviceTask.getTextParam())) {
|
Map<String, Map<String, String>> textParam = objectMapper.readValue(serviceTask.getTextParam(), Map.class);
|
serviceTaskVO.setTextParam(textParam);
|
}
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
}
|
|
for (ServiceSubtask serviceSubtask1 : list) {
|
PatTaskRelevance patTaskRelevance = new PatTaskRelevance();
|
if (!serviceSubtask1.getHospType().equals("2")) {
|
log.info("随访查询不为出院,{}", serviceSubtask1.getHospType());
|
//获取到患者信息,并放入到集合中
|
patTaskRelevance.setName(serviceSubtask1.getSendname());
|
patTaskRelevance.setAge(serviceSubtask1.getAge());
|
patTaskRelevance.setFinishtime(serviceSubtask1.getFinishtime());
|
patTaskRelevance.setSfzh(serviceSubtask1.getSfzh());
|
patTaskRelevance.setPhone(serviceSubtask1.getPhone());
|
patTaskRelevance.setTelcode(serviceSubtask1.getPhone());
|
patTaskRelevance.setAddr(serviceSubtask1.getAddr());
|
patTaskRelevance.setDiagname(serviceSubtask1.getDiagname());
|
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.getDiagname());
|
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<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) {
|
List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
|
//根据出院 时间倒序
|
// List<ServiceSubtask> sortedServiceSubtaskList = selectServiceSubtaskList.stream().sorted(Comparator.comparing(ServiceSubtask::getEndtime).reversed()).collect(Collectors.toList());
|
return selectServiceSubtaskList;
|
}
|
|
@Override
|
public List<ServiceSubtask> patItem2(ServiceSubtaskVO serviceSubtaskVO) {
|
List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
|
for (Long sendstate : serviceSubtaskVO.getSendstates()) {
|
serviceSubtaskVO.setSendstate(sendstate);
|
List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
|
serviceSubtaskList.addAll(serviceSubtasks);
|
}
|
return serviceSubtaskList;
|
}
|
|
|
@Override
|
public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
|
serviceSubtaskVO.setPageSize(99999999);
|
serviceSubtaskVO.setPageNum(1);
|
List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
|
Map<String, Object> map = new HashMap<>();
|
Integer wzx = 0;
|
Integer ysf = 0;
|
Integer yc = 0;
|
Integer fssb = 0;
|
Integer yfs = 0;
|
Integer blq = 0;
|
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) 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 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 Map<String, Integer> 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);
|
}
|
if (StringUtils.isNotEmpty(serviceTaskVO.getLibtemplateid())) {
|
serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid());
|
serviceTask.setLibtemplatename(serviceTaskVO.getLibtemplatename());
|
}
|
serviceTask.setTemplateid(tempid);
|
serviceTask.setTemplatename(tempName);
|
serviceTask.setLeaveldeptcodes(serviceTaskVO.getLeaveldeptcodes());
|
serviceTask.setLeavehospitaldistrictcode(serviceTask.getLeavehospitaldistrictcode());
|
if (serviceTaskVO.getLongTask() == 1L) serviceTask.setSendState(2L);
|
serviceTaskService.insertServiceTask(serviceTask);
|
ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
|
serviceTaskdept.setTaskId(serviceTask.getTaskid());
|
serviceTaskdept.setTaskName(serviceTask.getTaskName());
|
serviceTaskdept.setLongtask(0L);
|
serviceTaskdept.setGuid(serviceTask.getGuid());
|
serviceTaskdept.setOrgid(serviceTask.getOrgid());
|
serviceTaskdept.setOrgid(serviceTask.getOrgid());
|
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<String, Integer> map = new HashMap<>();
|
map.put("taskId", serviceTask.getTaskid().intValue());
|
return map;
|
}
|
|
//将任务信息放到服务表中
|
ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
|
serviceSubtask.setTaskid(serviceTask.getTaskid().longValue());
|
serviceSubtask.setTemplatename(tempName);
|
serviceSubtask.setTemplateid(tempid);
|
//新增
|
if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) {
|
for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) {
|
//将任务信息新增到随访服务表中
|
serviceSubtask.setSendname(patTaskRelevance.getName());
|
serviceSubtask.setAge(patTaskRelevance.getAge());
|
// serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
|
serviceSubtask.setSfzh(patTaskRelevance.getIdcardno());
|
serviceSubtask.setPhone(patTaskRelevance.getTelcode());
|
serviceSubtask.setAddr(patTaskRelevance.getAddr());
|
serviceSubtask.setPatid(patTaskRelevance.getPatid());
|
serviceSubtask.setCreateTime(DateUtils.getNowDate());
|
serviceSubtask.setSendstate(1L);
|
if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1)
|
serviceSubtask.setSendstate(2L);
|
serviceSubtask.setDeptcode(patTaskRelevance.getDeptCode());
|
serviceSubtask.setDeptname(patTaskRelevance.getDeptName());
|
serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
|
serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
|
serviceSubtask.setType(serviceTaskVO.getHospType());
|
serviceSubtask.setHospType(patTaskRelevance.getHospType());
|
serviceSubtask.setOpenid(patTaskRelevance.getOpenid());
|
serviceSubtask.setDrname(patTaskRelevance.getDrname());
|
serviceSubtask.setDrcode(patTaskRelevance.getDrcode());
|
serviceSubtask.setInhosptime(patTaskRelevance.getInhosptime());
|
serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
|
serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
|
serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
|
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);
|
if (serviceTaskVO.getLibtemplateid() != null)
|
serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid().toString());
|
serviceTask.setTemplateid(serviceTaskVO.getTemplateid());
|
serviceTask.setLongTask(serviceTaskVO.getLongTask());
|
serviceTaskService.updateServiceTask(serviceTask);
|
ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
|
serviceTaskdept.setTaskId(serviceTask.getTaskid());
|
serviceTaskdept.setTaskName(serviceTask.getTaskName());
|
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());
|
|
ServiceTaskdept st = new ServiceTaskdept();
|
st.setDeptCode(deptCode);
|
st.setTaskId(serviceTask.getTaskid());
|
List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptService.selectServiceTaskdeptList(st);
|
if (CollectionUtils.isEmpty(serviceTaskdepts)) {
|
serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept);
|
} else {
|
serviceTaskdeptService.updateServiceTaskdept(serviceTaskdept);
|
}
|
}
|
}
|
if (StringUtils.isNotEmpty(serviceTaskVO.getLeavehospitaldistrictcode())) {
|
String[] leavehospitaldistrictcodes = serviceTaskVO.getLeavehospitaldistrictcode().split(",");
|
for (String districtcode : leavehospitaldistrictcodes) {
|
serviceTaskdept.setDeptCode(districtcode);
|
serviceTaskdept.setDeptType("2");
|
serviceTaskdept.setServiceType(serviceTaskVO.getServiceType());
|
//先通过任务ID、部门code,判断ServiceTaskdept是否存在,不存在则新增,存在则修改
|
ServiceTaskdept st = new ServiceTaskdept();
|
st.setDeptCode(districtcode);
|
st.setTaskId(serviceTask.getTaskid());
|
List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptService.selectServiceTaskdeptList(st);
|
if (CollectionUtils.isEmpty(serviceTaskdepts)) {
|
serviceTaskdeptService.insertServiceTaskdept(serviceTaskdept);
|
} else {
|
serviceTaskdeptService.updateServiceTaskdept(serviceTaskdept);
|
}
|
}
|
}
|
if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) {
|
IvrTaskTemplate ivrTaskTemplate = new IvrTaskTemplate();
|
ivrTaskTemplate.setTaskid(serviceTaskVO.getIvrTaskTemplateVO().getTaskid());
|
ivrTaskTemplate.setId(serviceTaskVO.getIvrTaskTemplateVO().getId());
|
ivrTaskTemplateService.updateIvrTaskTemplate(ivrTaskTemplate);
|
} else if (ObjectUtils.isNotEmpty(serviceTaskVO.getSvyTaskTemplateVO())) {
|
SvyTaskTemplate svyTaskTemplate = new SvyTaskTemplate();
|
svyTaskTemplate.setTaskid(serviceTaskVO.getSvyTaskTemplateVO().getTaskid());
|
svyTaskTemplate.setId(serviceTaskVO.getSvyTaskTemplateVO().getId());
|
svyTaskTemplateService.updateSvyTaskTemplate(svyTaskTemplate);
|
}
|
|
if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1) {
|
//这里需要将任务id与任务模板ID,在任务模板中绑定
|
Map<String, Integer> map = new HashMap<>();
|
map.put("taskId", serviceTask.getTaskid().intValue());
|
return map;
|
}
|
if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) {
|
for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) {
|
ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
|
serviceSubtask.setSendname(patTaskRelevance.getName());
|
serviceSubtask.setAge(patTaskRelevance.getAge());
|
serviceSubtask.setSfzh(patTaskRelevance.getSfzh());
|
serviceSubtask.setPhone(patTaskRelevance.getTelcode());
|
serviceSubtask.setAddr(patTaskRelevance.getAddr());
|
serviceSubtask.setPatid(patTaskRelevance.getPatid());
|
serviceSubtask.setOpenid(patTaskRelevance.getOpenid());
|
serviceSubtask.setDeptcode(patTaskRelevance.getDeptCode());
|
serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
|
serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
|
serviceSubtask.setDeptname(patTaskRelevance.getDeptName());
|
serviceSubtask.setType(serviceTaskVO.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)
|
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());
|
}
|
serviceSubtask.getTaskid().intValue();
|
}
|
}
|
}
|
Map<String, Integer> map = new HashMap<>();
|
map.put("taskId", serviceTask.getTaskid().intValue());
|
return map;
|
}
|
|
|
@Override
|
public void phoneCallBack(PhoneCallBackVO phoneCallBackVO) {
|
phoneCallBackVO.setTextResult(phoneCallBackVO.getTextResult().substring(0, phoneCallBackVO.getTextResult().length() - 1));
|
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
|
|
//获取数据
|
Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid());
|
if (!aBoolean) {
|
throw new BaseException("该uuid不存在");
|
}
|
Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup");
|
PhoneUtils phoneUtils = new PhoneUtils();
|
if (hangupValue != null && hangupValue == 1) {
|
String date = simpleDateFormat1.format(new Date());
|
log.info("电话要挂断了: {}", date);
|
//hangupValue == 1 随访结束,直接可以挂电话
|
phoneUtils.hangup("", "", "", "", "", "", "", phoneCallBackVO.getUuid());
|
return;
|
}
|
|
Map<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid());
|
ServiceSubtask serviceSubtask = (ServiceSubtask) map.get("ServiceSubtask");
|
List<IvrTaskTemplateScriptVO> IvrTaskTemplateScriptVOs = (List<IvrTaskTemplateScriptVO>) map.get("IvrTaskTemplateScriptVO");
|
//将uuid更新到数据库中
|
serviceSubtask.setSenduuid(phoneCallBackVO.getUuid());
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
|
//获取模板信息
|
IvrTaskTemplateVO ivrTaskTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "IvrTaskTemplateVO");
|
|
//语音识别结果上报接口: 3
|
Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice");
|
QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
//将传回的结果放到回复对象中
|
returnQues.setContent(phoneCallBackVO.getTextResult());
|
|
IvrTaskTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
|
|
if (StringUtils.isEmpty(returnQues.getContent())) {
|
//无回话
|
//判断noVoice是否已经到了最大值
|
if (noVoice == ivrTaskTemplateVO.getNoVoiceNum().intValue()) {
|
//已经问了对应的遍数,就判断是否还有下一题
|
if (nowQuestion.getTargetid() == IvrTaskTemplateScriptVOs.size()) {
|
ServiceSubtask ss = new ServiceSubtask();
|
ss.setId(serviceSubtask.getId());
|
ss.setSendstate(5L);
|
ss.setRemark("电话无响应");
|
serviceSubtaskMapper.updateServiceSubtask(ss);
|
//没有下一题了,就挂断电话,播放结束语
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
return;
|
} else {
|
//有下一题
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
IvrTaskTemplateScriptVO nextQuestion = getNextQuestion(IvrTaskTemplateScriptVOs, nowQuestion);
|
// 问题, 去调用“tts合成和播放”接口
|
String date = simpleDateFormat1.format(new Date());
|
log.info("去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
phoneUtils.ttsPlayback(nowQuestion.getIvrtext(), phoneCallBackVO.getUuid());
|
}
|
} else {
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES);
|
//调用ivrLibaTemplateScriptVO中的slienceText(静默话术)
|
String slienceText = nowQuestion.getSlienceText();
|
//静默话术 + 问题, 去调用“tts合成和播放”接口
|
String date = simpleDateFormat1.format(new Date());
|
log.info("静默话术 + 问题,去调用tts合成和播放接口: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
phoneUtils.ttsPlayback(slienceText + nowQuestion.getIvrtext(), phoneCallBackVO.getUuid());
|
return;
|
}
|
|
} else {
|
//isppd用来记录是否匹配到
|
Boolean isppd = false;
|
//有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行)
|
for (int j = 0; j < nowQuestion.getIvrTaskScriptTargetoptionList().size(); j++) {
|
//包含
|
Matcher matcher = null;
|
if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex())) {
|
Pattern pattern = Pattern.compile(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex());
|
matcher = pattern.matcher(phoneCallBackVO.getTextResult());
|
}
|
//不包含
|
Matcher matcher2 = null;
|
if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2())) {
|
Pattern pattern2 = Pattern.compile(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2());
|
matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult());
|
}
|
log.error("PCB--getQuestionText问题为:{},UUID:{}", nowQuestion.getIvrtext(), phoneCallBackVO.getUuid());
|
if (StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() || StringUtils.isEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
|
//说明匹配正确了
|
//这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法
|
nowQuestion.getIvrTaskScriptTargetoptionList().get(j).setIsUserOperation(1);
|
serviceTaskScriptTargetoptionMapper.updateIvrTaskTemplateTargetoption(nowQuestion.getIvrTaskScriptTargetoptionList().get(j));
|
|
//将静默置为0
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
|
//将患者的回签写进表里
|
IvrTaskVisitResult serviceTaskVisitResult = DtoConversionUtils.sourceToTarget(serviceSubtask, IvrTaskVisitResult.class);
|
serviceTaskVisitResult.setId(null);
|
serviceTaskVisitResult.setQuestion(nowQuestion.getIvrtext());
|
serviceTaskVisitResult.setPatientAnswer(phoneCallBackVO.getTextResult());
|
serviceTaskVisitResult.setCreateTime(new Date());
|
serviceTaskVisitResult.setOptionResult(nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getTargetvalue());
|
serviceTaskVisitResultMapper.insertIvrTaskVisitResult(serviceTaskVisitResult);
|
|
//将匹配到的标识改成true
|
isppd = true;
|
|
//获取下一题
|
Long nextQuestion = nowQuestion.getIvrTaskScriptTargetoptionList().get(j).getNextQuestion();
|
for (IvrTaskTemplateScriptVO script : IvrTaskTemplateScriptVOs) {
|
if (script.getTargetid() == nextQuestion) {
|
QuestionMessage questionMessage = new QuestionMessage();
|
questionMessage.setNowQuestion(script);
|
questionMessage.setQuestionList(IvrTaskTemplateScriptVOs);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
phoneUtils.ttsPlayback(script.getIvrtext(), phoneCallBackVO.getUuid());
|
return;
|
} else if (nextQuestion > IvrTaskTemplateScriptVOs.size()) {
|
//没有下一题了,就结束了
|
ServiceSubtask ss = new ServiceSubtask();
|
ss.setId(serviceSubtask.getId());
|
ss.setSendstate(6L);
|
serviceSubtaskMapper.updateServiceSubtask(ss);
|
String date = simpleDateFormat1.format(new Date());
|
log.error("没有下一题了,就结束了: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
try {
|
Thread.sleep(3000);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
phoneUtils.hangup("", "", ivrTaskTemplateVO.getRevisitAfter(), "", "", "", "", phoneCallBackVO.getUuid());
|
return;
|
}
|
}
|
return;
|
} else {
|
//没有匹配上当前option
|
//Targetregex2 为false,表示在Targetregex2中存在 语句中的关键字,这个option就不用再继续匹配了,直接匹配下一个option
|
continue;
|
}
|
}
|
|
if (isppd != true) {
|
//没有匹配到
|
Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum");
|
if (mateNum == null) mateNum = 0;
|
//无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了
|
if (mateNum == ivrTaskTemplateVO.getMateNum().intValue()) {
|
//如果下一题为空.则新的数据返回,并加上感谢语
|
if (nowQuestion.getTargetid() < IvrTaskTemplateScriptVOs.size()) {
|
QuestionMessage questionMessage = new QuestionMessage();
|
IvrTaskTemplateScriptVO nextQuestion = getNextQuestion(IvrTaskTemplateScriptVOs, nowQuestion);
|
questionMessage.setQuestionList(IvrTaskTemplateScriptVOs);
|
questionMessage.setNowQuestion(nextQuestion);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
String date = simpleDateFormat1.format(new Date());
|
log.info("如果下一题为空.则新的数据返回,并加上感谢语: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
phoneUtils.ttsPlayback(nextQuestion.getIvrtext(), phoneCallBackVO.getUuid());
|
return;
|
} else {
|
//就可以挂断电话了
|
ServiceSubtask ss = new ServiceSubtask();
|
ss.setId(serviceSubtask.getId());
|
ss.setSendstate(6L);
|
serviceSubtaskMapper.updateServiceSubtask(ss);
|
|
String date = simpleDateFormat1.format(new Date());
|
log.info("就可以挂断电话了------: {},uuid为:{}", date, phoneCallBackVO.getUuid());
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
phoneUtils.ttsPlayback(ivrTaskTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
try {
|
Thread.sleep(3000);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
phoneUtils.hangup("", "", ivrTaskTemplateVO.getRevisitAfter(), "", "", "", "", phoneCallBackVO.getUuid());
|
return;
|
}
|
} else if (mateNum < ivrTaskTemplateVO.getMateNum().intValue()) {
|
//没有问到规定次数
|
mateNum = mateNum + 1;
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES);
|
}
|
}
|
//选项匹配完成后,需要再去通过库再进行匹配一次
|
String extemplateID = ivrTaskTemplateVO.getSubmoduleID();
|
String[] split = extemplateID.split(",");
|
List<String> list = Arrays.asList(split);
|
List<Long> list1 = new ArrayList<>();
|
if (StringUtils.isNotEmpty(extemplateID)) {
|
for (String str : list) {
|
list1.add(Long.valueOf(str));
|
}
|
List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
|
for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
|
Matcher matcher = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
|
Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
|
matcher = pattern.matcher(returnQues.getContent());
|
}
|
|
Matcher matcher2 = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
|
Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
|
matcher2 = pattern2.matcher(returnQues.getContent());
|
}
|
log.error("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
|
QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = returnQues.getNowQuestion();
|
ivrTaskTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
|
ivrTaskTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
if (ivrLibaExtemplatescript.getIsEnd() == 1) {
|
//将问题置空
|
IvrTaskTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion();
|
nowQuestion1.setScriptContent(null);
|
nowQuestion1.setScriptVoice(null);
|
questionMessage.setNowQuestion(nowQuestion1);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES);
|
}
|
//调用“15、tts合成和播放, tts_playback”将结果传回
|
String date = simpleDateFormat1.format(new Date());
|
log.info("调用“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<String, String> req = new HashMap<>();
|
req.put("uuid", phoneCallReqYQVO.getUuid());
|
req.put("caller", phoneCallReqYQVO.getPhone());
|
HttpUtil.postJsonRequest(hangup, new Gson().toJson(req));
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- hangup", "1", 2, TimeUnit.MINUTES);
|
//先把默认的recordAccept-hungup删除,再更新
|
redisCache.deleteObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
|
redisCache.setCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES);
|
//这个时候就需要走补偿机制了,先暂定走短信
|
getSmsCompensate(Long.valueOf(phoneCallReqYQVO.getTaskid()));
|
return new PhoneCallBackYQVO();
|
}
|
}
|
//定义一个分数的变量
|
Boolean aBoolean1 = redisCache.hasKey(phoneCallReqYQVO.getUuid() + "SCORE");
|
if (!aBoolean1) redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "SCORE", 0.0, 120, TimeUnit.MINUTES);
|
PhoneCallBackYQVO phoneCallBackYQVO = new PhoneCallBackYQVO();
|
//channel_create 通道创建的时候,可以执行一些其它操作,譬如发个短信之类的; 我们的业务可以不用管 PlayEventCallback 这个是播放语音的,暂时用不到 End_time()= -1或null表示当前的asrtext不是一句完整的话
|
if (phoneCallReqYQVO.getOperate().equals("channel_create")) {
|
return phoneCallBackYQVO;
|
}
|
//PlayEventCallback 这个是播放语音的 playstart:放音开始(问题播报开始) playstop: 放音结束(问题播报结束)
|
if (phoneCallReqYQVO.getOperate().equals("PlayEventCallback")) {
|
String cacheJSY = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- jsy");
|
if (phoneCallReqYQVO.getOperate().equals("PlayEventCallback") && phoneCallReqYQVO.getPlaystop() == false) {
|
//判断redis中是否有结束语
|
if (StringUtils.isEmpty(cacheJSY)) {
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop", false, 120, TimeUnit.MINUTES);
|
log.error("PlayEventCallbackPlaystop的值为-------:{}", false);
|
}
|
} else {
|
//如果结束语不为空,则要挂电话了
|
if (StringUtils.isNotEmpty(cacheJSY)) {
|
Map<String, String> req = new HashMap<>();
|
req.put("uuid", phoneCallReqYQVO.getUuid());
|
req.put("caller", phoneCallReqYQVO.getPhone());
|
// HttpUtils.sendPost(hangup, new Gson().toJson(req));
|
HttpUtil.postJsonRequest(hangup, new Gson().toJson(req));
|
//删除结束语的患存
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "- jsy");
|
} else {
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop", true, 120, TimeUnit.MINUTES);
|
log.error("-------PlayEventCallbackPlaystop的值为:{}", true);
|
}
|
}
|
return phoneCallBackYQVO;
|
}
|
//获取放音是否结束
|
Object isPlayEventOverObj = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop");
|
if (ObjectUtils.isNotEmpty(isPlayEventOverObj)) {
|
Boolean isPlayEventOver = (Boolean) isPlayEventOverObj;
|
if (!isPlayEventOver) {
|
return phoneCallBackYQVO;
|
}
|
}
|
|
//通过子任务ID获取到模板信息
|
ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid()));
|
IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid());
|
//获取模板问题
|
IvrTaskTemplateScript ivrTaskTemplateScript = new IvrTaskTemplateScript();
|
ivrTaskTemplateScript.setTemplateID(serviceSubtask.getTemplateid());
|
List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
|
//获取问题ID 和 序号
|
String scriptId = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid().trim() + "-" + phoneCallReqYQVO.getPhone().trim());
|
log.error("scriptId是多少:{}", scriptId);
|
//当前题的信息
|
IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = iIvrTaskTemplateScriptService.getTaskTempScriptInfoByid(Long.valueOf(scriptId));
|
//判断UUID是否存在
|
Boolean aBoolean = redisCache.hasKey(phoneCallReqYQVO.getUuid());
|
if (!aBoolean) {
|
//给静默设置一个默认次数在redis中
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
//如果不存在,就把当前的UUID做为key,放到对象中去
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid(), phoneCallReqYQVO, 120, TimeUnit.MINUTES);
|
}
|
|
if ("SilentCallback".equals(phoneCallReqYQVO.getOperate())) {
|
//如果是静默回调
|
Integer num = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "noVoice");
|
//判断静默回调次数是否小与模板规定的次数
|
if (num < ivrTaskTemplate.getNoVoiceNum()) {
|
//小与的话,就继续问患者
|
phoneCallBackYQVO.setType("text");
|
phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue());
|
String scriptContent = ivrTaskTemplateScriptVO.getIvrtext();
|
log.error("SilentCallback的问题内容scriptContent:{}", scriptContent);
|
phoneCallBackYQVO.setValue(getObject(serviceSubtask, scriptContent));
|
//将静默次数加1
|
Integer noVoiceNum = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "noVoice");
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "noVoice", noVoiceNum + 1, 120, TimeUnit.MINUTES);
|
return phoneCallBackYQVO;
|
} else {
|
log.error("静默次数达到,挂掉电话:{}", num);
|
ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
ServiceSubtask ss = new ServiceSubtask();
|
ss.setId(serviceSubtask.getId());
|
ss.setSendstate(5L);
|
ss.setRemark("电话静默");
|
serviceSubtaskMapper.updateServiceSubtask(ss);
|
//大与等于的话,直接挂断
|
phoneCallBackYQVO.setType("text");
|
phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue());
|
phoneCallBackYQVO.setValue(serviceTask1.getJsy());
|
//将结果写到detail中
|
ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq();
|
List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>();
|
serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate));
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList);
|
serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid());
|
serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(serviceSubTaskDetailReq);
|
//去redis中,把该子任务ID删除
|
Long id = serviceSubtask.getId();
|
//先更新一下分数
|
double score = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "SCORE");
|
serviceSubtask.setScore(BigDecimal.valueOf(score));
|
serviceSubtask.setFinishtime(new Date());
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
Map<String, String> map = delRedisValue(null, id.toString());
|
if (ObjectUtils.isNotEmpty(map)) redisCache.setCacheObject(map.get("cacheName"), map.get("val"));
|
redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop");
|
//在redis中保存一下结束语,在调用挂电话的方法时删除
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES);
|
}
|
return phoneCallBackYQVO;
|
} else if ("AsrCallback".equals(phoneCallReqYQVO.getOperate()) && phoneCallReqYQVO.getEnd_time() != null && phoneCallReqYQVO.getEnd_time() != -1) {
|
//做一个标识,用来在通话详情接口里,判断是否有人接电话(value=2,表示有人接)
|
redisCache.deleteObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
|
redisCache.setCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup", "2", 10, TimeUnit.MINUTES);
|
// 先对通话进行通用库匹配一次
|
String extemplateID = ivrTaskTemplate.getSubmoduleID();
|
if (StringUtils.isNotEmpty(extemplateID)) {
|
String[] split = extemplateID.split(",");
|
List<String> list = Arrays.asList(split);
|
List<Long> list1 = new ArrayList<>();
|
for (String str : list) {
|
list1.add(Long.valueOf(str));
|
}
|
List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
|
IvrLibaExtemplatescript les = null;
|
for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
|
Matcher matcher = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
|
Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
|
matcher = pattern.matcher(phoneCallReqYQVO.getAsrtext());
|
}
|
|
Matcher matcher2 = null;
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
|
Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
|
matcher2 = pattern2.matcher(phoneCallReqYQVO.getAsrtext());
|
}
|
if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
|
//将通用库匹配的,放到返回值中
|
// phoneCallBackYQVO.setValue(phoneCallBackYQVO.getValue() + ivrLibaExtemplatescript.getSwitchText());
|
phoneCallBackYQVO.setCommonValue(ivrLibaExtemplatescript.getSwitchText());
|
les = ivrLibaExtemplatescript;
|
}
|
break;
|
}
|
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<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>();
|
ivrTaskTemplateScriptVO.setExtemplateText(les.getSwitchText());
|
serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate));
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList);
|
serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid());
|
serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(serviceSubTaskDetailReq);
|
return phoneCallBackYQVO;
|
}
|
}
|
}
|
|
//如果是文本回调
|
//根据问题ID获取该问题的类型
|
if (ivrTaskTemplateScriptVO.getScriptType().equals("1")) {
|
//用来标记,是否有匹配上的
|
Integer flag = 0;
|
//是选择题
|
for (int j = 0; j < ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size(); j++) {
|
log.error("phoneCallReqYQVO.getAsrtext()的值为:{}", phoneCallReqYQVO.getAsrtext());
|
if (StringUtils.isEmpty(phoneCallReqYQVO.getAsrtext())) {
|
continue;
|
}
|
//包含
|
Matcher matcher = null;
|
if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex())) {
|
Pattern pattern = Pattern.compile(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex());
|
matcher = pattern.matcher(phoneCallReqYQVO.getAsrtext());
|
}
|
//不包含
|
Matcher matcher2 = null;
|
if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2())) {
|
Pattern pattern2 = Pattern.compile(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2());
|
matcher2 = pattern2.matcher(phoneCallReqYQVO.getAsrtext());
|
}
|
if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() || StringUtils.isEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
|
//说明匹配正确了
|
//这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法
|
ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).setIsUserOperation(1);
|
serviceTaskScriptTargetoptionMapper.updateIvrTaskTemplateTargetoption(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j));
|
|
//将患者的回签写进service_subtask_detail中
|
ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq();
|
List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>();
|
ivrTaskTemplateScriptVO.setQuestionResult(ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getOptiondesc());
|
ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate);
|
//修改一下语音路径(改成前端可以访问的,存到数据库中)
|
if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) {
|
String questionvoice = serviceSubtaskDetail.getQuestionvoice();
|
String[] split = questionvoice.split("\\\\");
|
if (split.length > 0) {
|
String lastPart = split[split.length - 1];
|
serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart);
|
}
|
}
|
serviceSubtaskDetailList.add(serviceSubtaskDetail);
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList);
|
serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid());
|
serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(serviceSubTaskDetailReq);
|
//判断一下,这个选项结果是不是还有继续问下去的必要,例如选项结果是别人不想继续回答问题,就要结束掉
|
if (ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().get(j).getIsEnd() == 1) {
|
redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop");
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "noVoice");
|
//在redis中保存一下结束语,在调用挂电话的方法时删除
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES);
|
phoneCallBackYQVO.setType("text");
|
phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask.getJsy());
|
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<ServiceSubtaskDetail> serviceSubtaskDetailList2 = new ArrayList<>();
|
serviceSubtaskDetailList.add(getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate));
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList2);
|
ssdReq.setGuid(phoneCallReqYQVO.getGuid());
|
ssdReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(ssdReq);
|
return phoneCallBackYQVO;
|
}
|
|
for (IvrTaskTemplateScript script : ivrTaskTemplateScripts) {
|
if (script.getSort() == nextQuestion.intValue()) {
|
phoneCallBackYQVO.setType("text");
|
phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue());
|
String scriptContent = 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<String, String> map = delRedisValue(null, id.toString());
|
log.error("map的值为:{}", map);
|
if (ObjectUtils.isNotEmpty(map))
|
redisCache.setCacheObject(map.get("cacheName"), map.get("val"));
|
redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
|
redisCache.deleteObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid());
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop");
|
//在redis中保存一下结束语,在调用挂电话的方法时删除
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES);
|
// return phoneCallBackYQVO;
|
|
}
|
} else {
|
//flag=0,说明没 匹配上,也要把患者说的话记录下来
|
if (j == ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList().size() - 1 && flag == 0) {
|
ServiceSubTaskDetailReq serviceSubTaskDetailReq = new ServiceSubTaskDetailReq();
|
List<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>();
|
ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate);
|
//修改一下语音路径(改成前端可以访问的,存到数据库中)
|
if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) {
|
String questionvoice = serviceSubtaskDetail.getQuestionvoice();
|
String[] split = questionvoice.split("\\\\");
|
if (split.length > 0) {
|
String lastPart = split[split.length - 1];
|
serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart);
|
}
|
}
|
serviceSubtaskDetailList.add(serviceSubtaskDetail);
|
//如果没有 匹配上,这个必须为null
|
serviceSubtaskDetailList.get(0).setMatchedtext("");
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList);
|
serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid());
|
serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(serviceSubTaskDetailReq);
|
}
|
continue;
|
}
|
}
|
//都没有匹配到
|
if (StringUtils.isEmpty(phoneCallBackYQVO.getValue())) {
|
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<String, String> 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<ServiceSubtaskDetail> serviceSubtaskDetailList = new ArrayList<>();
|
ServiceSubtaskDetail serviceSubtaskDetail = getServiceSubtaskDetail(phoneCallReqYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate);
|
//修改一下语音路径(改成前端可以访问的,存到数据库中)
|
if (StringUtils.isNotEmpty(serviceSubtaskDetail.getQuestionvoice())) {
|
String questionvoice = serviceSubtaskDetail.getQuestionvoice();
|
String[] split = questionvoice.split("\\\\");
|
if (split.length > 0) {
|
String lastPart = split[split.length - 1];
|
serviceSubtaskDetail.setQuestionvoice(voicePathPrefix + lastPart);
|
}
|
}
|
serviceSubtaskDetailList.add(serviceSubtaskDetail);
|
serviceSubTaskDetailReq.setServiceSubtaskDetailList(serviceSubtaskDetailList);
|
serviceSubTaskDetailReq.setGuid(phoneCallReqYQVO.getGuid());
|
serviceSubTaskDetailReq.setOrgid(phoneCallReqYQVO.getOrgid());
|
saveQuestionAnswerPhone(serviceSubTaskDetailReq);
|
// String xh = idSort.split("-")[1];
|
|
//如果选项分支为1的话,则需要根据问题上的nextScriptno进行跳转
|
//问答题没有跳转
|
if (ivrTaskTemplateScriptVO.getNextScriptno() != null && ivrTaskTemplateScriptVO.getNextScriptno() != 0) {
|
for (IvrTaskTemplateScript ivrTaskTemplateScript1 : ivrTaskTemplateScripts) {
|
if (ivrTaskTemplateScriptVO.getNextScriptno().intValue() == ivrTaskTemplateScript1.getSort()) {
|
phoneCallBackYQVO.setType("text");
|
phoneCallBackYQVO.setSilent_interval(ivrTaskTemplate.getSilencetime().intValue());
|
String scriptContent = 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<String, String> map = delRedisValue(null, id.toString());
|
redisCache.setCacheObject(map.get("cacheName"), map.get("val"));
|
//在redis中保存一下结束语,在调用挂电话的方法时删除
|
redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask1.getJsy(), 120, TimeUnit.MINUTES);
|
redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
|
redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
|
}
|
}
|
}
|
log.error("phoneCallBackYQVO的返回值是:{}", phoneCallBackYQVO);
|
return phoneCallBackYQVO;
|
}
|
|
|
private String getObject(ServiceSubtask serviceSubtask, String scriptContent) {
|
Map<String, Map<String, String>> param = getParam(serviceSubtask.getTaskid());
|
for (Map<String, String> map : param.values()) {
|
for (String key : map.keySet()) {
|
scriptContent = scriptContent.replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : "");
|
}
|
}
|
scriptContent = scriptContent.replace("${name}", StringUtils.isNotEmpty(serviceSubtask.getSendname()) ? serviceSubtask.getSendname() : "");
|
scriptContent = scriptContent.replace("${dzz}", StringUtils.isNotEmpty(serviceSubtask.getAddr()) ? serviceSubtask.getAddr() : "");
|
scriptContent = scriptContent.replace("${phone}", StringUtils.isNotEmpty(serviceSubtask.getTelcode()) ? serviceSubtask.getTelcode() : "");
|
|
return scriptContent;
|
}
|
|
|
/**
|
* 获取任务里的通配符
|
*
|
* @param taskId
|
* @return
|
*/
|
private Map<String, Map<String, String>> getParam(Long taskId) {
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskId);
|
ObjectMapper objectMapper = new ObjectMapper();
|
Map<String, Map<String, String>> serviceTaskMap = null;
|
try {
|
serviceTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class);
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
}
|
return serviceTaskMap;
|
}
|
|
private Map<String, String> delRedisValue(String cache, String id) {
|
id = "," + id + ",";
|
String val = "";
|
String cacheName = "";
|
Map<String, String> map = new HashMap<>();
|
|
if (StringUtils.isNotEmpty(cache)) {
|
val = redisCache.getCacheObject(cache);
|
if (!StringUtils.isEmpty(val)) {
|
if (val.contains(id)) {
|
val = val.replaceAll(id, "");
|
}
|
}
|
map.put("val", val);
|
map.put("cacheName", cache);
|
return map;
|
}
|
|
for (int i = 0; i < 6; i++) {
|
val = redisCache.getCacheObject("cache-0" + i);
|
if (!StringUtils.isEmpty(val)) {
|
if (val.contains(id)) {
|
val = val.replaceAll(id, "");
|
map.put("val", val);
|
map.put("cacheName", "cache-0" + i);
|
}
|
}
|
}
|
return map;
|
}
|
|
|
/**
|
* 雨绮任务拉取
|
*
|
* @return
|
*/
|
@Override
|
public List<PullTaskVO> taskPull() {
|
//pullTaskVOList用于数据返回
|
List<PullTaskVO> pullTaskVOList = new ArrayList<>();
|
List<String> cacheList = new ArrayList<>();
|
ListOperations<String, String> listOps = redisTemplate.opsForList();
|
//必须等ache-exist全部打完才能拉取下一批(主要是怕所有的数据都堆在电话的缓存里,在规定的时间打不完)
|
long existSize = listOps.size("cache-exist");
|
if (existSize > 0) return pullTaskVOList;
|
|
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<String> value = listOps.range("cache-0" + i, 0, count1 - 1);
|
|
List<PullTaskVO> pullTaskVOList2 = getPullTaskList(value, "cache-" + i);
|
if (CollectionUtils.isNotEmpty(pullTaskVOList2) && pullTaskVOList2.size() > 0) {
|
pullTaskVOList.addAll(pullTaskVOList2);
|
}
|
//将处理过的数据删除
|
listOps.trim("cache-0" + i, count1, -1);
|
}
|
}
|
//existList用来记录接下来需要执行的子任务ID
|
List<String> existList = new ArrayList<>();
|
if (CollectionUtils.isNotEmpty(pullTaskVOList)) {
|
//给回调参数赋值
|
for (PullTaskVO pullTaskVO : pullTaskVOList) {
|
existList.add(pullTaskVO.getTaskid());
|
pullTaskVO.setAsrcallback(ASRCallBackPath);
|
}
|
}
|
if (existList.size() != 0) redisCache.setCacheListRight("cache-exist", existList);
|
log.error("-----------实际拉取的电话数据量:{}", pullTaskVOList.size());
|
return pullTaskVOList;
|
}
|
|
|
private List<PullTaskVO> getPullTaskList(List<String> subIds, String cacheName) {
|
log.error("任务拉取subIds的值是多少:{}", subIds);
|
//pullTaskVOList用于数据返回
|
List<PullTaskVO> pullTaskVOList = new ArrayList<>();
|
//newValue0用于保存没有处理的子 任务
|
// String newValue0 = "";
|
List<String> newValue0 = new ArrayList<>();
|
//根据,获取子任务的ID
|
// String[] split = subIds.split(",,");
|
for (int i = 0; i < subIds.size(); i++) {
|
if (cacheName.equals("cache-0") && i < subIds.size() || !cacheName.equals("cache-0") && i < 1) {
|
PullTaskVO pullTaskVO = new PullTaskVO();
|
String subId = subIds.get(i).trim();
|
ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(subId));
|
if (ObjectUtils.isEmpty(serviceSubtask)) {
|
log.error("该subId有问题,在表中查询不到:{}", subId);
|
continue;
|
}
|
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
|
IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid());
|
if (ObjectUtils.isEmpty(ivrTaskTemplate)) continue;
|
//通过任务模板中的"第一次问题编号"获取第一个问题;
|
IvrTaskTemplateScript ivrTaskTemplateScript = null;
|
IvrTaskTemplateScript ivrTaskTemplateScript1 = new IvrTaskTemplateScript();
|
ivrTaskTemplateScript1.setTemplateID(ivrTaskTemplate.getId());
|
List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript1);
|
aa:
|
for (IvrTaskTemplateScript ivrTaskTemplateScript2 : ivrTaskTemplateScripts) {
|
if (ivrTaskTemplate.getFirstQuestionNum() == Long.valueOf(ivrTaskTemplateScript2.getSort())) {
|
ivrTaskTemplateScript = ivrTaskTemplateScript2;
|
break aa;
|
}
|
}
|
//如果ivrTaskTemplateScript为空,也就没有往下执行的必要了
|
if (ObjectUtils.isEmpty(ivrTaskTemplateScript)) return null;
|
//获取通配符匹配过后的问题
|
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<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid());
|
//// ObjectMapper objectMapper = new ObjectMapper();
|
//// Map<String, Object> map = null;
|
//// try {
|
//// map = objectMapper.readValue(cacheObject, Map.class);
|
//// } catch (JsonProcessingException e) {
|
//// e.printStackTrace();
|
//// }
|
//
|
// ServiceSubtask ServiceSubtask = (ServiceSubtask) map.get("ServiceSubtask");
|
// List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOs = (List<IvrLibaTemplateScriptVO>) map.get("ivrLibaTemplateScriptVO");
|
// //将uuid更新到数据库中
|
// ServiceSubtask.setSenduuid(phoneCallBackVO.getUuid());
|
// ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
|
//
|
// //获取模板信息
|
// IvrLibaTemplateVO ivrLibaTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "ivrLibaTemplateVO");
|
//
|
//
|
// //首先判断resultType
|
// if (phoneCallBackVO.getResultType() == 1) {
|
// //呼叫结果接口: 1
|
// if (phoneCallBackVO.getUint8() == 1) {
|
// //呼叫失败,去redis中记录一下失败次数,进行再次呼叫
|
// Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "uint8");
|
// if (integer != null) {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", integer + 1, 120, TimeUnit.MINUTES);
|
// } else {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", 1, 120, TimeUnit.MINUTES);
|
// }
|
//
|
// if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) {
|
// log.info("无人接听:{}, {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid());
|
// //连续打规定次,如果要没人接,那就结束
|
// ServiceSubtask.setResult(phoneCallBackVO.getErrResult());
|
// ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8");
|
// } else if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) {
|
// //进行重拨
|
// PhoneUtils phoneUtils = new PhoneUtils();
|
// phoneUtils.ob(null, null, null, null, null, null, null, ServiceSubtask.getPhone(), phoneCallBackVO.getUuid(), true);
|
// }
|
// }
|
//
|
// } else if (phoneCallBackVO.getResultType() == 2) {
|
// //通话状态更新接口: 2
|
// if (phoneCallBackVO.getEnumState() == 0) {
|
// // 0-振铃
|
// Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "enumState");
|
//
|
// if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", integer + 1, 120, TimeUnit.MINUTES);
|
// } else if (integer == null) {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", 1, 120, TimeUnit.MINUTES);
|
// } else if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) {
|
// ServiceSubtask.setResult("无人接听");
|
// ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
|
// }
|
// } else if (phoneCallBackVO.getEnumState() == 2) {
|
// //患者挂断电话
|
// log.info("患者挂断电话:{}", phoneCallBackVO.getUuid());
|
// ServiceSubtask.setResult(phoneCallBackVO.getHangUpResult());
|
// ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
|
// redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
|
// }
|
//
|
//
|
// } else if (phoneCallBackVO.getResultType() == 3) {
|
// //语音识别结果上报接口: 3
|
// Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice");
|
// QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
// IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
|
// PhoneUtils phoneUtils = new PhoneUtils();
|
//
|
// if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) {
|
// //无回话
|
// //判断noVoice是否已经到了最大值
|
// if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) {
|
// //已经问了对应的遍数,就判断是否还有下一题
|
// if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) {
|
// //没有下一题了,就挂断电话,播放结束语
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
// phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
// } else {
|
// //有下一题
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
// IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
|
// // 问题, 去调用“tts合成和播放”接口
|
// phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
|
// }
|
// } else {
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES);
|
// //调用ivrLibaTemplateScriptVO中的slienceText(静默话术)
|
// String slienceText = nowQuestion.getSlienceText();
|
// //静默话术 + 问题, 去调用“tts合成和播放”接口
|
// phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
|
// return new PhoneCallBackVO();
|
// }
|
//
|
// } else {
|
// //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行)
|
// for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) {
|
// //包含
|
// Matcher matcher = null;
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) {
|
// Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
|
// matcher = pattern.matcher(phoneCallBackVO.getTextResult());
|
// }
|
// //不包含
|
// Matcher matcher2 = null;
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) {
|
// Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
|
// matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult());
|
// }
|
// log.info("phoneCallBack--Targetregex的值为:{}, phoneCallBack--Targetregex2的值为:{}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
|
// if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
|
// //说明匹配正确了
|
// //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法
|
// nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true);
|
// ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j));
|
//
|
//
|
// //将静默置为0
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
// //获取下一题
|
// Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion();
|
// for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) {
|
// if (script.getTargetid() == nextQuestion) {
|
// QuestionMessage questionMessage = new QuestionMessage();
|
// questionMessage.setNowQuestion(script);
|
// questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// break;
|
// }
|
// }
|
// break;
|
// } else {
|
// //没有匹配到
|
// Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum");
|
// //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了
|
// if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
|
// //如果下一题为空.则新的数据返回,并加上感谢语
|
// if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) {
|
// QuestionMessage questionMessage = new QuestionMessage();
|
// IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
|
// questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
|
// questionMessage.setNowQuestion(nextQuestion);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
|
// } else {
|
// //就可以挂断电话了
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
|
// phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
|
// break;
|
// }
|
// } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
|
// //没有问到规定次数
|
// mateNum = mateNum + 1;
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES);
|
// }
|
// }
|
//
|
// }
|
// //选项匹配完成后,需要再去通过库再进行匹配一次
|
// String extemplateID = ivrLibaTemplateVO.getSubmoduleID();
|
// String[] split = extemplateID.split(",");
|
// List<String> list = Arrays.asList(split);
|
// List<Long> list1 = new ArrayList<>();
|
// if (StringUtils.isNotEmpty(extemplateID)) {
|
// for (String str : list) {
|
// list1.add(Long.valueOf(str));
|
// }
|
// List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
|
// for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
|
// Matcher matcher = null;
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
|
// Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
|
// matcher = pattern.matcher(returnQues.getContent());
|
// }
|
//
|
// Matcher matcher2 = null;
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
|
// Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
|
// matcher2 = pattern2.matcher(returnQues.getContent());
|
// }
|
// log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
|
// if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
|
// QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
|
// IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion();
|
// ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
|
// ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
// if (ivrLibaExtemplatescript.getIsEnd() == 1) {
|
// //将问题置空
|
// IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion();
|
// nowQuestion1.setQuestionText(null);
|
// nowQuestion1.setQuestionVoice(null);
|
// questionMessage.setNowQuestion(nowQuestion1);
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
|
//
|
// redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES);
|
// }
|
//
|
// //调用“15、tts合成和播放, tts_playback”将结果传回
|
//
|
//
|
// }
|
// break;
|
// }
|
// }
|
//
|
// }
|
// }
|
// return phoneCallBackVO;
|
// }
|
|
@Override
|
public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) {
|
int i = 0;
|
if (StringUtils.isNotEmpty(serviceSubTaskDetailReq.getParam1())) {
|
RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
|
Long tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam1(), pri_key));
|
Long pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam2(), pri_key));
|
ServiceSubtaskVO ivrTaskSingle = new ServiceSubtaskVO();
|
ivrTaskSingle.setTaskid(tid);
|
ivrTaskSingle.setPatid(pid);
|
List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ivrTaskSingle);
|
if (CollectionUtils.isEmpty(selectServiceSubtaskList) || selectServiceSubtaskList.size() == 0) {
|
log.error("报错了,selectServiceSubtaskList数据为空了:{}", ivrTaskSingle);
|
return 0;
|
}
|
//随访
|
for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) {
|
serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId());
|
serviceSubtaskDetail.setId(UUID.randomUUID().toString());
|
serviceSubtaskDetail.setCreateTime(new Date());
|
serviceSubtaskDetail.setGuid(selectServiceSubtaskList.get(0).getGuid());
|
serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid());
|
serviceSubtaskDetail.setGuid(serviceSubTaskDetailReq.getGuid());
|
i = serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
|
}
|
} else {
|
if (serviceSubTaskDetailReq != null && CollectionUtils.isNotEmpty(serviceSubTaskDetailReq.getServiceSubtaskDetailList())) {
|
for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) {
|
serviceSubtaskDetail.setCreateTime(new Date());
|
serviceSubtaskDetail.setGuid(serviceSubTaskDetailReq.getGuid());
|
serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid());
|
//先根据子任务id,任务ID和问题序号查询一下,该问题是否已经有值,如果有值,直接修改,如果为空,直接插入
|
ServiceSubtaskDetail ssd = new ServiceSubtaskDetail();
|
ssd.setSubId(serviceSubtaskDetail.getSubId());
|
ssd.setTaskid(serviceSubtaskDetail.getTaskid());
|
ssd.setTemplatequestionnum(serviceSubtaskDetail.getTemplatequestionnum());
|
if (serviceSubtaskDetail.getSubId() != null) {
|
ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId());
|
ssd.setGuid(serviceSubtask.getGuid());
|
ssd.setOrgid(serviceSubtask.getOrgid());
|
}
|
List<ServiceSubtaskDetail> serviceSubtaskDetails = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(ssd);
|
if (CollectionUtils.isNotEmpty(serviceSubtaskDetails) && StringUtils.isNotEmpty(serviceSubtaskDetails.get(0).getMatchedtext())) {
|
serviceSubtaskDetail.setId(serviceSubtaskDetails.get(0).getId());
|
serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
|
} else {
|
if (serviceSubtaskDetail.getSubId() != null) {
|
ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtaskDetail.getSubId());
|
serviceSubtaskDetail.setGuid(serviceSubtask.getGuid());
|
serviceSubtaskDetail.setOrgid(serviceSubtask.getOrgid());
|
}
|
i = serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
|
}
|
}
|
}
|
}
|
return i;
|
}
|
|
@Override
|
public Integer recordAccept(PhoneCallRecordVO phoneCallRecordVO) {
|
Object cacheObject = redisCache.getCacheObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
|
if (phoneCallRecordVO.getHangup_cause().equals("NO_USER_RESPONSE") || ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) {
|
//无人接听
|
getSmsCompensate(Long.valueOf(phoneCallRecordVO.getTaskid()));
|
redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
|
} 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()));
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
//下载文件
|
ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
|
redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
|
} else {
|
//患者拒绝随访
|
ServiceSubtask serviceSubtask = new ServiceSubtask();
|
serviceSubtask.setRemark("电话接通成功,患者拒绝随访");
|
serviceSubtask.setId(Long.valueOf(phoneCallRecordVO.getTaskid()));
|
serviceSubtask.setSendstate(6L);
|
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<ServiceSubtaskCount> getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq) {
|
if (serviceSubtaskCountReq.getUserId() == null) {
|
Long userId = SecurityUtils.getUserId();
|
serviceSubtaskCountReq.setUserId(userId);
|
}
|
if (serviceSubtaskCountReq.getStartTime() == null) {
|
LocalDate of = LocalDate.of(LocalDate.now().getYear(), 1, 1);
|
serviceSubtaskCountReq.setStartTime(Date.from(of.atStartOfDay(ZoneId.systemDefault()).toInstant()));
|
}
|
if (serviceSubtaskCountReq.getEndTime() == null) {
|
serviceSubtaskCountReq.setEndTime(new Date());
|
}
|
List<ServiceSubtaskCount> sfFzInfoEveryMonth = serviceSubtaskMapper.getSfFzInfoEveryMonth(serviceSubtaskCountReq);
|
List<ServiceSubtaskCount> result = sfFzInfoEveryMonth.stream().collect(Collectors.groupingBy(ServiceSubtaskCount::getMonth, Collectors.groupingBy(ServiceSubtaskCount::getServiceType, Collectors.summingLong(ServiceSubtaskCount::getCount)))).entrySet().stream().flatMap(monthEntry -> monthEntry.getValue().entrySet().stream().map(typeEntry -> new ServiceSubtaskCount(monthEntry.getKey(), typeEntry.getKey(), typeEntry.getValue()))).collect(Collectors.toList());
|
|
List<ServiceSubtaskCount> result2 = new ArrayList<>();
|
//根据服务类型进行筛选
|
if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getServiceType())) {
|
for (ServiceSubtaskCount serviceSubtaskCount : result) {
|
for (Long type : serviceSubtaskCountReq.getServiceType()) {
|
if (type == serviceSubtaskCount.getServiceType()) {
|
result2.add(serviceSubtaskCount);
|
}
|
}
|
}
|
} else {
|
result2 = result;
|
}
|
return result2;
|
}
|
|
/**
|
* 获取随访统计比例
|
*
|
* @param serviceSubtaskCountReq
|
* @return
|
*/
|
@Override
|
public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) {
|
log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq);
|
List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
|
Map<String, List<ServiceSubtask>> collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(ServiceSubtask::getLeavehospitaldistrictname));
|
for (List<ServiceSubtask> 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<ServiceSubtask> 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.getYfsCount() == 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.getYfsCount().toString()).divide(new BigDecimal(serviceSubtaskList.size() + ""), 2, BigDecimal.ROUND_HALF_UP);
|
serviceSubtaskStatistic.setSfwcl(multiply.toString());
|
}
|
|
return serviceSubtaskStatistic;
|
}
|
|
private IvrTaskTemplateScriptVO getNextQuestion(List<IvrTaskTemplateScriptVO> IvrTaskTemplateScriptVOList, IvrTaskTemplateScriptVO IvrTaskTemplateScriptVO) {
|
|
for (int j = 0; j < IvrTaskTemplateScriptVOList.size(); j++) {
|
if (IvrTaskTemplateScriptVOList.get(j).getTargetid() == IvrTaskTemplateScriptVO.getTargetid() + 1) {
|
// 对该条templateScriptVO进行处理
|
return IvrTaskTemplateScriptVOList.get(j);
|
}
|
}
|
return null;
|
}
|
|
private ServiceSubtaskDetail getServiceSubtaskDetail(PhoneCallReqYQVO phoneCallReqYQVO, IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, ServiceSubtask serviceSubtask, IvrTaskTemplate ivrTaskTemplate) {
|
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.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.getId());
|
serviceSubtaskDetail.setQuestiontext(ivrTaskTemplateScriptVO.getIvrtext());
|
serviceSubtaskDetail.setQuestionvoice(phoneCallReqYQVO.getRecordpath());
|
serviceSubtaskDetail.setCategoryname(ivrTaskTemplateScriptVO.getScriptType());
|
serviceSubtaskDetail.setTargetoptions(ivrTaskTemplateScriptVO.getTargetOptions());
|
serviceSubtaskDetail.setExtemplateText(ivrTaskTemplateScriptVO.getExtemplateText());
|
|
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);
|
ServiceOutPath serviceOutPath = new ServiceOutPath();
|
serviceOutPath.setParam1(taskId);
|
serviceOutPath.setParam2(patid);
|
serviceOutPath.setCreateTime(new Date());
|
iServiceOutPathService.insertServiceOutPath(serviceOutPath);
|
//转成16进制
|
String format = String.format("%03X", serviceOutPath.getId());
|
serviceOutPath.setRadix(format);
|
serviceOutPath.setUpdateTime(new Date());
|
iServiceOutPathService.updateServiceOutPath(serviceOutPath);
|
SendMagParam sendMagParam = new SendMagParam();
|
sendMagParam.setUrl(localIP + ":" + req_path + "/sf?p=" + format);
|
sendMagParam.setContent("【新华医院】您好,邀请您填写出院随访调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
|
Map<String, String> map = new HashMap<>();
|
map.put("phone", serviceSubtask.getPhone());
|
map.put("content", sendMagParam.getContent());
|
String result = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(map));
|
redisCache.setCacheObject(subTaskId + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES);
|
if (StringUtils.isNotEmpty(serviceSubtask.getRemark())) serviceSubtask.setRemark("电话发送拒接,短信补偿发送成功");
|
else serviceSubtask.setRemark("短信补偿发送成功");
|
serviceSubtask.setSendstate(3L);
|
serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
|
|
}
|
|
//通过当前时间,拉取电话总数
|
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;
|
}
|
}
|