package com.smartor.service.impl; import java.text.SimpleDateFormat; import java.util.*; import com.alibaba.fastjson2.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DtoConversionUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.config.RabbitMqCallPhoneConfig; import com.smartor.domain.*; import com.smartor.mapper.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.smartor.service.IIvrTaskService; import org.springframework.transaction.annotation.Transactional; /** * 语音任务Service业务层处理 * * @author smartor * @date 2023-03-24 */ @Slf4j @Service public class IvrTaskServiceImpl implements IIvrTaskService { @Autowired private IvrTaskMapper ivrTaskMapper; @Autowired private IvrTaskSingleMapper ivrTaskcallMapper; @Autowired private IvrLibaTemplateScriptMapper ivrLibaTemplateScriptMapper; @Autowired private PatArchiveMapper patArchiveMapper; @Autowired private IvrLibaTemplateTargetoptionMapper ivrLibaTemplateTargetOptionMapper; @Autowired private RabbitMqCallPhoneConfig rabbitMqCallPhoneConfig; /** * 查询语音任务 * * @param taskid 语音任务主键 * @return 语音任务 */ @Override public IvrTask selectIvrTaskByTaskid(Long taskid) { return ivrTaskMapper.selectIvrTaskByTaskid(taskid); } /** * 查询语音任务列表 * * @param ivrTask 语音任务 * @return 语音任务 */ @Override public List selectIvrTaskList(IvrTask ivrTask) { return ivrTaskMapper.selectIvrTaskList(ivrTask); } /** * 新增语音任务 * * @param ivrTask 语音任务 * @return 结果 */ @Override public int insertIvrTask(IvrTask ivrTask) { ivrTask.setCreateTime(DateUtils.getNowDate()); return ivrTaskMapper.insertIvrTask(ivrTask); } /** * 修改语音任务 * * @param ivrTask 语音任务 * @return 结果 */ @Override public int updateIvrTask(IvrTask ivrTask) { ivrTask.setUpdateTime(DateUtils.getNowDate()); return ivrTaskMapper.updateIvrTask(ivrTask); } /** * 批量删除语音任务 * * @param taskids 需要删除的语音任务主键 * @return 结果 */ @Override public int deleteIvrTaskByTaskids(Long[] taskids) { return ivrTaskMapper.deleteIvrTaskByTaskids(taskids); } /** * 删除语音任务信息 * * @param taskid 语音任务主键 * @return 结果 */ @Transactional(rollbackFor = Exception.class) @Override public Boolean deleteIvrTaskByTaskid(Long taskid) { IvrTaskSingle ivrTaskcall = new IvrTaskSingle(); ivrTaskcall.setTaskid(taskid); ivrTaskcall.setDelFlag("1"); Boolean aBoolean = ivrTaskcallMapper.updateIvrTaskcall(ivrTaskcall); Boolean isSuccess = false; if (!aBoolean) { new BaseException("任务删除失败"); } isSuccess = ivrTaskMapper.deleteIvrTaskByTaskid(taskid); return isSuccess; } @Override public List getScriptInfoByCondition(Long taskid, Long patid) { //通过任务ID获取模板ID IvrTask ivrTask = selectIvrTaskByTaskid(taskid); //通过模板ID获取问题信息 IvrLibaTemplateScript ivrLibaTemplateScript = new IvrLibaTemplateScript(); ivrLibaTemplateScript.setTemplateID(ivrTask.getTemplateid()); ivrLibaTemplateScript.setDelFlag("0"); List ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectIvrLibaTemplateScriptList(ivrLibaTemplateScript); if (CollectionUtils.isEmpty(ivrLibaTemplateScripts) || ivrLibaTemplateScripts.size() == 0) { log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理"); return new ArrayList<>(); } List ivrLibaTemplateScriptVOS = DtoConversionUtils.sourceToTarget(ivrLibaTemplateScripts, IvrLibaTemplateScriptVO.class); //获取患者信息 PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid); //通过患者信息和任务信息中的textParam对问题中的变量进行填充 ObjectMapper objectMapper = new ObjectMapper(); Map> ivrTaskMap = null; try { ivrTaskMap = objectMapper.readValue(ivrTask.getTextParam(), Map.class); } catch (JsonProcessingException e) { e.printStackTrace(); } List> mapList = new ArrayList<>(); for (Map map : ivrTaskMap.values()) { mapList.add(map); } //将模板问题话术里的通配符替换 for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVOS) { if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getQuestionText())) { for (Map map : mapList) { for (String key : map.keySet()) { ivrLibaTemplateScriptVO.setQuestionText(ivrLibaTemplateScriptVO.getQuestionText().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : "")); } } //替换患者个人信息数据 ivrLibaTemplateScriptVO.setQuestionText(ivrLibaTemplateScriptVO.getQuestionText().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : "")); ivrLibaTemplateScriptVO.setQuestionText(ivrLibaTemplateScriptVO.getQuestionText().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : "")); ivrLibaTemplateScriptVO.setQuestionText(ivrLibaTemplateScriptVO.getQuestionText().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : "")); //获取问题选项 IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption = new IvrLibaTemplateTargetoption(); ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScriptVO.getID()); List ivrLibaTemplateTargetoptions = ivrLibaTemplateTargetOptionMapper.selectIvrLibaTemplateTargetoptionList(ivrLibaTemplateTargetoption); ivrLibaTemplateScriptVO.setIvrLibaScriptTargetoptionList(ivrLibaTemplateTargetoptions); } } return ivrLibaTemplateScriptVOS; } /** * 任务发送 * * @return */ @Override public int taskSend(SendTaskVO sendTaskVO) { if (sendTaskVO.getTaskId() == null) throw new BaseException("任务ID不能为空,请检查后,再进行执行"); IvrTask ivrTask = selectIvrTaskByTaskid(sendTaskVO.getTaskId()); if (sendTaskVO.getSendState() != null && sendTaskVO.getSendState() == 3 || sendTaskVO.getSendState() != null && sendTaskVO.getSendState() == 4) { //任务暂停或终止 IvrTask ivrTask3 = new IvrTask(); ivrTask3.setTaskid(sendTaskVO.getTaskId()); ivrTask3.setStopState(ivrTask.getStopState() + 1); ivrTask3.setSendState(sendTaskVO.getSendState()); updateIvrTask(ivrTask3); return 0; } //判断发送状态是否为空 if (org.apache.commons.lang3.StringUtils.isEmpty(sendTaskVO.getSendType())) { sendTaskVO.setSendType(ivrTask.getSendType().toString()); } //判断任务是否是立即发送 if (org.apache.commons.lang3.StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("2")) { IvrTaskcallMQ ivrTaskcallMQ = new IvrTaskcallMQ(); ivrTaskcallMQ.setTaskid(sendTaskVO.getTaskId()); ivrTaskcallMQ.setSendType(sendTaskVO.getSendType()); ivrTaskcallMQ.setTemplateid(ivrTask.getTemplateid().toString()); ivrTaskcallMQ.setPreachform(ivrTask.getPreachform()); ivrTaskcallMQ.setStopState(ivrTask.getStopState()); String ivrTaskcallMQJson = JSON.toJSONString(ivrTaskcallMQ); ivrTaskcallMQJson = ivrTaskcallMQJson.substring(1, ivrTaskcallMQJson.length() - 1); //立即发送 rabbitMqCallPhoneConfig.sendMessage("phone_exchange", "phone.123", ivrTaskcallMQJson, 0L); //将任务状态修改成执行中 IvrTask ivrTask2 = new IvrTask(); ivrTask2.setTaskid(ivrTask.getTaskid()); ivrTask2.setSendState(2); updateIvrTask(ivrTask2); } else if (org.apache.commons.lang3.StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("1")) { //时间段发送 ObjectMapper objectMapper = new ObjectMapper(); if (org.apache.commons.lang3.StringUtils.isNotEmpty(ivrTask.getSendTimeSlot())) { List taskSendTimeVOList = null; try { taskSendTimeVOList = objectMapper.readValue(ivrTask.getSendTimeSlot(), new TypeReference>() { }); } catch (JsonProcessingException e) { log.error("JsonProcessingException报错了:{}", e.getMessage()); } for (TaskSendTimeVO taskSendTimeVO : taskSendTimeVOList) { //去SendTimeslot中,获取所有的时间段 List list = new ArrayList<>(); list.add(taskSendTimeVO); //获取开始发送时间 String begantime = taskSendTimeVO.getBegantime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //记录目前到发送时间的毫秒值 (发送时间的毫秒值 - 当前时间的毫秒值) Long milliseconds = 1000L; try { Date date = sdf.parse(begantime); milliseconds = date.getTime() - System.currentTimeMillis(); System.out.println("日期毫秒数:" + milliseconds); } catch (Exception e) { e.printStackTrace(); } IvrTaskcallMQ ivrTaskcallMQ = new IvrTaskcallMQ(); ivrTaskcallMQ.setTaskid(sendTaskVO.getTaskId()); ivrTaskcallMQ.setSendType("1"); ivrTaskcallMQ.setTemplateid(ivrTask.getTemplateid().toString()); ivrTaskcallMQ.setSendTimeslot(list); ivrTaskcallMQ.setStopState(ivrTask.getStopState()); ivrTaskcallMQ.setPreachform(ivrTask.getPreachform()); Long finalMilliseconds = milliseconds; String ivrTaskcallMQJson = JSON.toJSONString(ivrTaskcallMQ); ivrTaskcallMQJson = ivrTaskcallMQJson.substring(1, ivrTaskcallMQJson.length() - 1); rabbitMqCallPhoneConfig.sendMessage("phone_exchange", "phone.123", ivrTaskcallMQJson, milliseconds); } //将任务状态修改成执行中 IvrTask ivrTask2 = new IvrTask(); ivrTask2.setTaskid(ivrTask.getTaskid()); ivrTask2.setSendState(2); updateIvrTask(ivrTask2); } } return 1; } }