From 9d4e809d8aeed49c920c6ab27d93165dfb3fb46a Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Wed, 05 Jul 2023 19:18:24 +0800
Subject: [PATCH] 外呼任务创建新增关联信息

---
 skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/service/impl/CallServiceImpl.java |  497 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 485 insertions(+), 12 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 fafa8fc..8a6d156 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;
@@ -7,6 +8,9 @@
 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.vo.AttAdBaseVO;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -14,18 +18,24 @@
 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.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
-import org.springframework.util.LinkedMultiValueMap;
 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.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -36,7 +46,16 @@
 	private CallTaskMapper callTaskMapper;
 
 	@Autowired
+	private IAttAdBaseService attAdBaseService;
+
+	@Autowired
 	private RestTemplate restTemplate;
+
+	@Autowired
+	private BladeRedis bladeRedis;
+
+	@Autowired
+	private AsyncCallService asyncCallService;
 
 //	@Value("${dial.task.url}")
 	private String url = CallConstant.HOST;
@@ -55,6 +74,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";
@@ -264,27 +286,292 @@
 		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) {
-		List<String> list = new ArrayList<>();
-		if (null!= callTaskStatistic.getAdName() && !callTaskStatistic.getAdName().equals("")){
-			// 查询所有下级区域code
-			list = getAllChildrenAreaByAreaCode(callTaskStatistic.getAdName());
+		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)));
 		}
-		// 勾选导出行政区 id 组装
-		if (null!= callTaskStatistic.getIds() && !callTaskStatistic.getIds().equals("")){
-			list = Arrays.asList(callTaskStatistic.getIds().split(","));
+		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 {
+				return page.setRecords(totalList);
+			}
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		} catch (ExecutionException e) {
+			e.printStackTrace();
 		}
-		// 判断是否分页
-		if (null!= callTaskStatistic.getIsPage()){
-			return callTaskMapper.getOutgoingStatisticList(null,callTaskStatistic,list);
+		// 返回
+		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();
 		}
-		return page.setRecords(callTaskMapper.getOutgoingStatisticList(page,callTaskStatistic,list));
+		// 设置数据
+		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.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);
 	}
 
 	/**
@@ -333,6 +620,69 @@
 	 */
 	@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 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> everydayCall(Map<String, Object> params) {
 		// 自动创建任务的 4个条件  1:呼叫人数  2:调度时间  3:是否超汛限  4:多少天内呼叫过的不呼叫(天数)
 		//1. 调用中台接口查询出所有需要发任务的水库巡查责任人相关信息(该处需要将是否超汛限条件传入)
 		JSONArray jsonArray = getZtWaterMangerData(params);
@@ -351,6 +701,57 @@
 		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;
 	}
 
 	/**
@@ -481,6 +882,32 @@
 	}
 
 	/**
+	 * 计算时间
+	 * @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
@@ -507,4 +934,50 @@
 		}
 		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) {
+		List<String> list = new ArrayList<>();
+		if (null!= callTaskStatistic.getAdCode() && !callTaskStatistic.getAdCode().equals("")){
+			// 查询所有下级区域code
+			list = getAllChildrenAreaByAreaCode(callTaskStatistic.getAdCode());
+		}
+		if (null!=callTaskStatistic.getIsPage()){
+			// 不分页
+			return callTaskMapper.getCallResultList(null, list,callTaskStatistic);
+		}
+		List<CallTaskStatistic> callNotConnectResultList = callTaskMapper.getCallResultList(page,list, callTaskStatistic);
+		// 返回
+		return page.setRecords(callNotConnectResultList);
+	}
 }

--
Gitblit v1.9.3