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 { }