package com.ruoyi.web.task; 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.config.RobotPhoneUtils; import com.smartor.domain.*; import com.smartor.domain.robot.RobotData; import com.smartor.domain.robot.RobotDataConfig; import com.smartor.domain.robot.RobotIdlenumVO; import com.smartor.domain.robot.RobotScritpTemplateVO; import java.util.*; import java.util.concurrent.TimeUnit; public class PhoneTask implements Runnable { private ServiceSubtask ivrTaskSingle; private List ivrTaskTemplateScriptVO; private RedisCache redisCache; private IvrTaskTemplateVO ivrTaskTemplateVO; private SendService sendService; private String phonePath; private RobotPhoneUtils robotPhoneUtils; public PhoneTask(ServiceSubtask ivrTaskSingle, IvrTaskTemplateVO ivrTaskTemplateVO, RedisCache redisCache, SendService sendService, String phonePath, RobotPhoneUtils robotPhoneUtils) { this.ivrTaskSingle = DtoConversionUtils.sourceToTarget(ivrTaskSingle, ServiceSubtask.class); this.ivrTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(ivrTaskTemplateVO.getIvrTaskTemplateScriptVOList(), IvrTaskTemplateScriptVO.class); this.ivrTaskTemplateVO = DtoConversionUtils.sourceToTarget(ivrTaskTemplateVO, IvrTaskTemplateVO.class); this.redisCache = redisCache; this.sendService = sendService; this.phonePath = phonePath; this.robotPhoneUtils = robotPhoneUtils; } @Override public void run() { if (phonePath.equals("1")) { //上海的电话拨打 try { //获取电话组,查看哪些电话可以使用 PhoneUtils phoneUtils = new PhoneUtils(); final String uuid = IdUtils.randomUUID(); //获取所有的“通配符”键值对 ObjectMapper objectMapper = new ObjectMapper(); Map> ivrTaskSingleMmap = objectMapper.readValue(ivrTaskSingle.getTextParam(), Map.class); List> mapList = new ArrayList<>(); if (!Objects.isNull(ivrTaskSingleMmap)) { for (Map map : ivrTaskSingleMmap.values()) { mapList.add(map); } //将模板问题话术里的通配符替换 for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : ivrTaskTemplateScriptVO) { for (Map map : mapList) { for (String key : map.keySet()) { ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace(key, map.get(key))); } } } } Map objectMap = new HashMap<>(); objectMap.put("ivrTaskSingle", ivrTaskSingle); objectMap.put("ivrTaskTemplateScriptVO", ivrTaskTemplateScriptVO); //将数据放到redis中,方便在回调方法里获取 redisCache.setCacheObject(uuid, objectMap, 120, TimeUnit.MINUTES); //记录首次问题 QuestionMessage returnQues = new QuestionMessage(); returnQues.setKcb(ivrTaskTemplateVO.getRevisitBefore()); for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : ivrTaskTemplateScriptVO) { if (ivrTaskTemplateScriptVO.getTargetid() == ivrTaskTemplateVO.getFirstQuestionNum().intValue()) { returnQues.setNowQuestion(ivrTaskTemplateScriptVO); } } returnQues.setQuestionList(ivrTaskTemplateScriptVO); //将问题,和模板信息放到redis中 redisCache.setCacheObject(uuid + "returnQues", returnQues, 120, TimeUnit.MINUTES); redisCache.setCacheObject(uuid + "ivrTaskTemplateVO", ivrTaskTemplateVO, 120, TimeUnit.MINUTES); System.out.println("----------------uuID为 :" + uuid + " " + ivrTaskSingle.getSendname() + " " + returnQues.getNowQuestion().getScriptContent() + " " + ivrTaskSingle.getPhone()); //先将话术放到ob_queue队列中 IvrTaskcallPhoneMQ ivrTaskcallPhoneMQ = new IvrTaskcallPhoneMQ(); ivrTaskcallPhoneMQ.setScript(ivrTaskTemplateVO.getRevisitBefore() + returnQues.getNowQuestion().getScriptContent()); 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().getScriptContent() + " " + ivrTaskSingle.getPhone() + "----------已经拨打"); Map obMap = objectMapper.readValue(ob, Map.class); Thread.sleep(1000); redisCache.setCacheObject(uuid + "state_id", "0", 10, TimeUnit.MINUTES); // rabbitMqCallPhoneConfig.sendMessage("phone_exchange", "phone.ob1", data, 0L); //这里先注释,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(); } } else if (phonePath.equals("2")) { //杭州的电话拨打 RobotScritpTemplateVO robotScritpTemplateVO = new RobotScritpTemplateVO(); robotScritpTemplateVO.setNotes("aa"); robotScritpTemplateVO.setBs_uuid(UUID.randomUUID().toString()); robotScritpTemplateVO.setDnis(ivrTaskSingle.getPhone()); robotScritpTemplateVO.setSpecify_ch(false); robotScritpTemplateVO.setTime_stamp(1566227782278333L); robotScritpTemplateVO.setEngine("ali"); robotScritpTemplateVO.setAsr_sample("8000"); robotScritpTemplateVO.setAsr_ent("ZurNHpaQLq6P55YS"); robotScritpTemplateVO.setTts_ent("ZurNHpaQLq6P55YS"); robotScritpTemplateVO.setTts_vcn("Aixia"); robotScritpTemplateVO.setTts_volume(100); robotScritpTemplateVO.setTts_speed(-300); robotScritpTemplateVO.setDial_mode("呼叫对接方式,FS注册到网关、网关注册到FS、IP对接、IP校验账号对接"); robotScritpTemplateVO.setDial_server("call_out_group,192.168.2.108:5060"); robotScritpTemplateVO.setOutbound_codes("PCMU,PCMA,OPUS,G722"); robotScritpTemplateVO.setAuto_test(true); RobotData robotData = new RobotData(); RobotDataConfig robotDataConfig = new RobotDataConfig(); robotDataConfig.setTemplate_name("inbound_88008001_16k_utf8.json"); robotData.setConfig(robotDataConfig); robotScritpTemplateVO.setData(robotData); RobotIdlenumVO robotIdlenumVO = DtoConversionUtils.sourceToTarget(robotScritpTemplateVO, RobotIdlenumVO.class); // String idlenum = robotPhoneUtils.idlenum(robotIdlenumVO); // System.out.println(idlenum); robotPhoneUtils.outbound(robotScritpTemplateVO); } } }