소스 검색

评分细则加字段

root 2 년 전
부모
커밋
d946ff0f45

+ 1 - 0
api-common/src/main/java/api/common/pojo/vo/project/SubScListVo.java

@@ -9,6 +9,7 @@ public class SubScListVo {
 
 
     private String sceneNum;
+    private String errorSceneNum;
     private String notScoredSceneNum;
     private String notStandardSceneNum;
     private String standardSceneNum;

+ 1 - 0
api-common/src/main/java/api/common/pojo/vo/project/SublistScoreVo.java

@@ -17,6 +17,7 @@ public class SublistScoreVo {
     private Double firScore;
     private Double lasScore;
     private String packageAndRules;
+    private String errorSceneNum;
     private String notScoredSceneNum;
     private String notStandardSceneNum;
     private String standardSceneNum;

+ 5 - 3
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/controller/TaskController.java

@@ -9,16 +9,18 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.annotation.Resource;
-
 @RefreshScope
 @RestController
 @RequestMapping("/task")
 public class TaskController {
 
-    @Resource
     TaskService taskService;
 
+    @Autowired
+    public TaskController(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
     // -------------------------------- Comment --------------------------------
 
     /**

+ 33 - 16
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/TaskManager.java

@@ -100,7 +100,7 @@ public class TaskManager {
             return false;
         } else { // 结束的 pod 都直接删除,并判断项目是否完成
             // -------------------------------- 处理状态 --------------------------------
-            //TODO 暂时不用重试操作
+            // TODO 暂时不用重试操作
             try {
                 log.info("TaskManager--state 修改任务 " + taskId + "的状态为 " + state + ",pod 名称为:" + podName + ",并删除 pod。");
                 if ("Aborted".equals(state)) {
@@ -180,6 +180,7 @@ public class TaskManager {
     }
 
     @SneakyThrows
+    @Transactional
     public void score(PrefixTO redisPrefix, String userId, String projectId, String projectType, ClientSession session) {
         // -------------------------------- 打分 --------------------------------
         ProjectPO projectPO = null;
@@ -271,11 +272,7 @@ public class TaskManager {
                         taskOfLeaf.setModifyTime(TimeUtil.getNowForMysql());
                         scoreExplain.set(score.getScore_description());
                         taskOfLeaf.setRunState(DictConstants.TASK_COMPLETED);
-                        taskMapper.updateSuccessStateAndScoreResultWithStopTime(
-                                taskOfLeaf,
-                                DictConstants.TASK_COMPLETED,
-                                TimeUtil.getNowForMysql()
-                        );
+                        taskMapper.updateSuccessStateAndScoreResultWithStopTime(taskOfLeaf, DictConstants.TASK_COMPLETED, TimeUtil.getNowForMysql());
                     }
                 } catch (Exception e) {
                     taskOfLeaf.setRunState(DictConstants.TASK_ABORTED);
@@ -289,22 +286,39 @@ public class TaskManager {
 
             // 计算不合格的任务数(不到100分就是不合格,执行失败的不算)
             // 计算叶子指标下任务得分总和
-            long notStandardSceneNumber = 0;
-            double leafSum = 0;
+            int errorSceneNumber = 0;
+            int notScoredSceneNumber = 0;
+            int notStandardSceneNumber = 0;
+            int standardSceneNumber = 0;
+            double leafSum = 0.0;
             for (TaskPO task : taskListOfLeafIndex) {
-                // 失败状态的任务是没有分数的,计为 0 分。
-                double scoreTemp = task.getScore() == null ? 0.0 : task.getScore();
-                leafSum += scoreTemp;
-                if (scoreTemp < 100.0) {
+                Double scoreTemp = task.getScore();
+                if (scoreTemp == null) {   // 失败状态的任务是没有分数的,计为 0 分。
+                    errorSceneNumber++;
+                    scoreTemp = 0.0;
+                } else if ("-1".equals(task.getScore().toString())) {  // 如果得分是 -1 ,说明是评分规则无法打分,即也不参与计分
+                    notScoredSceneNumber++;
+                    continue;
+                } else if (scoreTemp < 100.0) {
                     notStandardSceneNumber++;
+                } else if (scoreTemp == 100.0) {
+                    standardSceneNumber++;
                 }
+
+                // 计算分数总和
+                leafSum += scoreTemp;
             }
 
             // 计算任务的个数
-            long resultNumberOfCurrentIndex = taskListOfLeafIndex.size();
-            log.info("TaskManager--score 项目 " + projectId + " 的叶子指标" + indexId + "下成功执行的场景数量为:" + resultNumberOfCurrentIndex);
+            long taskNumberToScore = errorSceneNumber + notStandardSceneNumber + standardSceneNumber;
+            log.info("TaskManager--score 项目 " + projectId + " 的叶子指标 " + indexId
+                    + " 下参与计算的任务总数为 " + taskNumberToScore
+                    + ":仿真异常场景个数 " + errorSceneNumber
+                    + "、未达标场景个数 " + notStandardSceneNumber
+                    + "、达标场景个数 " + standardSceneNumber
+            );
             // 计算叶子指标得分(任务得分总和 / 任务数量)
-            double leafIndexScore = resultNumberOfCurrentIndex == 0 ? 0 : NumberUtil.cut(leafSum / resultNumberOfCurrentIndex, 2);
+            double leafIndexScore = taskNumberToScore == 0 ? 0 : NumberUtil.cut(leafSum / taskNumberToScore, 2);
             // 创建叶子指标对象
             leafIndexTemplate.setTempScore(leafIndexScore);
 
@@ -312,7 +326,10 @@ public class TaskManager {
                     .id(StringUtil.getRandomUUID())
                     .pId(projectId)
                     .target(leafIndexTemplate.getIndexId())
-                    .notStandardSceneNum((int) notStandardSceneNumber)
+                    .errorSceneNum(errorSceneNumber)
+                    .notScoredSceneNum(notScoredSceneNumber)
+                    .notStandardSceneNum(notStandardSceneNumber)
+                    .standardSceneNum(standardSceneNumber)
                     .score(leafIndexScore)
                     .indexId(indexId)
                     .parentId(parentId)

+ 8 - 4
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/mapper/TaskMapper.java

@@ -67,9 +67,13 @@ public interface TaskMapper {
     void updateSuccessStateWithStopTime(@Param("id") String id, @Param("runState") String runState, @Param("runStopTime") Timestamp runStopTime);
 
     @Update("update simulation_manual_project_task\n" +
-            "set run_state = #{runState},run_end_time = #{runStopTime},run_result='Failed',score = 0,target_evaluate = #{targetEvaluate}\n" +
+            "set run_state = #{runState}\n," +
+            "   run_end_time = #{runStopTime},\n" +
+            "   run_result = 'Failed',\n" +
+            "   score = 0,\n" +
+            "   target_evaluate = #{targetEvaluate}\n" +
             "where id = #{id}" +
-            " and score is null")
+            "   and score is null")
     void updateFailStateWithStopTime(@Param("id") String id,
                                      @Param("runState") String runState,
                                      @Param("runStopTime") Timestamp runStopTime,
@@ -119,7 +123,7 @@ public interface TaskMapper {
 
     @Select("select count(1)\n" +
             "from simulation_manual_project_task\n" +
-            "where run_state in ('Aborted', 'PendingAnalysis', 'Terminated')\n" +
+            "where run_state in ('Aborted', 'Terminated')\n" +
             "  and p_id = #{projectId}")
-    int selectEndTaskNumByProjectId(@Param("projectId") String projectId);
+    int selectErrorTaskNumByProjectId(@Param("projectId") String projectId);
 }

+ 3 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/pojo/po/LeafIndexPO.java

@@ -16,7 +16,10 @@ public class LeafIndexPO extends CommonPO {
     private String parentId;  // 父指标 id
     private String rootId;  // 场景测试包 id
     private String target;
+    private Integer errorSceneNum;
+    private Integer notScoredSceneNum;
     private Integer notStandardSceneNum;
+    private Integer standardSceneNum;
     private Double score; // 得分
     private String weight; // 权重
     private String scoreExplain; // 得分说明

+ 44 - 60
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -58,6 +58,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.List;
@@ -1881,61 +1882,60 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         SimulationManualProjectParam query = new SimulationManualProjectParam();
         query.setId(projectId);
         query.setPackageId(scenePackageId);
-        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore2(query);
+        List<SublistScoreVo> sublistScoreVoList = simulationProjectMapper.selectSubScore2(query);
         HashMap<String, Object> hashMap = new HashMap<>();
-        int size = 0;
+        int maxHeaderNumber = 0;
         List<List<String>> result = new ArrayList<>();
         //递归指标名称得分
-        for (SublistScoreVo po : pos) {
-            if (ObjectUtil.isNotNull(po.getPackageAndRules()) && (po.getFirTarget() != null || po.getLasTarget() != null)) {
+        for (SublistScoreVo sublistScoreVo : sublistScoreVoList) {
+            if (ObjectUtil.isNotNull(sublistScoreVo.getPackageAndRules()) && (sublistScoreVo.getFirTarget() != null || sublistScoreVo.getLasTarget() != null)) {
                 //末级指标
-                setParent(po, null, pos, scenePackageId);
-
-                String sublistName = po.getSublistName();
-                Double firScore = po.getFirScore();
+                setParent(sublistScoreVo, null, sublistScoreVoList, scenePackageId);
+                String sublistName = sublistScoreVo.getSublistName();
+                Double firScore = sublistScoreVo.getFirScore();
                 String firstScore = ""; // first得分
                 if (firScore != null) {
                     firstScore = saveTwoDecimalPlaces(firScore, 1).toString();
                 }
-                Double lasScore = po.getLasScore();
+                Double lasScore = sublistScoreVo.getLasScore();
                 String LastScore = "";  // last得分
                 if (lasScore != null) {
                     LastScore = saveTwoDecimalPlaces(lasScore, 1).toString();
                 }
-                String sceneNum = po.getSceneNum();//场景数量
-                String notScoredSceneNum = po.getNotScoredSceneNum();       // 未参与评分数量
-                String notStandardSceneNum = po.getNotStandardSceneNum();   // 未达标场景数量
-                String standardSceneNum = po.getStandardSceneNum();         // 达标场景数量
+                String sceneNum = sublistScoreVo.getSceneNum(); // 场景数量
+                String errorSceneNum = sublistScoreVo.getErrorSceneNum();       // 仿真异常场景个数
+                String notScoredSceneNum = sublistScoreVo.getNotScoredSceneNum();       // 未参与评分数量
+                String notStandardSceneNum = sublistScoreVo.getNotStandardSceneNum();   // 未达标场景数量
+                String standardSceneNum = sublistScoreVo.getStandardSceneNum();         // 达标场景数量
 
                 if (ObjectUtil.isNotNull(sublistName)) {
                     sublistName += ProjectConstants.SEPARATOR
                             + sceneNum + ProjectConstants.SEPARATOR
+                            + errorSceneNum + ProjectConstants.SEPARATOR
                             + notScoredSceneNum + ProjectConstants.SEPARATOR
                             + notStandardSceneNum + ProjectConstants.SEPARATOR
                             + standardSceneNum + ProjectConstants.SEPARATOR
                             + LastScore + ProjectConstants.SEPARATOR
                             + firstScore;
                     String[] split = sublistName.split(ProjectConstants.SEPARATOR);
-
-
-                    List<String> strings = new LinkedList<>();
-                    strings.addAll(Arrays.asList(split));
-                    if (size < strings.size()) {
-                        size = strings.size();
-                    }
-                    result.add(strings);
+                    maxHeaderNumber = Math.max(maxHeaderNumber, split.length);  // 求最大表头数量
+                    result.add(Arrays.asList(split));
                 }
-
             }
-
         }
-
-
-        List<SubScListVo> objects = new ArrayList<>();
-        //结果补全
+        // 结果补全
+        List<SubScListVo> values = new ArrayList<>();
+        int fieldNumber = 7;
         for (List<String> list : result) {
-            int start = list.size() - 4;
+            int start = list.size() - fieldNumber;
             SubScListVo subScListVo = new SubScListVo();
+            subScListVo.setSceneNum(list.get(start));
+            subScListVo.setErrorSceneNum(list.get(start + 1));
+            subScListVo.setNotScoredSceneNum(list.get(start + 2));
+            subScListVo.setNotStandardSceneNum(list.get(start + 3));
+            subScListVo.setStandardSceneNum(list.get(start + 4));
+            subScListVo.setLastScore(list.get(start + 5));
+            subScListVo.setFirstScore(list.get(start + 6));
             for (int i = 0; i < start; i++) {
                 if (0 == i) {
                     subScListVo.setSublistName1(list.get(i));
@@ -1950,32 +1950,22 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 } else if (5 == i) {
                     subScListVo.setSublistName6(list.get(i));
                 }
-
             }
-            subScListVo.setSceneNum(list.get(start + 0));
-            subScListVo.setNotScoredSceneNum(list.get(start + 1));
-            subScListVo.setNotStandardSceneNum(list.get(start + 2));
-            subScListVo.setStandardSceneNum(list.get(start + 3));
-            subScListVo.setLastScore(list.get(start + 4));
-            subScListVo.setFirstScore(list.get(start + 5));
-
-            objects.add(subScListVo);
-
-
+            values.add(subScListVo);
         }
-
         List<Map<Object, Object>> headerList = new ArrayList<>();
-        for (int i = 0; i < size - 4; i++) {
+        for (int i = 0; i < maxHeaderNumber - fieldNumber; i++) {
             addHeaders(i, headerList);
         }
         headerList.add(ImmutableMap.builder().put("label", "场景数量").put("prop", "sceneNum").build());
+        headerList.add(ImmutableMap.builder().put("label", "仿真异常场景个数").put("prop", "errorSceneNum").build());
         headerList.add(ImmutableMap.builder().put("label", "未参与评分场景个数").put("prop", "notScoredSceneNum").build());
         headerList.add(ImmutableMap.builder().put("label", "未达标场景数量").put("prop", "notStandardSceneNum").build());
         headerList.add(ImmutableMap.builder().put("label", "达标场景个数").put("prop", "standardSceneNum").build());
         headerList.add(ImmutableMap.builder().put("label", "得分").put("prop", "lastScore").build());
         headerList.add(ImmutableMap.builder().put("label", "总分").put("prop", "firstScore").build());
         hashMap.put("headerList", headerList);
-        hashMap.put("result", objects);
+        hashMap.put("result", values);
 
 
         return hashMap;
@@ -2428,7 +2418,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             //下载 or 保存本地
             if (param.getIsCreateLocalPdfFile() != null && param.getIsCreateLocalPdfFile() == true) {
                 File file = new File(param.getLocalPdfFilePath());
-                os = new BufferedOutputStream(new FileOutputStream(file));
+                os = new BufferedOutputStream(Files.newOutputStream(file.toPath()));
             } else {
                 String fileName = vo.getProjectId() + "_" + vo.getProjectName();
                 response.setContentType("application/x-download");
@@ -2491,12 +2481,12 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
             setBlankLineSpacing(20, font, document);
 
-            //表头
+            // 表头
             PdfPTable pdfPTable = new PdfPTable(5);
             pdfPTable.setHeaderRows(1);//换页每页显示表头
             addTitleList(pdfPTable, font, new String[]{"测试项目", "场景数量", "测试权重(%)", "测试得分", "得分率(%)"});
 
-            //数据
+            // 数据
             List<AlgorithmScoreVo> algorithmScoreList = vo.getAlgorithmScoreList();
             for (AlgorithmScoreVo asv : algorithmScoreList) {
                 String[] data = new String[]{
@@ -2524,20 +2514,18 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 //            document.add(pdfPTable1);
 
 
-            //新的一页,横向显示
+            // 新的一页,横向显示
             document.setPageSize(PageSize.A4.rotate());
             document.newPage();
 
-            //指标得分列表
+            // 算法测试评分细则(指标得分列表
             Paragraph subListScoreElements = new Paragraph(
                     50,
                     "算法测试评分细则",
                     defaultFont(font));
             subListScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
             document.add(subListScoreElements);
-
             setBlankLineSpacing(20, font, document);
-
             List<Map> subListScoreLiTitle = vo.getSubListScoreLiTitle();
             int size = subListScoreLiTitle.size();
             PdfPTable pdfPTable2 = new PdfPTable(size);
@@ -2547,51 +2535,47 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 slt[i] = subListScoreLiTitle.get(i).get("label").toString();
             }
             addTitleList(pdfPTable2, font, slt);
-
             List<SubScListVo> subListScoreLi = vo.getSubListScoreLi();
-
             List<String[]> list = new ArrayList<>();
+            int fieldNumber = 7;
             for (SubScListVo slv : subListScoreLi) {
                 String[] slsi = new String[size];
                 for (int i = 0; i < size; i++) {
                     slsi[i] = "";
                 }
                 //目前最多支持到6级指标
-                for (int i = 0; i < size - 4; i++) {
+                for (int i = 0; i < size - fieldNumber; i++) {
                     if (i == 0) {
                         if (slv.getSublistName1() != null) {
                             slsi[i] = slv.getSublistName1();
                         }
-
                     } else if (i == 1) {
                         if (slv.getSublistName2() != null) {
                             slsi[i] = slv.getSublistName2();
                         }
-
                     } else if (i == 2) {
                         if (slv.getSublistName3() != null) {
                             slsi[i] = slv.getSublistName3();
                         }
-
                     } else if (i == 3) {
                         if (slv.getSublistName4() != null) {
                             slsi[i] = slv.getSublistName4();
                         }
-
                     } else if (i == 4) {
                         if (slv.getSublistName5() != null) {
                             slsi[i] = slv.getSublistName5();
                         }
-
                     } else if (i == 5) {
                         if (slv.getSublistName6() != null) {
                             slsi[i] = slv.getSublistName6();
                         }
-
                     }
                 }
-                slsi[size - 4] = slv.getSceneNum();
-                slsi[size - 3] = slv.getNotStandardSceneNum();
+                slsi[size - 7] = slv.getSceneNum();
+                slsi[size - 6] = slv.getErrorSceneNum();
+                slsi[size - 5] = slv.getNotScoredSceneNum();
+                slsi[size - 4] = slv.getNotStandardSceneNum();
+                slsi[size - 3] = slv.getStandardSceneNum();
                 slsi[size - 2] = slv.getLastScore();
                 slsi[size - 1] = slv.getFirstScore();
 

+ 1 - 0
simulation-resource-server/src/main/resources/mapper/project/SimulationProjectMapper.xml

@@ -571,6 +571,7 @@
                fir.score      as firScore,
                las.score      as lasScore,
                sub.package_and_rules,
+               las.error_scene_num,
                las.not_scored_scene_num,
                las.not_standard_scene_num,
                las.standard_scene_num,