root 2 лет назад
Родитель
Сommit
e402b6dc6c

+ 10 - 0
api-common/src/main/java/api/common/pojo/constants/DictConstants.java

@@ -123,4 +123,14 @@ public class DictConstants {
     // 集群id
     public static final String SYSTEM_CLUSTER_ID = "system"; // 超管使用此集群id执行项目
 
+    // 评测等级
+    public static final String EVALUATION_LEVEL_G = "G"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_G_DESCRIPTION = "优秀(G)"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_A = "A"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_A_DESCRIPTION = "良好(A)"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_M = "M"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_M_DESCRIPTION = "一般(M)"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_P = "P"; // 超管使用此集群id执行项目
+    public static final String EVALUATION_LEVEL_P_DESCRIPTION = "较差(P)"; // 超管使用此集群id执行项目
+
 }

+ 25 - 0
api-common/src/main/java/api/common/util/PythonUtil.java

@@ -0,0 +1,25 @@
+package api.common.util;
+
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.UUID;
+
+@Slf4j
+public class PythonUtil {
+
+    /**
+     * @param pythonCode python 代码
+     */
+    @SneakyThrows
+    public static String pylint(String pythonCode) {
+        //1 把代码保存成本地文件
+        String filePath = "/tmp/" + UUID.randomUUID().toString().replace("-", "") + ".py";
+        FileUtil.writeStringToLocalFile(pythonCode, filePath);
+        //2 执行命令检查格式
+        LinuxUtil.execute("apt install python-pip");
+        LinuxUtil.execute("pip3 install pylint");
+        return LinuxUtil.execute("pylint " + filePath);
+    }
+}

+ 24 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/configuration/kafka/KafkaAdminConfiguration.java

@@ -0,0 +1,24 @@
+package com.css.simulation.resource.scheduler.configuration.kafka;
+
+import org.apache.kafka.clients.admin.Admin;
+import org.apache.kafka.clients.admin.KafkaAdminClient;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+@Configuration
+public class KafkaAdminConfiguration {
+
+    @Value("${spring.kafka.bootstrap-servers}")
+    private String bootstrapServers;    // 服务器
+
+    @Bean("myKafkaAdmin")
+    public Admin admin() {
+        Properties properties = new Properties();
+        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+        return KafkaAdminClient.create(properties);
+    }
+}

+ 3 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/TaskManager.java

@@ -87,7 +87,6 @@ public class TaskManager {
     @Resource
     ProjectUtil projectUtil;
 
-
     @SneakyThrows
     @Transactional
     public boolean isProjectCompleted(PrefixTO redisPrefix, String projectId, String taskId, String state, String podName) {
@@ -143,7 +142,9 @@ public class TaskManager {
                     projectMessageDTO.setTaskCompleted(taskCompleted + 1);  // 增加已完成任务数
                     stringRedisTemplate.opsForValue().set(redisPrefix.getProjectRunningKey(), JsonUtil.beanToJson(projectMessageDTO));
                     if (taskTotal - taskCompleted <= currentParallelism) {
-                        projectUtil.addOneParallelismToNode(nodeName);  // 如果 taskTotal - taskCompleted 小于 currentParallelism ,则不启动下一个 pod 并归还一个并行度
+                        // 如果 taskTotal - taskCompleted 小于 currentParallelism ,则不启动下一个 pod,删除当前 pod 并归还一个并行度
+                        projectUtil.deletePod(podName);
+                        projectUtil.addOneParallelismToNode(nodeName);
                     } else {
                         createNextPod(projectId, nodeName, podName);  // 删除上一个 pod,并启动下一个 pod
                     }

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

@@ -9,10 +9,7 @@ import com.css.simulation.resource.scheduler.configuration.kubernetes.Kubernetes
 import com.css.simulation.resource.scheduler.mapper.*;
 import com.css.simulation.resource.scheduler.pojo.po.*;
 import com.css.simulation.resource.scheduler.pojo.to.*;
-import com.css.simulation.resource.scheduler.util.GitUtil;
-import com.css.simulation.resource.scheduler.util.MinioUtil;
-import com.css.simulation.resource.scheduler.util.ProjectUtil;
-import com.css.simulation.resource.scheduler.util.RedisUtil;
+import com.css.simulation.resource.scheduler.util.*;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.minio.MinioClient;
@@ -20,6 +17,7 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.kafka.clients.admin.Admin;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.kafka.core.KafkaTemplate;
@@ -72,6 +70,8 @@ public class ProjectService {
 
     @Resource
     StringRedisTemplate stringRedisTemplate;
+    @Resource(name = "myKafkaAdmin")
+    Admin kafkaAdminClient;
     @Resource
     KafkaTemplate<String, String> kafkaTemplate;
     @Resource
@@ -179,6 +179,7 @@ public class ProjectService {
     public void sendTaskMessage(int parallelism, String projectRunningPrefix, String userId, String projectId, String projectType, Long videoTime, Set<ScenePO> scenePOSet, VehiclePO vehiclePO, List<CameraPO> cameraPOList, List<OgtPO> ogtPOList) {
 
         final int[] messageNumber = CollectionUtil.createIntArray(0);
+        ApacheKafkaUtil.createTopic(kafkaAdminClient, projectId, parallelism, (short) 1);   // 创建主题
         log.info("ProjectService--sendTaskMessage 项目 " + projectId + " 获得的包括的场景信息为:" + scenePOSet);
         for (ScenePO scenePO : scenePOSet) {
             String sceneId = scenePO.getId();

+ 196 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/ApacheKafkaUtil.java

@@ -0,0 +1,196 @@
+package com.css.simulation.resource.scheduler.util;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.admin.Admin;
+import org.apache.kafka.clients.admin.NewTopic;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.clients.producer.RecordMetadata;
+
+import java.util.Collections;
+import java.util.concurrent.Future;
+
+@Slf4j
+public class ApacheKafkaUtil {
+
+    //* -------------------------------- Admin --------------------------------
+
+    /**
+     * 创建主题
+     *
+     * @param admin             管理员对象
+     * @param name              主题名
+     * @param numPartitions     分区数量
+     * @param replicationFactor 副本数量
+     */
+    public static void createTopic(Admin admin, String name, int numPartitions, short replicationFactor) {
+        NewTopic newTopic = new NewTopic(name, numPartitions, replicationFactor);
+        admin.createTopics(Collections.singleton(newTopic));
+        log.info("ApacheKafkaUtil--createTopic 创建主题 " + name + ",分区数为:" + numPartitions + ",副本数为:" + replicationFactor);
+    }
+
+
+    //* -------------------------------- Producer --------------------------------
+
+    /**
+     * 默认用异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void send(KafkaProducer<String, String> kafkaProducer, String topic, String value) {
+        sendAsync(kafkaProducer, topic, value);
+    }
+
+    /**
+     * 默认用异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void send(KafkaProducer<String, String> kafkaProducer, String topic, String key, String value) {
+        sendAsync(kafkaProducer, topic, key, value);
+    }
+
+    /**
+     * 默认用异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void send(KafkaProducer<String, String> kafkaProducer, String topic, int partition, String key, String value) {
+        sendAsync(kafkaProducer, topic, partition, key, value);
+    }
+
+    /**
+     * 异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void sendAsync(KafkaProducer<String, String> kafkaProducer, String topic, String value) {
+        Future<RecordMetadata> send = kafkaProducer.send(new ProducerRecord<>(topic, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        );
+    }
+
+    /**
+     * 异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void sendAsync(KafkaProducer<String, String> kafkaProducer, String topic, String key, String value) {
+        Future<RecordMetadata> send = kafkaProducer.send(new ProducerRecord<>(topic, key, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        );
+    }
+
+    /**
+     * 异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    public static void sendAsync(KafkaProducer<String, String> kafkaProducer, String topic, int partition, String key, String value) {
+        Future<RecordMetadata> send = kafkaProducer.send(new ProducerRecord<>(topic, partition, key, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        );
+    }
+
+
+    /**
+     * 同步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     * @return 元信息
+     */
+    @SneakyThrows
+    public static RecordMetadata sendSync(KafkaProducer<String, String> kafkaProducer, String topic, String value) {
+        return kafkaProducer.send(new ProducerRecord<>(topic, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        ).get();
+    }
+
+    /**
+     * 异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    @SneakyThrows
+    public static RecordMetadata sendSync(KafkaProducer<String, String> kafkaProducer, String topic, String key, String value) {
+        return kafkaProducer.send(new ProducerRecord<>(topic, key, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        ).get();
+    }
+
+
+    /**
+     * 异步发送
+     *
+     * @param kafkaProducer 生产者对象
+     * @param topic         主题
+     * @param value         值
+     */
+    @SneakyThrows
+    public static RecordMetadata sendSync(KafkaProducer<String, String> kafkaProducer, String topic, int partition, String key, String value) {
+//        kafkaProducer.send(new ProducerRecord<>(topic, value));
+        return kafkaProducer.send(new ProducerRecord<>(topic, partition, key, value), (recordMetadata, e) -> {
+                    if (e == null) {
+                        log.info("ApacheKafkaUtil--send 主题:" + recordMetadata.topic() + ",分区:" + recordMetadata.partition());
+                    } else {
+                        log.error("ApacheKafkaUtil--send 发送失败,主题:" + topic + ",值:" + value);
+                    }
+                }
+        ).get();
+    }
+
+    //* -------------------------------- Consumer --------------------------------
+
+    public static void commitAsync(KafkaConsumer<String, String> kafkaConsumer) {
+        kafkaConsumer.commitAsync();
+    }
+
+    public static void commitSync(KafkaConsumer<String, String> kafkaConsumer) {
+        kafkaConsumer.commitSync();
+    }
+
+
+}

+ 2 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/open/ctrl/ReportCtrl.java

@@ -48,11 +48,11 @@ public class ReportCtrl {
         //获取报告详情
         SimulationManualProjectParam projectParam = new SimulationManualProjectParam();
         projectParam.setId(projectId);
-        ResponseBodyVO vo = simulationProjectService.selectProjectReportById(projectParam);
+        ResponseBodyVO<ProjectReportVo> vo = simulationProjectService.selectProjectReportById(projectParam);
 
         //ProjectReportVo reportVo = reportService.getSimulationReportById(paramMap);
         ResponseBodyVO<ProjectReportVo> response = new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
-        response.setInfo((ProjectReportVo) vo.getInfo());
+        response.setInfo(vo.getInfo());
         return response;
     }
 }

+ 65 - 127
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -705,53 +705,28 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
 
     @Override
-    public ResponseBodyVO selectProjectReportById(SimulationManualProjectParam param) {
-        if (isEmpty(param.getId())) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
-        }
-
-        if (isEmpty(param.getProjectType())) {
-            param.setProjectType("1");//默认
-        }
-
+    public ResponseBodyVO<ProjectReportVo> selectProjectReportById(SimulationManualProjectParam param) {
+        String id = param.getId();
+        String projectType = param.getProjectType();
         //封装要使用到的数据
         SimulationManualProjectPo poParam = new SimulationManualProjectPo();
 
-        if ("1".equals(param.getProjectType())) {
+        if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
             //项目基本信息
-            SimulationManualProjectPo po = simulationProjectMapper.selectProjectBaseById(param);
-            if (po == null) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "没有获取到数据");
-            }
-            poParam = po;
-        } else if ("2".equals(param.getProjectType())) {
+            poParam = simulationProjectMapper.selectProjectBaseById(param);
+        } else if (DictConstants.PROJECT_TYPE_AUTO_SUB.equals(projectType)) {
             SimulationManualProjectVo po = simulationAutomaticSubProjectMapper.selectProjectInfo(param);
-            if (po == null) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "没有获取到数据");
-            }
-
             BeanUtils.copyProperties(po, poParam);
-
         }
 
 
         //算法配置
         AlgorithmPO algorithmBaseInfoVo = getAlgorithmInfo(poParam);
-
         ProjectReportVo projectReportVo = new ProjectReportVo();
-
         projectReportVo.setProjectId(poParam.getProjectId());
         projectReportVo.setProjectName(poParam.getProjectName());
-
         projectReportVo.setAlgorithmName(algorithmBaseInfoVo.getAlgorithmName());
-//        Double algorithmScore = po.getAlgorithmScore();
-//        projectReportVo.setAlgorithmScore(algorithmScore);
         projectReportVo.setAlgorithmDescribe(algorithmBaseInfoVo.getDescription());
-
-//        String evaluationLevelReport = getEvaluationLevelReport(algorithmScore);
-//        projectReportVo.setEvaluationLevel(evaluationLevelReport);
-
-
         String sceneNames = "";
 
         //算法测试得分表
@@ -766,121 +741,84 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         par.setPId(poParam.getId());
         List<SimulationMptFirstTargetScorePo> pos = simulationMptFirstTargetScoreMapper.selectFirstTargetByPid(par);
 
-//        List<ScenePackageSubListVO> scenePackageSubListVOS = simulationProjectMapper.selectSubSceneByPid(poParam.getScene());
-
-        List<AlgorithmScoreVo> algorithmScoreVoList = new ArrayList();
+        List<AlgorithmScoreVo> algorithmScoreVoList = new ArrayList<>();
         String evaluationLevelReport = "";
-//        if(!isEmpty(scenePackageSubListVOS)){
-        if (!isEmpty(pos)) {
-            StringBuffer stringBuffer = new StringBuffer("");
-
-            //汇总数据初始化
-            Integer totalSceneNum = 0;
-//            Double totalWeight = 0D;
-            Double totalScore = 0D;
-            Double totalScoreRatio = 0D;
-            Integer totalSceneScoreNum = 0;
-
-//            for(ScenePackageSubListVO v : scenePackageSubListVOS){
-            for (SimulationMptFirstTargetScorePo v : pos) {
 
-                //获取指标信息
-//                ScenePackageSubListVO svo = simulationProjectMapper.selectsublistBySublistId(v.getTarget());
+        StringBuilder stringBuilder = new StringBuilder();
 
+        //汇总数据初始化
+        Integer totalSceneNum = 0;
+        double totalScore = 0D;
+        double totalScoreRatio = 0D;
+        Integer totalSceneScoreNum = 0;
 
-                stringBuffer.append(v.getSublistName() + "、");
-//                stringBuffer.append(svo.getSublistName()+"、");
-                AlgorithmScoreVo algorithmScoreVo = new AlgorithmScoreVo();
-                algorithmScoreVo.setProjectName(v.getSublistName());
-//                algorithmScoreVo.setProjectName(svo.getSublistName());
-                Integer sceneNum = v.getSceneNum();
-//                Integer sceneNum = svo.getSceneNum();
-                totalSceneNum += sceneNum;
-                algorithmScoreVo.setSceneNum(sceneNum);
-                String weight = v.getWeight();
-//                String weight = svo.getWeight();
-                Double weightDouble = Double.valueOf(weight);
-                algorithmScoreVo.setWeight(weight);
-                /*SimulationMptFirstTargetScorePo simulationMptFirstTargetScorePo = new SimulationMptFirstTargetScorePo();
-                simulationMptFirstTargetScorePo.setPId(poParam.getId());
-                simulationMptFirstTargetScorePo.setTarget(v.getSublistId());*/
-                //单个二级指标得分
-//                SimulationMptFirstTargetScorePo simulationMptFirstTargetScorePo1 = simulationMptFirstTargetScoreMapper.selectFirstTargetScore(simulationMptFirstTargetScorePo);
-//                Double score = simulationMptFirstTargetScorePo1.getScore();
-                Double score = v.getScore();
-                totalScore += BigDecimal.valueOf(score).multiply(BigDecimal.valueOf(weightDouble).divide(BigDecimal.valueOf(100))).doubleValue();
-//                totalScore += score*(weightDouble/100);
-                algorithmScoreVo.setScore(saveTwoDecimalPlaces(score));
-//                totalWeight +=aDouble;
-//                Integer num = v.getSceneNum();
-                //获取得分不为0的场景数量
-                Integer scoreNum = getSetScoreNum(v.getSublistId(), poParam.getId());
-//                Integer scoreNum = getSetScoreNum(svo.getSublistId(),poParam.getId());
-                totalSceneScoreNum += scoreNum;
-                algorithmScoreVo.setScoreRatio(saveTwoDecimalPlaces(Double.valueOf(scoreNum) / Double.valueOf(sceneNum) * 100));
-                algorithmScoreVoList.add(algorithmScoreVo);
 
-                totalScoreRatio += Double.valueOf(scoreNum) / Double.valueOf(sceneNum) * 100;
-            }
-            //汇总
+        for (SimulationMptFirstTargetScorePo v : pos) {
+            //获取指标信息
+            stringBuilder.append(v.getSublistName()).append("、");
             AlgorithmScoreVo algorithmScoreVo = new AlgorithmScoreVo();
-            algorithmScoreVo.setProjectName("汇总");
-            algorithmScoreVo.setSceneNum(totalSceneNum);
-//            algorithmScoreVo.setWeight(saveTwoDecimalPlaces(totalWeight).toString());
-            //指标权重总和默认是100%
-            algorithmScoreVo.setWeight("100");
-            algorithmScoreVo.setScore(saveTwoDecimalPlaces(totalScore));
-
-            totalScoreRatio = Double.valueOf(totalSceneScoreNum) / Double.valueOf(totalSceneNum) * 100;
-            //汇总得分率计算方式修改
-            Double d = 0D;
-            if (!isEmpty(algorithmScoreVoList)) {
-                /*for(AlgorithmScoreVo a : algorithmScoreVoList){
-                    d +=a.getScoreRatio();
-                }
-                totalScoreRatio = saveTwoDecimalPlaces(d/algorithmScoreVoList.size());*/
-//                totalScoreRatio = saveTwoDecimalPlaces(totalScoreRatio/algorithmScoreVoList.size());
-            }
-
-            algorithmScoreVo.setScoreRatio(saveTwoDecimalPlaces(totalScoreRatio));
+            algorithmScoreVo.setProjectName(v.getSublistName());
+            Integer sceneNum = v.getSceneNum();
+            totalSceneNum += sceneNum;
+            algorithmScoreVo.setSceneNum(sceneNum);
+            String weight = v.getWeight();
+            double weightDouble = Double.parseDouble(weight);
+            algorithmScoreVo.setWeight(weight);
+            //单个二级指标得分
+            Double score = v.getScore();
+            totalScore += BigDecimal.valueOf(score).multiply(BigDecimal.valueOf(weightDouble).divide(BigDecimal.valueOf(100))).doubleValue();
+            algorithmScoreVo.setScore(saveTwoDecimalPlaces(score));
+            //获取得分不为0的场景数量
+            Integer scoreNum = getSetScoreNum(v.getSublistId(), poParam.getId());
+            totalSceneScoreNum += scoreNum;
+            algorithmScoreVo.setScoreRatio(saveTwoDecimalPlaces(Double.valueOf(scoreNum) / Double.valueOf(sceneNum) * 100));
             algorithmScoreVoList.add(algorithmScoreVo);
 
-            projectReportVo.setScoreRatio(saveTwoDecimalPlaces(totalScoreRatio));
-
-            projectReportVo.setAlgorithmScore(saveTwoDecimalPlaces(totalScore));
-//            evaluationLevelReport = getEvaluationLevelReport(saveTwoDecimalPlaces(totalScore));
-            evaluationLevelReport = poParam.getEvaluationLevel();
-            projectReportVo.setEvaluationLevel(evaluationLevelReport);
-
-            sceneNames = stringBuffer.substring(0, stringBuffer.lastIndexOf("、"));
-        }
-
-
-        projectReportVo.setAlgorithmEvaluation(algorithmBaseInfoVo.getAlgorithmName() + "经测试获得" + evaluationLevelReport + "级评价," +
-                "(" + sceneNames + ")得分率达到了" + projectReportVo.getScoreRatio() + "%。");
-
+            totalScoreRatio += Double.valueOf(scoreNum) / Double.valueOf(sceneNum) * 100;
+        }
+        // 汇总
+        AlgorithmScoreVo algorithmScoreVo = new AlgorithmScoreVo();
+        algorithmScoreVo.setProjectName("汇总");
+        algorithmScoreVo.setSceneNum(totalSceneNum);
+        // 指标权重总和默认是100%
+        algorithmScoreVo.setWeight("100");
+        algorithmScoreVo.setScore(saveTwoDecimalPlaces(totalScore));
+
+        totalScoreRatio = Double.valueOf(totalSceneScoreNum) / Double.valueOf(totalSceneNum) * 100;
+        // 汇总得分率计算方式修改
+        algorithmScoreVo.setScoreRatio(saveTwoDecimalPlaces(totalScoreRatio));
+        algorithmScoreVoList.add(algorithmScoreVo);
+        projectReportVo.setScoreRatio(saveTwoDecimalPlaces(totalScoreRatio));
+        projectReportVo.setAlgorithmScore(saveTwoDecimalPlaces(totalScore));
+        evaluationLevelReport = poParam.getEvaluationLevel();
+        if (DictConstants.EVALUATION_LEVEL_G.equals(evaluationLevelReport)) {
+            projectReportVo.setEvaluationLevel(DictConstants.EVALUATION_LEVEL_G_DESCRIPTION);
+            projectReportVo.setEvaluationGrade(DictConstants.EVALUATION_LEVEL_G_DESCRIPTION);
+        } else if (DictConstants.EVALUATION_LEVEL_A.equals(evaluationLevelReport)) {
+            projectReportVo.setEvaluationLevel(DictConstants.EVALUATION_LEVEL_A_DESCRIPTION);
+            projectReportVo.setEvaluationGrade(DictConstants.EVALUATION_LEVEL_A_DESCRIPTION);
+        } else if (DictConstants.EVALUATION_LEVEL_M.equals(evaluationLevelReport)) {
+            projectReportVo.setEvaluationLevel(DictConstants.EVALUATION_LEVEL_M_DESCRIPTION);
+            projectReportVo.setEvaluationGrade(DictConstants.EVALUATION_LEVEL_M_DESCRIPTION);
+        } else if (DictConstants.EVALUATION_LEVEL_P.equals(evaluationLevelReport)) {
+            projectReportVo.setEvaluationLevel(DictConstants.EVALUATION_LEVEL_P_DESCRIPTION);
+            projectReportVo.setEvaluationGrade(DictConstants.EVALUATION_LEVEL_P_DESCRIPTION);
+        }
+
+        sceneNames = stringBuilder.substring(0, stringBuilder.lastIndexOf("、"));
+        projectReportVo.setAlgorithmEvaluation(algorithmBaseInfoVo.getAlgorithmName() + "经测试获得" + evaluationLevelReport + "级评价," + "(" + sceneNames + ")得分率达到了" + projectReportVo.getScoreRatio() + "%。");
         projectReportVo.setAlgorithmScoreList(algorithmScoreVoList);
-        projectReportVo.setEvaluationGrade(evaluationLevelReport);
-
-        //算法测试评分细则、详细得分情况
-        /*List<ScenePackageSubListVO> scenePackageSubListVOS1 = selectScenePackageSubListTreeAndSetScore(null, true, po.getScene(), po.getId(), 2);
-        projectReportVo.setSceneScoreList(scenePackageSubListVOS1);*/
-
-        //查询场景包所有数据
-//        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(po.getScene());
-
         //指标得分列表
         Map<String, Object> stringObjectMap = selectScenePackageSubListAndSetScore(poParam.getScene(), poParam.getId());
         projectReportVo.setSubListScoreLiTitle((List<Map>) stringObjectMap.get("headerList"));
         projectReportVo.setSubListScoreLi((List<SubScListVo>) stringObjectMap.get("result"));
 
         //场景得分列表
-//        Map<String, Object> maps = selectSceneScore(pos, po.getId());
         Map<String, Object> maps = selectSceneScore(poParam.getScene(), poParam.getId(), null);
         projectReportVo.setSceneScoreLiTitle((List<Map>) maps.get("headerList"));
         projectReportVo.setSceneScoreLi((List<SceneScListVo>) maps.get("result"));
 
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, projectReportVo);
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, projectReportVo);
     }
 
     private AlgorithmPO getAlgorithmInfo(SimulationManualProjectPo po) {

+ 2 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/project/service/SimulationProjectService.java

@@ -3,6 +3,7 @@ package com.css.simulation.resource.project.service;
 import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.param.project.SimulationManualProjectParam;
 import api.common.pojo.vo.project.DropDownTypeVo;
+import api.common.pojo.vo.project.ProjectReportVo;
 import api.common.pojo.vo.project.ProjectTaskDetailsVo;
 import api.common.pojo.vo.project.SimulationManualProjectVo;
 import com.github.pagehelper.PageInfo;
@@ -24,7 +25,7 @@ public interface SimulationProjectService {
 
     ResponseBodyVO selectProjectDetailsById(SimulationManualProjectParam param);
 
-    ResponseBodyVO selectProjectReportById(SimulationManualProjectParam param);
+    ResponseBodyVO<ProjectReportVo> selectProjectReportById(SimulationManualProjectParam param);
 
     ResponseBodyVO<List<DropDownTypeVo>> selectDropDownByType(SimulationManualProjectParam param);
 

+ 1 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/ScenePackageController.java

@@ -53,7 +53,7 @@ public class ScenePackageController {
     //新增测试包
     @PostMapping("/saveScenePackage")
     @ResponseBody
-    public ResponseBodyVO<String> saveScoringRules(@RequestBody Map<String, List<ScenePackageSublistVO>> map) {
+    public ResponseBodyVO<String> saveScenePackage(@RequestBody Map<String, List<ScenePackageSublistVO>> map) {
 
         List<ScenePackageSublistVO> params = map.get("params");
         if (params == null || params.size() < 1) {

+ 25 - 10
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/ScoringRulesController.java

@@ -6,7 +6,8 @@ import api.common.pojo.param.scene.ScoringRulesParam;
 import api.common.pojo.po.scene.ScoringRulesPO;
 import api.common.pojo.vo.scene.ScoringRulesVO;
 import api.common.util.ObjectUtil;
-import com.css.simulation.resource.common.utils.AuthUtil;
+import api.common.util.PythonUtil;
+import api.common.util.StringUtil;
 import com.css.simulation.resource.common.utils.PageUtil;
 import com.css.simulation.resource.scene.service.ScoringRulesService;
 import com.github.pagehelper.PageInfo;
@@ -20,7 +21,7 @@ import java.util.List;
 
 //打分规则
 @RestController
-@RequestMapping(value ="/ScoringRules" ,name = LogConstants.MODULE_SCORING)
+@RequestMapping(value = "/ScoringRules", name = LogConstants.MODULE_SCORING)
 public class ScoringRulesController {
 
     @Resource
@@ -69,23 +70,37 @@ public class ScoringRulesController {
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, list);
     }
 
-    //新增打分规则
+
+    /**
+     * 新增打分规则
+     *
+     * @param scoringRulesPO
+     * @return
+     */
     @PostMapping("/saveScoringRules")
     @ResponseBody
-    public ResponseBodyVO<String> saveScoringRules(@RequestBody ScoringRulesPO parms) {
+    public ResponseBodyVO<String> saveScoringRules(@RequestBody ScoringRulesPO scoringRulesPO) {
         ScoringRulesParam vo = new ScoringRulesParam();
-        BeanUtils.copyProperties(parms, vo);
+        BeanUtils.copyProperties(scoringRulesPO, vo);
         vo.setShare("0");
+        //1 检查是否存在同名平分规则
         List<ScoringRulesPO> list = scoringRulesService.queryScoringRulesByRuleName(vo);
         if (list != null && list.size() > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "规则名称ruleName已存在,请重新命名");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "规则名称ruleName已存在,请重新命名");
         }
-        if (ObjectUtil.isNull(parms.getRulesId())) {
-            scoringRulesService.saveScoringRules(parms);
+        //2 校验 python 语法错误
+        String pycodestyleResult = PythonUtil.pylint(scoringRulesPO.getRuleDetails());
+        if (StringUtil.isNotEmpty(pycodestyleResult)) {
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, pycodestyleResult);
+        }
+
+        //3 保存
+        if (ObjectUtil.isNull(scoringRulesPO.getRulesId())) {
+            scoringRulesService.saveScoringRules(scoringRulesPO);
         } else {
-            scoringRulesService.updateScoringRules(parms);
+            scoringRulesService.updateScoringRules(scoringRulesPO);
         }
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
     }
 
     //分享