zhongrj
2023-04-24 3962badef529417e64e612756a2149581171662c
智能外呼调试1
4 files modified
1 files added
224 ■■■■■ changed files
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/constant/CallConstant.java 9 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/controller/CallController.java 31 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java 9 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java 166 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/vo/CallBackDetailVO.java 9 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/constant/CallConstant.java
@@ -22,6 +22,15 @@
     */
    public static final String AppSecret = "ea3b23ecdb2247e9bcbccbdee7d5dbf4";
    public static final String scenesId = "230";
    public static final String callingNumbers = "00862787222298";
    public static final String empId = "24";
    /**
     * 创建会话url
     */
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/controller/CallController.java
@@ -5,6 +5,7 @@
import cn.gistack.sm.intelligentCall.entity.ThirdPartyResult;
import cn.gistack.sm.intelligentCall.entity.ThirdRequestHead;
import cn.gistack.sm.intelligentCall.entity.User;
import cn.gistack.sm.intelligentCall.service.CallService;
import cn.gistack.sm.intelligentCall.util.HttpClientUtils;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
@@ -12,6 +13,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.security.MessageDigest;
@@ -35,30 +37,36 @@
@AllArgsConstructor
public class CallController {
    private final CallService callService;
    /**
     * 创建任务
     * @return
     */
    @GetMapping("/createCall")
    public R createCall(){
        // 请求
        Map<String, Object> map = new HashMap<>();
        map.put("p1",createCallUtil());
        List<Map<String,String>> list = new ArrayList<>();
        Map<String,String> maps = new HashMap<>();
        maps.put("phone","15170720695");
        maps.put("name","测试水库");
        maps.put("over","1.2");
        maps.put("code","1241241122");
        maps.put("userName","zrj");
        maps.put("userId","123456");
        list.add(maps);
        callService.createTask(list);
        // 返回
        return R.data(map);
        return R.status(true);
    }
    /**
     * 创建任务
     * 获取通话详情
     * @return
     */
    @GetMapping("/createCall1")
    public R createCall1(){
        // 请求
        Map<String, Object> map = new HashMap<>();
        map.put("p1",createCallUtil());
    @GetMapping("/getCallDetail")
    public R getCallDetail(String taskId,String calleeNumber){
        // 返回
        return R.data(map);
        return R.data(callService.getCallDetail(taskId,calleeNumber));
    }
    /**
@@ -157,7 +165,6 @@
        // 验证token
        boolean b = validateToken(thirdBaseParam, CallConstant.AppSecret, new ThirdPartyResult());
        System.out.println("token 验证结果 = " + b);
        String url = CallConstant.HOST + CallConstant.createTaskUrl1;
        String httpPost = HttpClientUtils.doPost(url, stringHashMap);
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java
@@ -1,4 +1,13 @@
package cn.gistack.sm.intelligentCall.service;
import cn.gistack.sm.intelligentCall.vo.CallBackDetailVO;
import java.util.List;
import java.util.Map;
public interface CallService {
    void createTask(List<Map<String, String>> params);
    Object getCallDetail(String taskId, String calleeNumber);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -1,7 +1,171 @@
package cn.gistack.sm.intelligentCall.service.impl;
import cn.gistack.sm.intelligentCall.constant.CallConstant;
import cn.gistack.sm.intelligentCall.service.CallService;
import cn.gistack.sm.intelligentCall.vo.CallBackDetailVO;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
@Service
public class CallServiceImpl {
@Slf4j
public class CallServiceImpl implements CallService {
    @Resource
    private RestTemplate restTemplate;
//    @Value("${dial.task.url}")
    private String url = CallConstant.HOST;
//    @Value("${dial.task.empId}")
    private String empId = CallConstant.empId;
//    @Value("${dial.task.appId}")
    private String appId = CallConstant.AppKey;
//    @Value("${dial.task.appSecret}")
    private String appSecret = CallConstant.AppSecret;
//    @Value("${dial.task.scenesId}")
    private String scenesId = CallConstant.scenesId;
//    @Value("${dial.task.callingNumbers}")
    private String callingNumbers = CallConstant.callingNumbers;
    private static final String CONTENT_TYPE = "application/json; charset=UTF-8";
    private static final String ACCEPT_TYPE = "application/json";
    private static final String ACCEPT_ENCODING = "gzip";
    private final static String CREATE_TASK_URL = "/api/task/createTask.json";
    private final static String CALL_DETAIL_URL = "/api/task/callDetail.json";
    @Override
    public void createTask(List<Map<String, String>> params) {
        String requestUrl = url + CREATE_TASK_URL;
        LocalDateTime now = LocalDateTime.now();
        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS"));
        String transId = generateTransId(now);
        String taskName = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm")) + "智能外呼";
        String[] numbers = StringUtils.split(callingNumbers,",");
        String taskScheduleTime = LocalDateTime.now().plusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        JSONArray arr = getCalleeInfo(params);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Type", CONTENT_TYPE);
        httpHeaders.add("Accept", ACCEPT_TYPE);
        httpHeaders.add("Accept-Encoding", ACCEPT_ENCODING);
        JSONObject paramJson = new JSONObject();
        paramJson.put("taskName", taskName);
        paramJson.put("scenesId", scenesId);
        paramJson.put("callingNumbers", numbers);
        paramJson.put("taskScheduleTime", taskScheduleTime);
        paramJson.put("calleeData", arr);
        paramJson.put("empId", empId);
        String token = getToken(appId, timestamp, transId, appSecret, paramJson.toJSONString());
        JSONObject headerJson = new JSONObject();
        headerJson.put("appId", appId);
        headerJson.put("timestamp", timestamp);
        headerJson.put("transId", transId);
        headerJson.put("token", token);
        JSONObject bodyJson = new JSONObject();
        bodyJson.put("head", headerJson);
        bodyJson.put("body", paramJson);
        HttpEntity<String> stringHttpEntity = new HttpEntity<>(bodyJson.toJSONString(), httpHeaders);
        log.info("创建超汛限智能外呼任务请求参数:{}", bodyJson.toJSONString());
        ResponseEntity<String> response = restTemplate.postForEntity(requestUrl, stringHttpEntity, String.class);
        log.info("创建外呼任务请求结果:{}", response);
        if (response.getStatusCode() != HttpStatus.OK) {
            log.error("创建智能外呼任务失败:{}", response.getStatusCode());
        }
    }
    @Override
    public Object getCallDetail(String taskId, String calleeNumber) {
        String requestUrl = url + CALL_DETAIL_URL;
        LocalDateTime now = LocalDateTime.now();
        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS"));
        String transId = generateTransId(now);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Type", CONTENT_TYPE);
        httpHeaders.add("Accept", ACCEPT_TYPE);
        httpHeaders.add("Accept-Encoding", ACCEPT_ENCODING);
        JSONObject paramJson = new JSONObject();
        paramJson.put("taskId", taskId);
        paramJson.put("calleeNumber", calleeNumber);
        JSONObject bodyJson = new JSONObject();
        bodyJson.put("head", getHeadJson(appId, timestamp, transId, appSecret, paramJson.toJSONString()));
        bodyJson.put("body", paramJson);
        HttpEntity<String> stringHttpEntity = new HttpEntity<>(bodyJson.toJSONString(), httpHeaders);
        ResponseEntity<String> response = restTemplate.postForEntity(requestUrl, stringHttpEntity, String.class);
        log.info(response.toString());
        if (response.getStatusCode() == HttpStatus.OK) {
            JSONObject responseJson = (JSONObject) JSONObject.parse(response.getBody());
            assert responseJson != null;
//            return JSONObject.parseObject(responseJson.getString("data"), CallBackDetailVO.class);
            return responseJson.getString("data");
        }
        return null;
    }
    private String getToken(String appId, String timestamp, String transId, String appSecret, String body) {
        String sb = "appId" + appId + "timestamp" + timestamp + "transId" + transId + body + appSecret;
        return DigestUtils.md5DigestAsHex(sb.getBytes());
    }
    private JSONObject getHeadJson(String appId, String timestamp, String transId, String appSecret, String body) {
        String token = getToken(appId, timestamp, transId, appSecret, body);
        JSONObject headerJson = new JSONObject();
        headerJson.put("appId", appId);
        headerJson.put("timestamp", timestamp);
        headerJson.put("transId", transId);
        headerJson.put("token", token);
        return headerJson;
    }
    private String generateTransId(LocalDateTime now) {
        String s = "000000" + RandomUtils.nextLong(0, 999999);
        String randomStr = StringUtils.substring(s, -6);
        return now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")) + randomStr;
    }
    /**
     * 封装被呼人对象
     * @param params 被呼人信息
     * @return 被呼人数组
     */
    private JSONArray getCalleeInfo(List<Map<String, String>> params) {
        JSONArray arr = new JSONArray();
        params.forEach(map -> {
            String phone = map.get("phone");
            String name = map.get("name");
            String code = map.get("code");
            String userName = map.get("userName");
            String userId = map.get("userId");
            String over = map.get("over");
            if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(name)) {
                JSONObject json = new JSONObject();
                json.put("被叫号码", phone);
                json.put("水库名称", name);
                json.put("水库编码", code);
                json.put("用户名", userName);
                json.put("用户id", userId);
                json.put("超汛限多少米", over);
                arr.add(json);
            }
        });
        return arr;
    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/vo/CallBackDetailVO.java
New file
@@ -0,0 +1,9 @@
package cn.gistack.sm.intelligentCall.vo;
import lombok.Data;
@Data
public class CallBackDetailVO {
}