| | |
| | | package com.ruoyi.web.task; |
| | | |
| | | import com.rabbitmq.client.Channel; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.ruoyi.common.core.redis.RedisCache; |
| | | import com.ruoyi.common.utils.DtoConversionUtils; |
| | | import com.ruoyi.common.utils.uuid.IdUtils; |
| | | import com.smartor.common.SendService; |
| | | import com.smartor.config.PhoneUtils; |
| | | import com.smartor.domain.IvrLibaTemplateScriptVO; |
| | | import com.smartor.domain.IvrLibaTemplateVO; |
| | | import com.smartor.domain.IvrTaskSingle; |
| | | import com.smartor.domain.QuestionMessage; |
| | | import com.smartor.config.RabbitMqCallPhoneConfig; |
| | | import com.smartor.domain.*; |
| | | import org.springframework.amqp.core.Message; |
| | | import org.springframework.amqp.rabbit.core.RabbitTemplate; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | public class PhoneTask implements Runnable { |
| | | private IvrTaskSingle ivrTaskcall; |
| | | private IvrTaskSingle ivrTaskSingle; |
| | | private List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVO; |
| | | private RedisCache redisCache; |
| | | private IvrLibaTemplateVO ivrLibaTemplateVO; |
| | | private Channel channel; |
| | | private RabbitMqCallPhoneConfig rabbitMqCallPhoneConfig; |
| | | private Message message; |
| | | private SendService sendService; |
| | | |
| | | public PhoneTask(IvrTaskSingle ivrTaskcall, IvrLibaTemplateVO ivrLibaTemplateVO, RedisCache redisCache, Channel channel, Message message) { |
| | | this.ivrTaskcall = ivrTaskcall; |
| | | this.ivrLibaTemplateScriptVO = ivrLibaTemplateVO.getIvrLibaTemplateScriptVOList(); |
| | | this.ivrLibaTemplateVO = ivrLibaTemplateVO; |
| | | |
| | | public PhoneTask(IvrTaskSingle ivrTaskSingle, IvrLibaTemplateVO ivrLibaTemplateVO, RedisCache redisCache, RabbitMqCallPhoneConfig rabbitMqCallPhoneConfig, Message message, SendService sendService) { |
| | | this.ivrTaskSingle = DtoConversionUtils.sourceToTarget(ivrTaskSingle, IvrTaskSingle.class); |
| | | this.ivrLibaTemplateScriptVO = DtoConversionUtils.sourceToTarget(ivrLibaTemplateVO.getIvrLibaTemplateScriptVOList(), IvrLibaTemplateScriptVO.class); |
| | | this.ivrLibaTemplateVO = DtoConversionUtils.sourceToTarget(ivrLibaTemplateVO, IvrLibaTemplateVO.class); |
| | | this.redisCache = redisCache; |
| | | this.channel = channel; |
| | | this.rabbitMqCallPhoneConfig = rabbitMqCallPhoneConfig; |
| | | this.message = message; |
| | | this.sendService = sendService; |
| | | } |
| | | |
| | | @Override |
| | |
| | | try { |
| | | //获取电话组,查看哪些电话可以使用 |
| | | PhoneUtils phoneUtils = new PhoneUtils(); |
| | | String uuid = IdUtils.randomUUID(); |
| | | final String uuid = IdUtils.randomUUID(); |
| | | //获取所有的“通配符”键值对 |
| | | ObjectMapper objectMapper = new ObjectMapper(); |
| | | Map<String, Map<String, String>> ivrTaskSingleMmap = objectMapper.readValue(ivrTaskSingle.getTextParam(), Map.class); |
| | | List<Map<String, String>> mapList = new ArrayList<>(); |
| | | if (!Objects.isNull(ivrTaskSingleMmap)) { |
| | | for (Map<String, String> map : ivrTaskSingleMmap.values()) { |
| | | mapList.add(map); |
| | | } |
| | | //将模板问题话术里的通配符替换 |
| | | for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVO) { |
| | | for (Map<String, String> map : mapList) { |
| | | for (String key : map.keySet()) { |
| | | ivrLibaTemplateScriptVO.setQuestionText(ivrLibaTemplateScriptVO.getQuestionText().replace(key, map.get(key))); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | Map<String, Object> objectMap = new HashMap<>(); |
| | | objectMap.put("ivrTaskcall", ivrTaskcall); |
| | | objectMap.put("ivrTaskSingle", ivrTaskSingle); |
| | | objectMap.put("ivrLibaTemplateScriptVO", ivrLibaTemplateScriptVO); |
| | | //将数据放到redis中,方便在回调方法里获取 |
| | | redisCache.setCacheObject(uuid, objectMap, 120, TimeUnit.MINUTES); |
| | |
| | | redisCache.setCacheObject(uuid + "returnQues", returnQues, 120, TimeUnit.MINUTES); |
| | | redisCache.setCacheObject(uuid + "ivrLibaTemplateVO", ivrLibaTemplateVO, 120, TimeUnit.MINUTES); |
| | | |
| | | //调用机器人电话,开始电话(需要将回调方法传入,这个等”电话方“告诉怎么传,现在先空着,还有第一句问题话术) |
| | | phoneUtils.ob(uuid, null, ivrTaskcall.getPhone(), null, null, null, null, null, null, null, null); |
| | | //通知 MQ 消息已被接收,可以ACK(从队列中删除)了 (这个需要根据业务再去处理ACK) |
| | | System.out.println("----------------uuID为 :" + uuid + " " + ivrTaskSingle.getSendname() + " " + returnQues.getNowQuestion().getQuestionText() + " " + ivrTaskSingle.getPhone()); |
| | | |
| | | channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); |
| | | } catch (IOException e) { |
| | | //先将话术放到ob_queue队列中 |
| | | IvrTaskcallPhoneMQ ivrTaskcallPhoneMQ = new IvrTaskcallPhoneMQ(); |
| | | ivrTaskcallPhoneMQ.setScript(ivrLibaTemplateVO.getRevisitBefore() + returnQues.getNowQuestion().getQuestionText()); |
| | | ivrTaskcallPhoneMQ.setType("1"); |
| | | ivrTaskcallPhoneMQ.setUuid(uuid); |
| | | String data = JSON.toJSONString(ivrTaskcallPhoneMQ); |
| | | rabbitMqCallPhoneConfig.sendMessage("phone_exchange", "phone.ob1", data, 0L); |
| | | |
| | | //调用机器人电话,开始电话 |
| | | String ob = phoneUtils.ob("", "", "", "", "", "", "", ivrTaskSingle.getPhone(), uuid, true); |
| | | System.out.println("----------------uuID为 :" + uuid + " " + ivrTaskSingle.getSendname() + " " + returnQues.getNowQuestion().getQuestionText() + " " + ivrTaskSingle.getPhone() + "----------已经拨打"); |
| | | Map<String, String> obMap = objectMapper.readValue(ob, Map.class); |
| | | Thread.sleep(1000); |
| | | redisCache.setCacheObject(uuid + "state_id", "0", 10, TimeUnit.MINUTES); |
| | | //这里先注释,state_id,电话那边,只能返回6,不能返回0,还需要电话那边进行修改,那边修改之后,上面两行可删除,将下面的解开注释 |
| | | // if (obMap.get("state_id").equals("0")) { |
| | | // // 说明打通了 |
| | | // redisCache.setCacheObject(uuid + "state_id", "0", 10, TimeUnit.MINUTES); |
| | | // } else { |
| | | // while (true) { |
| | | // Thread.sleep(2000); |
| | | // redisCache.setCacheObject(uuid + "state_id", "0", 10, TimeUnit.MINUTES); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | System.out.println("OB的值为:" + ob); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | } |