guoshilong
2023-04-24 5c7dab639fffc0fe7d453c5c5153ddb6036fe45a
Merge remote-tracking branch 'origin/jtdev' into jtdev
5 files modified
1 files added
359 ■■■■■ changed files
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/SmApplication.java 9 ●●●●● patch | view | raw | blame | history
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 158 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java 8 ●●●●● 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/SmApplication.java
@@ -5,7 +5,10 @@
import org.springblade.core.launch.BladeApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@BladeCloudApplication
@EnableFeignClients({"cn.gistack"})
@@ -14,4 +17,10 @@
    public static void main(String[] args) {
        BladeApplication.run("blade-sm", SmApplication.class, args);
    }
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }
}
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
@@ -1,12 +1,6 @@
package cn.gistack.sm.intelligentCall.controller;
import cn.gistack.sm.intelligentCall.constant.CallConstant;
import cn.gistack.sm.intelligentCall.entity.ThirdBaseParam;
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.util.HttpClientUtils;
import com.alibaba.fastjson.JSON;
import cn.gistack.sm.intelligentCall.service.CallService;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -14,14 +8,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;
import static cn.gistack.sm.intelligentCall.util.CallUtil.getRandom;
import static cn.gistack.sm.intelligentCall.util.CallUtil.getToken;
import static cn.gistack.sm.intelligentCall.util.ThirdPartyValidate.validateToken;
/**
 * 智能呼叫控制层
@@ -35,147 +22,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());
        // 返回
        return R.data(map);
    }
    /**
     * 创建任务
     * @return
     */
    @GetMapping("/createCall1")
    public R createCall1(){
        // 请求
        Map<String, Object> map = new HashMap<>();
        map.put("p1",createCallUtil());
        // 返回
        return R.data(map);
    }
    /**
     * 创建任务
     * @return
     */
    public static String createCallUtil(){
        Date date = new Date();
        String dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
        String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(date);
        String transId = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date) + getRandom();
        Map<String, Object> map = new HashMap<>();
        map.put("taskName","测试");
        map.put("sceneId",230);
        map.put("callingNumbers", Arrays.asList("00862787222298"));
        map.put("taskScheduleTime",dateFormat);
        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> maps = new HashMap<>();
        maps.put("被叫号码","15170720695");
        maps.put("水库名称","测试水库");
        maps.put("超汛限多少米","0");
        maps.put("水库编码","1241241122");
        maps.put("用户名","zrj");
        maps.put("用户id","123456");
        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);
        map.put("calleeData",list);
        ThirdBaseParam thirdBaseParam = new ThirdBaseParam();
        ThirdRequestHead thirdRequestHead = new ThirdRequestHead();
        thirdRequestHead.setAppId(CallConstant.AppKey);
        thirdRequestHead.setTimestamp(timestamp);
        thirdRequestHead.setToken(getToken(timestamp, transId, map));
        thirdRequestHead.setTransId(transId);
        thirdBaseParam.setHead(thirdRequestHead);
        thirdBaseParam.setSecretString(JSON.toJSONString(map));
        // 验证token
        boolean b = validateToken(thirdBaseParam, CallConstant.AppSecret, new ThirdPartyResult());
        System.out.println("token 验证结果 = " + b);
        String token = getToken(timestamp, transId, map);
        String url = CallConstant.HOST + CallConstant.createTaskUrl1;
        String httpPost = HttpClientUtils.httpPost(url, CallConstant.AppKey, timestamp, transId, token, map);
        callService.createTask(list);
        // 返回
        return httpPost;
        return R.status(true);
    }
    /**
     * 创建任务
     * 获取通话详情
     * @return
     */
    public static String createCallUtil1(){
        Date date = new Date();
        String dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
        String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(date);
        String transId = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date) + getRandom();
        Map<String, Object> map = new HashMap<>();
        map.put("taskName","测试");
        map.put("sceneId",230);
        map.put("callingNumbers", Arrays.asList("00862787222298"));
        map.put("taskScheduleTime",dateFormat);
        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> maps = new HashMap<>();
        maps.put("被叫号码","15170720695");
        maps.put("水库名称","测试水库");
        maps.put("超汛限多少米","0");
        maps.put("水库编码","1241241122");
        maps.put("用户名","zrj");
        maps.put("用户id","123456");
        list.add(maps);
        map.put("calleeData",list);
        String token = getToken(timestamp, transId, map);
        String jsonString = JSON.toJSONString(map);
        HashMap<Object, Object> hashMap = new HashMap<>(4);
        hashMap.put("appId",CallConstant.AppKey);
        hashMap.put("timestamp",timestamp);
        hashMap.put("transId",transId);
        hashMap.put("token",token);
        Map<String, String> stringHashMap = new HashMap<>();
        stringHashMap.put("head",hashMap.toString());
        stringHashMap.put("body",jsonString);
        ThirdBaseParam thirdBaseParam = new ThirdBaseParam();
        ThirdRequestHead thirdRequestHead = new ThirdRequestHead();
        thirdRequestHead.setAppId(CallConstant.AppKey);
        thirdRequestHead.setTimestamp(timestamp);
        thirdRequestHead.setToken(token);
        thirdRequestHead.setTransId(transId);
        thirdBaseParam.setHead(thirdRequestHead);
        thirdBaseParam.setSecretString(JSON.toJSONString(map));
        // 验证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);
    @GetMapping("/getCallDetail")
    public R getCallDetail(String taskId,String calleeNumber){
        // 返回
        return httpPost;
        return R.data(callService.getCallDetail(taskId,calleeNumber));
    }
//    /**
//     * 测试
//     * @param args
//     */
//    public static void main(String[] args) {
//        Map<String, Object> map = new HashMap<>();
//        map.put("p1",createCallUtil());
////        map.put("p1",createCallUtil());
//
//    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/CallService.java
@@ -1,4 +1,12 @@
package cn.gistack.sm.intelligentCall.service;
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 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.Autowired;
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;
@Slf4j
@Service
public class CallServiceImpl {
public class CallServiceImpl implements CallService {
    @Autowired
    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 {
}