|
|
@@ -1,8 +1,13 @@
|
|
|
package com.fs.app.service;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
import com.fs.common.core.redis.RedisCacheT;
|
|
|
+import com.fs.company.domain.CompanyVoiceRobotic;
|
|
|
+import com.fs.company.mapper.CompanyVoiceRoboticMapper;
|
|
|
import com.fs.company.param.ExecutionContext;
|
|
|
+import com.fs.company.param.PauseRoboticActiveParam;
|
|
|
import com.fs.company.service.*;
|
|
|
import com.fs.company.service.impl.call.node.AiCallTaskNode;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
@@ -12,6 +17,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.time.LocalTime;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.*;
|
|
|
|
|
|
@@ -29,6 +35,7 @@ public class CallTaskService {
|
|
|
private final RedisCache redisCache2;
|
|
|
private final CompanyWorkflowEngine companyWorkflowEngine;
|
|
|
private final ICompanyVoiceRoboticService companyVoiceRoboticService;
|
|
|
+ private final CompanyVoiceRoboticMapper companyVoiceRoboticMapper;
|
|
|
@Autowired
|
|
|
@Qualifier("cidWorkFlowExecutor")
|
|
|
private Executor cidWorkFlowExecutor;
|
|
|
@@ -81,4 +88,114 @@ public class CallTaskService {
|
|
|
});
|
|
|
log.info("===========工作流延时任务扫描结束===========");
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查任务状态来暂停外呼任务的外呼运行
|
|
|
+ */
|
|
|
+ public void taskStatusChange(){
|
|
|
+ LocalTime now = LocalTime.now();
|
|
|
+ log.info("===========任务状态变更扫描开始, 当前时间: {}, 分组: {}===========", now, cidGroupNo);
|
|
|
+ pauseOutOfRangeTasks(now);
|
|
|
+ resumeInRangeTasks(now);
|
|
|
+ log.info("===========任务状态变更扫描结束===========");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void pauseOutOfRangeTasks(LocalTime now) {
|
|
|
+ List<CompanyVoiceRobotic> activeTasks = companyVoiceRoboticMapper.selectList(
|
|
|
+ new QueryWrapper<CompanyVoiceRobotic>()
|
|
|
+ .eq("task_status", 1)
|
|
|
+ .eq("task_type", 1)
|
|
|
+ .eq("cid_group_no", cidGroupNo)
|
|
|
+ .eq("del_flag", 0)
|
|
|
+ );
|
|
|
+ log.info("扫描到执行中的普通任务 {} 个", activeTasks.size());
|
|
|
+ if (activeTasks.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<CompletableFuture<Void>> futures = new ArrayList<>();
|
|
|
+ for (CompanyVoiceRobotic task : activeTasks) {
|
|
|
+ if (isOutOfRuntimeRange(task, now)) {
|
|
|
+ log.info("任务[{}]运行时间范围[{},{}),当前{}超出范围,准备自动暂停", task.getId(), task.getRuntimeRangeStart(), task.getRuntimeRangeEnd(), now);
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
+ try {
|
|
|
+ PauseRoboticActiveParam param = new PauseRoboticActiveParam();
|
|
|
+ param.setTaskId(task.getId());
|
|
|
+ param.setActiveType(1);
|
|
|
+ companyVoiceRoboticService.pauseRoboticActive(param);
|
|
|
+ companyVoiceRoboticMapper.update(null,
|
|
|
+ new LambdaUpdateWrapper<CompanyVoiceRobotic>()
|
|
|
+ .eq(CompanyVoiceRobotic::getId, task.getId())
|
|
|
+ .set(CompanyVoiceRobotic::getPauseSource, "auto")
|
|
|
+ );
|
|
|
+ log.info("任务[{}]超出运行时间范围,已自动暂停", task.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("自动暂停任务[{}]异常", task.getId(), e);
|
|
|
+ }
|
|
|
+ }, cidWorkFlowExecutor));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!futures.isEmpty()) {
|
|
|
+ log.info("本次需自动暂停 {} 个任务,等待并行执行完成", futures.size());
|
|
|
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void resumeInRangeTasks(LocalTime now) {
|
|
|
+ List<CompanyVoiceRobotic> pausedTasks = companyVoiceRoboticMapper.selectList(
|
|
|
+ new QueryWrapper<CompanyVoiceRobotic>()
|
|
|
+ .eq("task_status", 2)
|
|
|
+ .eq("task_type", 1)
|
|
|
+ .eq("pause_source", "auto")
|
|
|
+ .eq("cid_group_no", cidGroupNo)
|
|
|
+ .eq("del_flag", 0)
|
|
|
+ );
|
|
|
+ log.info("扫描到自动暂停中的普通任务 {} 个", pausedTasks.size());
|
|
|
+ if (pausedTasks.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<CompletableFuture<Void>> futures = new ArrayList<>();
|
|
|
+ for (CompanyVoiceRobotic task : pausedTasks) {
|
|
|
+ if (isWithinRuntimeRange(task, now)) {
|
|
|
+ log.info("任务[{}]运行时间范围[{},{}),当前{}在范围内,准备自动恢复", task.getId(), task.getRuntimeRangeStart(), task.getRuntimeRangeEnd(), now);
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
+ try {
|
|
|
+ PauseRoboticActiveParam param = new PauseRoboticActiveParam();
|
|
|
+ param.setTaskId(task.getId());
|
|
|
+ param.setActiveType(2);
|
|
|
+ companyVoiceRoboticService.pauseRoboticActive(param);
|
|
|
+ companyVoiceRoboticMapper.update(null,
|
|
|
+ new LambdaUpdateWrapper<CompanyVoiceRobotic>()
|
|
|
+ .eq(CompanyVoiceRobotic::getId, task.getId())
|
|
|
+ .set(CompanyVoiceRobotic::getPauseSource, null)
|
|
|
+ );
|
|
|
+ log.info("任务[{}]回到运行时间范围,已自动恢复", task.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("自动恢复任务[{}]异常", task.getId(), e);
|
|
|
+ }
|
|
|
+ }, cidWorkFlowExecutor));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!futures.isEmpty()) {
|
|
|
+ log.info("本次需自动恢复 {} 个任务,等待并行执行完成", futures.size());
|
|
|
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isOutOfRuntimeRange(CompanyVoiceRobotic task, LocalTime now) {
|
|
|
+ LocalTime start = task.getRuntimeRangeStart();
|
|
|
+ LocalTime end = task.getRuntimeRangeEnd();
|
|
|
+ if (start == null || end == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (start.isBefore(end)) {
|
|
|
+ return now.isBefore(start) || now.isAfter(end);
|
|
|
+ } else {
|
|
|
+ return now.isAfter(end) && now.isBefore(start);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isWithinRuntimeRange(CompanyVoiceRobotic task, LocalTime now) {
|
|
|
+ return !isOutOfRuntimeRange(task, now);
|
|
|
+ }
|
|
|
+
|
|
|
}
|