From 1dd5d8f8a616f5cf3caa7828d46989c7d3dcafc4 Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Thu, 19 Oct 2023 15:01:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/jtdev' into jtdev
---
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java | 1048 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 1,028 insertions(+), 20 deletions(-)
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
index 568f5d5..b03d7cb 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java
@@ -1,30 +1,45 @@
package cn.gistack.sm.intelligentCall.service.impl;
+import cn.gistack.common.config.MyThreadPoolConfig;
import cn.gistack.sm.intelligentCall.constant.CallConstant;
+import cn.gistack.sm.intelligentCall.constant.ZtConstant;
+import cn.gistack.sm.intelligentCall.entity.Scene;
+import cn.gistack.sm.intelligentCall.excel.CallExcel;
import cn.gistack.sm.intelligentCall.mapper.CallTaskMapper;
import cn.gistack.sm.intelligentCall.service.CallService;
import cn.gistack.sm.intelligentCall.vo.CallTaskResultVO;
import cn.gistack.sm.intelligentCall.vo.CallTaskStatistic;
+import cn.gistack.sm.sjztmd.entity.AttAdBase;
+import cn.gistack.sm.sjztmd.service.IAttAdBaseService;
+import cn.gistack.sm.sjztmd.service.IAttResManagePersonService;
+import cn.gistack.sm.sjztmd.vo.AttAdBaseVO;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
-import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.tool.api.R;
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.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
+import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.stream.Collectors;
@Slf4j
@Service
@@ -34,7 +49,19 @@
private CallTaskMapper callTaskMapper;
@Autowired
+ private IAttAdBaseService attAdBaseService;
+
+ @Autowired
private RestTemplate restTemplate;
+
+ @Autowired
+ private BladeRedis bladeRedis;
+
+ @Autowired
+ private IAttResManagePersonService attResManagePersonService;
+
+ @Autowired
+ private AsyncCallService asyncCallService;
// @Value("${dial.task.url}")
private String url = CallConstant.HOST;
@@ -54,6 +81,9 @@
// @Value("${dial.task.callingNumbers}")
private String callingNumbers = CallConstant.callingNumbers;
+ @Autowired
+ private MyThreadPoolConfig myThreadPoolConfig;
+
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";
@@ -67,17 +97,25 @@
* @return
*/
@Override
- public Object createTask(Map<String,Object> map) {
+ public List<String> createTask(Map<String,Object> map) {
List<Map<String, String>> params = (List<Map<String, String>>) map.get("list");
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 taskName = map.get("taskName").toString();
+ String taskName = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")) + "智能外呼";
+ if(null!= map.get("taskName") && !map.get("taskName").equals("")){
+ taskName = map.get("taskName").toString();
+ }
String[] numbers = StringUtils.split(callingNumbers,",");
-// String taskScheduleTime = LocalDateTime.now().plusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- String taskScheduleTime = map.get("taskScheduleTime").toString();
+ String taskScheduleTime = LocalDateTime.now().plusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ if (null!=map.get("taskScheduleTime") && !map.get("taskScheduleTime").equals("")){
+ taskScheduleTime = map.get("taskScheduleTime").toString();
+ }
+ String scenesIds = scenesId;
+ if (null!=map.get("scenesId") && !map.get("scenesId").equals("")){
+ scenesIds = map.get("scenesId").toString();
+ }
JSONArray arr = getCalleeInfo(params);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", CONTENT_TYPE);
@@ -85,7 +123,79 @@
httpHeaders.add("Accept-Encoding", ACCEPT_ENCODING);
JSONObject paramJson = new JSONObject();
paramJson.put("taskName", taskName);
- paramJson.put("scenesId", scenesId);
+ paramJson.put("scenesId", scenesIds);
+ 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());
+ log.info("创建超汛限智能外呼任务呼叫人数:{}", arr.size());
+ ResponseEntity<String> response = restTemplate.postForEntity(requestUrl, stringHttpEntity, String.class);
+ log.info("创建外呼任务请求结果:{}", response.getBody());
+ if (response.getStatusCode() != HttpStatus.OK) {
+ log.error("创建智能外呼任务失败:{}", response.getStatusCode());
+ }
+ JSONObject jsonObject = JSON.parseObject(response.getBody());
+ Boolean success = jsonObject.getBoolean("success");
+ String taskId = "";
+ if (success){
+ //通过任务名称查询taskId
+ taskId = callTaskMapper.getTaskIdByTaskName(taskName);
+ }else {
+ // 任务创建失败,发送短信告知
+ asyncCallService.createOutCallErrorSendSms(jsonObject.getString("code"),jsonObject.getString("message"));
+ }
+ List<String> list = new ArrayList<>();
+ list.add(response.getBody());
+ list.add(taskId);
+ list.add(success.toString());
+ // 返回
+ return list;
+ }
+
+ /**
+ * 创建告警外呼任务
+ * @param map
+ * @return
+ */
+ @Override
+ public List<String> createOutCallTaskByAlarm(Map<String, Object> map) {
+ List<Map<String, String>> params = (List<Map<String, String>>) map.get("list");
+ JSONArray arr = getCalleeInfoAlarm(params,(List<String>) map.get("titles"));
+ 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:ss")) + "智能外呼";
+ if(null!= map.get("taskName") && !map.get("taskName").equals("")){
+ taskName = map.get("taskName").toString();
+ }
+ String[] numbers = StringUtils.split(callingNumbers,",");
+ String taskScheduleTime = LocalDateTime.now().plusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ if (null!=map.get("taskScheduleTime") && !map.get("taskScheduleTime").equals("")){
+ taskScheduleTime = map.get("taskScheduleTime").toString();
+ }
+ String scenesIds = scenesId;
+ if (null!=map.get("scenesId") && !map.get("scenesId").equals("")){
+ scenesIds = map.get("scenesId").toString();
+ }
+ 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", scenesIds);
paramJson.put("callingNumbers", numbers);
paramJson.put("taskScheduleTime", taskScheduleTime);
paramJson.put("calleeData", arr);
@@ -102,11 +212,40 @@
HttpEntity<String> stringHttpEntity = new HttpEntity<>(bodyJson.toJSONString(), httpHeaders);
log.info("创建超汛限智能外呼任务请求参数:{}", bodyJson.toJSONString());
ResponseEntity<String> response = restTemplate.postForEntity(requestUrl, stringHttpEntity, String.class);
- log.info("创建外呼任务请求结果:{}", response);
+ log.info("创建外呼任务请求结果:{}", response.getBody());
if (response.getStatusCode() != HttpStatus.OK) {
log.error("创建智能外呼任务失败:{}", response.getStatusCode());
}
- return response;
+ JSONObject jsonObject = JSON.parseObject(response.getBody());
+ Boolean success = jsonObject.getBoolean("success");
+ String taskId = "";
+ if (success){
+ //通过任务名称查询taskId
+ taskId = callTaskMapper.getTaskIdByTaskName(taskName);
+ }
+ List<String> list = new ArrayList<>();
+ list.add(response.getBody());
+ list.add(taskId);
+ list.add(success.toString());
+ // 返回
+ return list;
+ }
+
+ /**
+ * 外呼动态数据封装
+ * @param params
+ * @return
+ */
+ private JSONArray getCalleeInfoAlarm(List<Map<String, String>> params,List<String> titles) {
+ JSONArray arr = new JSONArray();
+ params.forEach(map -> {
+ JSONObject json = new JSONObject();
+ for (String title : titles) {
+ json.put(title, map.get(title));
+ }
+ arr.add(json);
+ });
+ return arr;
}
/**
@@ -214,9 +353,9 @@
List<String> list = new ArrayList<>();
if (null!= callTaskResult.getAreaName() && !callTaskResult.getAreaName().equals("")){
// 查询所有下级区域code
- list = getWaterNameByAreaCode(callTaskResult.getAreaName());
+ list = getAllChildrenAreaByAreaCode(callTaskResult.getAreaName());
}
- List<CallTaskResultVO> resultListPage = callTaskMapper.getCallTaskResultListPage(page, callTaskResult,list);
+ List<CallTaskResultVO> resultListPage = callTaskMapper.getCallTaskResultListPage(page, callTaskResult,list,null);
return page.setRecords(resultListPage);
}
@@ -228,13 +367,366 @@
@Override
public Object getCallTaskResultList(CallTaskResultVO callTaskResult) {
List<String> list = new ArrayList<>();
+ List<String> idsList = new ArrayList<>();
if (null!= callTaskResult.getAreaName() && !callTaskResult.getAreaName().equals("")){
// 查询所有下级区域code
- list = getWaterNameByAreaCode(callTaskResult.getAreaName());
+ list = getAllChildrenAreaByAreaCode(callTaskResult.getAreaName());
}
- List<CallTaskResultVO> resultListPage = callTaskMapper.getCallTaskResultListPage(null, callTaskResult,list);
+ if (null!= callTaskResult.getIds() && !callTaskResult.getIds().equals("")){
+ // 查询所有下级区域code
+ idsList = Arrays.asList(callTaskResult.getIds().split(","));
+ }
+ List<CallTaskResultVO> resultListPage = callTaskMapper.getCallTaskResultListPage(null, callTaskResult,list,idsList);
// 返回
return resultListPage;
+ }
+
+// /**
+// * 查询智能外呼统计数据-按日期-行政区统计
+// * @param page
+// * @param callTaskStatistic
+// * @return
+// */
+// @Override
+// public Object getOutgoingStatisticList(IPage<CallTaskStatistic> page,CallTaskStatistic callTaskStatistic) {
+// if (null==callTaskStatistic.getCreateTime() || callTaskStatistic.getCreateTime().equals("")){
+// long l = System.currentTimeMillis();
+// // 设置当前时间的前一天
+// callTaskStatistic.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date(l - 60*60*24*1000)));
+// }
+// ThreadPoolExecutor executor = myThreadPoolConfig.threadPoolExecutor();
+// // 异步查询统计数据
+// CompletableFuture<List<CallTaskStatistic>> callTaskStatisticCompletableFuture = getListCompletableFuture(page, callTaskStatistic, executor);
+// // 查询 按区域统计连续三天,连续两天未接通,前一天拒接对应的数量
+// Map<String, Object> threeDay = computationTime(callTaskStatistic.getCreateTime(), 2);
+// Map<String, Object> twoDay = computationTime(callTaskStatistic.getCreateTime(), 1);
+// Map<String, Object> oneDay = computationTime(callTaskStatistic.getCreateTime(), 0);
+// // 查询
+// CompletableFuture<List<CallTaskStatistic>> threeDayNotCallConnect = getListCompletableFuture(callTaskStatistic, executor, threeDay, "200003", 2);
+// CompletableFuture<List<CallTaskStatistic>> twoDayNotCallConnect = getListCompletableFuture(callTaskStatistic, executor, twoDay, "200003", 1);
+// CompletableFuture<List<CallTaskStatistic>> oneDayNotCallConnect = getListCompletableFuture(callTaskStatistic, executor, oneDay, "200005", 0);
+// //等待所有任务执行完成
+// try {
+// CompletableFuture.allOf(callTaskStatisticCompletableFuture,threeDayNotCallConnect,twoDayNotCallConnect,oneDayNotCallConnect).get();
+// // 数据处理
+// List<CallTaskStatistic> callTaskStatistics = getCallTaskStatistics(callTaskStatisticCompletableFuture, oneDay, threeDayNotCallConnect, twoDayNotCallConnect, oneDayNotCallConnect);
+// // 取当前行政区总数据
+// List<CallTaskStatistic> totalList = getTotalCallTaskStatistics(callTaskStatistics,callTaskStatistic);
+// // 排序
+// callTaskStatistics = getCallTaskStatisticsByOrder(callTaskStatistic, callTaskStatistics);
+// // 合并数据
+// totalList.addAll(callTaskStatistics);
+// // 返回数据
+// if (null!= callTaskStatistic.getIsPage()) {
+// return totalList;
+// }else {
+// return page.setRecords(totalList);
+// }
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// } catch (ExecutionException e) {
+// e.printStackTrace();
+// }
+// // 返回
+// return null;
+// }
+
+ /**
+ * 查询智能外呼统计数据-按日期-行政区统计
+ * @param page
+ * @param callTaskStatistic
+ * @return
+ */
+ @Override
+ public Object getOutgoingStatisticList(IPage<CallTaskStatistic> page,CallTaskStatistic callTaskStatistic) {
+ if (null==callTaskStatistic.getCreateTime() || callTaskStatistic.getCreateTime().equals("")){
+ long l = System.currentTimeMillis();
+ // 设置当前时间的前一天
+ callTaskStatistic.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date(l - 60*60*24*1000)));
+ }
+ ThreadPoolExecutor executor = myThreadPoolConfig.threadPoolExecutor();
+ // 异步查询当前天日常呼叫(3次)统计数据
+ CompletableFuture<List<CallTaskStatistic>> callTaskStatisticCompletableFuture = getListCompletableFuture(page, callTaskStatistic, executor);
+ // 查询当前天除去日常呼叫外的统计数据
+ CompletableFuture<List<CallTaskStatistic>> notCallConnect = getListCompletableFuture(callTaskStatistic,executor);
+ //等待所有任务执行完成
+ try {
+ CompletableFuture.allOf(callTaskStatisticCompletableFuture,notCallConnect).get();
+ // 数据处理
+ List<CallTaskStatistic> callTaskStatistics = getCallTaskStatistics(callTaskStatisticCompletableFuture,null,null,null, notCallConnect,callTaskStatistic);
+ // 取当前行政区总数据
+ List<CallTaskStatistic> totalList = getTotalCallTaskStatistics(callTaskStatistics,callTaskStatistic);
+ // 排序
+ callTaskStatistics = getCallTaskStatisticsByOrder(callTaskStatistic, callTaskStatistics);
+ // 合并数据
+ totalList.addAll(callTaskStatistics);
+ // 返回数据
+ if (null!= callTaskStatistic.getIsPage()) {
+ return totalList;
+ }else {
+ page.setTotal(totalList.size());
+ return page.setRecords(totalList);
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ // 返回
+ return null;
+ }
+
+ /**
+ * 获取当前行政区总数据
+ * @param callTaskStatistics
+ * @param callTaskStatisticEntity
+ * @return
+ */
+ private List<CallTaskStatistic> getTotalCallTaskStatistics(List<CallTaskStatistic> callTaskStatistics,CallTaskStatistic callTaskStatisticEntity) {
+ List<CallTaskStatistic> statistics = new ArrayList<>();
+ CallTaskStatistic callTaskStatistic = new CallTaskStatistic();
+ Integer totalCalleeNumberCount = 0;
+ Integer totalConnectionCount = 0;
+ Integer totalThreeNoConnectCount = 0;
+// Integer totalTwoNoConnectCount = 0;
+ Integer totalRefuseConnectCount = 0;
+ // 遍历
+ for (CallTaskStatistic taskStatistic : callTaskStatistics) {
+ totalCalleeNumberCount += Integer.parseInt(taskStatistic.getCalleeNumberCount());
+ totalConnectionCount += Integer.parseInt(taskStatistic.getConnectionCount());
+ totalThreeNoConnectCount += taskStatistic.getThreeNoConnectCount();
+// totalTwoNoConnectCount += taskStatistic.getTwoNoConnectCount();
+ totalRefuseConnectCount += taskStatistic.getRefuseConnectCount();
+ }
+ // 设置数据
+ callTaskStatistic.setCalleeNumberCount(totalCalleeNumberCount.toString());
+ callTaskStatistic.setConnectionCount(totalConnectionCount.toString());
+ callTaskStatistic.setThreeNoConnectCount(totalThreeNoConnectCount);
+// callTaskStatistic.setTwoNoConnectCount(totalTwoNoConnectCount);
+ callTaskStatistic.setRefuseConnectCount(totalRefuseConnectCount);
+ callTaskStatistic.setCreateTime(callTaskStatistics.get(0).getCreateTime());
+ // 查询当前行政区名称
+ AttAdBase attAdBase = new AttAdBase();
+ attAdBase.setGuid(callTaskStatisticEntity.getAdCode());
+ AttAdBaseVO detail = attAdBaseService.getDetail(attAdBase);
+ callTaskStatistic.setAdCode(callTaskStatisticEntity.getAdCode());
+ if (null != detail){
+ callTaskStatistic.setAdName(detail.getAdName());
+ }
+ // 计算比例
+ //格式化小数
+ DecimalFormat df = new DecimalFormat("0.00");
+ callTaskStatistic.setCallCompletingRate(df.format((float)totalConnectionCount/totalCalleeNumberCount*100));
+ statistics.add(callTaskStatistic);
+ // 返回
+ return statistics;
+ }
+
+ /**
+ * 排序
+ * @param callTaskStatistic
+ * @param callTaskStatistics
+ * @return
+ */
+ private List<CallTaskStatistic> getCallTaskStatisticsByOrder(CallTaskStatistic callTaskStatistic, List<CallTaskStatistic> callTaskStatistics) {
+ // 排序
+ if (null != callTaskStatistic.getSortName() && !callTaskStatistic.getSortName().equals("")) {
+ if (callTaskStatistic.getSortName().equals("refuseConnectCount")) {
+ if (callTaskStatistic.getSortOrder().equals("desc")) {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getRefuseConnectCount).reversed()).collect(Collectors.toList());
+ }else {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getRefuseConnectCount)).collect(Collectors.toList());
+ }
+ }
+ if (callTaskStatistic.getSortName().equals("twoNoConnectCount")) {
+ if (callTaskStatistic.getSortOrder().equals("desc")) {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getTwoNoConnectCount).reversed()).collect(Collectors.toList());
+ }else {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getTwoNoConnectCount)).collect(Collectors.toList());
+ }
+ }
+ if (callTaskStatistic.getSortName().equals("threeNoConnectCount")) {
+ if (callTaskStatistic.getSortOrder().equals("desc")) {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getThreeNoConnectCount).reversed()).collect(Collectors.toList());
+ }else {
+ callTaskStatistics = callTaskStatistics.stream().sorted(Comparator.comparing(CallTaskStatistic::getThreeNoConnectCount)).collect(Collectors.toList());
+ }
+ }
+ }
+ return callTaskStatistics;
+ }
+
+ /**
+ * 查询当前天除去日常呼叫外的统计数据
+ * @param callTaskStatistic
+ * @param executor
+ * @return
+ */
+ @NotNull
+ private CompletableFuture<List<CallTaskStatistic>> getListCompletableFuture(CallTaskStatistic callTaskStatistic, ThreadPoolExecutor executor) {
+ return CompletableFuture.supplyAsync(()->{
+ List<CallTaskStatistic> outgoingStatisticList = callTaskMapper.getNoDayOutgoingStatisticList(callTaskStatistic);
+ return outgoingStatisticList;
+ },executor);
+ }
+
+ /**
+ * 按行政区查询对应的接通率
+ * @param page
+ * @param callTaskStatistic
+ * @param executor
+ * @return
+ */
+ @NotNull
+ private CompletableFuture<List<CallTaskStatistic>> getListCompletableFuture(IPage<CallTaskStatistic> page, CallTaskStatistic callTaskStatistic, ThreadPoolExecutor executor) {
+ return CompletableFuture.supplyAsync(()->{
+ List<CallTaskStatistic> outgoingStatisticList = new ArrayList<>();
+ // 判断是否分页
+ if (null!= callTaskStatistic.getIsPage()){
+ // 不分页
+ outgoingStatisticList = callTaskMapper.getOutgoingStatisticList(null,callTaskStatistic,null);
+ }else {
+ // 按天查询数据
+ outgoingStatisticList = callTaskMapper.getOutgoingStatisticList(page, callTaskStatistic, null);
+ }
+ return outgoingStatisticList;
+ },executor);
+ }
+
+ /**
+ * 数据处理
+ * @param callTaskStatisticCompletableFuture
+ * @param oneDay
+ * @param threeDayNotCallConnect
+ * @param twoDayNotCallConnect
+ * @param oneDayNotCallConnect
+ * @return
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ @NotNull
+ private List<CallTaskStatistic> getCallTaskStatistics(CompletableFuture<List<CallTaskStatistic>> callTaskStatisticCompletableFuture,
+ Map<String, Object> oneDay,
+ CompletableFuture<List<CallTaskStatistic>> threeDayNotCallConnect,
+ CompletableFuture<List<CallTaskStatistic>> twoDayNotCallConnect,
+ CompletableFuture<List<CallTaskStatistic>> oneDayNotCallConnect,
+ CallTaskStatistic callTaskStatistic) throws InterruptedException, ExecutionException {
+ // 获取信息
+ List<CallTaskStatistic> callTaskStatistics = callTaskStatisticCompletableFuture.get();
+// List<CallTaskStatistic> threeNotConnectTaskStatisticsList = threeDayNotCallConnect.get();
+// List<CallTaskStatistic> twoNotConnectTaskStatisticsList = twoDayNotCallConnect.get();
+ List<CallTaskStatistic> oneNotConnectTaskStatisticsList = oneDayNotCallConnect.get();
+ // 遍历
+ for (CallTaskStatistic taskStatistic : callTaskStatistics) {
+// taskStatistic.setCreateTime(oneDay.get("endTime").toString());
+ taskStatistic.setCreateTime(callTaskStatistic.getCreateTime());
+// for (CallTaskStatistic statistic : threeNotConnectTaskStatisticsList) {
+// if (taskStatistic.getGuid().equals(statistic.getGuid())){
+// taskStatistic.setThreeNoConnectCount(statistic.getCount());
+// }
+// }
+// for (CallTaskStatistic statistic : twoNotConnectTaskStatisticsList) {
+// if (taskStatistic.getGuid().equals(statistic.getGuid())){
+// taskStatistic.setTwoNoConnectCount(statistic.getCount());
+// }
+// }
+ for (CallTaskStatistic statistic : oneNotConnectTaskStatisticsList) {
+ if (taskStatistic.getGuid().equals(statistic.getGuid())){
+ Integer count = Integer.parseInt(taskStatistic.getCalleeNumberCount()) + Integer.parseInt(statistic.getCalleeNumberCount());
+ Integer connectCount = Integer.parseInt(taskStatistic.getConnectionCount()) + Integer.parseInt(statistic.getConnectionCount());
+ taskStatistic.setCalleeNumberCount(count.toString());
+ taskStatistic.setConnectionCount(connectCount.toString());
+ taskStatistic.setThreeNoConnectCount(taskStatistic.getThreeNoConnectCount() + statistic.getThreeNoConnectCount());
+ taskStatistic.setRefuseConnectCount(taskStatistic.getRefuseConnectCount() + statistic.getRefuseConnectCount());
+ // 计算比例
+ if (connectCount==0){
+ taskStatistic.setCallCompletingRate("0");
+ }else {
+ //格式化小数
+ DecimalFormat df = new DecimalFormat("0.00");
+ taskStatistic.setCallCompletingRate(df.format((float) connectCount / count * 100));
+ }
+ }
+ }
+ }
+ return callTaskStatistics;
+ }
+
+ /**
+ * 按行政区查询未接通/拒接统计数据
+ * @param callTaskStatistic
+ * @param executor
+ * @param threeDay 日期
+ * @param s 状态
+ * @param i 数量
+ * @return
+ */
+ @NotNull
+ private CompletableFuture<List<CallTaskStatistic>> getListCompletableFuture(CallTaskStatistic callTaskStatistic, ThreadPoolExecutor executor, Map<String, Object> threeDay, String s, int i) {
+ return CompletableFuture.supplyAsync(() -> {
+ // 按天查询数据,区域统计
+ List<CallTaskStatistic> threeDayNotCallConnectStatisticList
+ = callTaskMapper.getNotCallConnectStatisticList(callTaskStatistic, s, i, threeDay);
+ return threeDayNotCallConnectStatisticList;
+ }, executor);
+ }
+
+ /**
+ * 查询智能外呼统计数据-行政区统计
+ * @param callTaskStatistic
+ * @return
+ */
+ @Override
+ public Object getOutgoingStatisticByArea(CallTaskStatistic callTaskStatistic) {
+ if (null==callTaskStatistic.getCreateTime() || callTaskStatistic.getCreateTime().equals("")){
+ long l = System.currentTimeMillis();
+ // 设置当前时间的前一天
+ callTaskStatistic.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date(l - 60*60*24*1000)));
+ }
+ if (null==callTaskStatistic.getStartTime() || callTaskStatistic.getStartTime().equals("")){
+ long l = System.currentTimeMillis();
+ String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date(l - 60 * 60 * 24 * 1000));
+ // 设置当前时间的前一天
+ callTaskStatistic.setStartTime(format);
+ callTaskStatistic.setEndTime(format);
+ }
+ ThreadPoolExecutor executor = myThreadPoolConfig.threadPoolExecutor();
+ callTaskStatistic.setIsPage(1);
+ // 异步查询当前天日常呼叫(3次)统计数据
+ CompletableFuture<List<CallTaskStatistic>> callTaskStatisticCompletableFuture = getListCompletableFuture(null, callTaskStatistic, executor);
+ // 查询当前天除去日常呼叫外的统计数据
+ CompletableFuture<List<CallTaskStatistic>> notCallConnect = getListCompletableFuture(callTaskStatistic,executor);
+ //等待所有任务执行完成
+ try {
+ CompletableFuture.allOf(callTaskStatisticCompletableFuture,notCallConnect).get();
+ // 数据处理
+ List<CallTaskStatistic> callTaskStatistics = getCallTaskStatistics(callTaskStatisticCompletableFuture,null,null,null, notCallConnect,callTaskStatistic);
+ // 取当前行政区总数据
+// List<CallTaskStatistic> totalList = getTotalCallTaskStatistics(callTaskStatistics,callTaskStatistic);
+ List<CallTaskStatistic> totalList = new ArrayList<>();
+ // 排序
+ callTaskStatistics = getCallTaskStatisticsByOrder(callTaskStatistic, callTaskStatistics);
+ // 合并数据
+ totalList.addAll(callTaskStatistics);
+ // 返回数据
+ return totalList;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ // 返回
+ return null;
+// return callTaskMapper.getOutgoingStatisticByArea(callTaskStatistic);
+ }
+
+ /**
+ * 查询所有下级区域
+ * @param areaCode
+ * @return
+ */
+ private List<String> getAllChildrenAreaByAreaCode(String areaCode) {
+ return callTaskMapper.getAllChildrenAreaByAreaCode(areaCode);
}
/**
@@ -256,4 +748,520 @@
// 通过行政区编号获取水库名称
return callTaskMapper.getWaterNameByAreaCode(areaCode);
}
+
+ /**
+ * 根据条件自动创建外呼任务
+ * @param params
+ * @return
+ */
+ @Override
+ public List<String> createCallTaskByParam(Map<String, Object> params) {
+ // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
+ String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
+ if (null==redisOneKey){
+ List<String> stringList = everydayCall(params);
+ // 取出数据进行设置 taskId
+ bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
+ // 异步保存日常关联呼叫任务信息
+ asyncCallService.saveDailyCallTask(stringList.get(1),1);
+ // 响应
+ return stringList;
+ }else {
+ return createEverydayAfter(redisOneKey);
+ }
+ }
+
+ /**
+ * 根据条件自动创建外呼任务--一直未接通,一直未呼叫的水库
+ * @param params
+ * @return
+ */
+ @Override
+ public List<String> createCallTaskByParamByNotCall(Map<String, Object> params) {
+ // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
+ String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
+ if (null==redisOneKey){
+ List<String> stringList = everydayCallByNotCall(params);
+ // 取出数据进行设置 taskId
+ bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
+ // 异步保存日常关联呼叫任务信息
+ asyncCallService.saveDailyCallTask(stringList.get(1),1);
+ // 响应
+ return stringList;
+ }else {
+ return createEverydayAfter(redisOneKey);
+ }
+ }
+
+ /**
+ * 根据条件自动创建外呼任务--指定区域呼叫
+ * @param params
+ * @return
+ */
+ @Override
+ public List<String> createOutCallTaskJobHandlerByArea(Map<String, Object> params) {
+ // 常规任务,每天上午11点打150人,下午2点打11点未接人员,下午5点打下午2点未接通人员
+ String redisOneKey = bladeRedis.get(CallConstant.call_task_key);
+ if (null==redisOneKey){
+ List<String> stringList = everydayCallByArea(params);
+ // 取出数据进行设置 taskId
+ bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+1,6*60*60L);
+ // 异步保存日常关联呼叫任务信息
+ asyncCallService.saveDailyCallTask(stringList.get(1),1);
+ // 响应
+ return stringList;
+ }else {
+ return createEverydayAfter(redisOneKey);
+ }
+ }
+
+ /**
+ * 日常外呼任务未接通的继续拨打
+ * @param redisOneKey 取值为上一次外呼的任务id
+ * @return
+ */
+ private List<String> createEverydayAfter(String redisOneKey) {
+// redisOneKey = "2216,1";
+ String[] split = redisOneKey.split(",");
+ String taskId = split[0];
+ String type = split[1];
+ List<String> stringList = new ArrayList<>();
+ Map<String, Object> params = new HashMap<>();
+ // 通过 taskId 查询未呼叫人员(mysql)
+ List<Scene> list = callTaskMapper.getCallNotConnectListByTaskId(taskId);
+ if (list.size()>0){
+ Set<Scene> scenes = new HashSet<>(list);
+ // 传入调度时间和随机得到的人员信息进行任务的创建并返回
+ params.put("list",setForListMap(scenes));
+ // 调度时间处理
+ params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ // 创建任务
+ stringList = createTask(params);
+
+ // 判断是否发送短信
+ if (type.equals("1")){
+ // 取出数据进行设置 taskId
+ bladeRedis.setEx(CallConstant.call_task_key,stringList.get(1)+","+2,6*60*60L);
+ // 异步保存日常关联呼叫任务信息
+ asyncCallService.saveDailyCallTask(stringList.get(1),2);
+ }
+ // 判断是否发送短信
+ if (type.equals("2")){
+ // 新增一个参数代表需要发短信
+ stringList.add("3");
+ // 异步保存日常关联呼叫任务信息
+ asyncCallService.saveDailyCallTask(stringList.get(1),3);
+ }
+ }
+ // 返回
+ return stringList;
+ }
+
+ /**
+ * 日常外呼任务创建--从未接通和从未呼叫的水库
+ * @param params
+ * @return
+ */
+ private List<String> everydayCallByNotCall(Map<String, Object> params) {
+ // 查询从未接通和从未呼叫的水库
+ List<Scene> totalList = callTaskMapper.getNotCallOrCallNotConnect();
+ // 取出随机的150人
+ Set<Scene> taskRandomList = new HashSet<>(totalList);
+// Integer personNumber = 220;
+// Random random = new Random();
+// for (int i = 0; i < totalList.size(); i++) {
+// // 获取随机数作为下标索引
+// int num = random.nextInt(totalList.size());
+// // 保存到 hashSet ,保证唯一
+// taskRandomList.add(totalList.get(num));
+// // 数量达到预期设定退出循环
+// if (taskRandomList.size() == personNumber) {
+// break;
+// }
+// }
+ //4. 传入调度时间和随机得到的人员信息进行任务的创建并返回
+ params.put("list",setForListMap(taskRandomList));
+ // 调度时间处理
+ params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " +params.get("taskScheduleTime") + ":00");
+ // 创建任务并返回结果
+ return createTask(params);
+ }
+
+ /**
+ * 日常外呼任务创建--按区域
+ * @param params
+ * @return
+ */
+ private List<String> everydayCallByArea(Map<String, Object> params) {
+ // 按区域查询需要呼叫的人员信息
+ List<Scene> totalList = callTaskMapper.getCallListByArea();
+ // 取出随机的150人
+ Set<Scene> taskRandomList = new HashSet<>();
+ Integer personNumber = 150;
+ Random random = new Random();
+ for (int i = 0; i < totalList.size(); i++) {
+ // 获取随机数作为下标索引
+ int num = random.nextInt(totalList.size());
+ // 保存到 hashSet ,保证唯一
+ taskRandomList.add(totalList.get(num));
+ // 数量达到预期设定退出循环
+ if (taskRandomList.size() == personNumber) {
+ break;
+ }
+ }
+ //4. 传入调度时间和随机得到的人员信息进行任务的创建并返回
+ params.put("list",setForListMap(taskRandomList));
+ // 调度时间处理
+ params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " +params.get("taskScheduleTime") + ":00");
+ // 创建任务并返回结果
+ return createTask(params);
+ }
+
+ /**
+ * 日常外呼任务创建
+ * @param params
+ * @return
+ */
+ private List<String> everydayCall(Map<String, Object> params) {
+ // 自动创建任务的 4个条件 1:呼叫人数 2:调度时间 3:是否超汛限 4:多少天内呼叫过的不呼叫(天数)
+ //1. 调用中台接口查询出所有需要发任务的水库巡查责任人相关信息(该处需要将是否超汛限条件传入)
+ JSONArray jsonArray = getZtWaterMangerData(params);
+ // 过滤得到手机号集合(排查手机号为null的数据)
+ List<Scene> totalList = filterJsonToList(jsonArray);
+ //2. 查询外呼多少天内已呼叫过的人员手机号集合信息
+ // 计算开始时间,结束时间
+ computationTime(params);
+ // 查询对应数据
+ List<String> list = callTaskMapper.getCallUserPhoneByParam(params);
+ //3. 比对中台得到的数据和外呼已呼叫信息,从中随机取出呼叫人数的信息
+ Set<Scene> taskRandomList = getCreateTaskRandomList(params, totalList, list);
+ //4. 传入调度时间和随机得到的人员信息进行任务的创建并返回
+ params.put("list",setForListMap(taskRandomList));
+ // 调度时间处理
+ params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd").format(new Date())+ " " +params.get("taskScheduleTime") + ":00");
+ // 创建任务并返回结果
+ return createTask(params);
+ }
+
+ /**
+ * 智能外呼呼叫前一天未接通人员
+ * @param map 包含调度时间
+ * @return
+ */
+ @Override
+ public List<String> createOutCallTaskByNotConnectJobHandler(Map<String, Object> map) {
+ map.put("day",1);
+ map.put("isOver","");
+ // 自动创建任务的 条件1:昨天外呼未接通人员 条件2:前三天如果同一个人都未接通,则不再呼叫
+ // 计算开始时间,结束时间
+ computationTime(map);
+ // 1. 查询前一天呼叫未接通人员
+ List<Scene> oneDayCallNotConnectList = callTaskMapper.getBeforeOneDayCallNotConnect(map);
+ if (oneDayCallNotConnectList.size()>0) {
+ // 2. 判断是否填报,查询前一天已填报的人员
+ List<String> fillRecordList = callTaskMapper.getFillRecordList(map);
+ // 3. 查询三天都未接通的人员
+ map.put("day", 3);
+ List<String> threeDayCallNotConnectList = callTaskMapper.getBeforeThreeDayCallNotConnect(map);
+ // 4. 组装数据,从前一天呼叫未接通里面去除已填报人员,去除连续三天未接人员
+ Set<Scene> taskRandomList = callNotConnectListDataHandle(oneDayCallNotConnectList, fillRecordList, threeDayCallNotConnectList);
+ // 5. 传入调度时间和随机得到的人员信息进行任务的创建并返回
+ map.put("list", setForListMap(taskRandomList));
+ // 调度时间处理
+ map.put("taskScheduleTime", new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " " + map.get("taskScheduleTime") + ":00");
+ // 创建任务并返回结果
+ return createTask(map);
+ }
+ return null;
+ }
+
+ /**
+ * 组装数据,从前一天呼叫未接通里面去除已填报人员,去除连续三天未接人员
+ * @param oneDayCallNotConnectList 前一天呼叫未接通人员信息
+ * @param fillRecordList 前一天已填报的人员手机号集合
+ * @param threeDayCallNotConnectList 连续三天都未接通的人员手机号集合
+ * @return
+ */
+ private Set<Scene> callNotConnectListDataHandle(List<Scene> oneDayCallNotConnectList, List<String> fillRecordList, List<String> threeDayCallNotConnectList) {
+ // 取差集
+ // 去除前一天已填报的人员手机号集合
+ List<Scene> sceneList = oneDayCallNotConnectList.stream().filter(item -> !fillRecordList.contains(item.getPhone())).collect(Collectors.toList());
+ // 再去除连续三天都未接通的人员手机号集合
+ List<Scene> resultList = sceneList.stream().filter(item -> !threeDayCallNotConnectList.contains(item.getPhone())).collect(Collectors.toList());
+ // 转set去重
+ HashSet<Scene> scenes = new HashSet<>(resultList);
+ // 返回
+ return scenes;
+ }
+
+ /**
+ * hashSet 转 List<Map<String,String>>
+ * @param taskRandomList
+ * @return
+ */
+ private List<Map<String,String>> setForListMap(Set<Scene> taskRandomList) {
+ List<Map<String,String>> list = new ArrayList<>();
+ for (Scene scene : taskRandomList) {
+ Map<String, String> map = new HashMap<>();
+ map.put("phone",scene.getPhone());
+ map.put("name",scene.getWaterName());
+ map.put("code",scene.getWaterCode());
+ map.put("userName",scene.getUsername());
+ map.put("userId",scene.getPhone());
+ map.put("over","");
+ // 加入集合
+ list.add(map);
+ }
+ return list;
+ }
+
+ /**
+ * 获取随机呼叫的相关信息
+ * @param params
+ * @param totalList
+ * @param list
+ */
+ private Set<Scene> getCreateTaskRandomList(Map<String, Object> params, List<Scene> totalList, List<String> list) {
+ Integer personNumber = ZtConstant.person_number;
+ if (!params.get("personNumber").equals("")){
+ personNumber = Integer.parseInt(params.get("personNumber").toString());
+ }
+ // 先取差集
+ List<Scene> sceneList = totalList.stream().filter(item -> !list.contains(item.getPhone())).collect(Collectors.toList());
+ // 如果差集数量不够 预定的数量(超汛情况),则从未超汛情况数据中补齐预定的数量
+ if (sceneList.size()<personNumber){
+ Map<String, Object> map = new HashMap<>();
+ map.put("isOver",0);
+ // 查询未超汛的数据
+ JSONArray jsonArray = getZtWaterMangerData(map);
+ // 过滤得到手机号集合(排查手机号为null的数据)
+ List<Scene> sceneListNoOver = filterJsonToList(jsonArray);
+ // 取差集
+ List<Scene> differenceSceneListNoOver = sceneListNoOver.stream().filter(item -> !list.contains(item.getPhone())).collect(Collectors.toList());
+ // 再随机抽取对应人员手机号
+ Set<Scene> hashSet = new HashSet<>();
+ // 先将超汛的加入集合
+ for (Scene scene : sceneList) {
+ hashSet.add(scene);
+ }
+ // 未超汛的补充
+ personNumber = personNumber - sceneList.size();
+ Random random = new Random();
+ for (int i = 0; i < differenceSceneListNoOver.size(); i++) {
+ // 获取随机数作为下标索引
+ int num = random.nextInt(differenceSceneListNoOver.size());
+ // 保存到 hashSet ,保证唯一
+ hashSet.add(differenceSceneListNoOver.get(num));
+ // 数量达到预期设定退出循环
+ if (hashSet.size() == personNumber) {
+ break;
+ }
+ }
+ return hashSet;
+ }else {
+ // 再随机抽取对应人员手机号
+ Set<Scene> hashSet = new HashSet<>();
+ Random random = new Random();
+ for (int i = 0; i < sceneList.size(); i++) {
+ // 获取随机数作为下标索引
+ int num = random.nextInt(sceneList.size());
+ // 保存到 hashSet ,保证唯一
+ hashSet.add(sceneList.get(num));
+ // 数量达到预期设定退出循环
+ if (hashSet.size() == personNumber) {
+ break;
+ }
+ }
+ return hashSet;
+ }
+ }
+
+ /**
+ * 将 jsonArray 取出手机号得到新的集合--超汛限场景
+ * @param jsonArray
+ * @return
+ */
+ private List<Scene> filterJsonToList(JSONArray jsonArray) {
+ List<Scene> list = new ArrayList<>();
+ for (int i = 0; i < jsonArray.size(); i++) {
+ if (null != jsonArray.getJSONObject(i).get("user_phone") &&
+ !jsonArray.getJSONObject(i).get("user_phone").equals("")){
+ Scene scene = new Scene();
+ scene.setPhone(jsonArray.getJSONObject(i).get("user_phone").toString());
+ scene.setUsername(jsonArray.getJSONObject(i).get("user_name").toString());
+ scene.setUserId(jsonArray.getJSONObject(i).get("user_phone").toString());
+ scene.setWaterName(jsonArray.getJSONObject(i).get("res_nm").toString());
+ scene.setWaterCode(jsonArray.getJSONObject(i).get("res_cd").toString());
+ // 加入集合
+ list.add(scene);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * 计算时间
+ * @param params
+ */
+ private void computationTime(Map<String, Object> params) {
+ long l = System.currentTimeMillis();
+ Integer day = ZtConstant.day_number;
+ // 获取天数
+ if (null != params.get("day")){
+ day = Integer.parseInt(params.get("day").toString());
+ }
+ long m = 60*60*24*1000*day;
+ // 相减得到时间
+ Long x = l-m;
+ // 格式化日期
+ String startTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date(x));
+ String endTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date(l));
+ // 加入到参数中
+ params.put("startTime",startTime);
+ params.put("endTime",endTime);
+ }
+
+ /**
+ * 计算时间
+ * @param time 传入的时间
+ * @param day 天数
+ */
+ private Map<String,Object> computationTime(String time,Integer day) {
+ HashMap<String, Object> map = new HashMap<>(2);
+ long l = 0;
+ try {
+ l = new SimpleDateFormat("yyyy-MM-dd").parse(time).getTime();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ long m = 60*60*24*1000*day;
+ // 相减得到时间
+ Long x = l-m;
+ // 格式化日期
+ String startTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date(x));
+ String endTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date(l));
+ // 加入到参数中
+ map.put("startTime",startTime);
+ map.put("endTime",endTime);
+ // 返回
+ return map;
+ }
+
+ /**
+ * 调用中台接口查询出所有需要发任务的水库巡查责任人相关信息(该处需要将是否超汛限条件传入)
+ * @param params
+ * @return
+ */
+ private JSONArray getZtWaterMangerData(Map<String, Object> params) {
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.add(ZtConstant.header_key, ZtConstant.header_value);
+ //封装请求头
+ HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
+ try {
+ //有请求头,有参数请求
+ ResponseEntity<String> responseEntity =
+ restTemplate.exchange(ZtConstant.patr_person_api+"?is_over="+params.get("isOver"),
+ HttpMethod.GET,
+ formEntity,
+ String.class);
+ JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
+ JSONArray jsonArray = JSONArray.parseArray(jsonObject.get("resultList").toString());
+ // 返回
+ return jsonArray;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 查询未接通,拒接的呼叫结果详情列表信息
+ * @param page
+ * @param callTaskStatistic
+ * @return
+ */
+ @Override
+ public Object getCallNotConnectResultList(IPage<CallTaskStatistic> page,CallTaskStatistic callTaskStatistic) {
+ // 计算时间
+ Map<String, Object> map = computationTime(callTaskStatistic.getCreateTime(), callTaskStatistic.getCount());
+ List<String> list = new ArrayList<>();
+ if (null!= callTaskStatistic.getAdCode() && !callTaskStatistic.getAdCode().equals("")){
+ // 查询所有下级区域code
+ list = getAllChildrenAreaByAreaCode(callTaskStatistic.getAdCode());
+ }
+ if (null!=callTaskStatistic.getIsPage()){
+ // 不分页
+ return callTaskMapper.getCallNotConnectResultList(null, list,callTaskStatistic,map);
+ }
+ List<CallTaskStatistic> callNotConnectResultList = callTaskMapper.getCallNotConnectResultList(page,list, callTaskStatistic,map);
+ // 返回
+ return page.setRecords(callNotConnectResultList);
+ }
+
+ /**
+ * 按日期行政区呼叫结果详情列表信息
+ * @param callTaskStatistic
+ * @param page
+ * @return
+ */
+ @Override
+ public Object getCallResultList(IPage<CallTaskStatistic> page, CallTaskStatistic callTaskStatistic) {
+ if (null!=callTaskStatistic.getIsPage()){
+ // 不分页
+ return callTaskMapper.getCallResultList(null,callTaskStatistic);
+ }
+ List<CallTaskStatistic> callNotConnectResultList = callTaskMapper.getCallResultList(page, callTaskStatistic);
+ // 返回
+ return page.setRecords(callNotConnectResultList);
+ }
+
+ /**
+ * 详情导出临时接口
+ * @param callTaskResult
+ * @param page
+ * @return
+ */
+ @Override
+ public Object getCallResultListTemp(IPage<CallTaskResultVO> page, CallTaskResultVO callTaskResult) {
+ List<String> list = new ArrayList<>();
+ if (null!=callTaskResult.getIds() && !callTaskResult.getIds().equals("")){
+ list = Arrays.asList(callTaskResult.getIds().split(","));
+ }
+ // 不分页
+ return callTaskMapper.getCallResultListTemp(null,callTaskResult,list);
+ }
+
+ /**
+ * 导入表格发送智能外呼
+ * @param list
+ * @param time
+ * @return
+ */
+ @Override
+ public Object importCall(List<CallExcel> list,String time) {
+ // 转换
+ List<String> stringList = list.stream().map(CallExcel::getWaterCode).collect(Collectors.toList());
+ // 通过水库代码获取水库及巡查责任人信息
+ Set<Scene> personList = attResManagePersonService.getPatrolPersonListByWaterCodeList(stringList);
+ Map<String, Object> params = new HashMap<>();
+ //传入调度时间和随机得到的人员信息进行任务的创建并返回
+ params.put("list",setForListMap(personList));
+ // 调度时间处理
+ if (null!=time && !time.equals("")){
+ params.put("taskScheduleTime",time);
+ }else {
+ params.put("taskScheduleTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ }
+ // 创建任务并返回结果
+ List<String> task = createTask(params);
+ if (null!=task.get(1) && !task.get(1).equals("")){
+ String successMsg = "外呼任务创建成功";
+ // 返回
+ return R.data(200,successMsg,null);
+ }
+ String errorMsg = task.get(0);
+ // 返回
+ return R.data(400,errorMsg,null);
+ }
}
--
Gitblit v1.9.3