liusheng
2025-04-18 09538e3f9a0392144637d04495d5975b6d7578b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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> 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<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.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().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(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<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);
        }
    }
}