| | |
| | | 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.domain.IvrLibaTemplateScriptVO; |
| | | import com.smartor.domain.IvrLibaTemplateVO; |
| | | import com.smartor.domain.IvrTaskcall; |
| | | import com.smartor.domain.QuestionMessage; |
| | | 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.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | public class PhoneTask implements Runnable { |
| | | private IvrTaskcall ivrTaskcall; |
| | | private List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVO; |
| | | private ServiceSubtask ivrTaskSingle; |
| | | private List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVO; |
| | | private RedisCache redisCache; |
| | | private IvrLibaTemplateVO ivrLibaTemplateVO; |
| | | private IvrTaskTemplateVO ivrTaskTemplateVO; |
| | | private SendService sendService; |
| | | private String phonePath; |
| | | private RobotPhoneUtils robotPhoneUtils; |
| | | |
| | | public PhoneTask(IvrTaskcall ivrTaskcall, IvrLibaTemplateVO ivrLibaTemplateVO, RedisCache redisCache) { |
| | | this.ivrTaskcall = ivrTaskcall; |
| | | this.ivrLibaTemplateScriptVO = ivrLibaTemplateVO.getIvrLibaTemplateScriptVOList(); |
| | | this.ivrLibaTemplateVO = ivrLibaTemplateVO; |
| | | |
| | | 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() { |
| | | //获取电话组,查看哪些电话可以使用 |
| | | PhoneUtils phoneUtils = new PhoneUtils(); |
| | | String uuid = IdUtils.randomUUID(); |
| | | Map<String, Object> objectMap = new HashMap<>(); |
| | | objectMap.put("ivrTaskcall", ivrTaskcall); |
| | | objectMap.put("ivrLibaTemplateScriptVO", ivrLibaTemplateScriptVO); |
| | | //将数据放到redis中,方便在回调方法里获取 |
| | | redisCache.setCacheObject(uuid, objectMap, 120, TimeUnit.MINUTES); |
| | | if (phonePath.equals("1")) { |
| | | //上海的电话拨打 |
| | | try { |
| | | //获取电话组,查看哪些电话可以使用 |
| | | PhoneUtils phoneUtils = new PhoneUtils(); |
| | | 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 (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : ivrTaskTemplateScriptVO) { |
| | | for (Map<String, String> map : mapList) { |
| | | for (String key : map.keySet()) { |
| | | ivrTaskTemplateScriptVO.setQuestionText(ivrTaskTemplateScriptVO.getQuestionText().replace(key, map.get(key))); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | Map<String, Object> 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(ivrLibaTemplateVO.getRevisitBefore()); |
| | | for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVO) { |
| | | if (ivrLibaTemplateScriptVO.getTargetid() == ivrLibaTemplateVO.getFirstQuestionNum().intValue()) { |
| | | returnQues.setNowQuestion(ivrLibaTemplateScriptVO); |
| | | //记录首次问题 |
| | | 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().getQuestionText() + " " + ivrTaskSingle.getPhone()); |
| | | |
| | | //先将话术放到ob_queue队列中 |
| | | IvrTaskcallPhoneMQ ivrTaskcallPhoneMQ = new IvrTaskcallPhoneMQ(); |
| | | ivrTaskcallPhoneMQ.setScript(ivrTaskTemplateVO.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); |
| | | // 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); |
| | | } |
| | | returnQues.setQuestionList(ivrLibaTemplateScriptVO); |
| | | //将问题,和模板信息放到redis中 |
| | | 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); |
| | | |
| | | |
| | | } |
| | | } |