martin 3 년 전
부모
커밋
bd2023f423

+ 4 - 5
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/scheduler/TickScheduler.java

@@ -13,7 +13,6 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
-import java.util.Optional;
 
 @Component
 @Slf4j
@@ -34,21 +33,21 @@ public class TickScheduler {
         if (CollectionUtil.isEmpty(executingTaskList)) {
             return;
         }
-        log.info("------- TickScheduler 查询出所有执行中的任务('Running'):" + executingTaskList);
+//        log.info("------- TickScheduler 查询出所有执行中的任务('Running'):" + executingTaskList);
         //2 根据 key 查出任务的心跳时间
         executingTaskList.forEach(task -> {
             String taskId = task.getId();
             String projectId = task.getPId();
             try {
                 String s = redisTemplate.opsForValue().get(manualProjectTopic + ":" + projectId + ":" + taskId);
-                Optional.ofNullable(s).orElseThrow(() -> new RuntimeException("项目 " + projectId + " 下的任务 " + taskId + " 的心跳查询失败"));
+//                Optional.ofNullable(s).orElseThrow(() -> new RuntimeException("项目 " + projectId + " 下的任务 " + taskId + " 的心跳查询失败"));
                 long tickTime = Long.parseLong(s);
                 long maxSimulationTime = task.getMaxSimulationTime() * 1000;
                 long now = TimeUtil.getNow();
                 long difference = now - tickTime;
-                log.info("------- TickScheduler 任务" + taskId + "心跳时间为:" + tickTime + "最大仿真时间为:" + tickTime + "时间差为:" + difference);
+//                log.info("------- TickScheduler 任务" + taskId + "心跳时间为:" + tickTime + "最大仿真时间为:" + tickTime + "时间差为:" + difference);
                 if (difference > maxSimulationTime) {
-                    log.info("------- TickScheduler 任务" + taskId + "已超时,状态修改为:" + DictConstants.TASK_ABORTED);
+//                    log.info("------- TickScheduler 任务" + taskId + "已超时,状态修改为:" + DictConstants.TASK_ABORTED);
                     taskMapper.updateState(taskId, DictConstants.TASK_ABORTED);
                 }
             } catch (Exception e) {

+ 14 - 11
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/TaskService.java

@@ -111,10 +111,10 @@ public class TaskService {
         } else if ("Aborted".equals(state) || "Terminated".equals(state)) {
             LinuxUtil.execute("kubectl delete pod " + podName);
             taskMapper.updateFailStateWithStopTime(taskId, state, TimeUtil.getNowForMysql());
-        } else if ( "PendingAnalysis".equals(state)) {
+        } else if ("PendingAnalysis".equals(state)) {
             LinuxUtil.execute("kubectl delete pod " + podName);
             taskMapper.updateSuccessStateWithStopTime(taskId, state, TimeUtil.getNowForMysql());
-        }else {
+        } else {
             taskMapper.updateState(taskId, state);
         }
         ProjectPO projectPO = projectMapper.selectById(taskId);
@@ -276,8 +276,10 @@ public class TaskService {
         log.info("------- /state 仿真云平台 token 为:" + accessToken);
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", "Bearer " + accessToken);
-        log.info("------- /state 访问仿真云平台评价等级接口:" + evaluationLevelUri);
-        HttpUtil.post(closeableHttpClient, requestConfig, evaluationLevelUri, headers, null);
+        Map<String, String> params = new HashMap<>();
+        params.put("id", projectId);
+        String post = HttpUtil.post(closeableHttpClient, requestConfig, evaluationLevelUri, headers, params);
+        log.info("------- /state 访问仿真云平台评价等级接口:" + evaluationLevelUri +",请求头为:" + headers +",请求体为:" + params + "结果为:" + post);
         log.info("------- /state 项目 " + projectId + " 打分完成");
 
 
@@ -300,9 +302,15 @@ public class TaskService {
             String parentId = leafTaskIndex.getParentId();
             String rootId = leafTaskIndex.getRootId();
             if (parentId.equals(rootId)) {
+                leafTaskIndex.setCreateUserId(USER_ID);
+                leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
+                leafTaskIndex.setModifyUserId(USER_ID);
+                leafTaskIndex.setModifyTime(TimeUtil.getNowForMysql());
+                leafTaskIndex.setIsDeleted("0");
                 taskIndexMapper.insertFirstIndex(leafTaskIndex);
+                leafTaskIndexIterator.remove();
             }
-            leafTaskIndexIterator.remove();
+
         }
         if (leafTaskIndexList.size() > 0) {
             Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream().collect(Collectors.groupingBy(TaskIndexPO::getParentId));
@@ -315,7 +323,7 @@ public class TaskService {
                 String weight = indexTemplate.getWeight();
 
                 List<TaskIndexPO> sonTaskIndexList = sonTaskIndexMap.get(indexTemplate.getIndexId());
-                double parentScore = sonTaskIndexList.stream().mapToDouble(taskIndex -> taskIndex.getScore() * Double.parseDouble(taskIndex.getWeight())).sum();
+                double parentScore = sonTaskIndexList.stream().mapToDouble(taskIndex -> taskIndex.getScore() * Double.parseDouble(taskIndex.getWeight()) / 100).sum();
                 TaskIndexPO parentTaskIndex = TaskIndexPO.builder()
                         .id(StringUtil.getRandomUUID())
                         .pId(projectId)
@@ -326,11 +334,6 @@ public class TaskService {
                         .rootId(indexTemplate.getRootId())
                         .weight(weight)
                         .build();
-                parentTaskIndex.setCreateUserId(USER_ID);
-                parentTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
-                parentTaskIndex.setModifyUserId(USER_ID);
-                parentTaskIndex.setModifyTime(TimeUtil.getNowForMysql());
-                parentTaskIndex.setIsDeleted("0");
                 parentIndexList.add(parentTaskIndex);
             });
             // 将父指标作为叶子指标递归

+ 120 - 0
simulation-resource-scheduler/src/test/java/com/css/simulation/resource/scheduler/SchedulerTest.java

@@ -1,15 +1,135 @@
 package com.css.simulation.resource.scheduler;
 
 
+import api.common.util.CollectionUtil;
+import api.common.util.StringUtil;
+import api.common.util.TimeUtil;
+import com.css.simulation.resource.scheduler.mapper.IndexTemplateMapper;
+import com.css.simulation.resource.scheduler.mapper.TaskIndexMapper;
+import com.css.simulation.resource.scheduler.pojo.po.IndexTemplatePO;
+import com.css.simulation.resource.scheduler.pojo.po.TaskIndexPO;
+import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.*;
+import java.util.stream.Collectors;
 
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
 public class SchedulerTest {
 
+    @Autowired
+    TaskIndexMapper taskIndexMapper;
+
+
+    @Autowired
+    IndexTemplateMapper indexTemplateMapper;
+
+    private final String USER_ID = "simulation-resource-scheduler";
+
+
     @Test
     public void test() {
 
+
+        List<TaskIndexPO> leafTaskIndexList = new ArrayList<>();
+        TaskIndexPO taskIndexPO1 = TaskIndexPO.builder()
+                .id("9e64a4aa3df7414097ffd1c82a8bdaa3")
+                .pId("7586e4196699414d87f63ffbbf281122")
+                .indexId("12db82c7acbf49a6a9274243e7eebc6a")
+                .parentId("046155104e934910b19305a6ba27a784")
+                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
+                .target("12db82c7acbf49a6a9274243e7eebc6a")
+                .notStandardSceneNum(0)
+                .score(100.0)
+                .weight("50")
+                .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .build();
+        leafTaskIndexList.add(taskIndexPO1);
+
+        TaskIndexPO taskIndexPO2 = TaskIndexPO.builder()
+                .id("fc16c0aa3292496fb37daa635dd2d506")
+                .pId("7586e4196699414d87f63ffbbf281122")
+                .indexId("393a4b959d684eec9b5b777c8fc38bcf")
+                .parentId("046155104e934910b19305a6ba27a784")
+                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
+                .target("393a4b959d684eec9b5b777c8fc38bcf")
+                .notStandardSceneNum(0)
+                .score(100.0)
+                .weight("50")
+                .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .build();
+        leafTaskIndexList.add(taskIndexPO2);
+
+        TaskIndexPO taskIndexPO3 = TaskIndexPO.builder()
+                .id("300fbafab2d3432aac2b7926bb89456a")
+                .pId("7586e4196699414d87f63ffbbf281122")
+                .indexId("5b95a89d5a764af0ad93164753ab8caa")
+                .parentId("059c582c7cf3422b8d9bb8583f6b7c5a")
+                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
+                .target("5b95a89d5a764af0ad93164753ab8caa")
+                .notStandardSceneNum(0)
+                .score(100.0)
+                .weight("60")
+                .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .build();
+        leafTaskIndexList.add(taskIndexPO3);
+
+        computeFirst(leafTaskIndexList, "7586e4196699414d87f63ffbbf281122");
     }
 
+    public void computeFirst(List<TaskIndexPO> leafTaskIndexList, String projectId) {
+
+        log.info("------- /state computeFirst 计算父指标得分:" + leafTaskIndexList);
+        Iterator<TaskIndexPO> leafTaskIndexIterator = leafTaskIndexList.iterator();
+        while (leafTaskIndexIterator.hasNext()) {
+            TaskIndexPO leafTaskIndex = leafTaskIndexIterator.next();
+            String parentId = leafTaskIndex.getParentId();
+            String rootId = leafTaskIndex.getRootId();
+            if (parentId.equals(rootId)) {
+                leafTaskIndex.setCreateUserId(USER_ID);
+                leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
+                leafTaskIndex.setModifyUserId(USER_ID);
+                leafTaskIndex.setModifyTime(TimeUtil.getNowForMysql());
+                leafTaskIndex.setIsDeleted("0");
+                taskIndexMapper.insertFirstIndex(leafTaskIndex);
+                leafTaskIndexIterator.remove();
+            }
+
+        }
+        if (leafTaskIndexList.size() > 0) {
+            Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream().collect(Collectors.groupingBy(TaskIndexPO::getParentId));
+            Set<String> parentIdSet = sonTaskIndexMap.keySet();
+            List<String> parentIdList = CollectionUtil.setToList(parentIdSet);
+            List<IndexTemplatePO> parentIndexTemplateList = indexTemplateMapper.selectByIdList(parentIdList);
+            // 计算父指标得分
+            List<TaskIndexPO> parentIndexList = new ArrayList<>();
+            parentIndexTemplateList.forEach(indexTemplate -> {
+                String weight = indexTemplate.getWeight();
+
+                List<TaskIndexPO> sonTaskIndexList = sonTaskIndexMap.get(indexTemplate.getIndexId());
+                double parentScore = sonTaskIndexList.stream().mapToDouble(taskIndex -> taskIndex.getScore() * Double.parseDouble(taskIndex.getWeight()) / 100).sum();
+                TaskIndexPO parentTaskIndex = TaskIndexPO.builder()
+                        .id(StringUtil.getRandomUUID())
+                        .pId(projectId)
+                        .target(indexTemplate.getIndexId())
+                        .score(parentScore)
+                        .indexId(indexTemplate.getIndexId())
+                        .parentId(indexTemplate.getParentId())
+                        .rootId(indexTemplate.getRootId())
+                        .weight(weight)
+                        .build();
+                parentIndexList.add(parentTaskIndex);
+            });
+            // 将父指标作为叶子指标递归
+            computeFirst(parentIndexList, projectId);
+        }
+    }
 
 }