|
@@ -6,16 +6,22 @@ import api.common.util.CollectionUtil;
|
|
import api.common.util.StringUtil;
|
|
import api.common.util.StringUtil;
|
|
import api.common.util.TimeUtil;
|
|
import api.common.util.TimeUtil;
|
|
import com.css.simulation.resource.scheduler.feign.CommonService;
|
|
import com.css.simulation.resource.scheduler.feign.CommonService;
|
|
-import com.css.simulation.resource.scheduler.mapper.IndexMapper;
|
|
|
|
|
|
+import com.css.simulation.resource.scheduler.manager.TaskIndexManager;
|
|
|
|
+import com.css.simulation.resource.scheduler.manager.TaskManager;
|
|
|
|
+import com.css.simulation.resource.scheduler.mapper.IndexTemplateMapper;
|
|
import com.css.simulation.resource.scheduler.mapper.ProjectMapper;
|
|
import com.css.simulation.resource.scheduler.mapper.ProjectMapper;
|
|
|
|
+import com.css.simulation.resource.scheduler.mapper.TaskIndexMapper;
|
|
import com.css.simulation.resource.scheduler.mapper.TaskMapper;
|
|
import com.css.simulation.resource.scheduler.mapper.TaskMapper;
|
|
-import com.css.simulation.resource.scheduler.pojo.po.IndexPO;
|
|
|
|
|
|
+import com.css.simulation.resource.scheduler.pojo.po.IndexTemplatePO;
|
|
import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
|
|
import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
|
|
|
|
+import com.css.simulation.resource.scheduler.pojo.po.TaskIndexPO;
|
|
import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
|
|
import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
|
|
|
|
+import com.css.simulation.resource.scheduler.pojo.to.ScoreTO;
|
|
import com.css.simulation.resource.scheduler.util.ScoreUtil;
|
|
import com.css.simulation.resource.scheduler.util.ScoreUtil;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -23,15 +29,22 @@ import java.util.stream.Collectors;
|
|
@Service
|
|
@Service
|
|
public class TaskService {
|
|
public class TaskService {
|
|
|
|
|
|
|
|
+ private final String USER_ID = "simulation-resource-scheduler";
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private CommonService commonService;
|
|
private CommonService commonService;
|
|
@Autowired
|
|
@Autowired
|
|
private ProjectMapper projectMapper;
|
|
private ProjectMapper projectMapper;
|
|
@Autowired
|
|
@Autowired
|
|
|
|
+ private TaskManager taskManager;
|
|
|
|
+ @Autowired
|
|
private TaskMapper taskMapper;
|
|
private TaskMapper taskMapper;
|
|
@Autowired
|
|
@Autowired
|
|
- private IndexMapper indexMapper;
|
|
|
|
|
|
+ private TaskIndexManager taskIndexManager;
|
|
|
|
+ @Autowired
|
|
|
|
+ private TaskIndexMapper taskIndexMapper;
|
|
|
|
+ @Autowired
|
|
|
|
+ private IndexTemplateMapper indexTemplateMapper;
|
|
@Value("${spring.kafka.consumer.topic.manual-project}")
|
|
@Value("${spring.kafka.consumer.topic.manual-project}")
|
|
private String manualProjectTopic;
|
|
private String manualProjectTopic;
|
|
|
|
|
|
@@ -39,36 +52,36 @@ public class TaskService {
|
|
// 刷新 redis 心跳时间
|
|
// 刷新 redis 心跳时间
|
|
ProjectPO projectPO = projectMapper.selectById(taskId);
|
|
ProjectPO projectPO = projectMapper.selectById(taskId);
|
|
String projectId = projectPO.getId();
|
|
String projectId = projectPO.getId();
|
|
- taskMapper.updateTickTime(taskId, TimeUtil.getNowForMysql());
|
|
|
|
commonService.set(RedisParameter.builder()
|
|
commonService.set(RedisParameter.builder()
|
|
.key(manualProjectTopic + ":" + projectId + ":" + taskId)
|
|
.key(manualProjectTopic + ":" + projectId + ":" + taskId)
|
|
.value(TimeUtil.getNow() + "")
|
|
.value(TimeUtil.getNow() + "")
|
|
.build());
|
|
.build());
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+ @Transactional
|
|
public void taskState(String taskId, String state) {
|
|
public void taskState(String taskId, String state) {
|
|
//1 根据 taskId 修改任务状态 taskState。
|
|
//1 根据 taskId 修改任务状态 taskState。
|
|
taskMapper.updateState(taskId, state);
|
|
taskMapper.updateState(taskId, state);
|
|
//2 如果 taskState 为完成状态,校验一下项目的已完成数量。
|
|
//2 如果 taskState 为完成状态,校验一下项目的已完成数量。
|
|
ProjectPO projectPO = projectMapper.selectById(taskId);
|
|
ProjectPO projectPO = projectMapper.selectById(taskId);
|
|
String projectId = projectPO.getId();
|
|
String projectId = projectPO.getId();
|
|
- String scenePackageId = projectPO.getScenePackageId();
|
|
|
|
|
|
+ String scenePackageId = projectPO.getScenePackageId(); // 场景测试包 id,指标根 id
|
|
int taskNum = projectMapper.selectTaskNumById(projectId);
|
|
int taskNum = projectMapper.selectTaskNumById(projectId);
|
|
int completedTaskNum = projectMapper.selectTaskNumByProjectIdAndState(projectId, DictConstants.TASK_COMPLETED);
|
|
int completedTaskNum = projectMapper.selectTaskNumByProjectIdAndState(projectId, DictConstants.TASK_COMPLETED);
|
|
if (taskNum != completedTaskNum) {
|
|
if (taskNum != completedTaskNum) {
|
|
return;
|
|
return;
|
|
} //3 如果已完成任务数等于所有任务数量,调用打分程序,对项目中每个指标进行打分,
|
|
} //3 如果已完成任务数等于所有任务数量,调用打分程序,对项目中每个指标进行打分,
|
|
List<TaskPO> taskList = taskMapper.selectTaskListByProjectId(projectId); // 所有任务信息
|
|
List<TaskPO> taskList = taskMapper.selectTaskListByProjectId(projectId); // 所有任务信息
|
|
- List<IndexPO> leafIndexList = indexMapper.selectLeafIndexWithRuleDetailsByPackageId(scenePackageId);
|
|
|
|
|
|
+ List<IndexTemplatePO> leafIndexTemplateList = indexTemplateMapper.selectLeafIndexWithRuleDetailsByPackageId(scenePackageId);
|
|
|
|
+ List<TaskIndexPO> leafTaskIndexList = new ArrayList<>();
|
|
|
|
|
|
// 计算所有叶子节点指标的得分
|
|
// 计算所有叶子节点指标的得分
|
|
- for (IndexPO indexPO : leafIndexList) {
|
|
|
|
- String ruleDetails = indexPO.getRuleDetails();
|
|
|
|
|
|
+ for (IndexTemplatePO indexTemplatePO : leafIndexTemplateList) {
|
|
|
|
+ String ruleDetails = indexTemplatePO.getRuleDetails();
|
|
Set<String> sceneIdSet = new HashSet<>();
|
|
Set<String> sceneIdSet = new HashSet<>();
|
|
- String naturalIds = indexPO.getSceneNaturalIds();
|
|
|
|
- String standardIds = indexPO.getSceneStatueIds();
|
|
|
|
- String accidentIds = indexPO.getSceneTrafficIds();
|
|
|
|
|
|
+ String naturalIds = indexTemplatePO.getSceneNaturalIds();
|
|
|
|
+ String standardIds = indexTemplatePO.getSceneStatueIds();
|
|
|
|
+ String accidentIds = indexTemplatePO.getSceneTrafficIds();
|
|
if (StringUtil.isNotEmpty(naturalIds)) {
|
|
if (StringUtil.isNotEmpty(naturalIds)) {
|
|
String[] naturalIdArray = naturalIds.split(",");
|
|
String[] naturalIdArray = naturalIds.split(",");
|
|
sceneIdSet.addAll(Arrays.asList(naturalIdArray));
|
|
sceneIdSet.addAll(Arrays.asList(naturalIdArray));
|
|
@@ -86,18 +99,55 @@ public class TaskService {
|
|
.filter(task1 -> sceneIdSet.contains(task1.getSceneId()))
|
|
.filter(task1 -> sceneIdSet.contains(task1.getSceneId()))
|
|
.mapToDouble(task2 -> {
|
|
.mapToDouble(task2 -> {
|
|
// 计算每个任务的得分
|
|
// 计算每个任务的得分
|
|
- double score = ScoreUtil.score(task2.getRunResult(), ruleDetails);
|
|
|
|
- task2.setScore(score);
|
|
|
|
- return score;
|
|
|
|
|
|
+ ScoreTO score = ScoreUtil.score(task2.getRunResult(), ruleDetails);
|
|
|
|
+ task2.setReturnSceneId(score.getUnitSceneID());
|
|
|
|
+ task2.setScore(score.getUnitSceneScore());
|
|
|
|
+ task2.setTargetEvaluate(score.getEvaluateItem());
|
|
|
|
+ task2.setScoreExplain(score.getScoreDescription());
|
|
|
|
+ task2.setModifyUserId(USER_ID);
|
|
|
|
+ task2.setModifyTime(TimeUtil.getNowForMysql());
|
|
|
|
+ return score.getUnitSceneScore();
|
|
}).sum();
|
|
}).sum();
|
|
- double indexScore = sum / resultNumberOfCurrentIndex;
|
|
|
|
- indexPO.setScore(indexScore);
|
|
|
|
|
|
+ long notStandardSceneNum = taskList.stream() // 计算不合格的任务数(不到100分就是不合格)
|
|
|
|
+ .filter(task1 -> sceneIdSet.contains(task1.getSceneId()) && task1.getScore() < 100)
|
|
|
|
+ .count();
|
|
|
|
+ double leafIndexScore = sum / resultNumberOfCurrentIndex; // 叶子指标的得分
|
|
|
|
+ indexTemplatePO.setTempScore(leafIndexScore);
|
|
|
|
+ TaskIndexPO leafTaskIndex = TaskIndexPO.builder()
|
|
|
|
+ .id(StringUtil.getRandomUUID())
|
|
|
|
+ .pId(projectId)
|
|
|
|
+ .target(indexTemplatePO.getIndexId())
|
|
|
|
+ .notStandardSceneNum((int) notStandardSceneNum)
|
|
|
|
+ .score(leafIndexScore)
|
|
|
|
+ .build();
|
|
|
|
+ leafTaskIndex.setCreateUserId(USER_ID);
|
|
|
|
+ leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
|
+ leafTaskIndex.setModifyUserId(USER_ID);
|
|
|
|
+ leafTaskIndex.setModifyTime(TimeUtil.getNowForMysql());
|
|
|
|
+ leafTaskIndex.setIsDeleted("0");
|
|
|
|
+ leafTaskIndexList.add(leafTaskIndex);
|
|
}
|
|
}
|
|
- // 计算不合格的任务总数(不到100分就是不合格)
|
|
|
|
- int unqualified = (int) taskList.stream().filter(taskPO -> taskPO.getScore() < 100).count();
|
|
|
|
|
|
+
|
|
//4 根据每个指标的得分和权重算出 project 的总得分。
|
|
//4 根据每个指标的得分和权重算出 project 的总得分。
|
|
- double totalScore = compute(leafIndexList);
|
|
|
|
- //5 保存指标的分数和总分数
|
|
|
|
|
|
+ double totalScore = compute(leafIndexTemplateList);
|
|
|
|
+ //5 保存分数
|
|
|
|
+ //5-1 保存任务分数
|
|
|
|
+ taskManager.batchUpdateByScoreResult(taskList);
|
|
|
|
+ //5-2 保存指标分数
|
|
|
|
+ taskIndexManager.batchInsertLeafIndex(leafTaskIndexList);
|
|
|
|
+ //5-3 保存总分数
|
|
|
|
+ TaskIndexPO totalTaskIndex = TaskIndexPO.builder()
|
|
|
|
+ .id(StringUtil.getRandomUUID())
|
|
|
|
+ .pId(projectId)
|
|
|
|
+ .target(scenePackageId)
|
|
|
|
+ .score(totalScore)
|
|
|
|
+ .build();
|
|
|
|
+ totalTaskIndex.setCreateUserId(USER_ID);
|
|
|
|
+ totalTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
|
+ totalTaskIndex.setModifyUserId(USER_ID);
|
|
|
|
+ totalTaskIndex.setModifyTime(TimeUtil.getNowForMysql());
|
|
|
|
+ totalTaskIndex.setIsDeleted("0");
|
|
|
|
+ taskIndexMapper.insertTotalIndex(totalTaskIndex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -107,17 +157,17 @@ public class TaskService {
|
|
return DictConstants.TASK_PENDING.equals(state);
|
|
return DictConstants.TASK_PENDING.equals(state);
|
|
}
|
|
}
|
|
|
|
|
|
- public double compute(List<IndexPO> leaf) {
|
|
|
|
|
|
+ public double compute(List<IndexTemplatePO> leaf) {
|
|
double result = 0.0;
|
|
double result = 0.0;
|
|
- Map<String, List<IndexPO>> groups = leaf.stream().collect(Collectors.groupingBy(IndexPO::getParentId));
|
|
|
|
|
|
+ Map<String, List<IndexTemplatePO>> groups = leaf.stream().collect(Collectors.groupingBy(IndexTemplatePO::getParentId));
|
|
Set<String> idSet = groups.keySet();
|
|
Set<String> idSet = groups.keySet();
|
|
- List<IndexPO> indexPOList = indexMapper.selectByIdList(CollectionUtil.setToList(idSet));
|
|
|
|
- indexPOList.forEach(index1 -> {
|
|
|
|
- double sum = groups.get(index1.getIndexId()).stream().mapToDouble(index2 -> index2.getScore() * Double.parseDouble(index2.getWeight())).sum();
|
|
|
|
- index1.setScore(sum);
|
|
|
|
|
|
+ List<IndexTemplatePO> indexTemplatePOList = indexTemplateMapper.selectByIdList(CollectionUtil.setToList(idSet));
|
|
|
|
+ indexTemplatePOList.forEach(index1 -> {
|
|
|
|
+ double sum = groups.get(index1.getIndexId()).stream().mapToDouble(index2 -> index2.getTempScore() * Double.parseDouble(index2.getWeight())).sum();
|
|
|
|
+ index1.setTempScore(sum);
|
|
});
|
|
});
|
|
- if (indexPOList.size() > 1) {
|
|
|
|
- result = result + compute(indexPOList);
|
|
|
|
|
|
+ if (indexTemplatePOList.size() > 1) {
|
|
|
|
+ result = result + compute(indexTemplatePOList);
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|