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 |  517 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 484 insertions(+), 33 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 018cd35..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
@@ -4,12 +4,14 @@
 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;
@@ -19,11 +21,12 @@
 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.*;
 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;
 
@@ -50,6 +53,15 @@
 
 	@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;
@@ -91,7 +103,7 @@
 		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")) + "智能外呼";;
+		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();
 		}
@@ -105,6 +117,78 @@
 			scenesIds = map.get("scenesId").toString();
 		}
 		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", 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);
@@ -145,6 +229,23 @@
 		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;
 	}
 
 	/**
@@ -280,6 +381,56 @@
 		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
@@ -294,21 +445,15 @@
 			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);
-		// 查询 按区域统计连续三天,连续两天未接通,前一天拒接对应的数量
-		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);
+		// 查询当前天除去日常呼叫外的统计数据
+		CompletableFuture<List<CallTaskStatistic>> notCallConnect = getListCompletableFuture(callTaskStatistic,executor);
 		//等待所有任务执行完成
 		try {
-			CompletableFuture.allOf(callTaskStatisticCompletableFuture,threeDayNotCallConnect,twoDayNotCallConnect,oneDayNotCallConnect).get();
+			CompletableFuture.allOf(callTaskStatisticCompletableFuture,notCallConnect).get();
 			// 数据处理
-			List<CallTaskStatistic> callTaskStatistics = getCallTaskStatistics(callTaskStatisticCompletableFuture, oneDay, threeDayNotCallConnect, twoDayNotCallConnect, oneDayNotCallConnect);
+			List<CallTaskStatistic> callTaskStatistics = getCallTaskStatistics(callTaskStatisticCompletableFuture,null,null,null, notCallConnect,callTaskStatistic);
 			// 取当前行政区总数据
 			List<CallTaskStatistic> totalList = getTotalCallTaskStatistics(callTaskStatistics,callTaskStatistic);
 			// 排序
@@ -319,6 +464,7 @@
 			if (null!= callTaskStatistic.getIsPage()) {
 				return totalList;
 			}else {
+				page.setTotal(totalList.size());
 				return page.setRecords(totalList);
 			}
 		} catch (InterruptedException e) {
@@ -342,21 +488,21 @@
 		Integer totalCalleeNumberCount = 0;
 		Integer totalConnectionCount = 0;
 		Integer totalThreeNoConnectCount = 0;
-		Integer totalTwoNoConnectCount = 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();
+//			totalTwoNoConnectCount += taskStatistic.getTwoNoConnectCount();
 			totalRefuseConnectCount += taskStatistic.getRefuseConnectCount();
 		}
 		// 设置数据
 		callTaskStatistic.setCalleeNumberCount(totalCalleeNumberCount.toString());
 		callTaskStatistic.setConnectionCount(totalConnectionCount.toString());
 		callTaskStatistic.setThreeNoConnectCount(totalThreeNoConnectCount);
-		callTaskStatistic.setTwoNoConnectCount(totalTwoNoConnectCount);
+//		callTaskStatistic.setTwoNoConnectCount(totalTwoNoConnectCount);
 		callTaskStatistic.setRefuseConnectCount(totalRefuseConnectCount);
 		callTaskStatistic.setCreateTime(callTaskStatistics.get(0).getCreateTime());
 		// 查询当前行政区名称
@@ -411,6 +557,20 @@
 	}
 
 	/**
+	 * 查询当前天除去日常呼叫外的统计数据
+	 * @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
@@ -445,28 +605,47 @@
 	 * @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 {
+	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> 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());
-				}
-			}
+//			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())){
-					taskStatistic.setRefuseConnectCount(statistic.getCount());
+					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));
+					}
 				}
 			}
 		}
@@ -499,7 +678,46 @@
 	 */
 	@Override
 	public Object getOutgoingStatisticByArea(CallTaskStatistic callTaskStatistic) {
-		return callTaskMapper.getOutgoingStatisticByArea(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);
 	}
 
 	/**
@@ -538,6 +756,173 @@
 	 */
 	@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);
@@ -692,7 +1077,7 @@
 	}
 
 	/**
-	 * 将 jsonArray 取出手机号得到新的集合
+	 * 将 jsonArray 取出手机号得到新的集合--超汛限场景
 	 * @param jsonArray
 	 * @return
 	 */
@@ -813,4 +1198,70 @@
 		// 返回
 		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