浏览代码

覆盖率前置条件,增加一些状态流转条件。计算feign接口增加返参为CompletableFuture好查返回异常

ztf 3 月之前
父节点
当前提交
80aafcc426
共有 11 个文件被更改,包括 107 次插入33 次删除
  1. 5 0
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/db/mysql/mapper/SceneComputerRateMapper.java
  2. 44 18
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/runnable/SceneEvaluationComputeRunnable.java
  3. 8 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/impl/SceneComputerRateServiceImpl.java
  4. 2 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneComputerRateService.java
  5. 6 3
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneEvaluationRuleService.java
  6. 15 3
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneReferenceLibService.java
  7. 4 2
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/entity/SceneComputerRateEntity.java
  8. 2 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/mysql/mapper/SceneComputerRateMapper.java
  9. 5 1
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/feign/fallback/SchedulerServiceFallback.java
  10. 3 1
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/feign/service/SchedulerService.java
  11. 13 5
      simulation-resource-server/src/main/resources/mysql/mapper/SceneComputerRateMapper.xml

+ 5 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/db/mysql/mapper/SceneComputerRateMapper.java

@@ -38,4 +38,9 @@ public interface SceneComputerRateMapper {
             "where computer_rate_id = #{computerRateId} and  computer_type = #{computerType}")
     void updateResultByIdAndType(@Param("computerRateId") String computerRateId, @Param("computerType") String computerType,
                                  @Param("computerResult") String computerResult);
+
+    @Update("update simulation.scene_computer_rate set process_status = #{processStatus} " +
+            "where computer_rate_id = #{computerRateId} and  computer_type = #{computerType}")
+    void updateProcessStatusByIdAndType(@Param("computerRateId") String computerRateId, @Param("computerType") String computerType,
+                                        @Param("processStatus") String processStatus);
 }

+ 44 - 18
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/runnable/SceneEvaluationComputeRunnable.java

@@ -21,7 +21,6 @@ import com.css.simulation.resource.scheduler.infra.fs.minio.MinioUtil;
 import com.css.simulation.resource.scheduler.infra.threadpool.ThreadPool;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.sun.istack.internal.NotNull;
 import io.minio.MinioClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -34,6 +33,7 @@ import java.nio.file.attribute.PosixFilePermission;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.Future;
 
 
 /**
@@ -52,7 +52,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
     private final Map<String, SceneEvaluationComputeParam> sceneEvaluationComputeParamMap;
 
     public SceneEvaluationComputeRunnable(String linuxTempPath, String bucketName,
-                                          @NotNull Map<String, SceneEvaluationComputeParam> sceneEvaluationComputeParamMap) {
+                                          Map<String, SceneEvaluationComputeParam> sceneEvaluationComputeParamMap) {
         this.linuxTempPath = linuxTempPath;
         this.bucketName = bucketName;
         this.sceneEvaluationComputeParamMap = sceneEvaluationComputeParamMap;
@@ -82,13 +82,14 @@ public class SceneEvaluationComputeRunnable implements Runnable {
             sceneEvaluationStatusPO.setEndEvaluationTime(null);
             sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_1);
             sceneEvaluationStatusPO.setEvaluationErrorMsg("");
-            updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+            SceneComputerRateDTO numsKeysSceneResult = null;
+            updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_RUNNING);
 
             String ruleId = sceneEvaluationComputeParam.getSceneEvaluationRuleId();
             log.info("开始执行线程:" + sceneEvaluationComputeParam);
 //            String bucketName = sceneEvaluationComputeParam.getBucketName();
             // 如果是计算覆盖率,要先看覆盖率前置条件有没有跑完任务
-            SceneComputerRateDTO numsKeysSceneResult = null;
+
             if (DictConstants.COVERAGE.equals(sceneEvaluationComputeParam.getComputeType())
                     || DictConstants.COVERAGE_PREFIX.equals(sceneEvaluationComputeParam.getComputeType())) {
                 numsKeysSceneResult = sceneComputerRateMapper.loadSceneComputerRate(DictConstants.COVERAGE_PREFIX);
@@ -106,7 +107,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                 sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                 sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价规则已删除");
-                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                 return;
             }
             log.info("场景评价规则为:" + sceneEvaluationRulePO);
@@ -124,7 +125,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                 sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                 sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价脚本不存在");
-                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                 return;
             }
             String pyMainPath = scriptsPath + "/" + sceneEvaluationRulePO.getRuleId();
@@ -148,7 +149,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                     sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                     sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                     sceneEvaluationStatusPO.setEvaluationErrorMsg("下载场景评价脚本失败");
-                    updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                    updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                     return;
                 }
             }
@@ -157,6 +158,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
             String sceneComputerPathFather = evaluationDirectoryOfUser + "sceneComputer/" + sceneEvaluationComputeParam.getTaskId();
 
             List<String> sceneIdList = new ArrayList<>();
+            List<Future<?>> futureList = new ArrayList<>();
             for (SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam : sceneEvaluationComputeParam.getSceneEvaluationComputeSubParam()) {
                 sceneIdList.add(sceneEvaluationComputeSubParam.getSceneId());
                 if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
@@ -170,7 +172,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                         log.info("创建复杂度文件夹:" + scenePath);
                         FileUtil.createDirectory(scenePath);
                     }
-                    ThreadPool.sceneDownloadPool.execute(() -> {
+                    Future<?> future = ThreadPool.sceneDownloadPool.submit(() -> {
                         try {
                             // 计算复杂度,根据场景 id 获取场景信息,下载 osc odr
                             String scenarioOsc = sceneEvaluationComputeSubParam.getSceneXOSCPath();
@@ -187,6 +189,8 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                             FileUtil.deleteFolder(scenePathFather);   // 删除临时文件
                         }
                     });
+
+                    futureList.add(future);
                 } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.RISK)) {
                     if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getEvaluationPath())) {
                         continue;
@@ -197,7 +201,8 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                         log.info("创建危险度文件夹:" + scenePath);
                         FileUtil.createDirectory(scenePath);
                     }
-                    ThreadPool.sceneDownloadPool.execute(() -> {
+
+                    Future<?> future = ThreadPool.sceneDownloadPool.submit(() -> {
                         try {
                             // 计算危险度 从 minio path 下载 csv (ego 和 sensors)
                             MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getEvaluationPath() + "/Ego.csv", scenePath + "/Ego.csv");
@@ -207,6 +212,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                             FileUtil.deleteFolder(riskPathFather);   // 删除临时文件
                         }
                     });
+                    futureList.add(future);
                 } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.EXPOSURE_RATE)
                         || StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE)
                         || StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
@@ -229,21 +235,32 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                     }
                     paramFilesStrSet.add(dirPrefix);
                     // 开线程去下载
-                    ThreadPool.sceneDownloadPool.execute(() -> {
+                    Future<?> future = ThreadPool.sceneDownloadPool.submit(() -> {
                         try {
                             MinioUtil.downloadDirFiles(minioClient, bucketName, dirPrefix, sceneComputerPathFather);
                         } catch (Exception e) {
                             log.error("文件目录下载失败,{}", dirPrefix);
                         }
                     });
+                    futureList.add(future);
                 } else {
                     sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                     sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                     sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
-                    updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                    updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                     return;
                 }
             }
+            log.info("file download future size={}", futureList.size());
+            for (Future<?> future : futureList) {
+                log.info("wait files download");
+                try {
+                    future.get(); // 阻塞等待任务完成
+                } catch (Exception e) {
+                    log.error("download file future error", e);
+                }
+                log.info("files download end");
+            }
             String sceneEvaluationCommand;
             if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
                 sceneEvaluationCommand = pyMainPath + " " + scenePathFather + " complexity";
@@ -297,7 +314,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                 sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                 sceneEvaluationStatusPO.setEvaluationErrorMsg("执行场景评价命令失败");
-                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                 return;
             }
 
@@ -314,7 +331,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                 sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                 sceneEvaluationStatusPO.setEvaluationErrorMsg("获取场景评价结果失败");
-                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                 return;
             }
             sceneEvaluationResult = sb.toString();
@@ -335,7 +352,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                             sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                             sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                             sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
-                            updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                            updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                             return;
                         }
                         FileInputStream fileInputStream = new FileInputStream(readPath + sceneEvaluationComputeSubParam.getSceneId() + "/scenario_evaluation.json");
@@ -421,7 +438,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                         sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                         sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
                         sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
-                        updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                        updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_TERMINATING);
                         return;
                     }
                     FileInputStream fileInputStream = new FileInputStream(readPath);
@@ -441,7 +458,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                     // 如果是覆盖率前置条件,需要修改覆盖率前置条件
                     if (numsKeysSceneResult != null && DictConstants.COVERAGE_PREFIX.equals(sceneEvaluationComputeParam.getComputeType())) {
                         sceneComputerRateMapper.updateResultByIdAndType(numsKeysSceneResult.getComputerRateId(), numsKeysSceneResult.getComputerType(), replace);
-                    }else {
+                    } else {
                         // 保存结果
                         SceneComputerRateDTO sceneComputerRatePO = getSceneComputerRatePO(sceneEvaluationComputeParam, replace, ruleId, sceneIdList);
                         sceneComputerRateMapper.saveSceneComputerRate(sceneComputerRatePO);
@@ -454,7 +471,7 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
                 sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_2);
                 sceneEvaluationStatusPO.setEvaluationErrorMsg("");
-                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
+                updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO, numsKeysSceneResult, DictConstants.PROJECT_COMPLETED);
             }
         });
         // 删除临时文件
@@ -493,10 +510,14 @@ public class SceneEvaluationComputeRunnable implements Runnable {
         sceneComputerRatePO.setAlgorithmId(sceneEvaluationComputeParam.getAlgorithmId());
         sceneComputerRatePO.setVehicleId(sceneEvaluationComputeParam.getVehicleId());
         sceneComputerRatePO.setCreateTime(TimeUtil.getNowForMysql());
+        sceneComputerRatePO.setIsDeleted("0");
         return sceneComputerRatePO;
     }
 
-    private void updateStatus(SceneEvaluationComputeParam sceneEvaluationComputeParam, SceneEvaluationStatusMapper sceneEvaluationStatusMapper, SceneEvaluationStatusPO sceneEvaluationStatusPO) {
+    private void updateStatus(SceneEvaluationComputeParam sceneEvaluationComputeParam,
+                              SceneEvaluationStatusMapper sceneEvaluationStatusMapper,
+                              SceneEvaluationStatusPO sceneEvaluationStatusPO,
+                              SceneComputerRateDTO numsKeysSceneResult, String processStatus) {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
             if (DictConstants.SCENE_IMPORT_EVALUATION_TYPE.equals(sceneEvaluationComputeParam.getType())) {
@@ -550,6 +571,11 @@ public class SceneEvaluationComputeRunnable implements Runnable {
                 sceneEvaluationStatusMapper.updateManualProjectEvaluationStatus(sceneEvaluationStatusPO.getId(), evaluationJsonObj.toString());
             }
         } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
+
+            if (numsKeysSceneResult != null) {
+                SceneComputerRateMapper sceneComputerRateMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneComputerRateMapper.class);
+                sceneComputerRateMapper.updateProcessStatusByIdAndType(numsKeysSceneResult.getComputerRateId(), numsKeysSceneResult.getComputerType(), processStatus);
+            }
             SimulationManualProjectMapper simulationManualProjectMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SimulationManualProjectMapper.class);
             ProjectEntity projectEntity = simulationManualProjectMapper.selectById(sceneEvaluationComputeParam.getTaskId());
             if (StringUtil.isNotEmpty(projectEntity.getEvaluationJsonMsg())) {

+ 8 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/impl/SceneComputerRateServiceImpl.java

@@ -39,6 +39,11 @@ public class SceneComputerRateServiceImpl implements SceneComputerRateService {
         sceneComputerRateMapper.deleteByIdAndType(computerRateId, computerType);
     }
 
+    @Override
+    public void updateProcessStatus(SceneComputerRateEntity params) {
+        sceneComputerRateMapper.updateProcessStatus(params);
+    }
+
     @Override
     public List<SceneComputerECRateVo> selectProjectComputerRates(String projectId, List<String> computerTypeList) {
 
@@ -97,6 +102,9 @@ public class SceneComputerRateServiceImpl implements SceneComputerRateService {
                     baseSceneKeysNumsVos.add(baseSceneKeysNumsVo);
                 }
                 coveragePrefixStatusVO.setBaseSceneKeysNumsVos(baseSceneKeysNumsVos);
+            } else if (DictConstants.PROJECT_TERMINATING.equals(sceneComputerRateEntity.getProcessStatus())) {
+                coveragePrefixStatusVO.setStatusCode(DictConstants.PROJECT_TERMINATING);
+                coveragePrefixStatusVO.setStatusMessage("执行失败");
             } else {
                 coveragePrefixStatusVO.setStatusCode(DictConstants.PROJECT_RUNNING);
                 coveragePrefixStatusVO.setStatusMessage(DictConstants.PROJECT_RUNNING_NAME);

+ 2 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneComputerRateService.java

@@ -18,6 +18,8 @@ public interface SceneComputerRateService {
 
     void deleteByIdAndType(@Param("computerRateId") String computerRateId, @Param("computerType") String computerType);
 
+    void updateProcessStatus(SceneComputerRateEntity params);
+
     /**
      * 根据项目id和场景计算类型查询覆盖率,暴露率等数据
      * @param projectId projectId

+ 6 - 3
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneEvaluationRuleService.java

@@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -129,7 +130,9 @@ public class SceneEvaluationRuleService {
             return new ResponseBodyVO<>(false, 500, "参数错误!", null);
         }
         String sceneType = sceneEvaluationRulePO.getRuleType();
-        if (ObjectUtil.isNull(sceneType) || DictConstants.SCENE_GENERAL.equals(sceneType)) {
+        // 覆盖率和泛化场景一样的code不用判断了
+//        if (ObjectUtil.isNull(sceneType) || DictConstants.SCENE_GENERAL.equals(sceneType)) {
+        if (ObjectUtil.isNull(sceneType)) {
             return new ResponseBodyVO<>(false, 500, "参数错误!", null);
         }
         boolean createRule = StringUtil.isEmpty(sceneEvaluationRulePO.getRuleId());
@@ -277,7 +280,7 @@ public class SceneEvaluationRuleService {
     }
 
 
-    public void computeSceneEvaluation(SceneEvaluationComputeParam sceneEvaluationComputeParam) {
-        schedulerService.computeSceneEvaluation(sceneEvaluationComputeParam);
+    public CompletableFuture<Void> computeSceneEvaluation(SceneEvaluationComputeParam sceneEvaluationComputeParam) {
+        return schedulerService.computeSceneEvaluation(sceneEvaluationComputeParam);
     }
 }

+ 15 - 3
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/service/SceneReferenceLibService.java

@@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -454,6 +455,7 @@ public class SceneReferenceLibService {
 
 
     public ResponseBodyVO<String> handleConvergePrefix() {
+
         // 查询覆盖率前置的脚本
         SceneEvaluationScriptParam sceneEvaluationScriptParam = new SceneEvaluationScriptParam();
         sceneEvaluationScriptParam.setSceneEvaluationType(Collections.singletonList(DictConstants.COVERAGE_PREFIX));
@@ -492,7 +494,8 @@ public class SceneReferenceLibService {
         // 删除旧的前置结果
         SceneComputerRateEntity sceneComputerRateEntity1 = sceneComputerRateService.loadSceneCoveragePrefixKeyNums();
         if (sceneComputerRateEntity1 != null) {
-            if (StringUtil.isEmpty(sceneComputerRateEntity1.getComputerResult())) {
+            if (DictConstants.PROJECT_RUNNING.equals(sceneComputerRateEntity1.getProcessStatus())
+                    || DictConstants.PROJECT_WAITING.equals(sceneComputerRateEntity1.getProcessStatus())) {
                 return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "覆盖率前置脚本还在运行中,请稍等再重跑");
             }
             sceneComputerRateService.deleteByIdAndType(sceneComputerRateEntity1.getComputerRateId(), DictConstants.COVERAGE_PREFIX);
@@ -505,10 +508,19 @@ public class SceneReferenceLibService {
         sceneComputerRateEntity.setRuleId(sceneEvaluationRulePO.getRuleId());
         sceneComputerRateEntity.setCreateUserId(AuthUtil.getCurrentUserId());
         sceneComputerRateEntity.setCreateTime(TimeUtil.getNowForMysql());
+        sceneComputerRateEntity.setIsDeleted("0");
+        sceneComputerRateEntity.setProcessStatus(DictConstants.PROJECT_WAITING);
+
+        // 执行任务计算覆盖率前置条件
+        CompletableFuture<Void> feature = sceneEvaluationRuleService.computeSceneEvaluation(sceneComplexityEvaluationComputeParam);
+        feature.exceptionally(ex -> {
+            sceneComputerRateEntity.setProcessStatus(DictConstants.PROJECT_TERMINATING);
+            sceneComputerRateService.updateProcessStatus(sceneComputerRateEntity);
+            log.error("覆盖率前置脚本执行失败, error: ", ex);
+            return null;
+        });
         // 新增一个空前置结果,好处理状态
         sceneComputerRateService.saveSceneComputerRate(sceneComputerRateEntity);
-        // 执行任务计算覆盖率前置条件
-        sceneEvaluationRuleService.computeSceneEvaluation(sceneComplexityEvaluationComputeParam);
         return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
     }
 }

+ 4 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/entity/SceneComputerRateEntity.java

@@ -30,9 +30,11 @@ public class SceneComputerRateEntity implements Serializable {
     private String computerResult;
     private String sceneIdList;
     private String isDeleted;
-    public Timestamp createTime;
+    private Timestamp createTime;
     /**
      * 记录创建人(用户id)
      */
-    public String createUserId;
+    private String createUserId;
+    private String processStatus;
+
 }

+ 2 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/mysql/mapper/SceneComputerRateMapper.java

@@ -18,4 +18,6 @@ public interface SceneComputerRateMapper {
     void deleteByIdAndType(@Param("computerRateId") String computerRateId, @Param("computerType") String computerType);
 
     List<SceneComputerRateEntity> loadSceneComputerRateByTaskIdAndType(@Param("taskId") String taskId, @Param("computerTypeList") List<String> computerTypeList);
+
+    void updateProcessStatus(SceneComputerRateEntity params);
 }

+ 5 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/feign/fallback/SchedulerServiceFallback.java

@@ -6,6 +6,9 @@ import com.css.simulation.resource.server.infra.feign.service.SchedulerService;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.concurrent.CompletableFuture;
+
 @Component
 public class SchedulerServiceFallback implements SchedulerService {
 
@@ -16,6 +19,7 @@ public class SchedulerServiceFallback implements SchedulerService {
 
 
     @Override
-    public void computeSceneEvaluation(@RequestBody SceneEvaluationComputeParam sceneEvaluationComputeParam){
+    public CompletableFuture<Void> computeSceneEvaluation(@RequestBody SceneEvaluationComputeParam sceneEvaluationComputeParam){
+    return CompletableFuture.completedFuture(null);
     }
 }

+ 3 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/feign/service/SchedulerService.java

@@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.concurrent.CompletableFuture;
+
 //@FeignClient(name = "scheduler", url = "http://36.110.106.156:10204", path = "/simulation/resource/scheduler", fallback = SchedulerServiceFallback.class, configuration = FeignConfiguration.class)
 @FeignClient(
         contextId = "scheduler",
@@ -25,6 +27,6 @@ public interface SchedulerService {
 
     @Async
     @PostMapping(value = "/sceneEvaluation/computeSceneEvaluation")
-    void computeSceneEvaluation(@RequestBody SceneEvaluationComputeParam sceneEvaluationComputeParam);
+    CompletableFuture<Void> computeSceneEvaluation(@RequestBody SceneEvaluationComputeParam sceneEvaluationComputeParam);
 
 }

+ 13 - 5
simulation-resource-server/src/main/resources/mysql/mapper/SceneComputerRateMapper.xml

@@ -12,8 +12,10 @@
         <result column="computer_result" property="computerResult" jdbcType="DECIMAL"/>
         <result column="scene_id_list" property="sceneIdList" jdbcType="DECIMAL"/>
         <result column="is_deleted" property="isDeleted" jdbcType="VARCHAR"/>
+        <result column="process_status" property="processStatus" jdbcType="VARCHAR"/>
         <result column="create_user_id" property="createUserId" jdbcType="DECIMAL"/>
         <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+
     </resultMap>
 
     <insert id="saveSceneComputerRate"
@@ -22,27 +24,33 @@
       insert into simulation.scene_computer_rate
             (computer_rate_id, computer_type, rule_id, algorithm_id,vehicle_id,task_id,
              computer_result, scene_id_list,
-             is_deleted, create_user_id, create_time
+             is_deleted, process_status, create_user_id, create_time
             )
             values (#{computerRateId,jdbcType=VARCHAR}, #{computerType,jdbcType=VARCHAR}, #{ruleId,jdbcType=VARCHAR},
                     #{algorithmId,jdbcType=VARCHAR},#{vehicleId,jdbcType=VARCHAR},#{taskId,jdbcType=VARCHAR},
                     #{computerResult,jdbcType=VARCHAR}, #{sceneIdList,jdbcType=VARCHAR},
                     #{isDeleted,jdbcType=VARCHAR},
+                    #{processStatus,jdbcType=VARCHAR},
                     #{createUserId,jdbcType=VARCHAR},
                     #{createTime,jdbcType=TIMESTAMP})
     </insert>
     <update id="deleteByIdAndType">
-        update simulation.scene_computer_rate set is_deleted = 1
+        update simulation.scene_computer_rate set is_deleted = '1'
             where computer_rate_id = #{computerRateId} and  computer_type = #{computerType}
     </update>
+    <update id="updateProcessStatus"
+            parameterType="com.css.simulation.resource.server.infra.db.entity.SceneComputerRateEntity">
+        update simulation.scene_computer_rate set process_status = #{processStatus, jdbcType=VARCHAR}
+        where computer_rate_id = #{computerRateId}
+    </update>
 
     <select id="loadSceneCoveragePrefixKeyNums" resultMap="resultMap"
             parameterType="java.lang.String">
-        select computer_rate_id, computer_type, computer_result
+        select computer_rate_id, computer_type, computer_result, process_status
         from simulation.scene_computer_rate where computer_type = #{computerType} and is_deleted = '0'
     </select>
     <select id="loadSceneComputerRateByTaskIdAndType" resultMap="resultMap">
-        select computer_rate_id, task_id, computer_type, computer_result
+        select computer_rate_id, task_id, computer_type, computer_result, process_status
         from simulation.scene_computer_rate
         <where>
             <if test="taskId != null and taskId != ''">
@@ -55,7 +63,7 @@
                     #{item}
                 </foreach>
             </if>
-            and is_deleted = 0
+            and is_deleted = '0'
         </where>
     </select>
 </mapper>