From 484f0d1017906469f15d1c74921142332139ede1 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Mon, 26 Jun 2023 15:12:10 +0800
Subject: [PATCH] 智能外呼统计调整,新增连续三天,两天未接通,当前时间拒绝统计及相关详情查询导出

---
 skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java |  195 ++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 170 insertions(+), 25 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 8f874f4..efcc550 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,5 +1,6 @@
 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;
@@ -14,6 +15,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
@@ -27,6 +29,9 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -56,6 +61,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";
@@ -278,39 +286,152 @@
 			// 设置当前时间的前一天
 			callTaskStatistic.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date(l - 60*60*24*1000)));
 		}
-		List<String> list = new ArrayList<>();
-		if (null!= callTaskStatistic.getAdName() && !callTaskStatistic.getAdName().equals("")){
-			// 查询所有下级区域code
-			list = getAllChildrenAreaByAreaCode(callTaskStatistic.getAdName());
-		}
-		// 勾选导出行政区 id 组装
-		if (null!= callTaskStatistic.getIds() && !callTaskStatistic.getIds().equals("")){
-			list = Arrays.asList(callTaskStatistic.getIds().split(","));
-		}
-		// 判断是否分页
-		if (null!= callTaskStatistic.getIsPage()){
-			return callTaskMapper.getOutgoingStatisticList(null,callTaskStatistic,list);
-		}
-		// 按天查询数据
-		List<CallTaskStatistic> outgoingStatisticList = callTaskMapper.getOutgoingStatisticList(page, callTaskStatistic, list);
+		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);
 		// 查询
-		List<CallTaskStatistic> notCallConnectStatisticList = callTaskMapper.getNotCallConnectStatisticList(callTaskStatistic,list,threeDay,twoDay,oneDay);
-		// 遍历
-		for (CallTaskStatistic taskStatistic : outgoingStatisticList) {
-			for (CallTaskStatistic statistic : notCallConnectStatisticList) {
-				if (taskStatistic.getGuid().equals(statistic.getGuid())){
-					taskStatistic.setThreeNoConnectCount(statistic.getThreeNoConnectCount());
-					taskStatistic.setTwoNoConnectCount(statistic.getTwoNoConnectCount());
-					taskStatistic.setRefuseConnectCount(statistic.getRefuseConnectCount());
+		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);
+			// 排序
+			callTaskStatistics = getCallTaskStatisticsByOrder(callTaskStatistic, callTaskStatistics);
+			// 返回数据
+			if (null!= callTaskStatistic.getIsPage()) {
+				return callTaskStatistics;
+			}else {
+				return page.setRecords(callTaskStatistics);
+			}
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		} catch (ExecutionException e) {
+			e.printStackTrace();
+		}
+		// 返回
+		return null;
+	}
+
+	/**
+	 * 排序
+	 * @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 page.setRecords(outgoingStatisticList);
+		return callTaskStatistics;
+	}
+
+	/**
+	 * 按行政区查询对应的接通率
+	 * @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) 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());
+			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())){
+					taskStatistic.setRefuseConnectCount(statistic.getCount());
+				}
+			}
+		}
+		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);
 	}
 
 	/**
@@ -610,4 +731,28 @@
 		}
 		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);
+	}
 }

--
Gitblit v1.9.3