李春阳 1 năm trước cách đây
mục cha
commit
0d50c68f1f
53 tập tin đã thay đổi với 218 bổ sung124 xóa
  1. 2 0
      api-common/src/main/java/api/common/pojo/param/demo/TestPageParam.java
  2. 2 0
      api-common/src/main/java/api/common/pojo/param/log/LogPageParam.java
  3. 2 0
      api-common/src/main/java/api/common/pojo/param/model/ConfigPageParam.java
  4. 2 0
      api-common/src/main/java/api/common/pojo/param/model/VehiclePageParam.java
  5. 1 2
      api-common/src/main/java/api/common/pojo/param/scene/SceneAccidentParam.java
  6. 1 1
      api-common/src/main/java/api/common/pojo/param/scene/SceneGeneralTemplateParam.java
  7. 1 2
      api-common/src/main/java/api/common/pojo/param/scene/SceneNaturalParam.java
  8. 1 1
      api-common/src/main/java/api/common/pojo/param/scene/ScenePackageNewParam.java
  9. 1 1
      api-common/src/main/java/api/common/pojo/param/scene/ScoringRulesParam.java
  10. 1 2
      api-common/src/main/java/api/common/pojo/param/scene/StandardsRegulationsParam.java
  11. 2 0
      api-common/src/main/java/api/common/pojo/param/system/ClusterParam.java
  12. 2 0
      api-common/src/main/java/api/common/pojo/param/system/ParameterParam.java
  13. 2 0
      api-common/src/main/java/api/common/pojo/param/system/RoleParam.java
  14. 2 0
      api-common/src/main/java/api/common/pojo/param/system/SceneImportPageParam.java
  15. 2 0
      api-common/src/main/java/api/common/pojo/param/system/UserParam.java
  16. 2 0
      api-common/src/main/java/api/common/pojo/po/model/GpsPO.java
  17. 2 0
      api-common/src/main/java/api/common/pojo/po/model/LidarPO.java
  18. 2 0
      api-common/src/main/java/api/common/pojo/po/model/OgtPO.java
  19. 2 0
      api-common/src/main/java/api/common/pojo/po/model/VehicleTempPO.java
  20. 3 6
      api-common/src/main/java/api/common/pojo/po/scene/VehicleTypePO.java
  21. 2 0
      api-common/src/main/java/api/common/pojo/po/system/ClusterPO.java
  22. 2 0
      api-common/src/main/java/api/common/pojo/po/system/DictPO.java
  23. 2 0
      api-common/src/main/java/api/common/pojo/po/system/ParameterPO.java
  24. 2 0
      api-common/src/main/java/api/common/pojo/po/system/RoleMenuPO.java
  25. 2 0
      api-common/src/main/java/api/common/pojo/po/system/RolePO.java
  26. 2 0
      api-common/src/main/java/api/common/pojo/po/system/UserPO.java
  27. 0 1
      api-common/src/main/java/api/common/pojo/vo/algorithm/AlgorithmVO.java
  28. 1 1
      api-common/src/main/java/api/common/pojo/vo/model/VehicleVO.java
  29. 1 1
      api-common/src/main/java/api/common/pojo/vo/scene/SceneAccidentVO.java
  30. 1 1
      api-common/src/main/java/api/common/pojo/vo/scene/SceneNaturalVO.java
  31. 0 1
      api-common/src/main/java/api/common/pojo/vo/scene/ScenePackageSublistVO.java
  32. 1 1
      api-common/src/main/java/api/common/pojo/vo/scene/ScenePackageVO.java
  33. 1 1
      api-common/src/main/java/api/common/pojo/vo/scene/ScoringRulesVO.java
  34. 1 1
      api-common/src/main/java/api/common/pojo/vo/scene/StandardsRegulationsVO.java
  35. 15 14
      api-common/src/main/java/api/common/util/ParamUtil.java
  36. 3 0
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/adapter/controller/MinioController.java
  37. 0 1
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/acl/entity/AlgorithmExpandAclEntity.java
  38. 0 1
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/mysql/entity/AlgorithmEntity.java
  39. 0 1
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/mysql/entity/AlgorithmExpandEntity.java
  40. 0 1
      simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/acl/entity/AlgorithmExpandAclEntity.java
  41. 5 2
      simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/app/service/impl/AlgorithmExpandApplicationServiceImpl.java
  42. 0 1
      simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/infra/mysql/entity/AlgorithmExpandEntity.java
  43. 2 2
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/adapter/consumer/ProjectConsumer.java
  44. 22 21
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/ProjectApplicationService.java
  45. 5 6
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/TaskApplicationService.java
  46. 13 11
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/ProjectDomainService.java
  47. 6 7
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/TaskDomainService.java
  48. 17 0
      simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/test/Main.java
  49. 10 8
      simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/carsim-pod-template.yaml
  50. 6 3
      simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/vtd-pod-template.yaml
  51. 2 2
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/adapter/controller/algorithm_library/AlgorithmLibraryController.java
  52. 58 19
      simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/impl/SimulationProjectServiceImpl.java
  53. 1 1
      simulation-resource-server/src/main/resources/bootstrap.yaml

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/demo/TestPageParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.demo;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class TestPageParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/log/LogPageParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.log;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class LogPageParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/model/ConfigPageParam.java

@@ -2,9 +2,11 @@ package api.common.pojo.param.model;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import javax.validation.constraints.NotBlank;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class ConfigPageParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/model/VehiclePageParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.model;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class VehiclePageParam extends PageVO {
 

+ 1 - 2
api-common/src/main/java/api/common/pojo/param/scene/SceneAccidentParam.java

@@ -9,9 +9,8 @@ import java.util.List;
 /**
  * 交通事故场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class SceneAccidentParam extends PageVO implements Serializable {

+ 1 - 1
api-common/src/main/java/api/common/pojo/param/scene/SceneGeneralTemplateParam.java

@@ -9,7 +9,7 @@ import java.util.List;
 /**
  * 泛化模板
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 2
api-common/src/main/java/api/common/pojo/param/scene/SceneNaturalParam.java

@@ -9,9 +9,8 @@ import java.util.List;
 /**
  * 自然驾驶场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class SceneNaturalParam extends PageVO implements Serializable {

+ 1 - 1
api-common/src/main/java/api/common/pojo/param/scene/ScenePackageNewParam.java

@@ -10,7 +10,7 @@ import java.util.List;
 /**
  * 测试场景包
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 1
api-common/src/main/java/api/common/pojo/param/scene/ScoringRulesParam.java

@@ -8,7 +8,7 @@ import java.io.Serializable;
 /**
  * 打分规则
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 2
api-common/src/main/java/api/common/pojo/param/scene/StandardsRegulationsParam.java

@@ -9,9 +9,8 @@ import java.util.List;
 /**
  * 标准法规场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class StandardsRegulationsParam extends PageVO implements Serializable {

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/system/ClusterParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.system;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class ClusterParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/system/ParameterParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.system;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class ParameterParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/system/RoleParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.system;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class RoleParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/system/SceneImportPageParam.java

@@ -3,9 +3,11 @@ package api.common.pojo.param.system;
 import api.common.pojo.common.PageVO;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.sql.Timestamp;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class SceneImportPageParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/system/UserParam.java

@@ -2,7 +2,9 @@ package api.common.pojo.param.system;
 
 import api.common.pojo.common.PageVO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class UserParam extends PageVO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/model/GpsPO.java

@@ -2,9 +2,11 @@ package api.common.pojo.po.model;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class GpsPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/model/LidarPO.java

@@ -2,9 +2,11 @@ package api.common.pojo.po.model;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class LidarPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/model/OgtPO.java

@@ -2,9 +2,11 @@ package api.common.pojo.po.model;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class OgtPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/model/VehicleTempPO.java

@@ -3,9 +3,11 @@ package api.common.pojo.po.model;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class VehicleTempPO extends CommonPO {
 

+ 3 - 6
api-common/src/main/java/api/common/pojo/po/scene/VehicleTypePO.java

@@ -10,14 +10,13 @@ import java.math.BigDecimal;
  */
 @EqualsAndHashCode()
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class VehicleTypePO implements Serializable {
     private String vehicleCategory;//车辆类型
     private String model3d;//车辆颜色渲染地址
     private BigDecimal centerX;
-    private double centerY=0;
+    private double centerY = 0;
     private BigDecimal centerZ;
     private BigDecimal dimensionsWidth;
     private BigDecimal dimensionsLength;
@@ -25,7 +24,7 @@ public class VehicleTypePO implements Serializable {
 
     private BigDecimal performanceMaxSpeed;
     private BigDecimal performanceMaxDeceleration;
-    private String performanceMaxAcceleration="2.5";
+    private String performanceMaxAcceleration = "2.5";
 
     private BigDecimal FrontAxleMaxSteering;
     private BigDecimal FrontAxleWheelDiameter;
@@ -33,13 +32,11 @@ public class VehicleTypePO implements Serializable {
     private BigDecimal FrontAxlePositionX;
     private BigDecimal FrontAxlePositionZ;
 
-    private String RearAxleMaxSteering="0";
+    private String RearAxleMaxSteering = "0";
     private BigDecimal RearAxleWheelDiameter;
     private BigDecimal RearAxleTrackWidth;
     private BigDecimal RearAxlePositionX;
     private BigDecimal RearAxlePositionZ;
 
 
-
-
 }

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/ClusterPO.java

@@ -3,9 +3,11 @@ package api.common.pojo.po.system;
 import api.common.pojo.common.CommonPO;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.util.Date;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class ClusterPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/DictPO.java

@@ -2,7 +2,9 @@ package api.common.pojo.po.system;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class DictPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/ParameterPO.java

@@ -2,7 +2,9 @@ package api.common.pojo.po.system;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class ParameterPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/RoleMenuPO.java

@@ -2,7 +2,9 @@ package api.common.pojo.po.system;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class RoleMenuPO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/RolePO.java

@@ -2,7 +2,9 @@ package api.common.pojo.po.system;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class RolePO extends CommonPO {
 

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/system/UserPO.java

@@ -2,7 +2,9 @@ package api.common.pojo.po.system;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class UserPO extends CommonPO {
 

+ 0 - 1
api-common/src/main/java/api/common/pojo/vo/algorithm/AlgorithmVO.java

@@ -8,7 +8,6 @@ import lombok.*;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-@Builder
 public class AlgorithmVO {
     private String id;  //算法ID
     private String algorithmCode;   //算法名称

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/model/VehicleVO.java

@@ -8,9 +8,9 @@ import lombok.NoArgsConstructor;
 import java.math.BigDecimal;
 import java.util.List;
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
+@Builder
 public class VehicleVO {
     private String saveOrShare = "0";   // 0 保存 1 分享
     private String id;  //主键id

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/scene/SceneAccidentVO.java

@@ -8,7 +8,7 @@ import java.io.Serializable;
 /**
  * 交通事故场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/scene/SceneNaturalVO.java

@@ -8,7 +8,7 @@ import java.io.Serializable;
 /**
  * 自然驾驶场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 0 - 1
api-common/src/main/java/api/common/pojo/vo/scene/ScenePackageSublistVO.java

@@ -10,7 +10,6 @@ import java.util.List;
  */
 @EqualsAndHashCode()
 @Data
-@Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class ScenePackageSublistVO implements Serializable {

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/scene/ScenePackageVO.java

@@ -9,7 +9,7 @@ import java.sql.Timestamp;
 /**
  * 测试场景包
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/scene/ScoringRulesVO.java

@@ -9,7 +9,7 @@ import java.sql.Timestamp;
 /**
  * 打分规则
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 1 - 1
api-common/src/main/java/api/common/pojo/vo/scene/StandardsRegulationsVO.java

@@ -8,7 +8,7 @@ import java.io.Serializable;
 /**
  * 标准法规场景
  */
-@EqualsAndHashCode()
+@EqualsAndHashCode(callSuper = false)
 @Data
 @Builder
 @NoArgsConstructor

+ 15 - 14
api-common/src/main/java/api/common/util/ParamUtil.java

@@ -1,6 +1,8 @@
 package api.common.util;
 
 
+import lombok.extern.slf4j.Slf4j;
+
 import java.lang.reflect.Method;
 import java.util.LinkedList;
 import java.util.List;
@@ -8,31 +10,30 @@ import java.util.List;
 /**
  * 参数转换工具类
  */
+@Slf4j
 public class ParamUtil {
 
     /**
      * 将多级下拉二维数组中的数据,赋值到对应对象的属性中
      */
-    @SuppressWarnings("unchecked")
-    public static void arrConvertObj(String[][] arr,Object object) {
+    public static void arrConvertObj(String[][] arr, Object object) {
         try {
-            if(arr == null || arr.length == 0){
-                return ;
+            if (arr == null || arr.length == 0) {
+                return;
             }
-            for (int i = 0; i < arr.length; i++) {
-                String[] selector = arr[i];
+            for (String[] selector : arr) {
                 //至少包含两级
-                if(selector != null && selector.length >= 2){
+                if (selector != null && selector.length >= 2) {
                     //截取type和value
-                    String type = selector[selector.length-2];
-                    String value = selector[selector.length-1];
-                    String filedName = type.substring(0,1).toUpperCase() + type.substring(1);
+                    String type = selector[selector.length - 2];
+                    String value = selector[selector.length - 1];
+                    String filedName = type.substring(0, 1).toUpperCase() + type.substring(1);
                     //get方法
-                    String getMethodName = "get" + filedName ;
-                    Method getMethod = object.getClass().getMethod(getMethodName,null);
+                    String getMethodName = "get" + filedName;
+                    Method getMethod = object.getClass().getMethod(getMethodName, (Class<?>) null);
 
                     List<String> getValue = (List<String>) getMethod.invoke(object);
-                    if(getValue == null || getValue.size() == 0){
+                    if (getValue == null || getValue.isEmpty()) {
                         getValue = new LinkedList<>();
                     }
                     getValue.add(value);
@@ -43,7 +44,7 @@ public class ParamUtil {
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error(e.getMessage());
         }
     }
 }

+ 3 - 0
simulation-resource-common/src/main/java/com/css/simulation/resource/common/adapter/controller/MinioController.java

@@ -214,6 +214,9 @@ public class MinioController {
         }
     }
 
+    /**
+     * 分片上传文件合并
+     */
     @RequestMapping("/completeMultipartUpload")
     @ResponseBody
     public ResponseBodyVO<String> completeMultipartUpload(@RequestBody Map<String, String> paramMap) throws Exception {

+ 0 - 1
simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/acl/entity/AlgorithmExpandAclEntity.java

@@ -9,7 +9,6 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-@Builder
 public class AlgorithmExpandAclEntity {
     @JsonAlias({"id"})
     private String id = "";

+ 0 - 1
simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/mysql/entity/AlgorithmEntity.java

@@ -8,7 +8,6 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-@Builder
 public class AlgorithmEntity {
     private String minioPath = "";
 }

+ 0 - 1
simulation-resource-common/src/main/java/com/css/simulation/resource/common/infra/mysql/entity/AlgorithmExpandEntity.java

@@ -8,7 +8,6 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-@Builder
 public class AlgorithmExpandEntity {
     private String id = "";
     private String algorithmId = "";

+ 0 - 1
simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/acl/entity/AlgorithmExpandAclEntity.java

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonAlias;
 
 
 @lombok.Data
-@lombok.Builder
 @lombok.NoArgsConstructor
 @lombok.AllArgsConstructor
 public class AlgorithmExpandAclEntity {

+ 5 - 2
simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/app/service/impl/AlgorithmExpandApplicationServiceImpl.java

@@ -7,6 +7,7 @@ import com.css.simulation.resource.monitor.app.service.AlgorithmExpandApplicatio
 import com.css.simulation.resource.monitor.infra.mysql.entity.AlgorithmExpandEntity;
 import com.css.simulation.resource.monitor.infra.mysql.mapper.AlgorithmExpandMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -30,11 +31,13 @@ public class AlgorithmExpandApplicationServiceImpl implements AlgorithmExpandApp
             //1 获取算法平台查询到的所有算法ID
             final List<String> aclAlgorithmIds = algorithmExpandAclEntities.stream().map(AlgorithmExpandAclEntity::getAlgorithmId).collect(Collectors.toList());
             log.info("算法平台的算法ID列表为:{}", aclAlgorithmIds);
-            List<String> infrastructureAlgorithmIds = algorithmExpandMapper.selectAlgorithmIds(AlgorithmExpandEntity.builder().build());
+            List<String> infrastructureAlgorithmIds = algorithmExpandMapper.selectAlgorithmIds(new AlgorithmExpandEntity());
             //2 仿真云存在而算法平台不存在,则将仿真云的数据删除
             for (String infrastructureAlgorithmId : infrastructureAlgorithmIds) {
                 if (!aclAlgorithmIds.contains(infrastructureAlgorithmId)) {
-                    algorithmExpandMapper.delete(AlgorithmExpandEntity.builder().algorithmId(infrastructureAlgorithmId).build());
+                    AlgorithmExpandEntity algorithmExpandEntity = new AlgorithmExpandEntity();
+                    algorithmExpandEntity.setAlgorithmId(infrastructureAlgorithmId);
+                    algorithmExpandMapper.delete(algorithmExpandEntity);
                 }
             }
         }

+ 0 - 1
simulation-resource-monitor/src/main/java/com/css/simulation/resource/monitor/infra/mysql/entity/AlgorithmExpandEntity.java

@@ -10,7 +10,6 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-@Builder
 public class AlgorithmExpandEntity {
     private String id = "";
     private String algorithmId = "";

+ 2 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/adapter/consumer/ProjectConsumer.java

@@ -27,7 +27,7 @@ public class ProjectConsumer {
      */
     @KafkaListener(groupId = "simulation-resource-scheduler", topics = "${custom.mq-start-project-topic}")
     public void acceptMessage(ConsumerRecord<String, String> projectStartMessageRecord) {
-        log.info("消费者组 simulation-resource-scheduler 接收到项目开始消息:" + projectStartMessageRecord);
+        log.info("消费者组 simulation-resource-scheduler 接收到项目开始消息:{}", projectStartMessageRecord);
         projectApplicationService.runProject(JsonUtil.jsonToBean(projectStartMessageRecord.value(), ProjectStartMessageEntity.class));
     }
 
@@ -37,7 +37,7 @@ public class ProjectConsumer {
      */
     @KafkaListener(groupId = "simulation-resource-scheduler", topics = "${custom.mq-stop-project-topic}")
     public void stopProject(ConsumerRecord<String, String> projectStopMessageRecord) {
-        log.info("消费者组 simulation-resource-scheduler 接收到的项目终止消息:" + projectStopMessageRecord);
+        log.info("消费者组 simulation-resource-scheduler 接收到的项目终止消息:{}", projectStopMessageRecord);
         try {
             TimeUnit.SECONDS.sleep(10);
             projectApplicationService.stopProject(JsonUtil.jsonToBean(projectStopMessageRecord.value(), ProjectStopMessageEntity.class));

+ 22 - 21
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/ProjectApplicationService.java

@@ -149,7 +149,7 @@ public class ProjectApplicationService {
     }
 
     /**
-     * 接收到运行信息立即复制一份数据作为运行数
+     * 接收到运行信息立即复制一份数据作为运行数
      *
      * @param projectStartMessageEntity 项目启动消息
      */
@@ -179,19 +179,19 @@ public class ProjectApplicationService {
             projectStartMessageEntity.setTaskCompleted(0);
             //去重,之后发送消息的时候会补全指标,如果不去重的话会出现多个场景重复关联多个指标
             Set<SceneEntity> sceneEntitySet = new HashSet<>(sceneEntityList);
-            log.info("项目 " + projectId + " 场景包括:" + sceneEntitySet);
+            log.info("项目 {} 场景包括:{}", projectId, sceneEntitySet);
             // -------------------------------- 2 算法导入 --------------------------------
-            log.info("项目 " + projectId + " 开始算法导入。");
+            log.info("项目 {} 开始算法导入。", projectId);
             String algorithmDockerImage = handleAlgorithm(projectId, algorithmId);
-            log.info("项目 " + projectId + " 算法已导入:" + algorithmDockerImage);
+            log.info("项目 {} 算法已导入:{}", projectId, algorithmDockerImage);
             customRedisClient.set("project:" + projectId + ":docker-image", algorithmDockerImage);
             // -------------------------------- 3 查询模型 --------------------------------
-            log.info("项目 " + projectId + " 开始查询模型。");
+            log.info("项目 {} 开始查询模型。", projectId);
             //1 根据车辆配置id vehicleConfigId, 获取 模型信息和传感器信息
             com.css.simulation.resource.scheduler.infra.entity.VehicleEntity vehicleEntity = vehicleMapper.selectByVehicleConfigId(vehicleConfigId);   // 车辆
             List<CameraEntity> cameraEntityList = sensorCameraMapper.selectCameraByVehicleConfigId(vehicleConfigId);    // 摄像头
             List<OgtEntity> ogtEntityList = sensorOgtMapper.selectOgtByVehicleId(vehicleConfigId); // 完美传感器
-            log.info("项目 " + projectId + " 开始保存任务消息。");
+            log.info("项目 {} 开始保存任务消息。", projectId);
             if (DictConstants.MODEL_TYPE_VTD.equals(modelType)) {
                 // -------------------------------- 4 保存任务消息 --------------------------------
                 List<TaskEntity> taskList = new ArrayList<>();
@@ -694,7 +694,7 @@ public class ProjectApplicationService {
             String currentNodeName = "";
             NodeEntity currentNodeEntity = null;
             int currentCount = Integer.MAX_VALUE;
-            log.info("各节点已经预定的任务个数为:" + nodeListToCount);
+            log.info("各节点已经预定的任务个数为:{}", nodeListToCount);
             for (NodeEntity nodeEntity : nodeListToCount) {
                 int tempCount = nodeEntity.getCount();
                 String tempNodeName = nodeEntity.getNodeName();
@@ -717,7 +717,7 @@ public class ProjectApplicationService {
                 remainderNodeMap.put(currentNodeName, cpuOrder);
             }
             // 只有准备启动(即 currentCount == 0)的时候才指定 cpu 编号
-            log.info("创建任务 " + taskId + " 的 yaml:是否使用 gpu (0是1否)" + isChoiceGpu + ",当前节点已创建 yaml 个数为:" + currentCount + ",当前节点名称为:" + currentNodeName + ",当前 cpu 编号为:" + cpuOrder + ",镜像名:" + algorithmDockerImage);
+            log.info("创建任务 {} 的 yaml:是否使用 gpu (0是1否){},当前节点已创建 yaml 个数为:{},当前节点名称为:{},当前 cpu 编号为:{},镜像名:{}", taskId, isChoiceGpu, currentCount, currentNodeName, cpuOrder, algorithmDockerImage);
             String yamlRedisKey = projectDomainService.createTempYaml(projectId, vehicleConfigId, modelType, algorithmDockerImage, currentNodeName, partition, offset, isChoiceGpu, cpuOrder);
             if (currentCount == 0) {
                 yamlToRunRedisKeyList.add(yamlRedisKey);
@@ -744,9 +744,9 @@ public class ProjectApplicationService {
         }
         //1 获取剩余并行度和即将使用的各node的并行度
         Map<String, Integer> remainderNodeMap = projectDomainService.getRemainderNodeMap(isChoiceGpu);
-        log.info("剩余并行度为:" + remainderNodeMap);
+        log.info("剩余并行度为:{}", remainderNodeMap);
         Map<String, Integer> nodeMapToUse = projectDomainService.getNodeMapToUse(isChoiceGpu, expandParallelism);
-        log.info("即将使用的并行度为:" + nodeMapToUse);
+        log.info("即将使用的并行度为:{}", nodeMapToUse);
         //2 将指定 node 的并行度减少
         nodeMapToUse.keySet().forEach(nodeName -> projectDomainService.decrementParallelism(isChoiceGpu, nodeName, nodeMapToUse.get(nodeName)));
         //3 获取还未运行的任务 ("project:" + projectId + ":node:" + nodeName + ":yaml")
@@ -758,7 +758,7 @@ public class ProjectApplicationService {
                 final String[] split = key.split(":");
                 return split[3];
             }));
-            log.info("yaml缓存key根据节点分组之后为:" + yamlPathCacheKeyMapGroupByNodeName);
+            log.info("yaml缓存key根据节点分组之后为:{}", yamlPathCacheKeyMapGroupByNodeName);
             // 每个节点分出一部分给两个节点
             yamlPathCacheKeyMapGroupByNodeName.forEach((nodeNameBefore, yamlPathCacheKeySetGroupByNodeName) -> {
                 final int yamlCount = yamlPathCacheKeySetGroupByNodeName.size();
@@ -845,7 +845,7 @@ public class ProjectApplicationService {
                 sceneList.addAll(sceneMapper.selectReferenceLibByIdList(sceneReferenceIdList));
             }
         });
-        log.info("项目" + projectId + " 共有 " + sceneList.size() + " 个任务:" + sceneList);
+        log.info("项目{} 共有 {} 个任务:{}", projectId, sceneList.size(), sceneList);
         return sceneList;
     }
 
@@ -865,7 +865,7 @@ public class ProjectApplicationService {
         String algorithmDirectoryLinuxTempPath;
         String algorithmTarLinuxTempPath = null;
         if (algorithmEntity != null) {
-            log.info("项目" + projectId + "使用仿真平台自己的算法 " + algorithmEntity);
+            log.info("项目{}使用仿真平台自己的算法 {}", projectId, algorithmEntity);
             String algorithmCode = algorithmEntity.getAlgorithmCode();
             String dockerImport = algorithmEntity.getDockerImport();
             dockerImage = dockerConfiguration.getRegistry() + "/algorithm_" + algorithmCode + ":latest";
@@ -876,14 +876,14 @@ public class ProjectApplicationService {
                 if (DictConstants.ALGORITHM_UPLOAD_MODE_FILE.equals(uploadMode)) {
                     algorithmTarLinuxTempPath = linuxTempPath + "algorithm-file/" + algorithmCode + "/" + algorithmCode + ".tar";
                     String minioPath = algorithmEntity.getMinioPath();
-                    log.info("下载 minio 算法文件 " + minioPath + " 到本地 " + algorithmTarLinuxTempPath);
+                    log.info("下载 minio 算法文件 {} 到本地 {}", minioPath, algorithmTarLinuxTempPath);
                     MinioUtil.downloadToFile(minioClient, bucketName, minioPath, algorithmTarLinuxTempPath);
                 } else if (DictConstants.ALGORITHM_UPLOAD_MODE_GIT.equals(uploadMode)) {
                     algorithmDirectoryLinuxTempPath = linuxTempPath + "algorithm-git/" + algorithmCode + "/";
                     String gitUrl = algorithmEntity.getGitUrl().replace(gitConfiguration.getName(), gitConfiguration.getUrl());
                     String gitUserName = algorithmEntity.getGitUserName();
                     String gitPassword = algorithmEntity.getGitPassword();
-                    log.info("下载 git 算法文件 " + gitUrl + " 到本地 " + algorithmDirectoryLinuxTempPath);
+                    log.info("下载 git 算法文件 {} 到本地 {}", gitUrl, algorithmDirectoryLinuxTempPath);
                     GitUtil.clone(gitUrl, gitUserName, gitPassword, algorithmDirectoryLinuxTempPath, true);
                     for (String filename : Objects.requireNonNull(new File(algorithmDirectoryLinuxTempPath).list())) {
                         if (filename.endsWith(".tar")) {
@@ -895,12 +895,12 @@ public class ProjectApplicationService {
                 }
                 algorithmMapper.updateDockerImportAndDockerImageById("1", dockerImage, algorithmId);
                 if (algorithmTarLinuxTempPath == null) {
-                    throw new RuntimeException("算法" + algorithmId + "下载失败");
+                    throw new RuntimeException("算法" + algorithmId + "下载失败");
                 }
                 OsUtil.exec("docker import " + algorithmTarLinuxTempPath + " " + dockerImage);
                 OsUtil.exec("docker push " + dockerImage);
                 FileUtil.rm(algorithmTarLinuxTempPath);
-                log.info("已删除算法临时文件:" + algorithmTarLinuxTempPath);
+                log.info("已删除算法临时文件:{}", algorithmTarLinuxTempPath);
             } else {
                 throw new RuntimeException("算法 " + algorithmId + " 的 mysql 数据有误!");
             }
@@ -933,7 +933,7 @@ public class ProjectApplicationService {
                 log.info("算法镜像" + dockerImageWithoutVersion + "已导入。");
             }
         }
-        log.info("项目 " + projectId + " 使用的算法镜像为:" + dockerImage);
+        log.info("项目 {} 使用的算法镜像为:{}", projectId, dockerImage);
 
         return dockerImage;
     }
@@ -952,7 +952,7 @@ public class ProjectApplicationService {
         //* -------------------------------- Comment --------------------------------
         ProjectEntity projectEntity = projectDomainService.getProjectByProjectId(projectId);
         if (projectEntity == null) {
-            log.info("项目未运行:" + projectId);
+            log.info("项目未运行:{}", projectId);
             return;
         }
         String projectUserId, clusterUserId, modelType, projectRunningKeyPrefix;
@@ -968,7 +968,7 @@ public class ProjectApplicationService {
         //1 判断项目是否已经运行
         projectRunningKeySet = RedisUtil.getKeySetByPrefix(stringRedisTemplate, projectRunningKeyPrefix);
         isRunning = !CollectionUtil.isEmpty(projectRunningKeySet);
-        //2 将项目状态修改为终止中
+        //2 ----------------------------------------------------- 将项目状态修改为终止中
         if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
             projectEntity = simulationManualProjectMapper.selectById(projectId);
             simulationManualProjectMapper.updateProjectState(projectId, DictConstants.PROJECT_TERMINATING, TimeUtil.getNowForMysql());
@@ -1022,7 +1022,8 @@ public class ProjectApplicationService {
         //8 删除 minio 残留文件
         MinioUtil.rmR(minioClient, bucketName, projectResultPathOfMinio + projectId + "/");
 
-        log.info("项目 " + projectId + " 终止成功!");
+        log.info("项目 {} 终止成功!", projectId);
+        // ----------------------------------------------------------- 修改状态为已终止
         if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
             simulationManualProjectMapper.updateProjectState(projectId, DictConstants.PROJECT_TERMINATED, TimeUtil.getNowForMysql());
         } else {

+ 5 - 6
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/TaskApplicationService.java

@@ -113,7 +113,7 @@ public class TaskApplicationService {
     public void state(String taskId, String state, String podName) {
         TaskEntity taskEntity = simulationManualProjectTaskMapper.selectById(taskId);
         if (taskEntity == null) {
-            log.info("收到不存在的任务的状态消息:" + taskId);
+            log.info("收到不存在的任务的状态消息:{}", taskId);
             return;
         }
         String projectId = taskEntity.getPId(); // 项目 id
@@ -134,11 +134,10 @@ public class TaskApplicationService {
             if (DictConstants.TASK_RUNNING.equals(state)) {  // 运行中的 pod 无需删除
                 // 将运行中的任务的 pod 名称放入 redis
                 stringRedisTemplate.opsForValue().set(redisPrefix.getTaskPodKey(), podName);
-                log.info("修改任务 " + taskId + " 的状态为 " + state + ",pod 名称为:" + podName);
+                log.info("修改任务 {} 的状态为 {},pod 名称为:{}", taskId, state, podName);
                 simulationManualProjectTaskMapper.updateStateWithStartTime(taskId, state, TimeUtil.getNowForMysql());
                 return;
             } else { // 结束的 pod 都直接删除,并判断项目是否完成
-                // -------------------------------- 处理状态 --------------------------------
                 log.info("修改任务 {} 的状态为 {} ,pod 名称为 {} ,并删除 pod。", taskId, state, podName);
                 if (DictConstants.TASK_ABORTED.equals(state)) {
                     String minioPathOfErrorLog = resultPathMinio + projectId + "/" + taskId + "error.log";
@@ -189,13 +188,13 @@ public class TaskApplicationService {
                 // -------------------------------- 判断项目是否结束 --------------------------------
                 isCompleted = projectDomainService.complete(redisPrefix, projectId);
                 if (isCompleted) {
-                    log.info("项目 " + projectId + " 已完成。");
+                    log.info("项目 {} 已完成。", projectId);
                     //如果项目已完成先把 pod 删除,并归还并行度
                     KubernetesUtil.deletePod2(apiClient, kubernetesConfiguration.getNamespace(), podName);
                     projectDomainService.incrementOneParallelism(isChoiceGpu, nodeName);
                     projectDomainService.releaseLicense(projectDomainService.getClusterUserIdByProjectUserId(projectUserId), projectDomainService.getModelTypeByProjectIdAndProjectType(projectId, projectType), 1);
                 } else {
-                    log.info("项目 " + projectId + " 还未运行完成。");
+                    log.info("项目 {} 还未运行完成。", projectId);
                     projectDomainService.createNextPod(projectUserId, projectId, projectType, nodeName, podName);
                 }
                 RedisUtil.deleteByPrefix(stringRedisTemplate, redisPrefix.getTaskMessageKey());
@@ -218,7 +217,7 @@ public class TaskApplicationService {
                 customRedisClient.unlock(lock2);
             }
         } catch (io.kubernetes.client.openapi.ApiException apiException) {
-            log.error("POD:" + podName + "已删除。", apiException);
+            log.info("POD:{}已删除。", podName, apiException);
         } catch (Exception e) {
             log.error("项目 {} 已结束。", projectId, e);
         } finally {

+ 13 - 11
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/ProjectDomainService.java

@@ -118,6 +118,7 @@ public class ProjectDomainService {
         String podName = getRandomPodName(projectId);   // 生成 podName
         String podYaml = getPodYamlName(nodeName, podName);     // 模板文件名称
         String yamlPath = podYamlDirectory + podYaml;
+        String yamlPathBak = podYamlDirectory + "bak/" + podYaml;
         String finalYaml;
         String podString;
 
@@ -159,7 +160,8 @@ public class ProjectDomainService {
             } else {
                 throw new RuntimeException("是否使用 gpu:" + isChoiceGpu);
             }
-        } else if ("2".equals(modelType)) {
+        }
+        else if ("2".equals(modelType)) {
             podString = FileUtil.read(new File(carsimPodTemplateYaml));
             String replace0 = podString.replace("vtd-container", "vtd-" + projectId);
             String replace1 = replace0.replace("simulation-cloud-ip", simulationCloudIp);
@@ -206,8 +208,9 @@ public class ProjectDomainService {
         } else {
             throw new RuntimeException("模型类型错误:" + modelType);
         }
-        log.info("保存项目 " + projectId + " 的 yaml 文件:" + yamlPath);
+        log.info("保存项目 {} 的 yaml 文件:{}", projectId, yamlPath);
         FileUtil.writeStringToLocalFile(finalYaml, yamlPath);
+        FileUtil.writeStringToLocalFile(finalYaml, yamlPathBak); // v20240409 备份一份yaml方便定位问题
         // 保存 yaml 地址
         String yamlRedisKey = "project:" + projectId + ":node:" + nodeName + ":yaml:" + podName;
         stringRedisTemplate.opsForValue().set(yamlRedisKey, yamlPath);
@@ -307,7 +310,7 @@ public class ProjectDomainService {
         for (String absolutePath : absolutePathList) {
             if (absolutePath.contains(projectId)) {
                 boolean delete = new File(absolutePath).delete();
-                log.debug("删除结果:" + delete);
+                log.debug("删除结果:{}", delete);
             }
         }
     }
@@ -354,13 +357,12 @@ public class ProjectDomainService {
         try {
             // 先删除 redis key
             KubernetesUtil.deletePod(apiClient, kubernetesConfiguration.getNamespace(), podName);
-            log.info("等待 pod " + podName + " 的资源释放完成。");
+            log.info("等待 pod {} 的资源释放完成。", podName);
             TimeUnit.SECONDS.sleep(3);
         } catch (ApiException apiException) {
-            log.info("pod " + podName + " 已删除。");
+            log.info("pod {} 已删除。", podName);
         } catch (Exception e) {
-            e.printStackTrace();
-            log.error("删除 pod " + podName + " 报错。", e);
+            log.error("删除 pod {} 报错。", podName, e);
         }
     }
 
@@ -507,7 +509,7 @@ public class ProjectDomainService {
         Map<String, Integer> resultNodeMap = new HashMap<>();    // 用于执行的节点映射(节点名,并行度)
         if (DictConstants.USE_GPU.equals(isChoiceGpu)) {
             List<NodeEntity> initialNodeList = kubernetesConfiguration.getGpuNodeList();
-            log.info("预设并行度的GPU节点列表为:" + initialNodeList);
+            log.info("预设并行度的GPU节点列表为:{}", initialNodeList);
             for (NodeEntity kubernetesNodeSource : initialNodeList) {
                 NodeEntity kubernetesNodeCopy = kubernetesNodeSource.clone();
                 String nodeName = kubernetesNodeCopy.getHostname();
@@ -523,10 +525,10 @@ public class ProjectDomainService {
                 }
                 resultNodeMap.put(nodeName, restParallelism);
             }
-            log.info("剩余并行度的GPU节点列表为:" + resultNodeMap);
+            log.info("剩余并行度的GPU节点列表为:{}", resultNodeMap);
         } else if (DictConstants.USE_CPU.equals(isChoiceGpu)) {
             List<NodeEntity> initialNodeList = kubernetesConfiguration.getCpuNodeList();
-            log.info("预设并行度的CPU节点列表为:" + initialNodeList);
+            log.info("预设并行度的CPU节点列表为:{}", initialNodeList);
             for (NodeEntity kubernetesNodeSource : initialNodeList) {
                 NodeEntity kubernetesNodeCopy = kubernetesNodeSource.clone();
                 String nodeName = kubernetesNodeCopy.getHostname();
@@ -542,7 +544,7 @@ public class ProjectDomainService {
                 }
                 resultNodeMap.put(nodeName, restParallelism);
             }
-            log.info("剩余并行度的CPU节点列表为:" + resultNodeMap);
+            log.info("剩余并行度的CPU节点列表为:{}", resultNodeMap);
         }
         return resultNodeMap;
     }

+ 6 - 7
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/TaskDomainService.java

@@ -203,7 +203,6 @@ public class TaskDomainService {
                             runResultFilePath + "/output_trafficLight.csv",
                             runResultFilePath + "/output_driverCtrl.csv",
                             runResultFilePath + "/trajectory.txt"
-
                     );
                     for (String csvResultFileMinioPath : csvResultFilePaths) {
                         if (!MinioUtil.isObjectExist(minioClient, bucketName, csvResultFileMinioPath)) {
@@ -218,7 +217,7 @@ public class TaskDomainService {
                     String scoreCommand = "python3 " + scoreDirectoryOfUser + "main.py " + (linuxTempPath + runResultFilePath + "/Ego.csv") + " " + (linuxTempPath + runResultFilePath + "/evaluation.csv") + " " + taskOfLeaf.getSceneType() + " " + ruleName; // 指定打分脚本
                     String scoreResult;
                     ScoreEntity score = null;
-                    log.info("开始执行打分命令:" + scoreCommand);
+                    log.info("开始执行打分命令:{}", scoreCommand);
                     Runtime r = Runtime.getRuntime();
                     Process p = r.exec(scoreCommand, null, new File(scoreDirectoryOfUser));
                     BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
@@ -353,7 +352,7 @@ public class TaskDomainService {
                 leafTaskIndexIterator.remove();
             }
         }
-        if (leafIndexList.size() > 0) {
+        if (!leafIndexList.isEmpty()) {
             List<LeafIndexEntity> nextLevelIndexList = new ArrayList<>();
             // 找出等级和 maxLevel 不相同的指标暂时不计算
             leafIndexList.stream().filter(po -> maxLevel != po.getPackageLevel()).forEach(nextLevelIndexList::add);
@@ -379,18 +378,18 @@ public class TaskDomainService {
     @SneakyThrows
     public void evaluationLevel(String projectId) {
         String tokenUrl = customConfiguration.getTokenUri() + "?grant_type=client_credentials" + "&client_id=" + customConfiguration.getClientId() + "&client_secret=" + customConfiguration.getClientSecret();
-        log.debug("获取仿真云平台 token:" + tokenUrl);
+        log.debug("获取仿真云平台 token:{}", tokenUrl);
         String response = HttpUtil.get(tokenUrl);
         ObjectMapper objectMapper = new ObjectMapper();
         JsonNode jsonNode = objectMapper.readTree(response);
         String accessToken = jsonNode.path("access_token").asText();
-        log.debug("仿真云平台 token 为:" + accessToken);
+        log.debug("仿真云平台 token 为:{}", accessToken);
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", "Bearer " + accessToken);
         Map<String, String> params = new HashMap<>();
         params.put("id", projectId);
         String post = HttpUtil.post(customConfiguration.getEvaluationLevelUri(), headers, params);
-        log.info("访问仿真云平台评价等级接口:" + customConfiguration.getEvaluationLevelUri() + ",请求头为:" + headers + ",请求体为:" + params + "结果为:" + post);
+        log.info("访问仿真云平台评价等级接口:{},请求头为:{},请求体为:{}结果为:{}", customConfiguration.getEvaluationLevelUri(), headers, params, post);
     }
 
     public Boolean taskConfirm(String taskId) {
@@ -399,7 +398,7 @@ public class TaskDomainService {
     }
 
     public void taskTick(String taskId) {
-        log.debug("收到任务 " + taskId + " 的心跳。");
+        log.debug("收到任务 {} 的心跳。", taskId);
         TaskEntity taskEntity = simulationManualProjectTaskMapper.selectById(taskId);
         if (taskEntity == null) {
             return;

+ 17 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/test/Main.java

@@ -0,0 +1,17 @@
+package com.css.simulation.resource.scheduler.test;
+
+import com.css.simulation.resource.scheduler.app.entity.VehicleEntity;
+import com.css.simulation.resource.scheduler.infra.entity.SensorsEntity;
+import com.css.simulation.resource.scheduler.infra.entity.TaskMessageEntity;
+
+public class Main {
+
+    public static void main(String[] args) {
+        TaskMessageEntity task = new TaskMessageEntity();
+        task.setVehicle(VehicleEntity.builder()
+                .sensors(SensorsEntity.builder()
+
+                        .build())
+                .build());
+    }
+}

+ 10 - 8
simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/carsim-pod-template.yaml

@@ -20,10 +20,10 @@ spec:
       hostnames:
         - gpu001
   initContainers:
-    - name: initAlgorithmImageContainer
+    - name: init
       image: algorithm-image
       imagePullPolicy: Always
-      command: [ 'sh', '-c', 'echo algorithm image downloaded && sleep 2' ]
+      command: ['sh', '-c', 'echo algorithm image downloaded && sleep 2']
   containers:
     - name: vtd-container
       image: vtd-image
@@ -61,7 +61,7 @@ spec:
         privileged: true
     - name: algorithm-container
       image: algorithm-image
-      imagePullPolicy: Always
+      imagePullPolicy: Never
       command: [ "/bin/sh", "-c", "/run.sh; touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 600; done;" ]
     - name: carsim-container
       image: carsim-image
@@ -88,13 +88,15 @@ spec:
           value: par-path
         - name: LOG_PATH
           value: log/carsim.log
+        - name: MINIO_BUCKET_NAME
+          value: minio-bucket
       ports:
         - name: carsimport
           containerPort: 8888
-#      resources:
-#        requests:
-#          cpu: "1"
-#          memory: "2Gi"
+  #      resources:
+  #        requests:
+  #          cpu: "1"
+  #          memory: "2Gi"
   restartPolicy: Never
   volumes:
     - name: nvidia0
@@ -102,4 +104,4 @@ spec:
         path: /dev/nvidia0
     - name: nvidiactl
       hostPath:
-        path: /dev/nvidiactl
+        path: /dev/nvidiactl

+ 6 - 3
simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/vtd-pod-template.yaml

@@ -22,15 +22,16 @@ spec:
       hostnames:
         - gpu001
   initContainers:
-    - name: initAlgorithmImageContainer
+    - name: init
       image: algorithm-image
       imagePullPolicy: Always
       command: ['sh', '-c', 'echo algorithm image downloaded && sleep 2']
   containers:
     - name: vtd-container
       image: vtd-image
-      imagePullPolicy: Never
+      imagePullPolicy: Always
       command: [ "/Controller/VTDController", "vtd-command", "kafka-topic" ]
+      #command: [ "/Controller/VTDController", "/Controller/config/docker_cloud_algContest.ini", "kafka-topic" ]
       resources:
         limits:
           nvidia.com/gpu: 1
@@ -60,8 +61,10 @@ spec:
           value: kafka-offset
         - name: CPU_ORDER
           value: cpu-order
+        - name: MINIO_BUCKET_NAME
+          value: minio-bucket
     - name: algorithm-container
       image: algorithm-image
       imagePullPolicy: Never
       command: [ "/bin/sh", "-c", "/run.sh; touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 600; done;" ]
-  restartPolicy: Never
+  restartPolicy: Never

+ 2 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/server/adapter/controller/algorithm_library/AlgorithmLibraryController.java

@@ -34,8 +34,8 @@ public class AlgorithmLibraryController {
      * 新增/修改算法
      */
     @RequestMapping("addOrUpdate")
-    public ResponseBodyVO<Object> addOrUpdate(@RequestBody AlgorithmParameter param) {
-        return algorithmService.addOrUpdate(param);
+    public ResponseBodyVO<Object> addOrUpdate(@RequestBody AlgorithmParameter algorithmParameter) {
+        return algorithmService.addOrUpdate(algorithmParameter);
     }
 
 

+ 58 - 19
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/impl/SimulationProjectServiceImpl.java

@@ -300,12 +300,13 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         projectDetailsVO.setAlgorithmScoreList(new ArrayList<>());
         log.info("项目 " + oldProjectId + " 的详情信息为:" + projectDetailsVO);
 
-        if (DictConstants.PROJECT_TERMINATED.equals(newState)) {
+        if (DictConstants.PROJECT_TERMINATED.equals(newState)) {// 终止项目
             projectDetailsVO.setNowRunState(DictConstants.PROJECT_TERMINATED);
             projectDetailsVO.setNowRunStateName(DictConstants.PROJECT_TERMINATED_NAME);
             String projectDetailsVOJson = JsonUtil.beanToJson(projectDetailsVO);
             oldProjectPO.setDetails(projectDetailsVOJson);
-            simulationManualProjectMapper.updateDetailsAndNowRunStateById(oldProjectId, projectDetailsVOJson, DictConstants.PROJECT_TERMINATED);
+            // 状态先改为终止中,等待调度程序实际终止
+            simulationManualProjectMapper.updateDetailsAndNowRunStateById(oldProjectId, projectDetailsVOJson, DictConstants.PROJECT_TERMINATING);
             projectStopToKafka(oldProjectPO);
         } else if (DictConstants.PROJECT_RUNNING.equals(newState)) {
             projectDetailsVO.setNowRunState(DictConstants.PROJECT_RUNNING);
@@ -460,14 +461,20 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         }
         //修正算法名称
         {
-            String algorithmName = null;
-            String algorithmDescription = null;
+            String algorithmName;
+            String algorithmDescription;
             {
                 if (DictConstants.ALGORITHM_UPLOAD_MODE_PLATFORM.equals(algorithmType)) {
+                    log.info("使用外部算法平台的算法{}", algorithmId);
                     List<AlgorithmVO> select = algorithmExpandMapper.select(AlgorithmParameter.builder().algorithmId(algorithmId).build());
                     AlgorithmVO algorithmVO = select.get(0);
                     algorithmName = algorithmVO.getAlgorithmName() + "-" + algorithmVO.getAlgorithmVersion();
                     algorithmDescription = select.get(0).getDescription();
+                } else {
+                    log.info("使用内部上传的算法{}", algorithmId);
+                    AlgorithmPO algorithmPO = algorithmMapper.selectDetailsById(algorithmId);
+                    algorithmName = algorithmPO.getAlgorithmName();
+                    algorithmDescription = algorithmPO.getDescription();
                 }
                 // 暂时不处理非算法平台的算法
                 projectDetailsVO.setAlgorithmName(algorithmName);
@@ -4951,7 +4958,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             simulationManualProjectTaskMapper.updateTaksResult(manualProjectTaskPo);
 
         } catch (Exception e) {
-            e.printStackTrace();
+            throw new RuntimeException(e);
         } finally {
             try {
                 if (fileInputStream != null) {
@@ -4969,15 +4976,17 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                  * }
                  */
             } catch (IOException e) {
-                e.printStackTrace();
-
+                log.error(e.getMessage());
             }
         }
 
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
 
     }
 
+    /**
+     * 标准化测试 - 下载 - 任务文件
+     */
     @Override
     public void exportProjectTaskFileById(SimulationManualProjectParam param) {
         String id = param.getId();
@@ -4995,40 +5004,39 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         sp.setId(id);
         SimulationManualProjectPO spo = simulationManualProjectMapper.selectProjectBaseById(sp);
         String rootPath = spo.getProjectName();
-        // FileUtil.createDirectory(rootPath);
 
         int len;
         byte[] buffer = new byte[1024];
-        // BufferedInputStream in = null;
         ZipOutputStream zos = null;
-        // InputStream inputStream = null;
         File pdfFile = null;
         try {
             HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
             response.setContentType("multipart/form-data");
             response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("运行任务包.zip", "UTF-8"));
             zos = new ZipOutputStream(response.getOutputStream());
+            // 下载所有任务的数据文件
+            log.info("项目 {} 共有 {} 个任务。", id, manualProjectTaskVos.size());
             int i = 1;
-            // ArrayList<String> fileList = CollectionUtil.createArrayList("Ego.csv",
-            // "evaluation.csv");
             for (ManualProjectTaskVo task : manualProjectTaskVos) {
+                log.info("当前下载进度为 {}/{}。", i++, manualProjectTaskVos.size());
                 String taskId = task.getId();
                 String runResultFilePath = task.getRunResultFilePath();
                 if (!isEmpty(runResultFilePath)) {
-
                     // 获取场景名
                     SceneBaseInfoVo sceneBaseInfoVo = getSceneNameAndOther(task.getSceneId(), task.getSceneType());
                     String sceneName = sceneBaseInfoVo.getCommonSceneName();
-
                     // 任务包路径
-                    // String taskPagePath = rootPath + File.separator + sceneName + "(" + i + ")";
                     String taskPagePath = rootPath + File.separator + sceneName + "- " + taskId.substring(0, 8);
-
                     // 视频文件路径
                     MinioParameter minioParameter1 = new MinioParameter();
                     minioParameter1.setObjectName(runResultFilePath);
                     ResponseBodyVO<List<String>> list = fileDownService.list(minioParameter1);
                     List<String> info = list.getInfo();
+                    // 防止下载两次,因为结果目录里有测试用的同名文件
+                    boolean mp4_done = false;
+                    boolean Ego_csv_done = false;
+                    boolean evaluation_csv_done = false;
+
                     for (String s : info) {
                         String fileName;
                         String zipPath;
@@ -5042,6 +5050,9 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                         // 文件后缀
                         String substring = s.substring(s.lastIndexOf(".") + 1);
                         if ("mp4".equals(substring)) {
+                            if (mp4_done) {
+                                continue;
+                            }
                             // mp4视频文件导出
                             MinioParameter minioParameter2 = new MinioParameter();
                             minioParameter2.setObjectName(s);
@@ -5054,8 +5065,36 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                                 zos.write(buffer, 0, len);
                             }
                             in.close();
-                        } else if ("Ego.csv".equals(fileName) || "evaluation.csv".equals(fileName)) {
+                            mp4_done = true;
+                        } else if ("Ego.csv".equals(fileName)) {
+                            if (Ego_csv_done) {
+                                continue;
+                            }
+                            MinioParameter minioParameter = new MinioParameter();
+                            if (s.contains("/")) {
+                                minioParameter.setObjectName(runResultFilePath + "/" + fileName);
+                            } else {
+                                minioParameter.setObjectName(runResultFilePath + "\\" + fileName);
+                            }
+
+                            Response download = fileDownService.download(minioParameter);
+                            Response.Body body = download.body();
+
+                            // 任务文件路径
+                            String taskFilePath = taskPagePath + File.separator + fileName;
 
+                            ZipEntry entry = new ZipEntry(taskFilePath);
+                            zos.putNextEntry(entry);
+                            BufferedInputStream in = new BufferedInputStream(body.asInputStream());
+                            while ((len = in.read(buffer)) != -1) {
+                                zos.write(buffer, 0, len);
+                            }
+                            in.close();
+                            Ego_csv_done = true;
+                        } else if ("evaluation.csv".equals(fileName)) {
+                            if (evaluation_csv_done) {
+                                continue;
+                            }
                             MinioParameter minioParameter = new MinioParameter();
                             if (s.contains("/")) {
                                 minioParameter.setObjectName(runResultFilePath + "/" + fileName);
@@ -5076,9 +5115,9 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                                 zos.write(buffer, 0, len);
                             }
                             in.close();
+                            evaluation_csv_done = true;
                         }
                     }
-                    i++;
                 }
             }
 

+ 1 - 1
simulation-resource-server/src/main/resources/bootstrap.yaml

@@ -2,7 +2,7 @@ spring:
   application:
     name: simulation-resource-server
   profiles:
-    active: dev
+    active: mlx
   jackson:
     time-zone: GMT+8
     date-format: yyyy-MM-dd HH:mm:ss