|
@@ -4,6 +4,7 @@ import api.common.pojo.constants.DictConstants;
|
|
|
import api.common.pojo.param.scene.SceneEvaluationComputeParam;
|
|
|
import api.common.pojo.param.scene.SceneEvaluationComputeSubParam;
|
|
|
import api.common.pojo.po.scene.SceneComplexityPO;
|
|
|
+import api.common.pojo.po.scene.SceneComputerRateDTO;
|
|
|
import api.common.pojo.po.scene.SceneEvaluationRulePO;
|
|
|
import api.common.pojo.po.scene.SceneRiskPO;
|
|
|
import api.common.pojo.po.system.SceneEvaluationStatusPO;
|
|
@@ -17,8 +18,10 @@ import com.css.simulation.resource.scheduler.adapter.entity.impl.ApplicationCont
|
|
|
import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.*;
|
|
|
import com.css.simulation.resource.scheduler.infra.entity.ProjectEntity;
|
|
|
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;
|
|
@@ -30,10 +33,7 @@ import java.nio.file.Paths;
|
|
|
import java.nio.file.attribute.PosixFilePermission;
|
|
|
import java.text.DecimalFormat;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -43,269 +43,460 @@ import java.util.Set;
|
|
|
@Slf4j
|
|
|
public class SceneEvaluationComputeRunnable implements Runnable {
|
|
|
|
|
|
- private final SceneEvaluationComputeParam sceneEvaluationComputeParam;
|
|
|
+// private final SceneEvaluationComputeParam sceneEvaluationComputeParam;
|
|
|
|
|
|
- public SceneEvaluationComputeRunnable(SceneEvaluationComputeParam sceneEvaluationComputeParam) {
|
|
|
- this.sceneEvaluationComputeParam = sceneEvaluationComputeParam;
|
|
|
+ private final String linuxTempPath;
|
|
|
+
|
|
|
+ private final String bucketName;
|
|
|
+
|
|
|
+ private final Map<String, SceneEvaluationComputeParam> sceneEvaluationComputeParamMap;
|
|
|
+
|
|
|
+ public SceneEvaluationComputeRunnable(String linuxTempPath, String bucketName,
|
|
|
+ @NotNull Map<String, SceneEvaluationComputeParam> sceneEvaluationComputeParamMap) {
|
|
|
+ this.linuxTempPath = linuxTempPath;
|
|
|
+ this.bucketName = bucketName;
|
|
|
+ this.sceneEvaluationComputeParamMap = sceneEvaluationComputeParamMap;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void run() {
|
|
|
- // 先修改状态
|
|
|
- SceneEvaluationStatusMapper sceneEvaluationStatusMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneEvaluationStatusMapper.class);
|
|
|
- SceneEvaluationStatusPO sceneEvaluationStatusPO = new SceneEvaluationStatusPO();
|
|
|
- sceneEvaluationStatusPO.setId(sceneEvaluationComputeParam.getEvaluationId());
|
|
|
- sceneEvaluationStatusPO.setStartEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(null);
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_1);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
-
|
|
|
- String ruleId = sceneEvaluationComputeParam.getSceneEvaluationRuleId();
|
|
|
- log.info("开始执行线程:" + sceneEvaluationComputeParam);
|
|
|
- String bucketName = sceneEvaluationComputeParam.getBucketName();
|
|
|
+ log.info("SceneEvaluationComputeRunnable begin handel.");
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ String tempPath = StringUtil.getRandomUUID();
|
|
|
+ // 覆盖率和暴露率用到 两个共用目录 不多次下载了
|
|
|
+ Set<String> paramFilesStrSet = new HashSet<>();
|
|
|
+ // 先准备各种bean
|
|
|
SceneEvaluationRuleMapper sceneEvaluationRuleMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneEvaluationRuleMapper.class);
|
|
|
SceneComplexityMapper sceneComplexityMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneComplexityMapper.class);
|
|
|
SceneRiskMapper sceneRiskMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneRiskMapper.class);
|
|
|
+ SceneComputerRateMapper sceneComputerRateMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneComputerRateMapper.class);
|
|
|
MinioClient minioClient = ApplicationContextAwareImpl.getApplicationContext().getBean(MinioClient.class);
|
|
|
- // 获取场景评价规则
|
|
|
- SceneEvaluationRulePO sceneEvaluationRulePO = sceneEvaluationRuleMapper.querySceneEvaluationPyById(ruleId);
|
|
|
- if (sceneEvaluationRulePO == null) {
|
|
|
- log.error(ruleId + " 的场景评价规则已删除");
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价规则已删除");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
- return;
|
|
|
- }
|
|
|
- log.info("场景评价规则为:" + sceneEvaluationRulePO);
|
|
|
- // 1 判断有没有用户目录,没有则复制
|
|
|
- String tempPath = StringUtil.getRandomUUID();
|
|
|
- log.info("项目 id :" + sceneEvaluationComputeParam.getTaskId() + " 的临时路径为:" + tempPath);
|
|
|
- String evaluationDirectoryOfUser = sceneEvaluationComputeParam.getLinuxTempPath() + "scene/evaluation/" + tempPath + "/";
|
|
|
- String scriptsPath = evaluationDirectoryOfUser + "scripts";
|
|
|
- if (!new File(evaluationDirectoryOfUser).exists()) {
|
|
|
- // 1 将场景评价规则脚本保存到 script 目录
|
|
|
- FileUtil.createDirectory(scriptsPath);
|
|
|
- }
|
|
|
|
|
|
- // 下载场景评价脚本到脚本目录
|
|
|
- if (sceneEvaluationRulePO.getScriptPath() == null) {
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价脚本不存在");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
- return;
|
|
|
- }
|
|
|
- String pyMainPath = scriptsPath + "/" + sceneEvaluationRulePO.getRuleId();
|
|
|
- if (!new File(pyMainPath).exists()) {
|
|
|
- try {
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationRulePO.getScriptPath(), pyMainPath);
|
|
|
- Path path = Paths.get(pyMainPath);
|
|
|
- Set<PosixFilePermission> permissions = new HashSet<>();
|
|
|
- permissions.add(PosixFilePermission.OWNER_READ);
|
|
|
- permissions.add(PosixFilePermission.OWNER_WRITE);
|
|
|
- permissions.add(PosixFilePermission.OWNER_EXECUTE);
|
|
|
- permissions.add(PosixFilePermission.GROUP_READ);
|
|
|
- permissions.add(PosixFilePermission.GROUP_WRITE);
|
|
|
- permissions.add(PosixFilePermission.GROUP_EXECUTE);
|
|
|
- permissions.add(PosixFilePermission.OTHERS_READ);
|
|
|
- permissions.add(PosixFilePermission.OTHERS_WRITE);
|
|
|
- permissions.add(PosixFilePermission.OTHERS_EXECUTE);
|
|
|
- Files.setPosixFilePermissions(path, permissions);
|
|
|
- } catch (IOException e) {
|
|
|
- log.error("下载执行文件失败: " + sceneEvaluationRulePO.getScriptPath(), e);
|
|
|
+ sceneEvaluationComputeParamMap.forEach((sceneType, sceneEvaluationComputeParam) -> {
|
|
|
+
|
|
|
+ // 先修改状态
|
|
|
+ SceneEvaluationStatusMapper sceneEvaluationStatusMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SceneEvaluationStatusMapper.class);
|
|
|
+ SceneEvaluationStatusPO sceneEvaluationStatusPO = new SceneEvaluationStatusPO();
|
|
|
+ sceneEvaluationStatusPO.setId(sceneEvaluationComputeParam.getEvaluationId());
|
|
|
+ sceneEvaluationStatusPO.setStartEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(null);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_1);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+
|
|
|
+ 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);
|
|
|
+ if ((DictConstants.COVERAGE.equals(sceneEvaluationComputeParam.getComputeType()))
|
|
|
+ && (null == numsKeysSceneResult || StringUtil.isEmpty(numsKeysSceneResult.getComputerResult()))) {
|
|
|
+ log.error("runnable run scene COVERAGE return, numsSceneKeysResultJson is null");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取场景评价规则
|
|
|
+ SceneEvaluationRulePO sceneEvaluationRulePO = sceneEvaluationRuleMapper.querySceneEvaluationPyById(ruleId);
|
|
|
+ if (sceneEvaluationRulePO == null) {
|
|
|
+ log.error(ruleId + " 的场景评价规则已删除");
|
|
|
sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("下载场景评价脚本失败");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价规则已删除");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
return;
|
|
|
}
|
|
|
- }
|
|
|
- String scenePathFather = evaluationDirectoryOfUser + "compScene/";
|
|
|
- String riskPathFather = evaluationDirectoryOfUser + "riskScene/";
|
|
|
- for (SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam : sceneEvaluationComputeParam.getSceneEvaluationComputeSubParam()) {
|
|
|
- if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
- // 创建场景路径
|
|
|
- if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getSceneXODRPath())
|
|
|
- || StringUtil.isEmpty(sceneEvaluationComputeSubParam.getSceneXOSCPath())) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- String scenePath = scenePathFather + sceneEvaluationComputeSubParam.getSceneId();
|
|
|
- if (!new File(scenePath).exists()) {
|
|
|
- log.info("创建复杂度文件夹:" + scenePath);
|
|
|
- FileUtil.createDirectory(scenePath);
|
|
|
- }
|
|
|
- try {
|
|
|
- // 计算复杂度,根据场景 id 获取场景信息,下载 osc odr
|
|
|
- String scenarioOsc = sceneEvaluationComputeSubParam.getSceneXOSCPath();
|
|
|
- String[] splitXosc = scenarioOsc.split("/");
|
|
|
- String xoscName = splitXosc[splitXosc.length - 1];
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getSceneXOSCPath(), scenePath + "/" + xoscName);
|
|
|
+ log.info("场景评价规则为:" + sceneEvaluationRulePO);
|
|
|
+ // 1 判断有没有用户目录,没有则复制
|
|
|
+ log.info("项目 id :" + sceneEvaluationComputeParam.getTaskId() + " 的临时路径为:" + tempPath);
|
|
|
+ String evaluationDirectoryOfUser = linuxTempPath + "scene/evaluation/" + tempPath + "/";
|
|
|
+ String scriptsPath = evaluationDirectoryOfUser + "scripts";
|
|
|
+ if (!new File(evaluationDirectoryOfUser).exists()) {
|
|
|
+ // 1 将场景评价规则脚本保存到 script 目录
|
|
|
+ FileUtil.createDirectory(scriptsPath);
|
|
|
+ }
|
|
|
|
|
|
- String scenarioOdr = sceneEvaluationComputeSubParam.getSceneXODRPath();
|
|
|
- String[] splitXodr = scenarioOdr.split("/");
|
|
|
- String xodrName = splitXodr[splitXodr.length - 1];
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getSceneXODRPath(), scenePath + "/" + xodrName);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("文件下载失败", e);
|
|
|
- FileUtil.deleteFolder(scenePathFather); // 删除临时文件
|
|
|
- }
|
|
|
- } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.RISK)) {
|
|
|
- if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getEvaluationPath())) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- // 创建场景路径
|
|
|
- String scenePath = riskPathFather + sceneEvaluationComputeSubParam.getSceneId();
|
|
|
- if (!new File(scenePath).exists()) {
|
|
|
- log.info("创建危险度文件夹:" + scenePath);
|
|
|
- FileUtil.createDirectory(scenePath);
|
|
|
- }
|
|
|
- try {
|
|
|
- // 计算危险度 从 minio path 下载 csv (ego 和 sensors)
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getEvaluationPath() + "/Ego.csv", scenePath + "/Ego.csv");
|
|
|
- MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getEvaluationPath() + "/evaluation.csv", scenePath + "/evaluation.csv");
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("文件下载失败", e);
|
|
|
- FileUtil.deleteFolder(riskPathFather); // 删除临时文件
|
|
|
- }
|
|
|
- } else {
|
|
|
+ // 下载场景评价脚本到脚本目录
|
|
|
+ if (sceneEvaluationRulePO.getScriptPath() == null) {
|
|
|
sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("场景评价脚本不存在");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
return;
|
|
|
}
|
|
|
- }
|
|
|
- String sceneEvaluationCommand;
|
|
|
- if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
- sceneEvaluationCommand = pyMainPath + " " + scenePathFather + " complexity";
|
|
|
- } else {
|
|
|
- sceneEvaluationCommand = pyMainPath + " " + riskPathFather + " criticality";
|
|
|
- }
|
|
|
- String sceneEvaluationResult;
|
|
|
- log.info("开始执行场景评价命令:" + sceneEvaluationCommand);
|
|
|
- Runtime r = Runtime.getRuntime();
|
|
|
- Process p;
|
|
|
- try {
|
|
|
- p = r.exec(sceneEvaluationCommand);
|
|
|
- } catch (IOException e) {
|
|
|
- log.error("执行场景评价脚本失败,脚本命令为: " + sceneEvaluationCommand, e);
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("执行场景评价命令失败");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- try {
|
|
|
- BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
|
|
- String inline;
|
|
|
- while ((inline = br.readLine()) != null) {
|
|
|
- sb.append(inline).append("\n");
|
|
|
+ String pyMainPath = scriptsPath + "/" + sceneEvaluationRulePO.getRuleId();
|
|
|
+ if (!new File(pyMainPath).exists()) {
|
|
|
+ try {
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationRulePO.getScriptPath(), pyMainPath);
|
|
|
+ Path path = Paths.get(pyMainPath);
|
|
|
+ Set<PosixFilePermission> permissions = new HashSet<>();
|
|
|
+ permissions.add(PosixFilePermission.OWNER_READ);
|
|
|
+ permissions.add(PosixFilePermission.OWNER_WRITE);
|
|
|
+ permissions.add(PosixFilePermission.OWNER_EXECUTE);
|
|
|
+ permissions.add(PosixFilePermission.GROUP_READ);
|
|
|
+ permissions.add(PosixFilePermission.GROUP_WRITE);
|
|
|
+ permissions.add(PosixFilePermission.GROUP_EXECUTE);
|
|
|
+ permissions.add(PosixFilePermission.OTHERS_READ);
|
|
|
+ permissions.add(PosixFilePermission.OTHERS_WRITE);
|
|
|
+ permissions.add(PosixFilePermission.OTHERS_EXECUTE);
|
|
|
+ Files.setPosixFilePermissions(path, permissions);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("下载执行文件失败: " + sceneEvaluationRulePO.getScriptPath(), e);
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("下载场景评价脚本失败");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
- br.close();
|
|
|
- } catch (IOException e) {
|
|
|
- log.error("获取场景评价脚本返回内容失败", e);
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("获取场景评价结果失败");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
- return;
|
|
|
- }
|
|
|
- sceneEvaluationResult = sb.toString();
|
|
|
- log.info("场景评价结束,结果为:" + sceneEvaluationResult);
|
|
|
- DecimalFormat df = new DecimalFormat("#.###");
|
|
|
- for (SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam : sceneEvaluationComputeParam.getSceneEvaluationComputeSubParam()) {
|
|
|
- // 读文件
|
|
|
- StringBuilder result = new StringBuilder();
|
|
|
- try {
|
|
|
- String readPath;
|
|
|
+ String scenePathFather = evaluationDirectoryOfUser + "compScene/";
|
|
|
+ String riskPathFather = evaluationDirectoryOfUser + "riskScene/";
|
|
|
+ String sceneComputerPathFather = evaluationDirectoryOfUser + "sceneComputer/" + sceneEvaluationComputeParam.getTaskId();
|
|
|
+
|
|
|
+ List<String> sceneIdList = new ArrayList<>();
|
|
|
+ for (SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam : sceneEvaluationComputeParam.getSceneEvaluationComputeSubParam()) {
|
|
|
+ sceneIdList.add(sceneEvaluationComputeSubParam.getSceneId());
|
|
|
if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
- readPath = scenePathFather;
|
|
|
+ // 创建场景路径
|
|
|
+ if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getSceneXODRPath())
|
|
|
+ || StringUtil.isEmpty(sceneEvaluationComputeSubParam.getSceneXOSCPath())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String scenePath = scenePathFather + sceneEvaluationComputeSubParam.getSceneId();
|
|
|
+ if (!new File(scenePath).exists()) {
|
|
|
+ log.info("创建复杂度文件夹:" + scenePath);
|
|
|
+ FileUtil.createDirectory(scenePath);
|
|
|
+ }
|
|
|
+ ThreadPool.sceneDownloadPool.execute(() -> {
|
|
|
+ try {
|
|
|
+ // 计算复杂度,根据场景 id 获取场景信息,下载 osc odr
|
|
|
+ String scenarioOsc = sceneEvaluationComputeSubParam.getSceneXOSCPath();
|
|
|
+ String[] splitXosc = scenarioOsc.split("/");
|
|
|
+ String xoscName = splitXosc[splitXosc.length - 1];
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getSceneXOSCPath(), scenePath + "/" + xoscName);
|
|
|
+
|
|
|
+ String scenarioOdr = sceneEvaluationComputeSubParam.getSceneXODRPath();
|
|
|
+ String[] splitXodr = scenarioOdr.split("/");
|
|
|
+ String xodrName = splitXodr[splitXodr.length - 1];
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getSceneXODRPath(), scenePath + "/" + xodrName);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("文件下载失败", e);
|
|
|
+ FileUtil.deleteFolder(scenePathFather); // 删除临时文件
|
|
|
+ }
|
|
|
+ });
|
|
|
} else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.RISK)) {
|
|
|
- readPath = riskPathFather;
|
|
|
+ if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getEvaluationPath())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 创建场景路径
|
|
|
+ String scenePath = riskPathFather + sceneEvaluationComputeSubParam.getSceneId();
|
|
|
+ if (!new File(scenePath).exists()) {
|
|
|
+ log.info("创建危险度文件夹:" + scenePath);
|
|
|
+ FileUtil.createDirectory(scenePath);
|
|
|
+ }
|
|
|
+ ThreadPool.sceneDownloadPool.execute(() -> {
|
|
|
+ try {
|
|
|
+ // 计算危险度 从 minio path 下载 csv (ego 和 sensors)
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getEvaluationPath() + "/Ego.csv", scenePath + "/Ego.csv");
|
|
|
+ MinioUtil.downloadToFile(minioClient, bucketName, sceneEvaluationComputeSubParam.getEvaluationPath() + "/evaluation.csv", scenePath + "/evaluation.csv");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("文件下载失败", e);
|
|
|
+ FileUtil.deleteFolder(riskPathFather); // 删除临时文件
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.EXPOSURE_RATE)
|
|
|
+ || StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE)
|
|
|
+ || StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
|
|
|
+ if (StringUtil.isEmpty(sceneEvaluationComputeSubParam.getSceneXOSCPath())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 创建场景路径
|
|
|
+ if (!new File(sceneComputerPathFather).exists()) {
|
|
|
+ log.info("创建基准场景文件夹:{}", sceneComputerPathFather);
|
|
|
+ FileUtil.createDirectory(sceneComputerPathFather);
|
|
|
+ }
|
|
|
+ // 下载目录文件
|
|
|
+ String dirPrefix = subDownDirPrefix(sceneEvaluationComputeSubParam, sceneEvaluationComputeParam);
|
|
|
+ if (org.apache.commons.lang3.StringUtils.isEmpty(dirPrefix)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 已经下载过了
|
|
|
+ if (paramFilesStrSet.contains(dirPrefix)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ paramFilesStrSet.add(dirPrefix);
|
|
|
+ // 开线程去下载
|
|
|
+ ThreadPool.sceneDownloadPool.execute(() -> {
|
|
|
+ try {
|
|
|
+ MinioUtil.downloadDirFiles(minioClient, bucketName, dirPrefix, sceneComputerPathFather);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("文件目录下载失败,{}", dirPrefix);
|
|
|
+ }
|
|
|
+ });
|
|
|
} else {
|
|
|
sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
return;
|
|
|
}
|
|
|
- FileInputStream fileInputStream = new FileInputStream(readPath + sceneEvaluationComputeSubParam.getSceneId() + "/scenario_evaluation.json");
|
|
|
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
|
|
|
-
|
|
|
- String line;
|
|
|
- while ((line = bufferedReader.readLine()) != null) {
|
|
|
- result.append(line).append("\n");
|
|
|
+ }
|
|
|
+ String sceneEvaluationCommand;
|
|
|
+ if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
+ sceneEvaluationCommand = pyMainPath + " " + scenePathFather + " complexity";
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.RISK)) {
|
|
|
+ sceneEvaluationCommand = pyMainPath + " " + riskPathFather + " criticality";
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE)) {
|
|
|
+ // 统一结果路径
|
|
|
+ String resultJsonPath = sceneComputerPathFather + "/coverage_evaluation.json";
|
|
|
+ /*
|
|
|
+ 覆盖率工具coverage_rate_main:
|
|
|
+ 输入:可执行文件+关键场景个数”结果存储路径+被测场景文件路径+“覆盖率”结果存储路径
|
|
|
+ */
|
|
|
+ String sceneNumsJsonPath = sceneComputerPathFather + "/coverage_prefix_result_evaluation.json";
|
|
|
+ // 保存覆盖率前置结果到dir中
|
|
|
+ if (numsKeysSceneResult == null || StringUtils.isEmpty(numsKeysSceneResult.getComputerResult())) {
|
|
|
+ return;
|
|
|
}
|
|
|
- bufferedReader.close();
|
|
|
+ try (FileWriter writer = new FileWriter(sceneNumsJsonPath)) {
|
|
|
+ writer.write(numsKeysSceneResult.getComputerResult()); // 写入内容
|
|
|
+ log.info("内容已成功写入文件!");
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("写入文件时出错: {}", e.getMessage());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ sceneEvaluationCommand = pyMainPath + " " + sceneNumsJsonPath + " " + sceneComputerPathFather + " " + resultJsonPath;
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
|
|
|
+ /*
|
|
|
+ * 覆盖率前置工具 num_key_scenes_main:
|
|
|
+ * 输入:可执行文件+基准场景文件路径+“关键场景个数”结果存储路径
|
|
|
+ */
|
|
|
+ // 统一结果路径
|
|
|
+ String resultJsonPath = sceneComputerPathFather + "/coverage_prefix_result_evaluation.json";
|
|
|
+ sceneEvaluationCommand = pyMainPath + " " + sceneComputerPathFather + " " + resultJsonPath;
|
|
|
+ } else {
|
|
|
+
|
|
|
+ /*
|
|
|
+ 暴露率工具exposure_rate_main:
|
|
|
+ 输入:可执行文件+被测场景文件路径+“暴露率”结果存储路径
|
|
|
+ */
|
|
|
+ String resultJsonPath = sceneComputerPathFather + "/exposure_evaluation.json";
|
|
|
+ sceneEvaluationCommand = pyMainPath + " " + sceneComputerPathFather + " " + resultJsonPath;
|
|
|
+ }
|
|
|
+ String sceneEvaluationResult;
|
|
|
+ log.info("开始执行场景评价命令:" + sceneEvaluationCommand);
|
|
|
+ Runtime r = Runtime.getRuntime();
|
|
|
+ Process p;
|
|
|
+ try {
|
|
|
+ p = r.exec(sceneEvaluationCommand);
|
|
|
} catch (IOException e) {
|
|
|
- log.error("读取场景评价结果失败", e);
|
|
|
- continue;
|
|
|
+ log.error("执行场景评价脚本失败,脚本命令为: " + sceneEvaluationCommand, e);
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("执行场景评价命令失败");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ return;
|
|
|
}
|
|
|
- String resultStr = result.toString();
|
|
|
- String replace = StringUtil.replace(resultStr, "'", "\"");
|
|
|
- JsonNode rootNode;
|
|
|
+
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
try {
|
|
|
- ObjectMapper mapper = new ObjectMapper();
|
|
|
- //JSON ----> JsonNode
|
|
|
- rootNode = mapper.readTree(replace);
|
|
|
+ BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
|
|
+ String inline;
|
|
|
+ while ((inline = br.readLine()) != null) {
|
|
|
+ sb.append(inline).append("\n");
|
|
|
+ }
|
|
|
+ br.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("获取场景评价脚本返回内容失败", e);
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("获取场景评价结果失败");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ sceneEvaluationResult = sb.toString();
|
|
|
+ log.info("场景评价结束,结果为:" + sceneEvaluationResult);
|
|
|
+ if (DictConstants.RISK.equals(sceneEvaluationComputeParam.getComputeType())
|
|
|
+ || DictConstants.COMPLEXITY.equals(sceneEvaluationComputeParam.getComputeType())) { // 这两个是单独场景跑分
|
|
|
+ DecimalFormat df = new DecimalFormat("#.###");
|
|
|
+ for (SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam : sceneEvaluationComputeParam.getSceneEvaluationComputeSubParam()) {
|
|
|
+ // 读文件
|
|
|
+ StringBuilder result = new StringBuilder();
|
|
|
+ try {
|
|
|
+ String readPath;
|
|
|
+ if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
+ readPath = scenePathFather;
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.RISK)) {
|
|
|
+ readPath = riskPathFather;
|
|
|
+ } else {
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ FileInputStream fileInputStream = new FileInputStream(readPath + sceneEvaluationComputeSubParam.getSceneId() + "/scenario_evaluation.json");
|
|
|
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
|
|
|
|
|
|
- if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
- String complexity = rootNode.path("复杂度").asText();
|
|
|
- String complexityLevel = rootNode.path("复杂度等级").asText();
|
|
|
- SceneComplexityPO sceneComplexityPO = new SceneComplexityPO();
|
|
|
- double complexityD = Double.parseDouble(complexity);
|
|
|
- String formattedNumber = df.format(complexityD);
|
|
|
- sceneComplexityPO.setComplexity(formattedNumber);
|
|
|
- sceneComplexityPO.setSceneId(sceneEvaluationComputeSubParam.getSceneId());
|
|
|
- sceneComplexityPO.setComplexityId(StringUtil.getRandomUUID());
|
|
|
- sceneComplexityPO.setSceneType(sceneEvaluationComputeSubParam.getSceneType());
|
|
|
- sceneComplexityPO.setRuleId(ruleId);
|
|
|
- sceneComplexityPO.setTaskId(sceneEvaluationComputeParam.getTaskId());
|
|
|
- sceneComplexityPO.setComplexityLevel(complexityLevel);
|
|
|
- sceneComplexityPO.setIsDeleted(DictConstants.IS_NOT_DELETED);
|
|
|
- sceneComplexityPO.setCreateUserId(sceneEvaluationComputeParam.getCreateUserId());
|
|
|
- sceneComplexityPO.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
- sceneComplexityMapper.saveSceneComplexity(sceneComplexityPO);
|
|
|
- if (CollectionUtil.isNotEmpty(sceneEvaluationComputeSubParam.getCopySceneId())) {
|
|
|
- copySceneComplexityResult(sceneComplexityPO.getTaskId(), sceneEvaluationComputeSubParam.getSceneId(), sceneEvaluationComputeSubParam.getCopySceneId());
|
|
|
+ String line;
|
|
|
+ while ((line = bufferedReader.readLine()) != null) {
|
|
|
+ result.append(line).append("\n");
|
|
|
+ }
|
|
|
+ bufferedReader.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("读取场景评价结果失败", e);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String resultStr = result.toString();
|
|
|
+ String replace = StringUtil.replace(resultStr, "'", "\"");
|
|
|
+ JsonNode rootNode;
|
|
|
+ try {
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ //JSON ----> JsonNode
|
|
|
+ rootNode = mapper.readTree(replace);
|
|
|
+
|
|
|
+ if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COMPLEXITY)) {
|
|
|
+ String complexity = rootNode.path("复杂度").asText();
|
|
|
+ String complexityLevel = rootNode.path("复杂度等级").asText();
|
|
|
+ SceneComplexityPO sceneComplexityPO = new SceneComplexityPO();
|
|
|
+ double complexityD = Double.parseDouble(complexity);
|
|
|
+ String formattedNumber = df.format(complexityD);
|
|
|
+ sceneComplexityPO.setComplexity(formattedNumber);
|
|
|
+ sceneComplexityPO.setSceneId(sceneEvaluationComputeSubParam.getSceneId());
|
|
|
+ sceneComplexityPO.setComplexityId(StringUtil.getRandomUUID());
|
|
|
+ sceneComplexityPO.setSceneType(sceneEvaluationComputeSubParam.getSceneType());
|
|
|
+ sceneComplexityPO.setRuleId(ruleId);
|
|
|
+ sceneComplexityPO.setTaskId(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ sceneComplexityPO.setComplexityLevel(complexityLevel);
|
|
|
+ sceneComplexityPO.setIsDeleted(DictConstants.IS_NOT_DELETED);
|
|
|
+ sceneComplexityPO.setCreateUserId(sceneEvaluationComputeParam.getCreateUserId());
|
|
|
+ sceneComplexityPO.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneComplexityMapper.saveSceneComplexity(sceneComplexityPO);
|
|
|
+ if (CollectionUtil.isNotEmpty(sceneEvaluationComputeSubParam.getCopySceneId())) {
|
|
|
+ copySceneComplexityResult(sceneComplexityPO.getTaskId(), sceneEvaluationComputeSubParam.getSceneId(), sceneEvaluationComputeSubParam.getCopySceneId());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String risk = rootNode.path("危险度").asText();
|
|
|
+ String riskLevel = rootNode.path("危险度等级").asText();
|
|
|
+ SceneRiskPO sceneRiskPO = new SceneRiskPO();
|
|
|
+ double riskD = Double.parseDouble(risk);
|
|
|
+ String formattedNumber = df.format(riskD);
|
|
|
+ sceneRiskPO.setRisk(formattedNumber);
|
|
|
+ sceneRiskPO.setSceneId(sceneEvaluationComputeSubParam.getSceneId());
|
|
|
+ sceneRiskPO.setRiskId(StringUtil.getRandomUUID());
|
|
|
+ sceneRiskPO.setSceneType(sceneEvaluationComputeSubParam.getSceneType());
|
|
|
+ sceneRiskPO.setRuleId(ruleId);
|
|
|
+ sceneRiskPO.setTaskId(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ sceneRiskPO.setRiskLevel(riskLevel);
|
|
|
+ sceneRiskPO.setIsDeleted(DictConstants.IS_NOT_DELETED);
|
|
|
+ sceneRiskPO.setCreateUserId(sceneEvaluationComputeParam.getCreateUserId());
|
|
|
+ sceneRiskPO.setAlgorithmId(sceneEvaluationComputeParam.getAlgorithmId());
|
|
|
+ sceneRiskPO.setVehicleId(sceneEvaluationComputeParam.getVehicleId());
|
|
|
+ sceneRiskPO.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneRiskMapper.saveSceneRisk(sceneRiskPO);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("场景" + sceneEvaluationComputeSubParam.getSceneId() + " 的场景评价失败:", e);
|
|
|
}
|
|
|
- } else {
|
|
|
- String risk = rootNode.path("危险度").asText();
|
|
|
- String riskLevel = rootNode.path("危险度等级").asText();
|
|
|
- SceneRiskPO sceneRiskPO = new SceneRiskPO();
|
|
|
- double riskD = Double.parseDouble(risk);
|
|
|
- String formattedNumber = df.format(riskD);
|
|
|
- sceneRiskPO.setRisk(formattedNumber);
|
|
|
- sceneRiskPO.setSceneId(sceneEvaluationComputeSubParam.getSceneId());
|
|
|
- sceneRiskPO.setRiskId(StringUtil.getRandomUUID());
|
|
|
- sceneRiskPO.setSceneType(sceneEvaluationComputeSubParam.getSceneType());
|
|
|
- sceneRiskPO.setRuleId(ruleId);
|
|
|
- sceneRiskPO.setTaskId(sceneEvaluationComputeParam.getTaskId());
|
|
|
- sceneRiskPO.setRiskLevel(riskLevel);
|
|
|
- sceneRiskPO.setIsDeleted(DictConstants.IS_NOT_DELETED);
|
|
|
- sceneRiskPO.setCreateUserId(sceneEvaluationComputeParam.getCreateUserId());
|
|
|
- sceneRiskPO.setAlgorithmId(sceneEvaluationComputeParam.getAlgorithmId());
|
|
|
- sceneRiskPO.setVehicleId(sceneEvaluationComputeParam.getVehicleId());
|
|
|
- sceneRiskPO.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
- sceneRiskMapper.saveSceneRisk(sceneRiskPO);
|
|
|
}
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("场景" + sceneEvaluationComputeSubParam.getSceneId() + " 的场景评价失败:", e);
|
|
|
}
|
|
|
- }
|
|
|
- sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
- sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_2);
|
|
|
- sceneEvaluationStatusPO.setEvaluationErrorMsg("");
|
|
|
- updateStatus(sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+
|
|
|
+ if (DictConstants.EXPOSURE_RATE.equals(sceneEvaluationComputeParam.getComputeType())
|
|
|
+ || DictConstants.COVERAGE.equals(sceneEvaluationComputeParam.getComputeType())
|
|
|
+ || DictConstants.COVERAGE_PREFIX.equals(sceneEvaluationComputeParam.getComputeType())) { // 这3个是跑所有场景
|
|
|
+ // 读文件
|
|
|
+ StringBuilder result = new StringBuilder();
|
|
|
+ try {
|
|
|
+ String readPath = sceneComputerPathFather;
|
|
|
+ if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.EXPOSURE_RATE)) {
|
|
|
+ readPath = readPath + "/exposure_evaluation.json";
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE)) {
|
|
|
+ readPath = readPath + "/coverage_evaluation.json";
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
|
|
|
+ readPath = readPath + "/coverage_prefix_result_evaluation.json";
|
|
|
+ } else {
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_3);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("获取评价类型错误");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ FileInputStream fileInputStream = new FileInputStream(readPath);
|
|
|
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
|
|
|
+
|
|
|
+ String line;
|
|
|
+ while ((line = bufferedReader.readLine()) != null) {
|
|
|
+ result.append(line).append("\n");
|
|
|
+ }
|
|
|
+ bufferedReader.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("读取场景评价结果失败", e);
|
|
|
+ }
|
|
|
+ String resultStr = result.toString();
|
|
|
+ String replace = StringUtil.replace(resultStr, "'", "\"");
|
|
|
+ try {
|
|
|
+ // 如果是覆盖率前置条件,需要修改覆盖率前置条件
|
|
|
+ if (numsKeysSceneResult != null && DictConstants.COVERAGE_PREFIX.equals(sceneEvaluationComputeParam.getComputeType())) {
|
|
|
+ sceneComputerRateMapper.updateResultByIdAndType(numsKeysSceneResult.getComputerRateId(), numsKeysSceneResult.getComputerType(), replace);
|
|
|
+ }else {
|
|
|
+ // 保存结果
|
|
|
+ SceneComputerRateDTO sceneComputerRatePO = getSceneComputerRatePO(sceneEvaluationComputeParam, replace, ruleId, sceneIdList);
|
|
|
+ sceneComputerRateMapper.saveSceneComputerRate(sceneComputerRatePO);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("任务" + sceneEvaluationComputeParam.getTaskId() + " 的场景评价失败:", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ sceneEvaluationStatusPO.setEndEvaluationTime(TimeUtil.getNowForMysql());
|
|
|
+ sceneEvaluationStatusPO.setEvaluationStatus(DictConstants.SCENE_EVALUATION_STATUS_2);
|
|
|
+ sceneEvaluationStatusPO.setEvaluationErrorMsg("");
|
|
|
+ updateStatus(sceneEvaluationComputeParam, sceneEvaluationStatusMapper, sceneEvaluationStatusPO);
|
|
|
+ }
|
|
|
+ });
|
|
|
// 删除临时文件
|
|
|
- FileUtil.deleteFolder(sceneEvaluationComputeParam.getLinuxTempPath() + "scene/evaluation/" + tempPath); // 删除临时文件
|
|
|
+ FileUtil.deleteFolder(linuxTempPath + "scene/evaluation/" + tempPath); // 删除临时文件
|
|
|
+
|
|
|
+ log.info("SceneEvaluationComputeRunnable handel end. cost {} ms", System.currentTimeMillis() - start);
|
|
|
}
|
|
|
|
|
|
- private void updateStatus(SceneEvaluationStatusMapper sceneEvaluationStatusMapper, SceneEvaluationStatusPO sceneEvaluationStatusPO) {
|
|
|
+ private String subDownDirPrefix(SceneEvaluationComputeSubParam sceneEvaluationComputeSubParam,
|
|
|
+ SceneEvaluationComputeParam sceneEvaluationComputeParam) {
|
|
|
+ String sceneXOSCPath = sceneEvaluationComputeSubParam.getSceneXOSCPath();
|
|
|
+ // 覆盖率和暴露率需要下载这个目录
|
|
|
+ String basePath = "/Scenarios/";
|
|
|
+ int indexOfBasePath = sceneXOSCPath.lastIndexOf(basePath);
|
|
|
+ if (indexOfBasePath < 0) {
|
|
|
+ log.info("task={}, sceneId={}, can not find basePath={}, sceneXOSCPath={}", sceneEvaluationComputeParam.getTaskId(),
|
|
|
+ sceneEvaluationComputeSubParam.getSceneId(), basePath, sceneXOSCPath);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return sceneXOSCPath.substring(0, indexOfBasePath) + basePath;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static SceneComputerRateDTO getSceneComputerRatePO(SceneEvaluationComputeParam sceneEvaluationComputeParam,
|
|
|
+ String replace,
|
|
|
+ String ruleId,
|
|
|
+ List<String> sceneIdList) {
|
|
|
+ SceneComputerRateDTO sceneComputerRatePO = new SceneComputerRateDTO();
|
|
|
+ sceneComputerRatePO.setComputerRateId(StringUtil.getRandomUUID());
|
|
|
+ sceneComputerRatePO.setComputerResult(replace);
|
|
|
+ sceneComputerRatePO.setComputerType(sceneEvaluationComputeParam.getComputeType());
|
|
|
+ sceneComputerRatePO.setRuleId(ruleId);
|
|
|
+ sceneComputerRatePO.setTaskId(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ sceneComputerRatePO.setSceneIdList(JSONObject.toJSONString(sceneIdList));
|
|
|
+ sceneComputerRatePO.setIsDeleted(DictConstants.IS_NOT_DELETED);
|
|
|
+ sceneComputerRatePO.setCreateUserId(sceneEvaluationComputeParam.getCreateUserId());
|
|
|
+ sceneComputerRatePO.setAlgorithmId(sceneEvaluationComputeParam.getAlgorithmId());
|
|
|
+ sceneComputerRatePO.setVehicleId(sceneEvaluationComputeParam.getVehicleId());
|
|
|
+ sceneComputerRatePO.setCreateTime(TimeUtil.getNowForMysql());
|
|
|
+ return sceneComputerRatePO;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateStatus(SceneEvaluationComputeParam sceneEvaluationComputeParam, SceneEvaluationStatusMapper sceneEvaluationStatusMapper, SceneEvaluationStatusPO sceneEvaluationStatusPO) {
|
|
|
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())) {
|
|
@@ -336,6 +527,39 @@ public class SceneEvaluationComputeRunnable implements Runnable {
|
|
|
evaluationJsonObj.put("riskEndEvaluationTime", sceneEvaluationStatusPO.getEndEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getEndEvaluationTime()));
|
|
|
sceneEvaluationStatusMapper.updateManualProjectEvaluationStatus(sceneEvaluationStatusPO.getId(), evaluationJsonObj.toString());
|
|
|
}
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE)) {
|
|
|
+ SimulationManualProjectMapper simulationManualProjectMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SimulationManualProjectMapper.class);
|
|
|
+ ProjectEntity projectEntity = simulationManualProjectMapper.selectById(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ if (StringUtil.isNotEmpty(projectEntity.getEvaluationJsonMsg())) {
|
|
|
+ JSONObject evaluationJsonObj = JSONObject.parseObject(projectEntity.getEvaluationJsonMsg());
|
|
|
+ evaluationJsonObj.put("coverageEvaluationStatus", sceneEvaluationStatusPO.getEvaluationStatus());
|
|
|
+ evaluationJsonObj.put("coverageEvaluationErrorMsg", sceneEvaluationStatusPO.getEvaluationErrorMsg());
|
|
|
+ evaluationJsonObj.put("coverageStartEvaluationTime", sceneEvaluationStatusPO.getStartEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getStartEvaluationTime()));
|
|
|
+ evaluationJsonObj.put("coverageEndEvaluationTime", sceneEvaluationStatusPO.getEndEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getEndEvaluationTime()));
|
|
|
+ sceneEvaluationStatusMapper.updateManualProjectEvaluationStatus(sceneEvaluationStatusPO.getId(), evaluationJsonObj.toString());
|
|
|
+ }
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.EXPOSURE_RATE)) {
|
|
|
+ SimulationManualProjectMapper simulationManualProjectMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SimulationManualProjectMapper.class);
|
|
|
+ ProjectEntity projectEntity = simulationManualProjectMapper.selectById(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ if (StringUtil.isNotEmpty(projectEntity.getEvaluationJsonMsg())) {
|
|
|
+ JSONObject evaluationJsonObj = JSONObject.parseObject(projectEntity.getEvaluationJsonMsg());
|
|
|
+ evaluationJsonObj.put("exposureEvaluationStatus", sceneEvaluationStatusPO.getEvaluationStatus());
|
|
|
+ evaluationJsonObj.put("exposureEvaluationErrorMsg", sceneEvaluationStatusPO.getEvaluationErrorMsg());
|
|
|
+ evaluationJsonObj.put("exposureStartEvaluationTime", sceneEvaluationStatusPO.getStartEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getStartEvaluationTime()));
|
|
|
+ evaluationJsonObj.put("exposureEndEvaluationTime", sceneEvaluationStatusPO.getEndEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getEndEvaluationTime()));
|
|
|
+ sceneEvaluationStatusMapper.updateManualProjectEvaluationStatus(sceneEvaluationStatusPO.getId(), evaluationJsonObj.toString());
|
|
|
+ }
|
|
|
+ } else if (StringUtils.equals(sceneEvaluationComputeParam.getComputeType(), DictConstants.COVERAGE_PREFIX)) {
|
|
|
+ SimulationManualProjectMapper simulationManualProjectMapper = ApplicationContextAwareImpl.getApplicationContext().getBean(SimulationManualProjectMapper.class);
|
|
|
+ ProjectEntity projectEntity = simulationManualProjectMapper.selectById(sceneEvaluationComputeParam.getTaskId());
|
|
|
+ if (StringUtil.isNotEmpty(projectEntity.getEvaluationJsonMsg())) {
|
|
|
+ JSONObject evaluationJsonObj = JSONObject.parseObject(projectEntity.getEvaluationJsonMsg());
|
|
|
+ evaluationJsonObj.put("coveragePreEvaluationStatus", sceneEvaluationStatusPO.getEvaluationStatus());
|
|
|
+ evaluationJsonObj.put("coveragePreEvaluationErrorMsg", sceneEvaluationStatusPO.getEvaluationErrorMsg());
|
|
|
+ evaluationJsonObj.put("coveragePreStartEvaluationTime", sceneEvaluationStatusPO.getStartEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getStartEvaluationTime()));
|
|
|
+ evaluationJsonObj.put("coveragePreEndEvaluationTime", sceneEvaluationStatusPO.getEndEvaluationTime() == null ? null : sdf.format(sceneEvaluationStatusPO.getEndEvaluationTime()));
|
|
|
+ sceneEvaluationStatusMapper.updateManualProjectEvaluationStatus(sceneEvaluationStatusPO.getId(), evaluationJsonObj.toString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}
|