|
@@ -5,18 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.tzld.piaoquan.sde.common.api.CommonRequest;
|
|
import com.tzld.piaoquan.sde.common.api.CommonRequest;
|
|
|
import com.tzld.piaoquan.sde.common.constant.Constant;
|
|
import com.tzld.piaoquan.sde.common.constant.Constant;
|
|
|
-import com.tzld.piaoquan.sde.common.enums.ExceptionEnum;
|
|
|
|
|
-import com.tzld.piaoquan.sde.common.enums.IsDeleteEnum;
|
|
|
|
|
-import com.tzld.piaoquan.sde.common.enums.TaskStatusEnum;
|
|
|
|
|
-import com.tzld.piaoquan.sde.common.enums.TaskTypeEnum;
|
|
|
|
|
|
|
+import com.tzld.piaoquan.sde.common.enums.*;
|
|
|
import com.tzld.piaoquan.sde.common.exception.BizException;
|
|
import com.tzld.piaoquan.sde.common.exception.BizException;
|
|
|
-import com.tzld.piaoquan.sde.mapper.SdStrategyMapper;
|
|
|
|
|
-import com.tzld.piaoquan.sde.mapper.SdTaskMapper;
|
|
|
|
|
|
|
+import com.tzld.piaoquan.sde.integration.OpenRouterClient;
|
|
|
|
|
+import com.tzld.piaoquan.sde.mapper.*;
|
|
|
|
|
+import com.tzld.piaoquan.sde.model.entity.*;
|
|
|
import com.tzld.piaoquan.sde.model.request.TaskCreateParam;
|
|
import com.tzld.piaoquan.sde.model.request.TaskCreateParam;
|
|
|
import com.tzld.piaoquan.sde.model.request.TaskGetParam;
|
|
import com.tzld.piaoquan.sde.model.request.TaskGetParam;
|
|
|
import com.tzld.piaoquan.sde.model.request.TaskListParam;
|
|
import com.tzld.piaoquan.sde.model.request.TaskListParam;
|
|
|
-import com.tzld.piaoquan.sde.model.entity.SdStrategy;
|
|
|
|
|
-import com.tzld.piaoquan.sde.model.entity.SdTask;
|
|
|
|
|
import com.tzld.piaoquan.sde.model.vo.SdTaskVO;
|
|
import com.tzld.piaoquan.sde.model.vo.SdTaskVO;
|
|
|
import com.tzld.piaoquan.sde.service.TaskService;
|
|
import com.tzld.piaoquan.sde.service.TaskService;
|
|
|
import com.tzld.piaoquan.sde.util.DateUtil;
|
|
import com.tzld.piaoquan.sde.util.DateUtil;
|
|
@@ -27,9 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.Map;
|
|
|
|
|
-import java.util.Objects;
|
|
|
|
|
|
|
+import java.time.ZoneId;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -46,8 +42,19 @@ public class TaskServiceImpl implements TaskService {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private SdTaskMapper sdTaskMapper;
|
|
private SdTaskMapper sdTaskMapper;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SdSubTaskMapper sdSubTaskMapper;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private SdStrategyMapper sdStrategyMapper;
|
|
private SdStrategyMapper sdStrategyMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SdPromptTemplateMapper sdPromptTemplateMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SdSubTaskResultItemMapper sdSubTaskResultItemMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private OpenRouterClient openRouterServiceClient;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private OpenRouterClient openRouterClient;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void create(CommonRequest<TaskCreateParam> request) {
|
|
public void create(CommonRequest<TaskCreateParam> request) {
|
|
@@ -74,10 +81,30 @@ public class TaskServiceImpl implements TaskService {
|
|
|
}
|
|
}
|
|
|
sdTask.setTaskType(params.getTaskType());
|
|
sdTask.setTaskType(params.getTaskType());
|
|
|
sdTask.setTaskStatus(TaskStatusEnum.INIT.getValue());
|
|
sdTask.setTaskStatus(TaskStatusEnum.INIT.getValue());
|
|
|
- int flag = sdTaskMapper.insert(sdTask);
|
|
|
|
|
- if (flag <= 0) {
|
|
|
|
|
|
|
+ int rows = sdTaskMapper.insert(sdTask);
|
|
|
|
|
+ log.info("create insert task rows = {}", rows);
|
|
|
|
|
+ if (rows <= 0) {
|
|
|
throw new BizException(ExceptionEnum.DATA_INSERT_ERROR);
|
|
throw new BizException(ExceptionEnum.DATA_INSERT_ERROR);
|
|
|
}
|
|
}
|
|
|
|
|
+ //子任务创建
|
|
|
|
|
+ int total = 0;
|
|
|
|
|
+ for (Long videoId : params.getVideoIds()) {
|
|
|
|
|
+ SdSubTask sdSubTask = new SdSubTask();
|
|
|
|
|
+ sdSubTask.setTaskId(sdTask.getId());
|
|
|
|
|
+ String subTaskNo = IdGeneratorUtil.generateSubTaskNo(sdTask.getTaskNo());
|
|
|
|
|
+ sdSubTask.setSubTaskNo(subTaskNo);
|
|
|
|
|
+ sdSubTask.setContentId(String.valueOf(videoId));
|
|
|
|
|
+ sdSubTask.setTaskStatus(TaskStatusEnum.INIT.getValue());
|
|
|
|
|
+ int subRows = sdSubTaskMapper.insert(sdSubTask);
|
|
|
|
|
+ total += subRows;
|
|
|
|
|
+ log.info("create subTask rows = {}", subRows);
|
|
|
|
|
+ }
|
|
|
|
|
+ //更新子任务数
|
|
|
|
|
+ SdTask updateTask = new SdTask();
|
|
|
|
|
+ updateTask.setId(sdTask.getId());
|
|
|
|
|
+ updateTask.setSubTaskCount(total);
|
|
|
|
|
+ int updateRows = sdTaskMapper.updateById(updateTask);
|
|
|
|
|
+ log.info("create update task rows = {}, total = {}", updateRows, total);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -135,11 +162,170 @@ public class TaskServiceImpl implements TaskService {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void taskStatusCheckHandler() {
|
|
public void taskStatusCheckHandler() {
|
|
|
|
|
+ long start = System.nanoTime();
|
|
|
|
|
+ log.info("taskStatusCheckHandler start");
|
|
|
|
|
+ // 6 小时前
|
|
|
|
|
+ Date hourAgo = Date.from(
|
|
|
|
|
+ LocalDateTime.now()
|
|
|
|
|
+ .minusHours(6)
|
|
|
|
|
+ .atZone(ZoneId.systemDefault())
|
|
|
|
|
+ .toInstant());
|
|
|
|
|
+ List<Integer> taskStatusList = Arrays.asList(TaskStatusEnum.INIT.getValue(),
|
|
|
|
|
+ TaskStatusEnum.PRE_PROCESSING.getValue());
|
|
|
|
|
+ LambdaQueryWrapper<SdTask> wrapper = Wrappers.lambdaQuery(SdTask.class)
|
|
|
|
|
+ .eq(SdTask::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .in(SdTask::getTaskStatus, taskStatusList)
|
|
|
|
|
+ .ge(SdTask::getCreateTime, hourAgo);
|
|
|
|
|
+ List<SdTask> tasks = sdTaskMapper.selectList(wrapper);
|
|
|
|
|
+ if (Objects.isNull(tasks) || tasks.isEmpty()) {
|
|
|
|
|
+ log.info("taskStatusCheckHandler tasks is empty");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (SdTask sdTask : tasks) {
|
|
|
|
|
+ TaskStatusEnum taskStatusEnum = TaskStatusEnum.getInstance(sdTask.getTaskStatus());
|
|
|
|
|
+ if (Objects.isNull(taskStatusEnum)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ switch (taskStatusEnum) {
|
|
|
|
|
+ case INIT:
|
|
|
|
|
+ initTaskStatusCheck(sdTask);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case PRE_PROCESSING:
|
|
|
|
|
+ preProcessingTaskStatsCheck(sdTask);
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ //其他状态不在这里处理
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
|
|
|
|
|
+ log.info("taskStatusCheckHandler finish cost={}ms", costMs);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ private void preProcessingTaskStatsCheck(SdTask sdTask) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ //获取完成任务数
|
|
|
|
|
+ List<Integer> finishTaskStatusList = Arrays.asList(TaskStatusEnum.SUCCESS.getValue(),
|
|
|
|
|
+ TaskStatusEnum.FAILED.getValue(),
|
|
|
|
|
+ TaskStatusEnum.TIMEOUT.getValue());
|
|
|
|
|
+ LambdaQueryWrapper<SdSubTask> wrapper = Wrappers.lambdaQuery(SdSubTask.class)
|
|
|
|
|
+ .eq(SdSubTask::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .eq(SdSubTask::getTaskId, sdTask.getId())
|
|
|
|
|
+ .in(SdSubTask::getTaskStatus, finishTaskStatusList);
|
|
|
|
|
+ Long finishCount = sdSubTaskMapper.selectCount(wrapper);
|
|
|
|
|
+ //更新主任务
|
|
|
|
|
+ if (Objects.isNull(finishCount)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean needUpdateFinishedCount = finishCount.intValue() > sdTask.getFinishedSubTaskCount();
|
|
|
|
|
+ boolean allFinished = finishCount.intValue() == sdTask.getSubTaskCount();
|
|
|
|
|
+ if (needUpdateFinishedCount || allFinished) {
|
|
|
|
|
+ SdTask updateTask = new SdTask();
|
|
|
|
|
+ updateTask.setId(sdTask.getId());
|
|
|
|
|
+ updateTask.setFinishedSubTaskCount(finishCount.intValue());
|
|
|
|
|
+ //如果全部完成,更新状态
|
|
|
|
|
+ if (allFinished) {
|
|
|
|
|
+ updateTask.setTaskStatus(TaskStatusEnum.READY.getValue());
|
|
|
|
|
+ }
|
|
|
|
|
+ int updateRows = sdTaskMapper.updateById(updateTask);
|
|
|
|
|
+ log.info("preProcessingTaskStatsCheck status:{} task update rows:{}", TaskStatusEnum.PRE_PROCESSING.getDesc(), updateRows);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("preProcessingTaskStatsCheck error", e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 初始任务状态更新
|
|
|
|
|
+ */
|
|
|
|
|
+ private void initTaskStatusCheck(SdTask sdTask) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ //检查子任务状态
|
|
|
|
|
+ LambdaQueryWrapper<SdSubTask> wrapper = Wrappers.lambdaQuery(SdSubTask.class)
|
|
|
|
|
+ .eq(SdSubTask::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .eq(SdSubTask::getTaskId, sdTask.getId())
|
|
|
|
|
+ .ne(SdSubTask::getTaskStatus, SubTaskStatusEnum.INIT.getValue());
|
|
|
|
|
+ Long count = sdSubTaskMapper.selectCount(wrapper);
|
|
|
|
|
+ //更新主任务状态
|
|
|
|
|
+ if (Objects.nonNull(count) && count > 0) {
|
|
|
|
|
+ SdTask updateTask = new SdTask();
|
|
|
|
|
+ updateTask.setId(sdTask.getId());
|
|
|
|
|
+ updateTask.setTaskStatus(TaskStatusEnum.PRE_PROCESSING.getValue());
|
|
|
|
|
+ int updateRows = sdTaskMapper.updateById(updateTask);
|
|
|
|
|
+ log.info("initTaskStatusCheck status:{} task update rows:{}", TaskStatusEnum.INIT.getDesc(), updateRows);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("initTaskStatusCheck error", e);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void taskExecuteHandler() {
|
|
public void taskExecuteHandler() {
|
|
|
|
|
+ long start = System.nanoTime();
|
|
|
|
|
+ log.info("taskExecuteHandler start");
|
|
|
|
|
+ //查询可以执行的任务
|
|
|
|
|
+ LambdaQueryWrapper<SdTask> wrapper = Wrappers.lambdaQuery(SdTask.class)
|
|
|
|
|
+ .eq(SdTask::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .eq(SdTask::getTaskStatus, TaskStatusEnum.READY.getValue());
|
|
|
|
|
+ List<SdTask> tasks = sdTaskMapper.selectList(wrapper);
|
|
|
|
|
+ if (Objects.isNull(tasks) || tasks.isEmpty()) {
|
|
|
|
|
+ log.info("taskExecuteHandler tasks is empty");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (SdTask sdTask : tasks) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ //提取需求
|
|
|
|
|
+ SdStrategy strategy = sdStrategyMapper.selectById(sdTask.getStrategyId());
|
|
|
|
|
+ if (Objects.isNull(strategy)) {
|
|
|
|
|
+ log.info("taskExecuteHandler strategy is null");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ SdPromptTemplate promptTemplate = sdPromptTemplateMapper.selectById(strategy.getPromptTemplateId());
|
|
|
|
|
+ if (Objects.isNull(promptTemplate)) {
|
|
|
|
|
+ log.info("taskExecuteHandler promptTemplate is null");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<SdSubTask> subTaskWrapper = Wrappers.lambdaQuery(SdSubTask.class)
|
|
|
|
|
+ .eq(SdSubTask::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .eq(SdSubTask::getTaskId, sdTask.getId())
|
|
|
|
|
+ .eq(SdSubTask::getTaskStatus, SubTaskStatusEnum.SUCCESS.getValue())
|
|
|
|
|
+ .eq(SdSubTask::getSubTaskType, sdTask.getTaskType())
|
|
|
|
|
+ .select(SdSubTask::getId);
|
|
|
|
|
+ List<SdSubTask> subTasks = sdSubTaskMapper.selectList(subTaskWrapper);
|
|
|
|
|
+ if (Objects.isNull(subTasks)) {
|
|
|
|
|
+ log.info("taskExecuteHandler subTasks is null");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<Long> subTaskIds = subTasks.stream().map(SdSubTask::getId).collect(Collectors.toList());
|
|
|
|
|
+ //TODO
|
|
|
|
|
+ String itemType = "";
|
|
|
|
|
+ LambdaQueryWrapper<SdSubTaskResultItem> resultItemWrapper = Wrappers.lambdaQuery(SdSubTaskResultItem.class)
|
|
|
|
|
+ .eq(SdSubTaskResultItem::getIsDeleted, IsDeleteEnum.NORMAL.getValue())
|
|
|
|
|
+ .in(SdSubTaskResultItem::getSubTaskId, subTaskIds)
|
|
|
|
|
+ .eq(SdSubTaskResultItem::getItemType, itemType)
|
|
|
|
|
+ .select(SdSubTaskResultItem::getItemContent);
|
|
|
|
|
+ List<SdSubTaskResultItem> resultItems = sdSubTaskResultItemMapper.selectList(resultItemWrapper);
|
|
|
|
|
+ if (Objects.isNull(resultItems) || resultItems.isEmpty()) {
|
|
|
|
|
+ log.info("taskExecuteHandler resultItems is null");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ //去掉null,换行拼接
|
|
|
|
|
+ String input = resultItems.stream()
|
|
|
|
|
+ .map(SdSubTaskResultItem::getItemContent)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.joining("\n"));
|
|
|
|
|
+
|
|
|
|
|
+ String prompt = promptTemplate.getPromptContent();
|
|
|
|
|
+ String finalPrompt = prompt.replaceAll("input", input);
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("taskExecuteHandler error", e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
|
|
|
|
|
+ log.info("taskExecuteHandler finish cost={}ms", costMs);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|