Переглянути джерело

Merge branch 'master' of http://10.12.10.70:3000/CSS/simulation-cloud

 Conflicts:
	api-common/src/main/java/api/common/pojo/constants/DictConstants.java
	simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/MinioUtil.java
	simulation-resource-scheduler/src/main/resources/bootstrap-dev.yaml
martin 3 роки тому
батько
коміт
5c3b0e1424
100 змінених файлів з 2990 додано та 402 видалено
  1. 5 8
      api-common/src/main/java/api/common/pojo/constants/DictConstants.java
  2. 5 2
      api-common/src/main/java/api/common/pojo/param/algorithm/AlgorithmParameter.java
  3. 9 0
      api-common/src/main/java/api/common/pojo/param/project/SimulationManualProjectParam.java
  4. 26 0
      api-common/src/main/java/api/common/pojo/param/scene/SceneGeneralTemplateParam.java
  5. 2 0
      api-common/src/main/java/api/common/pojo/param/scene/ScenePackageSublistParam.java
  6. 17 0
      api-common/src/main/java/api/common/pojo/param/sign/SignRefreshParameter.java
  7. 1 1
      api-common/src/main/java/api/common/pojo/param/sign/SignSingleParameter.java
  8. 1 1
      api-common/src/main/java/api/common/pojo/param/sign/SignUsernameParameter.java
  9. 33 0
      api-common/src/main/java/api/common/pojo/param/system/ClusterParam.java
  10. 15 0
      api-common/src/main/java/api/common/pojo/param/system/ParameterParam.java
  11. 2 0
      api-common/src/main/java/api/common/pojo/param/system/RoleParam.java
  12. 22 0
      api-common/src/main/java/api/common/pojo/param/system/UserParam.java
  13. 0 31
      api-common/src/main/java/api/common/pojo/po/UserPO.java
  14. 8 2
      api-common/src/main/java/api/common/pojo/po/algorithm/AlgorithmPO.java
  15. 22 0
      api-common/src/main/java/api/common/pojo/po/log/LogLoginPO.java
  16. 85 0
      api-common/src/main/java/api/common/pojo/po/project/SimulationAutomaticProjectPo.java
  17. 1 0
      api-common/src/main/java/api/common/pojo/po/scene/SceneAccidentPO.java
  18. 58 0
      api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralDataPO.java
  19. 90 0
      api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralExamplePO.java
  20. 91 0
      api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralTemplatePO.java
  21. 2 0
      api-common/src/main/java/api/common/pojo/po/scene/SceneNaturalPO.java
  22. 6 0
      api-common/src/main/java/api/common/pojo/po/scene/ScenePackageSublistPO.java
  23. 2 0
      api-common/src/main/java/api/common/pojo/po/scene/StandardsRegulationsPO.java
  24. 17 0
      api-common/src/main/java/api/common/pojo/po/system/ClusterPO.java
  25. 15 0
      api-common/src/main/java/api/common/pojo/po/system/ParameterPO.java
  26. 19 0
      api-common/src/main/java/api/common/pojo/po/system/UserPO.java
  27. 0 16
      api-common/src/main/java/api/common/pojo/vo/SimulationTokenVO.java
  28. 1 1
      api-common/src/main/java/api/common/pojo/vo/project/ManualProjectTaskVo.java
  29. 9 0
      api-common/src/main/java/api/common/pojo/vo/project/ProjectDetailsVo.java
  30. 3 0
      api-common/src/main/java/api/common/pojo/vo/project/SceneScListVo.java
  31. 4 3
      api-common/src/main/java/api/common/pojo/vo/project/SublistScoreVo.java
  32. 1 0
      api-common/src/main/java/api/common/pojo/vo/scene/SceneAccidentVO.java
  33. 34 0
      api-common/src/main/java/api/common/pojo/vo/scene/SceneGeneralTemplateMbVO.java
  34. 89 0
      api-common/src/main/java/api/common/pojo/vo/scene/SceneGeneralTemplateVO.java
  35. 1 0
      api-common/src/main/java/api/common/pojo/vo/scene/SceneNaturalVO.java
  36. 2 0
      api-common/src/main/java/api/common/pojo/vo/scene/ScenePackageSublistVO.java
  37. 1 0
      api-common/src/main/java/api/common/pojo/vo/scene/StandardsRegulationsVO.java
  38. 27 0
      api-common/src/main/java/api/common/pojo/vo/sign/SimulationTokenVO.java
  39. 20 0
      api-common/src/main/java/api/common/pojo/vo/system/ClusterVO.java
  40. 18 0
      api-common/src/main/java/api/common/pojo/vo/system/ParameterVO.java
  41. 0 38
      api-common/src/main/java/api/common/pojo/vo/system/UserInfoVO.java
  42. 19 0
      api-common/src/main/java/api/common/pojo/vo/system/UserVO.java
  43. 19 10
      api-common/src/main/java/api/common/util/JgitUtil.java
  44. 45 2
      api-common/src/main/java/api/common/util/JsonUtil.java
  45. 6 1
      api-common/src/main/java/api/common/util/TimeUtil.java
  46. 2 2
      simulation-gateway/src/main/resources/bootstrap-dev.yaml
  47. 5 0
      simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/configuration/oauth/OauthParameter.java
  48. 81 21
      simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/controller/SignController.java
  49. 30 0
      simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/mapper/LogLoginMapper.java
  50. 42 54
      simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/mapper/UserMapper.java
  51. 2 2
      simulation-oauth-client/src/main/resources/bootstrap-dev.yaml
  52. 5 1
      simulation-oauth-client/src/main/resources/bootstrap.yaml
  53. 4 1
      simulation-oauth-client/src/main/resources/logback-spring.xml
  54. 1 0
      simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/oauth/MyTokenService.java
  55. 2 3
      simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/oauth/MyUserAuthenticationConverter.java
  56. 2 3
      simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/security/MyUserDetails.java
  57. 3 5
      simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/security/MyUserDetailsService.java
  58. 11 22
      simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/mapper/UserMapper.java
  59. 2 2
      simulation-oauth-server/src/main/resources/bootstrap-dev.yaml
  60. 4 0
      simulation-oauth-server/src/main/resources/bootstrap.yaml
  61. 4 1
      simulation-oauth-server/src/main/resources/logback-spring.xml
  62. 10 2
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java
  63. 25 5
      simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/MinioUtil.java
  64. 2 2
      simulation-resource-common/src/main/resources/bootstrap-dev.yaml
  65. 2 2
      simulation-resource-scheduler/src/main/resources/bootstrap-dev.yaml
  66. 5 5
      simulation-resource-server/pom.xml
  67. 13 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/ctrl/AlgorithmCtrl.java
  68. 5 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/service/AlgorithmService.java
  69. 75 22
      simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/serviceImpl/AlgorithmServiceImpl.java
  70. 2 3
      simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/MyUserAuthenticationConverter.java
  71. 3 3
      simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/MyUserDetails.java
  72. 1 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/OauthParameter.java
  73. 21 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/common/utils/AuthUtil.java
  74. 6 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/feign/FileDownService.java
  75. 24 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/feign/SchedulerService.java
  76. 10 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/feign/fallback/FileDownServiceFallback.java
  77. 13 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/feign/fallback/SchedulerServiceFallback.java
  78. 3 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/constants/ProjectConstants.java
  79. 20 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/ctrl/SimulationProjectCtrl.java
  80. 197 19
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java
  81. 37 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/mapper/SimulationAutomaticProjectMapper.java
  82. 1 1
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/mapper/SimulationProjectMapper.java
  83. 5 5
      simulation-resource-server/src/main/java/com/css/simulation/resource/project/service/SimulationProjectService.java
  84. 16 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/FileController.java
  85. 10 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/SceneAccidentController.java
  86. 185 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/SceneGeneralTemplateController.java
  87. 5 1
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneAccidentMapper.java
  88. 19 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralDataMapper.java
  89. 18 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralExampleMapper.java
  90. 22 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralTemplateMapper.java
  91. 5 1
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneNaturalMapper.java
  92. 4 2
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/StandardsRegulationsMapper.java
  93. 342 73
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneAccidentService.java
  94. 232 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneGeneralExampleService.java
  95. 290 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneGeneralTemplateService.java
  96. 16 10
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneNaturalService.java
  97. 6 3
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/ScenePackageService.java
  98. 20 10
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/StandardsRegulationsService.java
  99. 140 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/XmlParse.java
  100. 127 0
      simulation-resource-server/src/main/java/com/css/simulation/resource/system/ctrl/ClusterCtrl.java

+ 5 - 8
api-common/src/main/java/api/common/pojo/constants/DictConstants.java

@@ -26,6 +26,7 @@ public class DictConstants {
     public static final String EVALUATION_LEVEL = "evaluationLevel";//项目评测等级
     public static final String PROJECT_RUN_STATE = "projectRunState";//项目运行状态
     public static final String VALIDATION_STATUS = "validationStatus";//项目运行状态
+    public static final String ROLE_CODE = "roleCode";//用户类型(角色编码)
 
     public static final String ALGORITHM_FILE = "algorithmFile";//算法文件上传type
 
@@ -83,13 +84,9 @@ public class DictConstants {
     public static final String REPORT_LEVEL_M = "M";
     public static final String REPORT_LEVEL_P = "P";
 
-
-    //报告评测等级
-    public static final String TASK_ERROR_REASON_1 = "任务执行超时!";
-    public static final String TASK_ERROR_REASON_2 = "未知错误!";
-    public static final String TASK_ERROR_REASON_3 = "容器终止!";
-    public static final String TASK_ERROR_REASON_4 = "未知状态!";
-    public static final String TASK_ERROR_REASON_5 = "打分出错!";
-
+    public static final String ROLE_CODE_SYSADMIN = "0"; //用户类型-超级管理员
+    public static final String ROLE_CODE_ADMIN = "1"; //用户类型-子管理员
+    public static final String ROLE_CODE_UESR = "2"; //用户类型-普通用户
+    public static final String ROLE_CODE_SUBUESR = "3"; //用户类型-子账户
 
 }

+ 5 - 2
api-common/src/main/java/api/common/pojo/param/algorithm/AlgorithmParameter.java

@@ -28,8 +28,11 @@ public class AlgorithmParameter extends PageParameter {
     //仓库地址
     private String gitUrl;
 
-    //代码仓库访问令牌
-    private String gitToken;
+    //代码仓库访问用户名
+    private String gitUserName;
+
+    //代码仓库访问密码
+    private String gitPassword;
 
     //算法文件在 minio 上的位置
     private String minioPath;

+ 9 - 0
api-common/src/main/java/api/common/pojo/param/project/SimulationManualProjectParam.java

@@ -118,5 +118,14 @@ public class SimulationManualProjectParam extends PageVO {
     //创建人
     private String createUserId;
 
+    //场景包id
+    private String packageId;
+
+    //自动运行状态
+    private String automaticRunState;
+
+    //父级项目id
+    private String parentId;
+
 
 }

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

@@ -0,0 +1,26 @@
+package api.common.pojo.param.scene;
+
+import api.common.pojo.common.PageVO;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 交通事故场景
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralTemplateParam extends PageVO implements Serializable {
+
+    private String id;              // (唯一)
+    private String sceneId;//场景编号
+    private List<String> scenarioWeather;  //天气
+    private String scenarioTime;  //场景发生时间
+    private List<String> fileName;//模块名称
+    private String version;//版本号
+
+}

+ 2 - 0
api-common/src/main/java/api/common/pojo/param/scene/ScenePackageSublistParam.java

@@ -32,6 +32,8 @@ public class ScenePackageSublistParam implements Serializable {
     private int packageLevel;//级别
     private String remarks;//备注
     private String share ; //是否分析  1为分享
+    private String templateId;//泛化模板id
+    private String exampleId;//泛化实例id
     private List<ScenePackageSublistParam> list;
 
 

+ 17 - 0
api-common/src/main/java/api/common/pojo/param/sign/SignRefreshParameter.java

@@ -0,0 +1,17 @@
+package api.common.pojo.param.sign;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SignRefreshParameter {
+
+    @NotBlank(message = "refreshToken不能为空!")
+    private String refreshToken;
+
+}

+ 1 - 1
api-common/src/main/java/api/common/pojo/param/SignSingleParameter.java → api-common/src/main/java/api/common/pojo/param/sign/SignSingleParameter.java

@@ -1,4 +1,4 @@
-package api.common.pojo.param;
+package api.common.pojo.param.sign;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;

+ 1 - 1
api-common/src/main/java/api/common/pojo/param/SignUsernameParameter.java → api-common/src/main/java/api/common/pojo/param/sign/SignUsernameParameter.java

@@ -1,4 +1,4 @@
-package api.common.pojo.param;
+package api.common.pojo.param.sign;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;

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

@@ -0,0 +1,33 @@
+package api.common.pojo.param.system;
+
+import api.common.pojo.common.PageVO;
+import lombok.Data;
+
+@Data
+public class ClusterParam extends PageVO {
+
+    //账户名
+    private String userName;
+
+    //账户id
+    private String userId;
+
+    //账户类型 2表示管理员账户查询的普通账户列表,3表示普通账户查询的普通账户子账号列表
+    private String roleCode;
+
+    //创建用户ID
+    private String createUserId;
+
+    //操作时间开始
+    private String modifyTimeStart;
+
+    //操作时间结束
+    private String modifyTimeEnd;
+
+    //到期时间开始
+    private String dueTimeStart;
+
+    //到期时间结束
+    private String dueTimeEnd;
+
+}

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

@@ -0,0 +1,15 @@
+package api.common.pojo.param.system;
+
+import api.common.pojo.common.PageVO;
+import lombok.Data;
+
+@Data
+public class ParameterParam extends PageVO {
+
+    //账户名
+    private String userName;
+
+    //账户id
+    private String userId;
+
+}

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

@@ -1,7 +1,9 @@
 package api.common.pojo.param.system;
 
 import api.common.pojo.common.PageVO;
+import lombok.Data;
 
+@Data
 public class RoleParam extends PageVO {
 
     //角色名称

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

@@ -0,0 +1,22 @@
+package api.common.pojo.param.system;
+
+import api.common.pojo.common.PageVO;
+import lombok.Data;
+
+@Data
+public class UserParam extends PageVO {
+
+    //账户名
+    private String username;
+    //昵称
+    private String nickname;
+    //所属公司
+    private String company;
+    //角色编码(账户类型)
+    private String roleCode;
+    //是否启用
+    private String visible;
+    //创建人ID
+    private String createUserId;
+
+}

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

@@ -1,31 +0,0 @@
-package api.common.pojo.po;
-
-import api.common.pojo.common.CommonPO;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * 用户。
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class UserPO extends CommonPO implements Serializable {
-
-    private String id;              // 用户主键(唯一)
-    private String username;        // 登录用户名
-    private String openid;          // 众工业平台的 openid
-    private String nickname;        // 用户昵称,用于显示
-    private String password;        // 密码(加密)
-    private String phone;
-    private String job;
-    private String isSub;
-    private String parentId;
-    private String role;
-
-}

+ 8 - 2
api-common/src/main/java/api/common/pojo/po/algorithm/AlgorithmPO.java

@@ -28,8 +28,14 @@ public class AlgorithmPO extends BasePo {
     //仓库地址
     private String gitUrl;
 
-    //代码仓库访问令牌
-    private String gitToken;
+    //代码仓库访问用户名
+    private String gitUserName;
+
+    //代码仓库访问密码
+    private String gitPassword;
+
+    //代码仓库访问密码
+    private String gitVersion;
 
     //算法文件名称
     private String fileName;

+ 22 - 0
api-common/src/main/java/api/common/pojo/po/log/LogLoginPO.java

@@ -0,0 +1,22 @@
+package api.common.pojo.po.log;
+
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+@Data
+public class LogLoginPO {
+
+    //主键id
+    private String id;
+    //账户id
+    private String userId;
+    //账户名
+    private String username;
+    //登录IP
+    private String ip;
+    //登录结果
+    private int state;
+    //创建时间
+    private Timestamp createTime;
+}

+ 85 - 0
api-common/src/main/java/api/common/pojo/po/project/SimulationAutomaticProjectPo.java

@@ -0,0 +1,85 @@
+package api.common.pojo.po.project;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 自动运行项目数据
+ */
+@Getter
+@Setter
+public class SimulationAutomaticProjectPo extends BasePo {
+
+    //项目日期
+    private Integer projectDate;
+
+    //项目序号
+    private Integer projectNum;
+
+    //项目id
+    private String projectId;
+
+    //项目名称
+    private String projectName;
+
+    //项目描述
+    private String projectDescribe;
+
+    //算法
+    private String algorithm;
+
+    //车辆
+    private String vehicle;
+
+    //场景(包)
+    private String scene;
+
+    //运行周期
+    private String operationCycle;
+
+    //并行度
+    private String parallelism;
+
+    //规则查看
+    private String ruleView;
+
+    //是否选择gpu(0:是,1:否)
+    private String isChoiceGpu;
+
+    //自动运行次数
+    private Long automaticRunTimes;
+
+    //最近运行时间
+    private Date lastRunTime;
+
+    //自动运行状态(0:开启,1:关闭)
+    private String automaticRunState;
+
+    //当前运行状态
+    private String nowRunState;
+
+    //评测等级
+    private String evaluationLevel;
+
+    //开始时间
+    private Date startTime;
+
+    //完成时间
+    private Date finishTime;
+
+    //最大仿真时间
+    private Long maxSimulationTime;
+
+    //算法得分
+    private Double algorithmScore;
+
+    //算法类型
+    private String algorithmType;
+
+
+
+
+
+}

+ 1 - 0
api-common/src/main/java/api/common/pojo/po/scene/SceneAccidentPO.java

@@ -33,6 +33,7 @@ public class SceneAccidentPO implements Serializable {
     private String jsonAddress ; //
     private String videoPreview;//视频预览地址
     private String label;//标签
+    private String maxTime ; //该场景仿真最大时长
     /**
      * 记录创建时间
      */

+ 58 - 0
api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralDataPO.java

@@ -0,0 +1,58 @@
+package api.common.pojo.po.scene;
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * 泛化场景实体类
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralDataPO implements Serializable {
+
+    private String id;              // (唯一)
+    private String sceneId;        // 场景编号(任务用)
+    private String sublistId;//指标Id
+    private String templateId;  //关联模板id
+    private String exampleId;  //关联模板实例id
+    private String osgbAddress  ;//
+    private String xodrAddress ; //
+    private String xoscAddress ; //
+    /**
+     * 记录创建时间
+     */
+    public Timestamp createTime;
+    /**
+     * 记录最后更新时间(包括删除)
+     */
+    public Timestamp modifyTime;
+    /**
+     * 记录创建人(用户id)
+     */
+    public String createUserId;
+    /**
+     * 记录最后更新人(包括删除)(用户id)
+     */
+    public String modifyUserId;
+    /**
+     * 是否已删除
+     */
+    public String isDeleted;
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 90 - 0
api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralExamplePO.java

@@ -0,0 +1,90 @@
+package api.common.pojo.po.scene;
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * 泛化模板实例
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralExamplePO implements Serializable {
+
+    private String id;              // (唯一)
+    private String sceneId;//场景编号
+    private String scenarioName;  //场景名称
+    private String scenarioWeather;  //天气
+    private String scenarioTime;  //场景发生时间
+    private String scenarioVehicleModel;  //车辆模型
+    private String scenarioRoadType;  //道路类型
+    private String scenarioRadiusCurvature;  //车道线曲率半径
+    private String egoStartX;  //自车初始x坐标
+    private String egoStartY;  //自车初始y坐标
+    private String egoStartVelocity ; //自车初始速度
+    private String egoHeadingAngle ; //自车航向角
+    private String egoVelocityStatus ; //自车行驶速度状态
+    private String egoTrajectory ; //自车轨迹形态
+    private String egoDurationTime ; //自车轨迹持续时间
+    private String egoVelocityTime  ;//自车速度分段持续时间
+    private String egoTrajectoryTime ; //自车轨迹形态分段持续时间
+    private String obsStartX ; //目标车初始x坐标
+    private String obsStartY ; //目标车初始y坐标
+    private String obsStartVelocity;//目标车初始速度
+    private String obsLateralAcceleration;//目标物最大横向加速度(m/s²)
+    private String obsLongitudinalAcceleration;//目标物最大纵向加速度(m/s²)
+    private String obsHeadingAngleRel;//目标物相对自车航向角
+    private String obsVelocityStatus;//目标车行驶速度状态
+    private String obsTrajectory;//目标车轨迹形态
+    private String obsDurationTime;//目标车轨迹持续时间
+    private String obsVelocityTime;//目标速度分段持续时间(s)
+    private String obsTrailTime;//目标车轨迹形态分段持续时间
+    private String generalizationType;//泛化标志位
+    private String scenarioResume;//场景简述
+    private String sceneDetailedDescription;//场景详细描述
+    private String evaluatingIndicator;//评价指标
+    private String videoLink;//视频链接
+    private String fileName;//文件名或地址
+    private String templateId;//模板id
+    private String sublistId;//指标id
+
+    private String uuId;//唯一值
+    private String isTure;//所用模板是否更新,1:该模板不是最新模板
+
+    /**
+     * 记录创建时间
+     */
+    public Timestamp createTime;
+    /**
+     * 记录最后更新时间(包括删除)
+     */
+    public Timestamp modifyTime;
+    /**
+     * 记录创建人(用户id)
+     */
+    public String createUserId;
+    /**
+     * 记录最后更新人(包括删除)(用户id)
+     */
+    public String modifyUserId;
+    /**
+     * 是否已删除
+     */
+    public String isDeleted;
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 91 - 0
api-common/src/main/java/api/common/pojo/po/scene/SceneGeneralTemplatePO.java

@@ -0,0 +1,91 @@
+package api.common.pojo.po.scene;
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * 泛化模板
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralTemplatePO implements Serializable {
+
+    private String id;              // (唯一)
+    private String sceneId;//场景编号
+    private String scenarioName;  //场景名称
+    private String scenarioWeather;  //天气
+    private String scenarioTime;  //场景发生时间
+    private String scenarioVehicleModel;  //车辆模型
+    private String scenarioRoadType;  //道路类型
+    private String scenarioRadiusCurvature;  //车道线曲率半径
+    private String egoStartX;  //自车初始x坐标
+    private String egoStartY;  //自车初始y坐标
+    private String egoStartVelocity ; //自车初始速度
+    private String egoHeadingAngle ; //自车航向角
+    private String egoVelocityStatus ; //自车行驶速度状态
+    private String egoTrajectory ; //自车轨迹形态
+    private String egoDurationTime ; //自车轨迹持续时间
+    private String egoVelocityTime  ;//自车速度分段持续时间
+    private String egoTrajectoryTime ; //自车轨迹形态分段持续时间
+    private String obsStartX ; //目标车初始x坐标
+    private String obsStartY ; //目标车初始y坐标
+    private String obsStartVelocity;//目标车初始速度
+    private String obsLateralAcceleration;//目标物最大横向加速度(m/s²)
+    private String obsLongitudinalAcceleration;//目标物最大纵向加速度(m/s²)
+    private String obsHeadingAngleRel;//目标物相对自车航向角
+    private String obsVelocityStatus;//目标车行驶速度状态
+    private String obsTrajectory;//目标车轨迹形态
+    private String obsDurationTime;//目标车轨迹持续时间
+    private String obsVelocityTime;//目标速度分段持续时间(s)
+    private String obsTrailTime;//目标车轨迹形态分段持续时间
+    private String generalizationType;//泛化标志位
+    private String scenarioResume;//场景简述
+    private String sceneDetailedDescription;//场景详细描述
+    private String evaluatingIndicator;//评价指标
+    private String videoLink;//视频链接
+    private String fileName;//文件名或地址
+    private String version;//版本号
+
+
+    private List<String> fileNameAll;//sheet页集合
+
+
+    /**
+     * 记录创建时间
+     */
+    public Timestamp createTime;
+    /**
+     * 记录最后更新时间(包括删除)
+     */
+    public Timestamp modifyTime;
+    /**
+     * 记录创建人(用户id)
+     */
+    public String createUserId;
+    /**
+     * 记录最后更新人(包括删除)(用户id)
+     */
+    public String modifyUserId;
+    /**
+     * 是否已删除
+     */
+    public String isDeleted;
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/scene/SceneNaturalPO.java

@@ -62,6 +62,8 @@ public class SceneNaturalPO  implements Serializable {
     private String videoPreview;//视频预览地址
 
     private String label;//标签
+
+    private String maxTime ; //该场景仿真最大时长
     /**
      * 记录创建时间
      */

+ 6 - 0
api-common/src/main/java/api/common/pojo/po/scene/ScenePackageSublistPO.java

@@ -33,6 +33,12 @@ public class ScenePackageSublistPO implements Serializable {
     private String remarks;//备注
     private String share ; //是否分析  1为分享
     private String treeNode;//模板预览node节点
+    private String templateId;//泛化模板id
+    private String exampleId;//泛化实例id
+
+
+
+
     /**
      * 记录创建时间
      */

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/scene/StandardsRegulationsPO.java

@@ -27,6 +27,8 @@ public class StandardsRegulationsPO implements Serializable {
     private String jsonAddress ; //
     private String videoPreview;//视频预览地址
     private String label;//标签
+
+    private String maxTime ; //该场景仿真最大时长
     /**
      * 记录创建时间
      */

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

@@ -0,0 +1,17 @@
+package api.common.pojo.po.system;
+
+import api.common.pojo.common.CommonPO;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ClusterPO extends CommonPO {
+
+    private String id;              // 用户主键(唯一)
+    private String userId;        // 账户id
+    private int numSimulationLicense;        // 仿真软件license数量
+    private Date dateSimulationLicense;       // 仿真软件license到期时间
+    private int numDynamicLicense;        // 动力学软件license数量
+    private Date dateDynamicLicense;       // 动力学软件license到期时间
+}

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

@@ -0,0 +1,15 @@
+package api.common.pojo.po.system;
+
+import api.common.pojo.common.CommonPO;
+import lombok.Data;
+
+@Data
+public class ParameterPO extends CommonPO {
+
+    private String id;              // 用户主键(唯一)
+    private String userId;        // 账户id
+    private int numCreateUser;        // 可创建子账户数量
+    private int numCreateScenePackage;           // 最多可创建场景测试包数量
+    private int numScenePerPackage;           // 场景测试包最大场景数量
+
+}

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

@@ -0,0 +1,19 @@
+package api.common.pojo.po.system;
+
+import api.common.pojo.common.CommonPO;
+import lombok.Data;
+
+@Data
+public class UserPO extends CommonPO {
+
+    private String id;              // 用户主键(唯一)
+    private String username;        // 登录用户名
+    private String nickname;        // 用户昵称,用于显示
+    private String password;        // 密码(加密)
+    private String phone;           // 联系电话
+    private String photo;           // 头像
+    private String company;         // 所属公司
+    private String roleCode;       // 账户角色类型
+    private String visible;         // 是否启用
+    private String openid;          // 众工业平台的 openid
+}

+ 0 - 16
api-common/src/main/java/api/common/pojo/vo/SimulationTokenVO.java

@@ -1,16 +0,0 @@
-package api.common.pojo.vo;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class SimulationTokenVO {
-    private String access_token;
-    private String token_type;
-    private String refresh_token;
-    private String expires_in;
-    private String scope;
-}

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

@@ -50,7 +50,7 @@ public class ManualProjectTaskVo {
     private String runResult;
 
     //得分
-    private String score;
+    private Double score;
 
     //指标评价
     private String targetEvaluate;

+ 9 - 0
api-common/src/main/java/api/common/pojo/vo/project/ProjectDetailsVo.java

@@ -75,5 +75,14 @@ public class ProjectDetailsVo {
     //运行结果统计
     private List<ProjectRunResultRatioNumVo> resultList;
 
+    //并行度
+    private String parallelism;
+
+    //最大仿真时间
+    private Long maxSimulationTime;
+
+    //是否选择gpu
+    private String isChoiceGpu;
+
 
 }

+ 3 - 0
api-common/src/main/java/api/common/pojo/vo/project/SceneScListVo.java

@@ -30,5 +30,8 @@ public class SceneScListVo {
 
     private String scoreExplain;
 
+    //运行状态
+    private String runState;
+
 
 }

+ 4 - 3
api-common/src/main/java/api/common/pojo/vo/project/SublistScoreVo.java

@@ -14,14 +14,15 @@ public class SublistScoreVo {
     private String parentId;
     private String sublistName;
     private String sceneNum;
-    private String firScore;
-    private String lasScore;
+    private Double firScore;
+    private Double lasScore;
     private String packageAndRules;
     private String notStandardSceneNum;
     private String scoreExplain;
-    private String sceneScore;
+    private Double sceneScore;
     private String targetEvaluate;
     private String sceneType;
     private String returnSceneId;
+    private String runResult;
 
 }

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

@@ -28,5 +28,6 @@ public class SceneAccidentVO extends PageVO implements Serializable {
     private String scenceResume ; //场景描述
     private String sceneTime ; //场景时间
     private String sceneWeather ; //天气
+    private String maxTime ; //该场景仿真最大时长
 
 }

+ 34 - 0
api-common/src/main/java/api/common/pojo/vo/scene/SceneGeneralTemplateMbVO.java

@@ -0,0 +1,34 @@
+package api.common.pojo.vo.scene;
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * 泛化模板目标物
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralTemplateMbVO implements Serializable {
+
+    private String obsStartX ; //目标车初始x坐标
+    private String obsStartY ; //目标车初始y坐标
+    private String obsStartVelocity;//目标车初始速度
+    private String obsLateralAcceleration;//目标物最大横向加速度(m/s²)
+    private String obsLongitudinalAcceleration;//目标物最大纵向加速度(m/s²)
+    private String obsHeadingAngleRel;//目标物相对自车航向角
+    private String obsVelocityStatus;//目标车行驶速度状态
+    private String obsTrajectory;//目标车轨迹形态
+    private String obsDurationTime;//目标车轨迹持续时间
+    private String obsVelocityTime;//目标速度分段持续时间(s)
+    private String obsTrailTime;//目标车轨迹形态分段持续时间
+    private String generalizationType;//泛化标志位
+
+
+
+}

+ 89 - 0
api-common/src/main/java/api/common/pojo/vo/scene/SceneGeneralTemplateVO.java

@@ -0,0 +1,89 @@
+package api.common.pojo.vo.scene;
+
+import lombok.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * 泛化模板
+ */
+@EqualsAndHashCode()
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneGeneralTemplateVO implements Serializable {
+
+    private String id;              // (唯一)
+    private String sceneId;//场景编号
+    private String scenarioName;  //场景名称
+    private String scenarioWeather;  //天气
+    private String scenarioTime;  //场景发生时间
+    private String scenarioVehicleModel;  //车辆模型
+    private String scenarioRoadType;  //道路类型
+    private String scenarioRadiusCurvature;  //车道线曲率半径
+    private String egoStartX;  //自车初始x坐标
+    private String egoStartY;  //自车初始y坐标
+    private String egoStartVelocity ; //自车初始速度
+    private String egoHeadingAngle ; //自车航向角
+    private String egoVelocityStatus ; //自车行驶速度状态
+    private String egoTrajectory ; //自车轨迹形态
+    private String egoDurationTime ; //自车轨迹持续时间
+    private String egoVelocityTime  ;//自车速度分段持续时间
+    private String egoTrajectoryTime ; //自车轨迹形态分段持续时间
+
+    private List<SceneGeneralTemplateMbVO> listMb;//目标物集合
+
+    private String generalizationType;//泛化标志位  目标物为空时使用
+
+    private String scenarioResume;//场景简述
+    private String sceneDetailedDescription;//场景详细描述
+    private String evaluatingIndicator;//评价指标
+    private String videoLink;//视频链接
+    private String fileName;//文件名或地址
+    private String version;//版本号
+
+    private String templateId;//模板id
+    private String isTure;//所用模板是否更新,1:该模板不是最新模板
+
+
+
+
+    private List<String> fileNameAll;//sheet页集合
+
+
+    /**
+     * 记录创建时间
+     */
+    public Timestamp createTime;
+    /**
+     * 记录最后更新时间(包括删除)
+     */
+    public Timestamp modifyTime;
+    /**
+     * 记录创建人(用户id)
+     */
+    public String createUserId;
+    /**
+     * 记录最后更新人(包括删除)(用户id)
+     */
+    public String modifyUserId;
+    /**
+     * 是否已删除
+     */
+    public String isDeleted;
+
+
+
+
+
+
+
+
+
+
+
+
+}

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

@@ -62,6 +62,7 @@ public class SceneNaturalVO extends PageVO implements Serializable {
     private String videoPreview;//视频预览地址
 
     private String label;//标签
+    private String maxTime ; //该场景仿真最大时长
 
 
 }

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

@@ -32,4 +32,6 @@ public class ScenePackageSublistVO implements Serializable {
     private int seq;//在当前层级下的顺序,由小到大
     private List<ScenePackageSublistVO>  children;
     private String treeNode;//模板预览node节点
+    private String templateId;//泛化模板id
+    private String exampleId;//泛化实例id
 }

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

@@ -23,4 +23,5 @@ public class StandardsRegulationsVO extends PageVO implements Serializable {
     private String videoAddress ; //视频地址
     private String videoPreview;//视频预览地址
     private String label;//标签
+    private String maxTime ; //该场景仿真最大时长
 }

+ 27 - 0
api-common/src/main/java/api/common/pojo/vo/sign/SimulationTokenVO.java

@@ -0,0 +1,27 @@
+package api.common.pojo.vo.sign;
+
+import api.common.util.TimeUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Timestamp;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SimulationTokenVO {
+
+    private String access_token;
+    private String token_type;
+    private String refresh_token;
+    private int expires_in;
+    private String scope;
+    private Timestamp expires_time;
+
+    //根据令牌有效时间设置到期时间
+    public void setExpires_in(int expires_in) {
+        this.expires_in = expires_in;
+        this.expires_time = TimeUtil.getPostTimestamp(expires_in);
+    }
+}

+ 20 - 0
api-common/src/main/java/api/common/pojo/vo/system/ClusterVO.java

@@ -0,0 +1,20 @@
+package api.common.pojo.vo.system;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ClusterVO {
+
+    private String id;              // 用户主键(唯一)
+    private String userName;        // 账户名称
+    private String userType;        // 占用类型
+    private String userId;        // 账户id
+    private int numSimulationLicense;        // 仿真软件license数量
+    private Date dateSimulationLicense;       // 仿真软件license到期时间
+    private int numDynamicLicense;        // 动力学软件license数量
+    private Date dateDynamicLicense;       // 动力学软件license到期时间
+    private Date modifyTime;        // 操作时间
+
+}

+ 18 - 0
api-common/src/main/java/api/common/pojo/vo/system/ParameterVO.java

@@ -0,0 +1,18 @@
+package api.common.pojo.vo.system;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ParameterVO {
+
+    private String id;              // 用户主键(唯一)
+    private String userName;        // 账户名称
+    private String userId;        // 账户id
+    private int numCreateUser;        // 可创建子账户数量
+    private int numCreateScenePackage;       // 最多可创建场景测试包数量
+    private int numScenePerPackage;        // 场景测试包最大场景数量
+    private Date modifyTime;        // 创建时间
+
+}

+ 0 - 38
api-common/src/main/java/api/common/pojo/vo/system/UserInfoVO.java

@@ -1,38 +0,0 @@
-package api.common.pojo.vo.system;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class UserInfoVO {
-
-    //主键
-    private String id;
-    //账户名
-    private String username;
-    //昵称
-    private String nickname;
-    //电话
-    private String phone;
-    //公司名称
-    private String company;
-    //岗位
-    private String job;
-    //可用CPU数量
-    private String cpuAvailableNumber;
-    //可用GPU数量
-    private String gpuAvailableNumber;
-    //是否是管理员账户
-    private String isAdmin;
-    //是否是子账户
-    private String isSub;
-    //父账号
-    private String parentId;
-    //是否失效(1失效,0有效)
-    private String isDeactivate;
-
-    //菜单
-    //private List<MenuVO> menus;
-
-}

+ 19 - 0
api-common/src/main/java/api/common/pojo/vo/system/UserVO.java

@@ -0,0 +1,19 @@
+package api.common.pojo.vo.system;
+
+import lombok.Data;
+
+@Data
+public class UserVO {
+
+    private String id;              // 用户主键(唯一)
+    private String username;        // 登录用户名
+    private String nickname;        // 用户昵称,用于显示
+    private String password;        // 密码(加密)
+    private String phone;           // 联系电话
+    private String photo;           // 头像
+    private String company;         // 所属公司
+    private String roleCode;       // 账户角色类型
+    private String visible;         // 是否启用
+    //private String openid;          // 众工业平台的 openid
+
+}

+ 19 - 10
api-common/src/main/java/api/common/util/JgitUtil.java

@@ -1,17 +1,14 @@
 package api.common.util;
 
-import io.minio.MinioClient;
-import io.minio.PutObjectArgs;
-import io.minio.errors.MinioException;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 
 import java.io.*;
-import java.security.InvalidKeyException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
-import java.util.Date;
 import java.util.Map;
 
 
@@ -25,11 +22,11 @@ import java.util.Map;
 public class JgitUtil {
 
 
-   public static Map<String, Ref> testConnection(String remoteUrl, String username, String password) throws GitAPIException {
+    public static Map<String, Ref> testConnection(String remoteUrl, String username, String password) throws GitAPIException {
        UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(username,password);
        Map<String, Ref> asMap = Git.lsRemoteRepository().setRemote(remoteUrl).setCredentialsProvider(provider).callAsMap();
        return asMap;
-   }
+    }
 
     public static Map<String, Ref> testConnectionByToken(String remoteUrl, String gitToken) throws GitAPIException {
         UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider("PRIVATE-TOKEN", gitToken);
@@ -44,11 +41,23 @@ public class JgitUtil {
         return result;
     }
 
-    public static void main(String[] args) throws GitAPIException, IOException {
+
+    public static void main(String[] args) throws GitAPIException, IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        try {
-           Map<String, Ref> asMap = testConnection("http://10.15.12.70:3000/CSS/simulation-cloud.git","zhaoyan","111112111");
+           Git git = clone("https://github.com/tensorflow/serving.git","E:\\simulation-cloud\\test","","");
+//           Iterable<RevCommit> iterable = git.log().call();
+//           for (RevCommit u : iterable) {
+//               String ID = String.valueOf(u.getId());
+//               System.out.println("cgfghdnhg");
+//               System.out.println(u.getFullMessage());
+//               System.out.println( ID);
+//               System.out.println("done!!");
+////               正则表达式 截取需要的部分
+////               versionID = getMatcher("commit\\s(\\w+)\\s?", ID);
+//               break;
+//           }
            System.out.println("slfasjkfasfksd:");
-           System.out.println(asMap);
+           System.out.println(git.log());
        }catch (Exception e){
            System.out.println("failllll:");
        }

+ 45 - 2
api-common/src/main/java/api/common/util/JsonUtil.java

@@ -12,6 +12,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class JsonUtil {
 
@@ -57,10 +59,10 @@ public class JsonUtil {
 
     public static <T> List<T> jsonToList(String json, Class<T> tClass) throws JsonProcessingException {
         JavaType javaType = TypeFactory.defaultInstance().constructParametricType(List.class, tClass);
-        if(ObjectUtil.isNull(json)){
+        if (ObjectUtil.isNull(json)) {
             return new ArrayList<>();
         }
-        List<T> list = new ObjectMapper().readValue(json,javaType);
+        List<T> list = new ObjectMapper().readValue(json, javaType);
         return list;
     }
 
@@ -81,4 +83,45 @@ public class JsonUtil {
         }
         return new TextNode("");
     }
+
+//泛化用的,把带下划线的json转换为驼峰jsom
+    public static String  stringToJson(String ss) throws JsonProcessingException {
+        Map maps = jsonToMap(ss);
+        Map map = new HashMap();
+        for (Object obj : maps.keySet()) {
+            String value = underlineToHump(obj.toString());
+            map.put(value, maps.get(obj));
+        }
+       return beanToJson(map);
+    }
+
+    private static Pattern UNDERLINE_PATTERN = Pattern.compile("_([a-z])");
+
+    /**
+     * 根据传入的带下划线的字符串转化为驼峰格式
+     *
+     * @param str
+     * @return
+     * @author mrf
+     */
+
+    public static String underlineToHump(String str) {
+        //正则匹配下划线及后一个字符,删除下划线并将匹配的字符转成大写
+        Matcher matcher = UNDERLINE_PATTERN.matcher(str);
+        StringBuffer sb = new StringBuffer(str);
+        if (matcher.find()) {
+            sb = new StringBuffer();
+            //将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
+            //正则之前的字符和被替换的字符
+            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+            //把之后的字符串也添加到StringBuffer对象中
+            matcher.appendTail(sb);
+        } else {
+            //去除除字母之外的前面带的下划线
+            return sb.toString().replaceAll("_", "");
+        }
+        return underlineToHump(sb.toString());
+    }
+
 }
+

+ 6 - 1
api-common/src/main/java/api/common/util/TimeUtil.java

@@ -7,7 +7,7 @@ import java.util.*;
 
 public class TimeUtil {
 
-    private static String[] dateFmtArr= new String[]{"yyyyMMdd", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd","HHmmssSS"};
+    private static String[] dateFmtArr= new String[]{"yyyyMMdd", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd","HHmmssSS","HH:mm:ss","yyyyMMddHHmmss"};
 
     public static long getNow() {
         return System.currentTimeMillis();
@@ -60,4 +60,9 @@ public class TimeUtil {
         map.put("toDate", getToStringDate(d,2));
         return map;
     }
+
+    //获取间隔 n 秒的时间
+    public static Timestamp getPostTimestamp(int secends) {
+        return new Timestamp(System.currentTimeMillis() + secends * 1000);
+    }
 }

+ 2 - 2
simulation-gateway/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 5 - 0
simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/configuration/oauth/OauthParameter.java

@@ -28,4 +28,9 @@ public class OauthParameter {
     private String simulationClientSecret;
     private String simulationTokenUri;
 
+    private int simulationLoginRepeatCount = 5;
+    private int simulationLoginRepeatHours = 24;
+
+    private String simulationZoogooyUserId = "zoogooy";
+
 }

+ 81 - 21
simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/controller/SignController.java

@@ -1,12 +1,17 @@
 package com.css.simulation.oauth.client.controller;
 
 import api.common.pojo.common.ResponseBodyVO;
-import api.common.pojo.param.SignSingleParameter;
-import api.common.pojo.param.SignUsernameParameter;
-import api.common.pojo.po.UserPO;
-import api.common.pojo.vo.SimulationTokenVO;
+import api.common.pojo.constants.DictConstants;
+import api.common.pojo.param.sign.SignRefreshParameter;
+import api.common.pojo.param.sign.SignSingleParameter;
+import api.common.pojo.param.sign.SignUsernameParameter;
+import api.common.pojo.po.system.UserPO;
+import api.common.pojo.po.log.LogLoginPO;
+import api.common.pojo.vo.sign.SimulationTokenVO;
+import api.common.pojo.vo.system.UserVO;
 import api.common.util.*;
 import com.css.simulation.oauth.client.configuration.oauth.OauthParameter;
+import com.css.simulation.oauth.client.mapper.LogLoginMapper;
 import com.css.simulation.oauth.client.mapper.UserMapper;
 import com.css.simulation.oauth.client.util.EncodeUtil;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -25,6 +30,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Set;
 
 @Controller
@@ -32,10 +39,12 @@ import java.util.Set;
 @Slf4j
 public class SignController {
 
-    static final String USER_ID = "simulation-oauth-client";
-
     @Resource
     UserMapper userMapper;
+
+    @Resource
+    LogLoginMapper logLoginMapper;
+
     @Autowired
     CloseableHttpClient closeableHttpClient;
     @Autowired
@@ -160,7 +169,7 @@ public class SignController {
         }
         log.info("------- /single 众工业平台用户信息为:" + zoogooyUserJson);
 
-        String username = userRoot.path("data").path("loginName").asText();
+        String username = "zoogooy-" + userRoot.path("data").path("loginName").asText();
         String nickname = userRoot.path("data").path("nickname").asText();
         String password = EncryptUtil.getLowerMD5(oauthParameter.getSimulationDefaultPassword());
 
@@ -173,8 +182,11 @@ public class SignController {
             newUser.setNickname(nickname);
             newUser.setOpenid(openid);
             newUser.setPassword(password);
-            newUser.setCreateUserId(USER_ID);
-            newUser.setModifyUserId(USER_ID);
+            newUser.setCompany("国汽");
+            newUser.setRoleCode(DictConstants.ROLE_CODE_SUBUESR);//默认为国汽账户子账户
+            newUser.setVisible("1");//启动页面登录功能
+            newUser.setCreateUserId(oauthParameter.getSimulationZoogooyUserId());
+            newUser.setModifyUserId(oauthParameter.getSimulationZoogooyUserId());
             newUser.setCreateTime(TimeUtil.getNowForMysql());
             newUser.setModifyTime(TimeUtil.getNowForMysql());
             newUser.setIsDeleted("0");
@@ -213,21 +225,39 @@ public class SignController {
     @RequestMapping("/username")
     @SneakyThrows
     @ResponseBody
-    public ResponseBodyVO<SimulationTokenVO> username(@RequestBody @Validated SignUsernameParameter signSingleParameter) {
-
-        //1 使用 username 查询数据库,是否已在仿真平台存在该用户
+    public ResponseBodyVO<SimulationTokenVO> username(@RequestBody @Validated SignUsernameParameter signSingleParameter, HttpServletRequest request) {
+        log.info("登录参数为:" + signSingleParameter);
         String username = signSingleParameter.getUsername();
         String password = signSingleParameter.getPassword();
-        log.info("登录参数为:" + signSingleParameter);
-        UserPO oldUser = userMapper.selectByUsername(username);
-        if (oldUser == null) {   //2-1 仿真平台不存在用户,直接创建新的
-            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "不存在该用户!");
-        } else { //2-2 仿真平台存在用户判断密码
-            if (!oldUser.getPassword().equals(password)) {
-                return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "密码错误!");
+        //密码加密
+        password = EncryptUtil.getLowerMD5(password);
+        UserVO userVO = userMapper.selectByUsername(username);
+        //登录日志
+        LogLoginPO po = new LogLoginPO();
+        po.setId(StringUtil.getRandomUUID());
+        po.setCreateTime(TimeUtil.getNowForMysql());
+        po.setIp(request.getRemoteAddr());
+        //登录逻辑判断
+        if (userVO == null ) {
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "用户名或密码错误!");
+        }else if("0".equals(userVO.getVisible())){
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "账户已停用!");
+        }else if(!userVO.getPassword().equals(password)) {
+            //记录登录错误日志
+            po.setUserId(userVO.getId());
+            po.setUsername(userVO.getUsername());
+            po.setState(0);
+            logLoginMapper.insertLog(po);
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "用户名或密码错误!");
+        }
+        //根据登录日志判断是否锁定账户
+        List<LogLoginPO> log = logLoginMapper.selectLogByUserId(userVO.getId(),oauthParameter.getSimulationLoginRepeatHours(),oauthParameter.getSimulationLoginRepeatCount());
+        if(ObjectUtil.isNotNull(log) && log.size() >= oauthParameter.getSimulationLoginRepeatCount()){
+            int sum = log.stream().mapToInt(m -> m.getState()).sum();
+            if(sum <= 0){
+                return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "登录失败次数过多,账户被锁定,请" + oauthParameter.getSimulationLoginRepeatHours() + "小时后重新登录!");
             }
         }
-
         //3 根据仿真平台用户名密码颁发仿真平台 token,返回给前端
         String simulationTokenUrl = oauthParameter.getSimulationTokenUri() +
                 "?grant_type=password" +
@@ -236,11 +266,41 @@ public class SignController {
                 "&username=" + username +
                 "&password=" + password;
         String simulationToken = HttpUtil.get(closeableHttpClient, requestConfig, simulationTokenUrl);
-        System.out.println("------- 仿真平台令牌信息为:" + simulationToken);
         SimulationTokenVO simulationTokenVO = JsonUtil.jsonToBean(simulationToken, SimulationTokenVO.class);
+        //记录登录成功日志
+        po.setUserId(userVO.getId());
+        po.setUsername(userVO.getUsername());
+        po.setState(1);
+        logLoginMapper.insertLog(po);
         return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, simulationTokenVO);
     }
 
+    /**
+     * 令牌刷新
+     *
+     * @return token 信息
+     */
+    @RequestMapping("/refreshToken")
+    @ResponseBody
+    public ResponseBodyVO<SimulationTokenVO> refreshToken(@RequestBody @Validated SignRefreshParameter signRefreshParameter) {
+        String refreshToken = signRefreshParameter.getRefreshToken();
+        //刷新令牌
+        String simulationTokenUrl = oauthParameter.getSimulationTokenUri() +
+                "?grant_type=refresh_token" +
+                "&client_id=" + oauthParameter.getSimulationClientId() +
+                "&client_secret=" + oauthParameter.getSimulationClientSecret() +
+                "&refresh_token=" + refreshToken;
+        try {
+            String simulationToken = HttpUtil.get(closeableHttpClient, requestConfig, simulationTokenUrl);
+            SimulationTokenVO simulationTokenVO = JsonUtil.jsonToBean(simulationToken, SimulationTokenVO.class);
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, simulationTokenVO);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "Invalid refresh token");
+        }
+
+    }
+
     /**
      * 服务监控
      */

+ 30 - 0
simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/mapper/LogLoginMapper.java

@@ -0,0 +1,30 @@
+package com.css.simulation.oauth.client.mapper;
+
+import api.common.pojo.po.log.LogLoginPO;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface LogLoginMapper {
+
+    @Select("SELECT" +
+            " state" +
+            " FROM log_login" +
+            " WHERE " +
+            " create_time >= (NOW() - INTERVAL #{hours} HOUR)" +
+            " and user_id = #{userId}" +
+            " ORDER BY create_time DESC" +
+            " LIMIT #{counter}")
+    @ResultType(LogLoginPO.class)
+    List<LogLoginPO> selectLogByUserId(@Param("userId") String userId,@Param("hours") int hours,@Param("counter") int counter);
+
+    @Insert("INSERT INTO log_login(id,user_id,username,ip,state,create_time)" +
+            " VALUES(#{log.id}," +
+            " #{log.userId}," +
+            " #{log.username}," +
+            " #{log.ip}," +
+            " #{log.state}," +
+            " #{log.createTime})")
+    void insertLog(@Param("log") LogLoginPO logLoginPO);
+}

+ 42 - 54
simulation-oauth-client/src/main/java/com/css/simulation/oauth/client/mapper/UserMapper.java

@@ -1,70 +1,58 @@
 package com.css.simulation.oauth.client.mapper;
 
 
-import api.common.pojo.po.UserPO;
+import api.common.pojo.po.system.UserPO;
+import api.common.pojo.vo.system.UserVO;
 import org.apache.ibatis.annotations.*;
-import org.apache.ibatis.type.JdbcType;
 
 @Mapper
 public interface UserMapper {
 
-    @Results(id = "user", value = {
-            @Result(property = "id", column = "id", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "username", column = "username", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "password", column = "password", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "isDeleted", column = "is_deleted", jdbcType = JdbcType.VARCHAR)
-    })
-    @Select("select id,\n" +
-            "       username,\n" +
-            "       password,\n" +
-            "       is_deleted\n" +
-            "from system_user\n" +
-            "where openid = #{openid}")
+    @Select("select id," +
+            " username," +
+            " password," +
+            " is_deleted" +
+            " from system_user" +
+            " where openid = #{openid}")
+    @ResultType(UserPO.class)
     UserPO selectByOpenIdIgnoreDelete(@Param("openid") String openid);
 
-
-    @ResultMap("user")
-    @Select("select id,\n" +
-            "       username,\n" +
-            "       password\n" +
-            "from system_user\n" +
-            "where is_deleted = '0'\n" +
-            "   and is_deactivate = '0'" +
-            "   and username = #{username}")
-    UserPO selectByUsername(@Param("username") String username);
-
-    @Update("update system_user\n" +
-            "set is_delete = #{isDeleted}\n" +
-            "   where openid = #{openid}")
+    @Select("SELECT" +
+            " id," +
+            " username," +
+            " password," +
+            " visible" +
+            " FROM system_user " +
+            " WHERE is_deleted = '0' " +
+            " and username = #{username}")
+    @ResultType(UserVO.class)
+    UserVO selectByUsername(@Param("username") String username);
+
+    @Update("update system_user" +
+            " set is_delete = #{isDeleted}" +
+            " where openid = #{openid}")
     void updateIsDeleted(@Param("openid") String openid,@Param("isDeleted") String isDeleted);
 
-
-
-
     //* -------------------------------- insert --------------------------------
-    @Insert("insert into system_user(id,\n" +
-            "                        username,\n" +
-            "                        nickname,\n" +
-            "                        openid,\n" +
-            "                        password,\n" +
-            "                        create_time,\n" +
-            "                        modify_time,\n" +
-            "                        create_user_id,\n" +
-            "                        modify_user_id,\n" +
-            "                        is_deleted)\n" +
-            "values (\n" +
-            "           #{user.id},\n" +
-            "           #{user.username},\n" +
-            "           #{user.nickname},\n" +
-            "           #{user.openid},\n" +
-            "           #{user.password},\n" +
-            "           #{user.createTime},\n" +
-            "           #{user.modifyTime},\n" +
-            "           #{user.createUserId},\n" +
-            "           #{user.modifyUserId},\n" +
-            "           #{user.isDeleted}\n" +
-            "       )")
+    @Insert("insert into system_user(" +
+            " id,username,nickname,openid,password," +
+            " company,role_code,visible," +
+            " create_time,modify_time,create_user_id,modify_user_id,is_deleted)" +
+            " values (" +
+            " #{user.id}," +
+            " #{user.username}," +
+            " #{user.nickname}," +
+            " #{user.openid}," +
+            " #{user.password}," +
+            " #{user.company}," +
+            " #{user.roleCode}," +
+            " #{user.visible}," +
+            " #{user.createTime}," +
+            " #{user.modifyTime}," +
+            " #{user.createUserId}," +
+            " #{user.modifyUserId}," +
+            " #{user.isDeleted}" +
+            " )")
     void insert(@Param("user") UserPO userPO);
 
-
 }

+ 2 - 2
simulation-oauth-client/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 5 - 1
simulation-oauth-client/src/main/resources/bootstrap.yaml

@@ -2,4 +2,8 @@ spring:
   application:
     name: simulation-oauth-client
   profiles:
-    active: dev
+    active: dev
+
+mybatis:
+  configuration:
+    map-underscore-to-camel-case: true

+ 4 - 1
simulation-oauth-client/src/main/resources/logback-spring.xml

@@ -1,9 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="true">
     <!-- 项目名称 -->
-    <property name="PROJECT_NAME" value="changjingyun"/>
+    <springProperty scop="context" name="PROJECT_NAME" source="spring.application.name" defaultValue="" />
 
     <!--定义不同环境的日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <springProfile name="dev">
+        <property name="LOG_HOME" value="logs/${PROJECT_NAME}"/>
+    </springProfile>
     <springProfile name="aliyun">
         <property name="LOG_HOME" value="/opt/simulation-cloud/simulation-oauth-client/log"/>
     </springProfile>

+ 1 - 0
simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/oauth/MyTokenService.java

@@ -31,6 +31,7 @@ public class MyTokenService {
         DefaultTokenServices services = new DefaultTokenServices();
         services.setClientDetailsService(clientDetailsService);     // 客户端详情服务,获取 ClientDetailsServiceConfigurer 中配置的客户端
         services.setSupportRefreshToken(true);      // 允许令牌自动刷新
+        services.setReuseRefreshToken(false);       //禁止refreshToken重复使用
         services.setTokenStore(tokenStore);         // 令牌存储策略
 //        services.setTokenEnhancer(jwtAccessTokenConverter);         // 使用 jwt 令牌
         services.setAccessTokenValiditySeconds(accessTokenValiditySeconds);   // 令牌默认有效期 2 小时

+ 2 - 3
simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/oauth/MyUserAuthenticationConverter.java

@@ -19,9 +19,8 @@ public class MyUserAuthenticationConverter extends DefaultUserAuthenticationConv
         //1 用户基本信息
         response.put("id", myUserDetails.getId());
         response.put("username", authentication.getName());
-        response.put("phone", myUserDetails.getPhone());
-        response.put("isSub", myUserDetails.getIsSub());
-        response.put("parentId", myUserDetails.getParentId());
+        response.put("roleCode", myUserDetails.getRoleCode());
+        response.put("createUserId", myUserDetails.getCreateUserId());
         //2 用户权限信息
         if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {
             response.put(AUTHORITIES, AuthorityUtils.authorityListToSet(authentication.getAuthorities()));

+ 2 - 3
simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/security/MyUserDetails.java

@@ -19,9 +19,8 @@ public class MyUserDetails implements UserDetails, Serializable {
     private String id;
     private String username;
     private String password;
-    private String phone;
-    private String isSub;
-    private String parentId;
+    private String roleCode;
+    private String createUserId;
     private Set<GrantedAuthority> authorities;
 
 

+ 3 - 5
simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/cofiguration/security/MyUserDetailsService.java

@@ -1,7 +1,7 @@
 package com.css.simulation.oauth.server.cofiguration.security;
 
 
-import api.common.pojo.po.UserPO;
+import api.common.pojo.po.system.UserPO;
 import api.common.util.CollectionUtil;
 import com.css.simulation.oauth.server.mapper.UserMapper;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -21,14 +21,12 @@ public class MyUserDetailsService implements UserDetailsService {
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         UserPO userPO = userMapper.selectByUsername(username);
-
         return new MyUserDetails(
                 userPO.getId(),
                 userPO.getUsername(),
                 userPO.getPassword(),
-                userPO.getPhone(),
-                userPO.getIsSub(),
-                userPO.getParentId(),
+                userPO.getRoleCode(),
+                userPO.getCreateUserId(),
                 CollectionUtil.createHashSet(new SimpleGrantedAuthority("default11111111111"))
         );
     }

+ 11 - 22
simulation-oauth-server/src/main/java/com/css/simulation/oauth/server/mapper/UserMapper.java

@@ -1,35 +1,24 @@
 package com.css.simulation.oauth.server.mapper;
 
 
-import api.common.pojo.po.UserPO;
+import api.common.pojo.po.system.UserPO;
 import org.apache.ibatis.annotations.*;
-import org.apache.ibatis.type.JdbcType;
 
 /**
- * 将查询接口放到第一个,用于写 @Results注解
+ * 查询用户
  */
 @Mapper
 public interface UserMapper {
 
-    //* -------------------------------- select --------------------------------
-
-    @Results(id = "user", value = {
-            @Result(property = "id", column = "id", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "username", column = "username", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "password", column = "password", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "phone", column = "phone", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "isSub", column = "is_sub", jdbcType = JdbcType.VARCHAR),
-            @Result(property = "parentId", column = "parent_id", jdbcType = JdbcType.VARCHAR)
-    })
-    @Select("select id,\n" +
-            "       username,\n" +
-            "       password,\n" +
-            "       phone,\n" +
-            "       is_sub,\n" +
-            "       parent_id\n" +
-            "from system_user\n" +
-            "where is_deleted = '0'" +
-            "   and username = #{username}")
+    @Select("select id," +
+            " username," +
+            " password," +
+            " role_code," +
+            " create_user_id" +
+            " from system_user" +
+            " where is_deleted = '0'" +
+            " and username = #{username}")
+    @ResultType(UserPO.class)
     UserPO selectByUsername(@Param("username") String username);
 
 

+ 2 - 2
simulation-oauth-server/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 4 - 0
simulation-oauth-server/src/main/resources/bootstrap.yaml

@@ -3,3 +3,7 @@ spring:
     name: simulation-oauth-server
   profiles:
     active: dev
+
+mybatis:
+  configuration:
+    map-underscore-to-camel-case: true

+ 4 - 1
simulation-oauth-server/src/main/resources/logback-spring.xml

@@ -1,9 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="true">
     <!-- 项目名称 -->
-    <property name="PROJECT_NAME" value="changjingyun"/>
+    <springProperty scop="context" name="PROJECT_NAME" source="spring.application.name" defaultValue="" />
 
     <!--定义不同环境的日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <springProfile name="dev">
+        <property name="LOG_HOME" value="logs/${PROJECT_NAME}"/>
+    </springProfile>
     <springProfile name="aliyun">
         <property name="LOG_HOME" value="/opt/simulation-cloud/simulation-oauth-server/log"/>
     </springProfile>

+ 10 - 2
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java

@@ -11,6 +11,7 @@ import com.css.simulation.resource.common.util.MinioUtil;
 import io.minio.*;
 import io.minio.errors.*;
 import io.minio.http.Method;
+import io.minio.messages.Item;
 import io.minio.messages.Part;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -109,8 +110,7 @@ public class MinioController {
     @PostMapping("/listDeepOne")
     public ResponseBodyVO<List<String>> listDeepOne(
             @RequestBody @Validated MinioParameter minioParameter
-    ) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
-
+    ) throws Exception {
         List<String> objects = MinioUtil.listObjectsUnRecursive(minioClientPrivate, bucketName, minioParameter.getObjectName());
         return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, objects);
     }
@@ -202,4 +202,12 @@ public class MinioController {
         minioClientPrivate.completeMultipartUpload(bucketName, null, objectName, uploadId, partArr, null, null);
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, "合并成功!");
     }
+    @PostMapping("/remove")
+    public void download(
+            @RequestBody @Validated MinioParameter minioParameter
+    ) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+
+        MinioUtil.removeObject(minioClientPrivate, bucketName, minioParameter.getObjectName());
+    }
+
 }

+ 25 - 5
simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/MinioUtil.java

@@ -25,6 +25,7 @@ import java.util.Set;
 public class MinioUtil {
 
 
+
     /**
      * 获取下一级文件列表
      *
@@ -33,8 +34,11 @@ public class MinioUtil {
      * @param prefix      目录名
      * @return 文件路径列表
      */
-    public static List<String> listObjectsUnRecursive(MinioClient minioClient, String bucket, String prefix) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, io.minio.errors.InternalException {
+    public static List<String> listObjectsUnRecursive(MinioClient minioClient, String bucket, String prefix) throws Exception{
 
+        if (prefix.startsWith("/")) {
+            prefix = prefix.substring(1);
+        }
         if (!prefix.endsWith("/")) {
             prefix = prefix + "/";
         }
@@ -46,19 +50,18 @@ public class MinioUtil {
                         .prefix(prefix)
                         .build()
         );
-        Set<String> result = new HashSet<>();
+        Set<String> resultSet = new HashSet<>();
         for (Result<Item> next : objects) {
             Item item = next.get();
             String objectName = item.objectName();
             String substring = objectName.substring(length);
             String[] split = substring.split("/");
-            result.add(prefix + split[0]);
+            resultSet.add(prefix + split[0]);
         }
 
-        return new ArrayList<>(result);
+        return new ArrayList<>(resultSet);
     }
 
-
     /**
      * 判断 bucket 是否存在
      */
@@ -255,4 +258,21 @@ public class MinioUtil {
         }
         return null;
     }
+    /**
+     * 删除文件
+     *
+     * @param minioClient minio 客户端对象
+     * @param bucket      桶
+     * @param object      文件对象
+     */
+    public static void removeObject(
+            MinioClient minioClient,
+            String bucket,
+            String object
+    ) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, io.minio.errors.InternalException {
+        minioClient.removeObject(RemoveObjectArgs.builder()
+                .bucket(bucket)
+                .object(object)
+                .build());
+    }
 }

+ 2 - 2
simulation-resource-common/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 10.15.12.70:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 2 - 2
simulation-resource-scheduler/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 47.94.105.148:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 47.94.105.148:8848
+        server-addr: 10.12.10.70:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 5 - 5
simulation-resource-server/pom.xml

@@ -17,17 +17,17 @@
 
     <dependencies>
 
-        <!-- 测试excel解析-->
-       <!-- <dependency>
+       <!--  测试excel解析-->
+        <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
-            <version>5.2.0</version>
+            <version>3.17</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>5.2.0</version>
-        </dependency>-->
+            <version>3.17</version>
+        </dependency>
       <!--  <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml-schemas</artifactId>

+ 13 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/ctrl/AlgorithmCtrl.java

@@ -9,6 +9,9 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 
 /**
  * 算法库模块
@@ -121,5 +124,15 @@ public class AlgorithmCtrl {
         return service.testConnection(param);
     }
 
+    /**
+     * 根据git仓库地址获取版本号
+     * @param param
+     * @return
+     */
+    @RequestMapping("getGitVersion")
+    @ResponseBody
+    public ResponseBodyVO getGitVersion(@RequestBody AlgorithmParameter param) throws IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
+        return service.getGitVersion(param);
+    }
 
 }

+ 5 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/service/AlgorithmService.java

@@ -4,6 +4,9 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.param.algorithm.AlgorithmParameter;
 
 import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Map;
 
 
@@ -27,5 +30,7 @@ public interface AlgorithmService {
 
     ResponseBodyVO testConnection(AlgorithmParameter param);
 
+    ResponseBodyVO getGitVersion(AlgorithmParameter param) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException;
+
     Map<String,Integer> selectDetailsBySy();
 }

+ 75 - 22
simulation-resource-server/src/main/java/com/css/simulation/resource/algorithm/serviceImpl/AlgorithmServiceImpl.java

@@ -1,5 +1,6 @@
 package com.css.simulation.resource.algorithm.serviceImpl;
 import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.param.MinioParameter;
 import api.common.pojo.param.algorithm.AlgorithmParameter;
 import api.common.pojo.param.system.DictParam;
 import api.common.pojo.po.algorithm.AlgorithmPO;
@@ -12,13 +13,20 @@ import com.css.simulation.resource.common.utils.PageUtil;
 import com.css.simulation.resource.algorithm.mapper.AlgorithmMapper;
 import com.css.simulation.resource.algorithm.service.AlgorithmService;
 import com.css.simulation.resource.feign.AlgoPlatformService;
+import com.css.simulation.resource.feign.FileDownService;
+import com.css.simulation.resource.feign.SchedulerService;
 import com.css.simulation.resource.system.service.DictService;
 import com.github.pagehelper.PageInfo;
+import feign.Response;
 import org.eclipse.jgit.lib.Ref;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -30,6 +38,12 @@ public class AlgorithmServiceImpl implements AlgorithmService {
     @Resource
     AlgoPlatformService algoPlatformService;
 
+    @Resource
+    SchedulerService schedulerService;
+
+    @Resource
+    FileDownService fileDownService;
+
     @Autowired
     private AlgorithmMapper algorithmMapper;
 
@@ -45,29 +59,43 @@ public class AlgorithmServiceImpl implements AlgorithmService {
         if(algorithmPOS != null && algorithmPOS.size() > 0){
             return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"该算法名称已存在!");
         }else {
-            if(isEmpty(param.getId())){
-                //添加
-                String algorithmId = StringUtil.getRandomUUID();
-                param.setId(algorithmId);
-                String algorithmCode = StringUtil.getRandomCode();
-                param.setAlgorithmCode(algorithmCode);
-                AlgorithmPO po = setPo(param, false);
-                int add = algorithmMapper.add(po);
-                if(add > 0){
-                    return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+            String minioPath = param.getMinioPath();
+            ResponseBodyVO<String> checkRes = schedulerService.check(minioPath);
+            if(checkRes.isStatus()){
+                if(isEmpty(param.getId())){
+                    //添加
+                    String algorithmId = StringUtil.getRandomUUID();
+                    param.setId(algorithmId);
+                    String algorithmCode = StringUtil.getRandomCode();
+                    param.setAlgorithmCode(algorithmCode);
+                    AlgorithmPO po = setPo(param, false);
+                    int add = algorithmMapper.add(po);
+                    if(add > 0){
+                        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+                    }else {
+                        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"添加失败");
+                    }
                 }else {
-                    return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"添加失败");
+                    //编辑
+                    AlgorithmPO po = setPo(param, true);
+                    int add = algorithmMapper.update(po);
+                    if (add > 0) {
+                        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+                    }else {
+                        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "编辑失败");
+                    }
                 }
             }else {
-                //编辑
-                AlgorithmPO po = setPo(param, true);
-                int add = algorithmMapper.update(po);
-                if (add > 0) {
-                    return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+                MinioParameter minioParameter = new MinioParameter();
+                minioParameter.setObjectName(minioPath);
+                Response remove =fileDownService.remove(minioParameter);
+                if(remove.status() == 200){
+                    return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"该算法经校验不可用,无法保存,算法文件已删除!");
                 }else {
-                    return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "编辑失败");
+                    return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"该算法经校验不可用,无法保存,算法文件删除失败!");
                 }
             }
+
         }
     }
 
@@ -172,13 +200,36 @@ public class AlgorithmServiceImpl implements AlgorithmService {
     @Override
     public ResponseBodyVO testConnection(AlgorithmParameter param) {
         try{
-            Map<String, Ref> asMap = JgitUtil.testConnectionByToken(param.getGitUrl(),param.getGitToken());
+            Map<String, Ref> asMap = JgitUtil.testConnection(param.getGitUrl(), param.getGitUserName(), param.getGitPassword());
         } catch (Exception e){
             return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"连接失败!");
         }
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,"连接成功");
     }
 
+    @Override
+    public ResponseBodyVO getGitVersion(AlgorithmParameter param) throws IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
+
+        AlgorithmPO po = algorithmMapper.selectDetailsById(param);
+        String gitUrl = po.getGitUrl();
+        if(StringUtil.isEmpty(gitUrl)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
+        }
+        //拼接get请求地址
+        String prefix = "https://api.github.com/repos/";
+        String suffix = "/commits?page=1&per_page=1";
+        String gitInfo = gitUrl.substring(19, gitUrl.length()-4);
+        String requestUrl = prefix + gitInfo + suffix;
+        String result = HttpUtil.get(HttpUtil.getHttpClient(), HttpUtil.getRequestConfig(), requestUrl);
+        List<HashMap> hashMaps = JsonUtil.jsonToList(result, HashMap.class);
+        String sha = "";
+        if(hashMaps.size() > 0){
+            HashMap hashMap = hashMaps.get(0);
+            sha = hashMap.get("sha").toString();
+        }
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,"请求成功", sha);
+    }
+
     @Override
     public ResponseBodyVO isAlgorithmRunning(AlgorithmParameter param)
     {
@@ -247,9 +298,11 @@ public class AlgorithmServiceImpl implements AlgorithmService {
         //设置po信息
         if("2".equals(param.getUploadMode())){ //使用仓库地址上传
             String gitUrl = param.getGitUrl();
-            String gitToken = param.getGitToken();
+            String gitUserName = param.getGitUserName();
+            String gitPassword = param.getGitPassword();
             po.setGitUrl(gitUrl);
-            po.setGitToken(gitToken);
+            po.setGitUserName(gitUserName);
+            po.setGitPassword(gitPassword);
         }else {
             String minioPath = param.getMinioPath();
             String[] splits = minioPath.split("/");
@@ -267,13 +320,13 @@ public class AlgorithmServiceImpl implements AlgorithmService {
 
         if(isEdit){
             po.setModifyTime(TimeUtil.getNowForMysql());
-            po.setCreateUserId(AuthUtil.getCurrentUserId());
+            po.setModifyUserId(AuthUtil.getCurrentUserId());
         }else {
             po.setIsDeleted("0");
             po.setCreateTime(TimeUtil.getNowForMysql());
             po.setModifyTime(TimeUtil.getNowForMysql());
             po.setCreateUserId(AuthUtil.getCurrentUserId());
-            po.setModifyTime(TimeUtil.getNowForMysql());
+            po.setModifyUserId(AuthUtil.getCurrentUserId());
         }
         return po;
 

+ 2 - 3
simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/MyUserAuthenticationConverter.java

@@ -31,9 +31,8 @@ public class MyUserAuthenticationConverter extends DefaultUserAuthenticationConv
         MyUserDetails userDetails = new MyUserDetails();
         userDetails.setId((String) map.get("id"));
         userDetails.setUsername((String) map.get("username"));
-        userDetails.setPhone((String) map.get("phone"));
-        userDetails.setIsSub((String) map.get("isSub"));
-        userDetails.setParentId((String) map.get("parentId"));
+        userDetails.setRoleCode((String) map.get("roleCode"));
+        userDetails.setCreateUserId((String) map.get("createUserId"));
         return new UsernamePasswordAuthenticationToken(userDetails, "N/A", list);
     }
 

+ 3 - 3
simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/MyUserDetails.java

@@ -19,9 +19,9 @@ public class MyUserDetails implements UserDetails, Serializable {
     private String id;
     private String username;
     private String password;
-    private String phone;
-    private String isSub;
-    private String parentId;
+    private String roleCode;
+    private String userType;
+    private String createUserId;
     private Set<GrantedAuthority> authorities;
 
 

+ 1 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/common/oauth/OauthParameter.java

@@ -13,4 +13,5 @@ public class OauthParameter {
     private String checkTokenEndpointUrl;
     private String clientId;
     private String clientSecret;
+    private String simulationDefaultPassword = "123456";
 }

+ 21 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/common/utils/AuthUtil.java

@@ -18,4 +18,25 @@ public class AuthUtil {
         String userId = userDetails.getId();
         return userId;
     }
+
+    /**
+     * 获取当前登录人roleCode
+     */
+    public static String getCurrentUserRoleCode(){
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        MyUserDetails userDetails = (MyUserDetails)authentication.getPrincipal();
+        String roleCode = userDetails.getRoleCode();
+        return roleCode;
+    }
+
+    /**
+     * 获取当前登录人roleCode
+     */
+    public static String getCurrentUserType(){
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        MyUserDetails userDetails = (MyUserDetails)authentication.getPrincipal();
+        String userType = userDetails.getUserType();
+        return userType;
+    }
+
 }

+ 6 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/FileDownService.java

@@ -40,7 +40,13 @@ public interface FileDownService {
     @PostMapping("/minio/list")
     ResponseBodyVO<List<String>> list( @RequestBody @Validated MinioParameter minioParameter );
 
+    @PostMapping("/minio/listDeepOne")
+    ResponseBodyVO<List<String>> listDeepOne( @RequestBody @Validated MinioParameter minioParameter );
+
     @RequestMapping("/minio/getPreviewUrl")
     ResponseBodyVO<String> getPreviewUrl(@RequestBody @Validated MinioParameter minioParameter);
 
+    @PostMapping("/minio/remove")
+    Response remove(@RequestBody @Validated MinioParameter minioParameter);
+
 }

+ 24 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/SchedulerService.java

@@ -0,0 +1,24 @@
+package com.css.simulation.resource.feign;
+
+import api.common.pojo.common.ResponseBodyVO;
+import com.css.simulation.resource.common.config.FeignConfiguration;
+import com.css.simulation.resource.feign.fallback.SchedulerServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+//@FeignClient(name = "scheduler", url = "http://47.94.105.148", path = "/simulation/resource/scheduler", fallback = SchedulerServiceFallback.class, configuration = FeignConfiguration.class)
+@FeignClient(
+        contextId = "scheduler",
+        value = "simulation-resource-scheduler",
+        path = "/simulation/resource/scheduler",
+        fallback = SchedulerServiceFallback.class,
+        configuration = FeignConfiguration.class
+)
+public interface SchedulerService {
+
+    @PostMapping(value = "/algorithm/check")
+    ResponseBodyVO<String> check(@RequestParam("minioPath") String minioPath);
+
+}

+ 10 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/fallback/FileDownServiceFallback.java

@@ -46,9 +46,19 @@ public class FileDownServiceFallback implements FileDownService {
         return null;
     }
 
+    @Override
+    public ResponseBodyVO<List<String>> listDeepOne(@RequestBody @Validated MinioParameter minioParameter) {
+        return null;
+    }
+
     @Override
     public ResponseBodyVO<String> getPreviewUrl(@RequestBody @Validated MinioParameter minioParameter) {
         return null;
     }
 
+    @Override
+    public Response remove(@RequestBody @Validated MinioParameter minioParameter) {
+        log.error("------- 删除错误:" + minioParameter.getObjectName());
+        return null;
+    }
 }

+ 13 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/fallback/SchedulerServiceFallback.java

@@ -0,0 +1,13 @@
+package com.css.simulation.resource.feign.fallback;
+
+import api.common.pojo.common.ResponseBodyVO;
+import com.css.simulation.resource.feign.SchedulerService;
+import org.springframework.web.bind.annotation.RequestParam;
+
+public class SchedulerServiceFallback implements SchedulerService {
+
+    @Override
+    public ResponseBodyVO<String> check(@RequestParam String minioPath){
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE);
+    }
+}

+ 3 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/project/constants/ProjectConstants.java

@@ -8,6 +8,9 @@ public class ProjectConstants {
     //任务运行 Kafka推送主题
     public static final String RUN_TASK_TOPIC = "manualProject";
 
+    //任务终止,kafka推送主题
+    public static final String STOP_TASK_TOPPIC = "manualProject-stop";
+
     //第三方算法类型(索为)
     public static final String SY_ALGORITHM_TYPE="3";
 

+ 20 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/project/ctrl/SimulationProjectCtrl.java

@@ -222,6 +222,26 @@ public class SimulationProjectCtrl {
     }
 
 
+    /**
+     * 添加编辑自动项目
+     * @param param
+     * @return
+     */
+    @RequestMapping("addOrUpdateAutomaticProject")
+    @ResponseBody
+    public ResponseBodyVO addOrUpdateAutomaticProject(@RequestBody SimulationManualProjectParam param){
+        return service.addOrUpdateAutomaticProject(param);
+    }
 
 
+    /**
+     * 删除自动运行工作(支持批量删除)
+     * @return
+     */
+    @RequestMapping("deleteAutomaticProjectByids")
+    @ResponseBody
+    public ResponseBodyVO deleteAutomaticProjectByids(@RequestBody SimulationManualProjectParam param){
+        return service.deleteAutomaticProjectByids(param);
+    }
+
 }

+ 197 - 19
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -27,10 +27,7 @@ import com.css.simulation.resource.project.constants.ProjectConstants;
 import com.css.simulation.resource.project.enums.ProjectRunStateEnum;
 import com.css.simulation.resource.project.enums.SceneTypeEnum;
 import com.css.simulation.resource.project.feign.KafkaService;
-import com.css.simulation.resource.project.mapper.SimulationMptFirstTargetScoreMapper;
-import com.css.simulation.resource.project.mapper.SimulationMptLastTargetScoreMapper;
-import com.css.simulation.resource.project.mapper.SimulationProjectMapper;
-import com.css.simulation.resource.project.mapper.SimulationProjectTaskMapper;
+import com.css.simulation.resource.project.mapper.*;
 import com.css.simulation.resource.project.service.SimulationProjectService;
 import com.css.simulation.resource.system.service.DictService;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -72,6 +69,9 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     @Autowired
     private SimulationProjectMapper simulationProjectMapper;
 
+    @Autowired
+    private SimulationAutomaticProjectMapper simulationAutomaticProjectMapper;
+
     @Autowired
     private SimulationProjectTaskMapper simulationProjectTaskMapper;
 
@@ -296,6 +296,12 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
         }
 
+        //项目终止,推送到kafka
+        if(DictConstants.PROJECT_TERMINATED.equals(param.getNowRunState())){
+            projectStopToKafka(po);
+        }
+
+
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
 
     }
@@ -312,8 +318,19 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         kafkaParameter.setTopic(ProjectConstants.RUN_TASK_TOPIC);
         String data = JsonUtil.beanToJson(kafkaParam);
         kafkaParameter.setData(data);
-        log.info("推送消息到kafka:"+data);
+        log.info("推送项目运行消息到kafka:"+data);
+        kafkaService.send(kafkaParameter);
+    }
+    private void projectStopToKafka(SimulationManualProjectPo po) throws JsonProcessingException{
+        SimulationManualProjectKafkaParam kafkaParam = new SimulationManualProjectKafkaParam();
+        kafkaParam.setProjectId(po.getId());
+        KafkaParameter kafkaParameter = new KafkaParameter();
+        kafkaParameter.setTopic(ProjectConstants.STOP_TASK_TOPPIC);
+        String data = JsonUtil.beanToJson(kafkaParam);
+        kafkaParameter.setData(data);
+        log.info("推送项目中止消息到kafka:"+data);
         kafkaService.send(kafkaParameter);
+
     }
 
     @Override
@@ -439,6 +456,17 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         projectDetailsVo.setStateList(projectRunStateNumVos);
         projectDetailsVo.setResultList(projectRunResultRatioNumVos);
 
+        projectDetailsVo.setParallelism(po.getParallelism());
+        projectDetailsVo.setMaxSimulationTime(po.getMaxSimulationTime());
+        String isChoiceGpu = po.getIsChoiceGpu();
+        String g = "";
+        if("0".equals(isChoiceGpu)){
+            g = "是";
+        }else if("1".equals(isChoiceGpu)){
+            g = "否";
+        }
+        projectDetailsVo.setIsChoiceGpu(g);
+
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, projectDetailsVo);
     }
 
@@ -562,7 +590,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         /*
         汇总测试得分计算方法:(每一项一级指标的测试得分*测试权重)累加
         得分率计算方法:每一项一级指标的所有场景得分不为0的数量/每一项一级指标的场景数量
-        汇总得分率计算方法:每一项一级指标的所有场景得分不为0的数量_累加/每一项一级指标的场景数量_累加
+        汇总得分率计算方法:每一项一级指标的所有场景得分不为0的数量_累加/每一项一级指标的场景数量_累加)换成(得分累加取平均值)
          */
         List<ScenePackageSubListVO> scenePackageSubListVOS = simulationProjectMapper.selectSubSceneByPid(po.getScene());
 
@@ -594,7 +622,8 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 //单个二级指标得分
                 SimulationMptFirstTargetScorePo simulationMptFirstTargetScorePo1 = simulationMptFirstTargetScoreMapper.selectFirstTargetScore(simulationMptFirstTargetScorePo);
                 Double score = simulationMptFirstTargetScorePo1.getScore();
-                totalScore += score*(weightDouble/100);
+                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();
@@ -612,7 +641,17 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             //指标权重总和默认是100%
             algorithmScoreVo.setWeight("100");
             algorithmScoreVo.setScore(saveTwoDecimalPlaces(totalScore));
-            totalScoreRatio = Double.valueOf(totalSceneScoreNum)/Double.valueOf(totalSceneNum)*100;
+
+//            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());
+            }
+
             algorithmScoreVo.setScoreRatio(saveTwoDecimalPlaces(totalScoreRatio));
             algorithmScoreVoList.add(algorithmScoreVo);
 
@@ -641,7 +680,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 //        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(po.getScene());
 
         //指标得分列表
-        Map<String, Object> stringObjectMap = selectScenePackageSubListAndSetScore(po.getScene());
+        Map<String, Object> stringObjectMap = selectScenePackageSubListAndSetScore(po.getScene(),po.getId());
         projectReportVo.setSubListScoreLiTitle((List<Map>) stringObjectMap.get("cloums"));
         projectReportVo.setSubListScoreLi((List<SubScListVo>) stringObjectMap.get("result"));
 
@@ -1261,7 +1300,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
     private SimulationManualProjectVo convertPoToVo(SimulationManualProjectVo vo){
         Date createTime = vo.getCreateTime();
-        vo.setCreateTimeFmt(getRqStr(createTime, 2));
+        vo.setCreateTimeFmt(getRqStr(createTime, 1));
         String algorithm = vo.getAlgorithm();
 
         AlgorithmPO algorithmPO = new AlgorithmPO();
@@ -1304,6 +1343,20 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
     }
 
+    private void createProjectId(SimulationAutomaticProjectPo po){
+        Integer nowRq = getRq(null,0);
+        po.setProjectDate(nowRq);
+        SimulationAutomaticProjectPo po1 = simulationAutomaticProjectMapper.selectLastProjectId(nowRq);
+        if(po1 == null){
+            //生成新id
+            po.setProjectNum(1);
+        }else{
+            po.setProjectNum(po1.getProjectNum()+1);
+        }
+        po.setProjectId(po.getProjectDate()+"-"+po.getProjectNum());
+
+    }
+
     private Integer getRq(Date date, int index){
         return  TimeUtil.getRq(date,index);
     }
@@ -1464,7 +1517,10 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     private Map<String, Object> selectSceneScore(String scenePackageId, String projectId) {
 
         //查询场景包所有数据
-        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(scenePackageId);
+        SimulationManualProjectParam query = new SimulationManualProjectParam();
+        query.setId(projectId);
+        query.setPackageId(scenePackageId);
+        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(query);
 
         HashMap<String, Object> hashMap = new HashMap<>();
 
@@ -1483,24 +1539,45 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                     if (sc.getLastTargerId().equals(po.getId())) {
                         SublistScoreVo sublistScoreVo = new SublistScoreVo();
                         BeanUtils.copyProperties(po, sublistScoreVo);
+                        sublistScoreVo.setRunResult(sc.getRunResult());
 
-                        sublistScoreVo.setSceneScore(sc.getScore()); //得分
+                        sublistScoreVo.setSceneScore(saveTwoDecimalPlaces(sc.getScore())); //得分
                         sublistScoreVo.setTargetEvaluate(sc.getTargetEvaluate());//指标评价
-                        sublistScoreVo.setReturnSceneId(sc.getReturnSceneId());//显示的场景id
+//                        sublistScoreVo.setReturnSceneId(sc.getReturnSceneId());//显示的场景id
                         String sceneType = sc.getSceneType();
+                        String sceneName = "";
                         if(DictConstants.SCENE_NATURAL.equals(sceneType)){
                             //自然驾驶
                             sublistScoreVo.setSceneType("自然驾驶");
+                            //获取场景名称
+                            SceneBaseInfoVo sceneBaseInfoVo = simulationProjectMapper.selectSceneNatural(sc.getSceneId());
+                            if(sceneBaseInfoVo != null){
+                                sceneName = sceneBaseInfoVo.getNaturalName();
+                            }
+
                         }else if(DictConstants.SCENE_STANDARD.equals(sceneType)){
                             //标准法规
                             sublistScoreVo.setSceneType("标准法规");
+                            //获取场景名称
+                            SceneBaseInfoVo sceneBaseInfoVo = simulationProjectMapper.selectSceneStandardsRegulations(sc.getSceneId());
+                            if(sceneBaseInfoVo != null){
+                                sceneName = sceneBaseInfoVo.getSceneName();
+                            }
+
                         }else if(DictConstants.SCENE_ACCIDENT.equals(sceneType)){
                             //交通事故
                             sublistScoreVo.setSceneType("交通事故");
+                            //获取场景名称
+                            SceneBaseInfoVo sceneBaseInfoVo = simulationProjectMapper.selectSceneAccidentById(sc.getSceneId());
+                            if(sceneBaseInfoVo != null){
+                                sceneName = sceneBaseInfoVo.getSceneName();
+                            }
+
                         }else if(DictConstants.SCENE_GENERAL.equals(sceneType)){
                             /// TODO 泛化场景暂不支持
 
                         }
+                        sublistScoreVo.setReturnSceneId(sceneName);//显示场景名称
 
                         lastSubList.add(sublistScoreVo);
                     }
@@ -1510,6 +1587,9 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
         int size = 0;
         List<List<String>> result = new ArrayList<>();
+
+        //新增返回状态
+        ArrayList<String> runStateList = new ArrayList<>();
         //末级指标
         for(SublistScoreVo sp : lastSubList){
             setParentSub(sp, null, pos);
@@ -1525,11 +1605,12 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 size = strings.size();
             }
             result.add(strings);
-
+            runStateList.add(sp.getRunResult());
         }
 
         List<SceneScListVo> objects = new ArrayList<>();
         //结果补全
+        int r = 0;
         for(List<String> list : result){
             int start = list.size() - 5;
             SceneScListVo sceneScListVo = new SceneScListVo();
@@ -1556,7 +1637,10 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             sceneScListVo.setTargetEvaluate(list.get(start+3));
             sceneScListVo.setScoreExplain(list.get(start+4));
 
+            sceneScListVo.setRunState(runStateList.get(r));
+
             objects.add(sceneScListVo);
+            r ++;
         }
 
         List<Map<String, String>> cloums = new ArrayList<>();
@@ -1639,10 +1723,13 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
 
 
-    private Map<String,Object> selectScenePackageSubListAndSetScore(String scenePackageId){
+    private Map<String,Object> selectScenePackageSubListAndSetScore(String scenePackageId, String projectId){
 
         //查询场景包所有数据
-        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(scenePackageId);
+        SimulationManualProjectParam query = new SimulationManualProjectParam();
+        query.setId(projectId);
+        query.setPackageId(scenePackageId);
+        List<SublistScoreVo> pos = simulationProjectMapper.selectSubScore(query);
 
         HashMap<String, Object> hashMap = new HashMap<>();
 
@@ -1655,8 +1742,16 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 setParent(po,null,pos,scenePackageId);
 
                 String sublistName = po.getSublistName();
-                String firstScore = po.getFirScore();//first得分
-                String LastScore = po.getLasScore();//last得分
+                Double firScore = po.getFirScore();
+                String firstScore = "";//first得分
+                if(firScore != null){
+                    firstScore = saveTwoDecimalPlaces(firScore,1).toString();
+                }
+                Double lasScore = po.getLasScore();
+                String LastScore = "";//last得分
+                if(lasScore != null){
+                    LastScore = saveTwoDecimalPlaces(lasScore,1).toString();
+                }
                 String sceneNum = po.getSceneNum();//场景数量
                 String notStandardSceneNum = po.getNotStandardSceneNum();//未达标场景数量
 
@@ -2291,7 +2386,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             //表头
             PdfPTable pdfPTable = new PdfPTable(5);
             pdfPTable.setHeaderRows(1);//换页每页显示表头
-            addTitleList(pdfPTable, font, new String[]{"测试项目","场景数量","测试权重(%)","测试得分","得分率"});
+            addTitleList(pdfPTable, font, new String[]{"测试项目","场景数量","测试权重(%)","测试得分","得分率(%)"});
 
             //数据
             List<AlgorithmScoreVo> algorithmScoreList = vo.getAlgorithmScoreList();
@@ -3433,6 +3528,89 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
     }
 
+    @Override
+    public ResponseBodyVO addOrUpdateAutomaticProject(SimulationManualProjectParam param) {
+
+        if(isEmpty(param.getProjectName())){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"工作名称不能为空");
+        }
+
+        SimulationAutomaticProjectPo po = convertToSimulationAutomaticProjectPo(param);
+
+        if(isEmpty(param.getId())){
+            //工作名称一样的的不能创建
+            List<SimulationAutomaticProjectPo> simulationManualProjectPos = simulationAutomaticProjectMapper.selectAutomaticProjectByQuery(param);
+            if(!isEmpty(simulationManualProjectPos)){
+                return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"工作名称已经存在,请修改后再保存");
+            }
+            po.createPo(AuthUtil.getCurrentUserId());
+            //生成id
+            createProjectId(po);
+            int add = simulationAutomaticProjectMapper.add(po);
+            if(add > 0){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,ResponseBodyVO.Response.SUCCESS.getMessage(),po.getId());
+            }
+            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"添加失败");
+        }else{
+            //获取工作状态,仅未开始的才可以修改信息
+            SimulationAutomaticProjectPo saPo = simulationAutomaticProjectMapper.selectById(param.getId());
+            if(!ProjectRunStateEnum.NOT_START.getCode().equals(saPo.getNowRunState())){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"当前状态不支持修改");
+            }
+
+            po.updatePo(AuthUtil.getCurrentUserId());
+            int update = simulationAutomaticProjectMapper.updateById(po);
+            if(update > 0){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,ResponseBodyVO.Response.SUCCESS.getMessage(),po.getId());
+            }
+
+            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"修改失败");
+        }
+
+    }
+
+    @Override
+    public ResponseBodyVO deleteAutomaticProjectByids(SimulationManualProjectParam param) {
+        String ids = param.getIds();
+        if(isEmpty(ids)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
+        }
+        String[] idArr = ids.split(",");
+
+        //未执行和已中止的可以删除
+        List<SimulationAutomaticProjectPo> pos = simulationAutomaticProjectMapper.selectProjectNowRunState(idArr);
+        for(SimulationAutomaticProjectPo p : pos){
+            if(!isEmpty(p.getNowRunState()) && !ProjectRunStateEnum.NOT_START.getCode().equals(p.getNowRunState()) && !ProjectRunStateEnum.DISCONTINUE.getCode().equals(p.getNowRunState())){
+                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"数据不支持删除");
+            }
+        }
+
+        int i = simulationAutomaticProjectMapper.deleteProject(idArr);
+        if(i > 0){
+            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+        }
+
+        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE,"删除失败");
+    }
+
+    private SimulationAutomaticProjectPo convertToSimulationAutomaticProjectPo(SimulationManualProjectParam param){
+        SimulationAutomaticProjectPo po = new SimulationAutomaticProjectPo();
+        po.setId(param.getId());
+        po.setProjectName(param.getProjectName());
+        po.setProjectDescribe(param.getProjectDescribe());
+        po.setAlgorithm(param.getAlgorithm());
+        po.setVehicle(param.getVehicle());
+        po.setScene(param.getScene());
+        po.setOperationCycle(param.getOperationCycle());
+        po.setMaxSimulationTime(param.getMaxSimulationTime());
+        po.setParallelism(param.getParallelism());
+        po.setRuleView(param.getRuleView());
+        po.setIsChoiceGpu(param.getIsChoiceGpu());
+        po.setNowRunState(param.getNowRunState());
+        po.setAlgorithmType(param.getAlgorithmType());
+        return po;
+    }
+
     /**
      * 换行
      * @param lineNum 换行数量

+ 37 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/project/mapper/SimulationAutomaticProjectMapper.java

@@ -0,0 +1,37 @@
+package com.css.simulation.resource.project.mapper;
+
+import api.common.pojo.param.project.SimulationManualProjectParam;
+import api.common.pojo.po.algorithm.AlgorithmPO;
+import api.common.pojo.po.model.ConfigPO;
+import api.common.pojo.po.model.ConfigSensorPO;
+import api.common.pojo.po.model.VehiclePO;
+import api.common.pojo.po.project.*;
+import api.common.pojo.po.scene.ScenePackagePO;
+import api.common.pojo.vo.project.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface SimulationAutomaticProjectMapper {
+
+
+     SimulationAutomaticProjectPo selectById(String id);
+
+     List<SimulationAutomaticProjectPo> selectAutomaticProjectByQuery(SimulationManualProjectParam param);
+
+     SimulationAutomaticProjectPo selectLastProjectId(Integer nowRq);
+
+     int add(SimulationAutomaticProjectPo po);
+
+     int updateById(SimulationAutomaticProjectPo po);
+
+     List<SimulationAutomaticProjectPo> selectProjectNowRunState(String[] ids);
+
+     int deleteProject(String[] ids);
+
+
+}

+ 1 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/project/mapper/SimulationProjectMapper.java

@@ -85,7 +85,7 @@ public interface SimulationProjectMapper {
 
     List<SimulationManualProjectPo> selectProjectNowRunState(String[] ids);
 
-    List<SublistScoreVo> selectSubScore(String id);
+    List<SublistScoreVo> selectSubScore(SimulationManualProjectParam param);
 
     Integer selectRunProjectBySy(Map map);
 

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

@@ -2,11 +2,6 @@ package com.css.simulation.resource.project.service;
 
 import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.param.project.SimulationManualProjectParam;
-import com.itextpdf.text.DocumentException;
-import org.springframework.web.bind.annotation.RequestBody;
-
-import java.io.IOException;
-import java.util.Map;
 
 
 public interface SimulationProjectService {
@@ -61,4 +56,9 @@ public interface SimulationProjectService {
     void exportProjectTaskFileById(SimulationManualProjectParam param);
 
     void exportProjectReportAndTaskFileById(SimulationManualProjectParam param);
+
+    ResponseBodyVO addOrUpdateAutomaticProject(SimulationManualProjectParam param);
+
+    ResponseBodyVO deleteAutomaticProjectByids(SimulationManualProjectParam param);
+
 }

+ 16 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/FileController.java

@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 //文件上传下载
@@ -109,5 +110,20 @@ public class FileController {
         }
     }
 
+//从minio获取文件列表
+    @PostMapping(value = "/queryList")
+    public List<String> queryList(@RequestBody @Validated MinioParameter parms
+    ) throws IOException {
+        List<String> list = fileDownService.list(parms).getInfo();
+        return list;
+    }
+
+    @PostMapping(value = "/queryList1")
+    public List<String> queryList1(@RequestBody @Validated MinioParameter parms
+    ) throws IOException {
+        List<String> list = fileDownService.listDeepOne(parms).getInfo();
+        return list;
+    }
+
 
 }

+ 10 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/SceneAccidentController.java

@@ -1,6 +1,7 @@
 package com.css.simulation.resource.scene.ctrl;
 
 import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.param.MinioParameter;
 import api.common.pojo.param.scene.SceneAccidentParam;
 import api.common.pojo.po.scene.SceneAccidentPO;
 import api.common.pojo.vo.scene.SceneAccidentVO;
@@ -61,4 +62,13 @@ public class SceneAccidentController {
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
     }
 
+    //测试批量导入
+    @PostMapping("/saveAll")
+    @ResponseBody
+    public ResponseBodyVO<String> saveAll(@RequestBody MinioParameter parms) {
+
+      return  sceneAccidentService.importMiNio(parms);
+        //return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+    }
+
 }

+ 185 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/ctrl/SceneGeneralTemplateController.java

@@ -0,0 +1,185 @@
+package com.css.simulation.resource.scene.ctrl;
+
+import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.param.scene.SceneGeneralTemplateParam;
+import api.common.pojo.po.scene.SceneGeneralDataPO;
+import api.common.pojo.po.scene.SceneGeneralExamplePO;
+import api.common.pojo.po.scene.SceneGeneralTemplatePO;
+import api.common.pojo.vo.scene.SceneGeneralTemplateVO;
+import api.common.util.HttpUtil;
+import api.common.util.JsonUtil;
+import api.common.util.ObjectUtil;
+import api.common.util.TimeUtil;
+import com.css.simulation.resource.common.utils.PageUtil;
+import com.css.simulation.resource.feign.FileDownService;
+import com.css.simulation.resource.scene.service.SceneGeneralExampleService;
+import com.css.simulation.resource.scene.service.SceneGeneralTemplateService;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.pagehelper.PageInfo;
+import lombok.SneakyThrows;
+import org.apache.http.client.config.RequestConfig;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+//泛化场景
+@RestController
+@RequestMapping("/SceneGeneralTemplate")
+public class SceneGeneralTemplateController {
+
+    @Resource
+    SceneGeneralTemplateService sceneGeneralTemplateService;
+    @Resource
+    SceneGeneralExampleService exampleService;
+    @Resource
+    private FileDownService fileDownService;
+    //查询列表
+    @PostMapping("/querySceneGeneralTemplateList")
+    @ResponseBody
+    public ResponseBodyVO<List<SceneGeneralTemplatePO>> querySceneGeneralTemplateList(@RequestBody SceneGeneralTemplateParam po) {
+        PageUtil.setPageInfo(po);
+        List<SceneGeneralTemplatePO> list = sceneGeneralTemplateService.querySceneGeneralTemplateList(po);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,  new PageInfo<>(list));
+    }
+
+    //查模板详情
+    @PostMapping("/querySceneGeneralTemplateById")
+    @ResponseBody
+    public ResponseBodyVO<SceneGeneralTemplateVO> querySceneGeneralTemplateById(@RequestBody SceneGeneralTemplateParam param) {
+        if(param!=null&&ObjectUtil.isNotNull(param.getId())){
+            SceneGeneralTemplateVO po = sceneGeneralTemplateService.querySceneGeneralTemplateById(param.getId());
+            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, po);
+        }
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "参数id不能为空,请检查");
+
+    }
+
+    /*
+        //新增泛化模板
+        @PostMapping("/saveSceneGeneralTemplate")
+        @ResponseBody
+        public ResponseBodyVO<String> saveSceneGeneralTemplate() {
+            return   sceneGeneralTemplateService.saveSceneGeneralTemplate1();
+
+        }*/
+    //新增泛化模板
+    @PostMapping("/saveSceneGeneralTemplate")
+    @ResponseBody
+    public ResponseBodyVO<String> saveSceneGeneralTemplate(@RequestParam("file") MultipartFile multipartFile) {
+        File file = null;
+        String originalFilename =  multipartFile.getOriginalFilename();
+        if(originalFilename.indexOf(".xls")==-1&&originalFilename.indexOf(".xlsx")==-1){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "文件格式错误,请检查模板.");
+
+        }
+        //版本号
+        String version=TimeUtil.getToStringDate(new Date(),5);
+        try {
+            ResponseBodyVO<String> respon;
+            Integer nowTime = TimeUtil.getRq(new Date(), 0);
+          String  fileName = "泛化场景/" + version +"/"+originalFilename;
+            respon = fileDownService.upload(multipartFile, fileName);
+
+            String[] filename = originalFilename.split("\\.");
+            file = File.createTempFile(filename[0], filename[1]);
+            multipartFile.transferTo(file);
+            file.deleteOnExit();
+        } catch (IOException e) {
+            e.printStackTrace();
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "模板解析失败,请检查模板.");
+
+        }
+        return sceneGeneralTemplateService.saveSceneGeneralTemplate(file,version);
+
+    }
+
+    //删除泛化模板
+    @PostMapping("/deleteSceneGeneralTemplateById")
+    @ResponseBody
+    public ResponseBodyVO<String> deleteSceneGeneralTemplateById(@RequestBody SceneGeneralTemplatePO po) {
+        return sceneGeneralTemplateService.deleteSceneGeneralTemplateById(po);
+
+    }
+
+    //查看泛化实例详情页面
+
+    @PostMapping("/queryGeneralTemplateByFh")
+    @ResponseBody
+    public ResponseBodyVO queryGeneralTemplateByFh(@RequestBody SceneGeneralExamplePO param) {
+        if(param!=null&&ObjectUtil.isNotNull(param.getId())){
+            return  exampleService.querySceneGeneralExampleById(param.getId());
+        }
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "参数id不能为空,请检查");
+    }
+
+
+    //泛化实例保存及调用外部接口
+    @PostMapping("/saveSceneGeneralExample")
+    @ResponseBody
+    public ResponseBodyVO saveSceneGeneralExample(@RequestBody SceneGeneralTemplateVO vo) {
+        if(ObjectUtil.isNotNull(vo)){
+            return  exampleService.saveSceneGeneralExample(vo);
+        }
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "参数不能为空,请检查");
+    }
+
+    //查询模块名称
+    @PostMapping("/queryType")
+    @ResponseBody
+    public ResponseBodyVO queryType() {
+            return  exampleService.queryType();
+    }
+
+
+
+
+    //测试
+    @PostMapping("/test1")
+    @ResponseBody
+    public ResponseBodyVO test1(@RequestBody SceneGeneralTemplatePO po) throws IllegalAccessException, IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
+      Map map=  beanToMap(po);
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setSocketTimeout(6*10*1000)
+                .setConnectTimeout(6*10*1000)
+                .setConnectionRequestTimeout(6*10*1000)
+                .setRedirectsEnabled(false)
+                .setExpectContinueEnabled(false)
+                .build();
+
+        String post = HttpUtil.post(HttpUtil.getHttpClient(), requestConfig, "http://47.94.105.148:5000/test_1.0", null, map);
+        JsonNode params = JsonUtil.readTree(post).get("params");
+        // 实例化 ObjectMapper 对象
+        ObjectMapper objectMapper = new ObjectMapper();
+        String newjson = objectMapper.writeValueAsString(params);
+       List<SceneGeneralDataPO>  list=JsonUtil.jsonToList(newjson,SceneGeneralDataPO.class);
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "参数不能为空,请检查");
+    }
+
+    /**
+     * 对象转Map
+     * @param object
+     * @return
+     * @throws IllegalAccessException
+     */
+    public static Map beanToMap(Object object) throws IllegalAccessException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        Field[] fields = object.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            field.setAccessible(true);
+            map.put(field.getName(), field.get(object));
+        }
+        return map;
+    }
+
+}

+ 5 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneAccidentMapper.java

@@ -12,13 +12,17 @@ public interface SceneAccidentMapper {
 
     void saveSceneAccident(SceneAccidentPO params);
 
+    void saveSceneAccidentList(List<SceneAccidentPO> list);
+
     List<SceneAccidentPO> querySceneAccidentList(SceneAccidentParam params);
     List<SceneAccidentPO> querySceneAccidentListByXlk(SceneAccidentParam params);
     List<SceneAccidentPO> querySceneAccidentListByBq(SceneAccidentParam params);
 
     void deleteSceneAccidentList(SceneAccidentPO params);
 
-    Integer querySceneAccidentByNmae(String sceneName);
+    String querySceneAccidentByNmae(String sceneName);
+    void updateSceneAccident(SceneAccidentPO params);
+    void updateSceneAccidentList(List<SceneAccidentPO> list);
 
 
 }

+ 19 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralDataMapper.java

@@ -0,0 +1,19 @@
+package com.css.simulation.resource.scene.mapper;
+
+import api.common.pojo.po.scene.SceneGeneralDataPO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface SceneGeneralDataMapper {
+
+    void saveSceneGeneralDataAll(List<SceneGeneralDataPO> list);
+    List<SceneGeneralDataPO> querySceneGeneralDataList(SceneGeneralDataPO params);
+    SceneGeneralDataPO querySceneGeneralDataById(String id);
+
+
+
+}

+ 18 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralExampleMapper.java

@@ -0,0 +1,18 @@
+package com.css.simulation.resource.scene.mapper;
+
+import api.common.pojo.po.scene.SceneGeneralExamplePO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface SceneGeneralExampleMapper {
+
+    void saveSceneGeneralExampleAll(List<SceneGeneralExamplePO> list);
+    void saveSceneGeneralExample(SceneGeneralExamplePO  po);
+    SceneGeneralExamplePO querySceneGeneralExampleById(String id);
+
+
+}

+ 22 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneGeneralTemplateMapper.java

@@ -0,0 +1,22 @@
+package com.css.simulation.resource.scene.mapper;
+
+import api.common.pojo.param.scene.SceneGeneralTemplateParam;
+import api.common.pojo.po.scene.SceneGeneralTemplatePO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface SceneGeneralTemplateMapper {
+
+    void saveSceneGeneralTemplateAll(List<SceneGeneralTemplatePO> list);
+    List<SceneGeneralTemplatePO> querySceneGeneralTemplateList(SceneGeneralTemplateParam params);
+    SceneGeneralTemplatePO querySceneGeneralTemplateById(String id);
+    void deleteSceneGeneralTemplateAll(SceneGeneralTemplatePO po);
+    void deleteSceneGeneralTemplateById(SceneGeneralTemplatePO po);
+    List<String> queryType( );
+
+
+}

+ 5 - 1
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/SceneNaturalMapper.java

@@ -13,6 +13,7 @@ import java.util.Map;
 public interface SceneNaturalMapper {
 
     void saveSceneNatural(SceneNaturalPO params);
+    void saveSceneNaturalList(List<SceneNaturalPO> list);
 
     List<SceneNaturalPO> querySceneNaturalList(SceneNaturalParam params);
     List<SceneNaturalPO> querySceneNaturalListByBqAndXlk(Map<String,SceneNaturalParam> map);
@@ -20,8 +21,11 @@ public interface SceneNaturalMapper {
 
     void deleteSceneNatural(SceneNaturalPO params);
 
-    List<SceneNaturalPO> querySceneNaturaByName(SceneNaturalParam params);
+    String querySceneNaturaByName(String fileName);
 
     Integer querySceneNumBySy(SceneNaturalParam params);
 
+    void updateSceneNatural(SceneNaturalPO params);
+    void updateSceneNaturalList(List<SceneNaturalPO> list);
+
 }

+ 4 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/mapper/StandardsRegulationsMapper.java

@@ -12,13 +12,15 @@ import java.util.List;
 public interface StandardsRegulationsMapper {
 
     void saveStandardsRegulations(StandardsRegulationsPO params);
+    void saveStandardsRegulationsList(List<StandardsRegulationsPO> list);
 
     List<StandardsRegulationsPO> queryStandardsRegulationsList(StandardsRegulationsParam params);
     List<StandardsRegulationsPO> queryStandardsRegulationsListByBq(StandardsRegulationsParam params);
 
     void deleteStandardsRegulations(StandardsRegulationsPO params);
 
-    List<StandardsRegulationsPO> queryStandardsRegulationsByName(StandardsRegulationsParam params);
-
+    String queryStandardsRegulationsByName(String sceneName);
 
+    void updateStandardsRegulations(StandardsRegulationsPO params);
+    void updateStandardsRegulationsList(List<StandardsRegulationsPO> list);
 }

+ 342 - 73
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneAccidentService.java

@@ -15,19 +15,16 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import feign.Response;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-/*import org.apache.poi.util.IOUtils;
-import org.springframework.mock.web.MockMultipartFile;
+import org.apache.commons.fileupload.FileItem;
 import org.springframework.web.multipart.MultipartFile;
-import java.io.FileInputStream;
-import java.util.Date;*/
+import java.util.Date;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import javax.annotation.Resource;
 import java.io.File;
 import java.util.ArrayList;
-
 import java.util.List;
 
-
 @Slf4j
 @Service
 public class SceneAccidentService {
@@ -58,11 +55,7 @@ public class SceneAccidentService {
         JsonNode root = objMap.readTree(json);
         //判断场景名称唯一
         String sceneName = root.path("场景名称").asText();
-       Integer sceneNum = SceneAccidentMapper.querySceneAccidentByNmae(sceneName);
-        if (sceneNum > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
-        }
-
+        String sceneId = SceneAccidentMapper.querySceneAccidentByNmae(sceneName);
         SceneAccidentPO sceneAccidentPO = null;
         sceneAccidentPO = sceneAccidentPO.builder()
                 .accidentId(StringUtil.getRandomUUID())
@@ -75,13 +68,9 @@ public class SceneAccidentService {
                 .conflictType(root.path("冲突类型").asText())
                 .sceneTime(root.path("时间").asText())
                 .sceneWeather(root.path("天气").asText())
+                .maxTime(root.path("max_time").asText())
                 .isDeleted("0")
                 .build();
-        // -------------------------------- 保存数据到 mysql --------------------------------
-        sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
-        sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
-        sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
-
         if (null != param.getJsonAddress() && !param.getJsonAddress().equals("")) {
             sceneAccidentPO.setJsonAddress(param.getJsonAddress());
         }
@@ -97,11 +86,24 @@ public class SceneAccidentService {
         if (null != param.getVideoAddress() && !param.getVideoAddress().equals("")) {
             sceneAccidentPO.setVideoAddress(param.getVideoAddress());
         }
-        if (null != param.getVideoPreview() && !param.getVideoPreview().equals("")) {
-            sceneAccidentPO.setVideoPreview(param.getVideoPreview());
-        }
-        SceneAccidentMapper.saveSceneAccident(sceneAccidentPO);
+        if (ObjectUtil.isNull(sceneId)) {
+            // -------------------------------- 保存数据到 mysql --------------------------------
+            sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
+            sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
+            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
 
+
+         /*   if (null != param.getVideoPreview() && !param.getVideoPreview().equals("")) {
+                sceneAccidentPO.setVideoPreview(param.getVideoPreview());
+            }*/
+            SceneAccidentMapper.saveSceneAccident(sceneAccidentPO);
+        } else {
+            // -------------------------------- 修改数据到 mysql --------------------------------
+            sceneAccidentPO.setAccidentId(sceneId);
+            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+            sceneAccidentPO.setModifyUserId(AuthUtil.getCurrentUserId());
+            SceneAccidentMapper.updateSceneAccident(sceneAccidentPO);
+        }
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
 
     }
@@ -146,6 +148,7 @@ public class SceneAccidentService {
                             .conflictType(root.path("冲突类型").asText())
                             .sceneTime(root.path("时间").asText())
                             .sceneWeather(root.path("天气").asText())
+                            .maxTime(root.path("max_time").asText())
                             .isDeleted("0")
                             .build();
                     // -------------------------------- 保存数据到 mysql --------------------------------
@@ -177,19 +180,19 @@ public class SceneAccidentService {
     }
 
     public List<SceneAccidentPO> querySceneAccidentList(SceneAccidentParam params) {
-        if(ObjectUtil.isNotNull(params.getSceneName()) || (params.getSelfDriving()!=null&&params.getSelfDriving().size()>0)||(params.getTargetDriving()!=null&&params.getTargetDriving().size()>0)
-        || (params.getSelfReaction()!=null&&params.getSelfReaction().size()>0)||(params.getConflictType()!=null&&params.getConflictType().size()>0)||(params.getConflictBehavior()!=null&&params.getConflictBehavior().size()>0)||(params.getIds()!=null&&params.getIds().length>0)){
+        if (ObjectUtil.isNotNull(params.getSceneName()) || (params.getSelfDriving() != null && params.getSelfDriving().size() > 0) || (params.getTargetDriving() != null && params.getTargetDriving().size() > 0)
+                || (params.getSelfReaction() != null && params.getSelfReaction().size() > 0) || (params.getConflictType() != null && params.getConflictType().size() > 0) || (params.getConflictBehavior() != null && params.getConflictBehavior().size() > 0) || (params.getIds() != null && params.getIds().length > 0)) {
             params.setXlk("1");
         }
-        if(ObjectUtil.isNotNull(params.getRearEndCollision()) ||ObjectUtil.isNotNull(params.getCutIn()) ||ObjectUtil.isNotNull(params.getDriveCurve()) ||ObjectUtil.isNotNull(params.getCarConflict())){
+        if (ObjectUtil.isNotNull(params.getRearEndCollision()) || ObjectUtil.isNotNull(params.getCutIn()) || ObjectUtil.isNotNull(params.getDriveCurve()) || ObjectUtil.isNotNull(params.getCarConflict())) {
             params.setBq(1);
         }
         List<SceneAccidentPO> list = null;
-        if((params.getXlk().equals("1")&&params.getBq().equals(1))||(params.getXlk().equals("0")&&params.getBq().equals(0))||(params.getXlk().equals("1")&&params.getBq().equals(0))){
+        if ((params.getXlk().equals("1") && params.getBq().equals(1)) || (params.getXlk().equals("0") && params.getBq().equals(0)) || (params.getXlk().equals("1") && params.getBq().equals(0))) {
             list = SceneAccidentMapper.querySceneAccidentList(params);
         }/*else if(params.getXlk().equals("1")&&params.getBq().equals("0")){
             list = SceneAccidentMapper.querySceneAccidentListByXlk(params);
-        }*/else if(params.getXlk().equals("0")&&params.getBq().equals(1)){
+        }*/ else if (params.getXlk().equals("0") && params.getBq().equals(1)) {
             list = SceneAccidentMapper.querySceneAccidentListByBq(params);
         }
 
@@ -249,31 +252,31 @@ public class SceneAccidentService {
             params.setAllIds(listA);
         }*/
 
-        for (SceneAccidentPO po: list) {
-            if(po.getConflictBehavior().indexOf("追尾")>-1){
+        for (SceneAccidentPO po : list) {
+            if (po.getConflictBehavior().indexOf("追尾") > -1) {
                 po.setLabel("追尾");
             }
-            if(po.getTargetDriving().indexOf("切入")>-1){
-                if(ObjectUtil.isNull(po.getLabel())){
+            if (po.getTargetDriving().indexOf("切入") > -1) {
+                if (ObjectUtil.isNull(po.getLabel())) {
                     po.setLabel("目标车切入");
-                }else{
-                    po.setLabel(po.getLabel()+",目标车切入");
+                } else {
+                    po.setLabel(po.getLabel() + ",目标车切入");
                 }
 
             }
-            if(po.getTargetDriving().indexOf("沿弯道行驶")>-1){
-                if(ObjectUtil.isNull(po.getLabel())){
+            if (po.getTargetDriving().indexOf("沿弯道行驶") > -1) {
+                if (ObjectUtil.isNull(po.getLabel())) {
                     po.setLabel("目标车沿弯道行驶");
-                }else{
-                    po.setLabel(po.getLabel()+",目标车沿弯道行驶");
+                } else {
+                    po.setLabel(po.getLabel() + ",目标车沿弯道行驶");
                 }
 
             }
-            if(po.getConflictType().indexOf("机动车-机动车")>-1){
-                if(ObjectUtil.isNull(po.getLabel())){
+            if (po.getConflictType().indexOf("机动车-机动车") > -1) {
+                if (ObjectUtil.isNull(po.getLabel())) {
                     po.setLabel("机动车-机动车冲突");
-                }else{
-                    po.setLabel(po.getLabel()+",机动车-机动车冲突");
+                } else {
+                    po.setLabel(po.getLabel() + ",机动车-机动车冲突");
                 }
             }
         }
@@ -289,10 +292,9 @@ public class SceneAccidentService {
         //systemUserSceneService.deleteSystemUserSceneBySceneId(params.getAccidentId());
     }
 
-
-/*    *//**
+    /*
      * 获取交通事故场景数据:
-     *//*
+     */
     @SneakyThrows
     public ResponseBodyVO<String> saveAll(SceneAccidentParam param) {
         //1 获取所有目录下所有场景
@@ -305,8 +307,9 @@ public class SceneAccidentService {
 
         String fileName = null;
         try {
-            List<SceneAccidentPO> list=new ArrayList<SceneAccidentPO>();
-                Integer wJNum=1;
+            List<SceneAccidentPO> list = new ArrayList<SceneAccidentPO>();
+            List<SceneAccidentPO> updateList = new ArrayList<SceneAccidentPO>();
+            Integer wJNum = 1;
             for (File scene1 : scenes) {
                 String dataUrlNew = scene1.getAbsolutePath();
                 File[] scenes1 = FileUtil.getDirectory(dataUrlNew).listFiles();
@@ -317,15 +320,19 @@ public class SceneAccidentService {
                 Integer nowTime = TimeUtil.getRq(new Date(), 0);
                 for (File scene : scenes1) {
                     String dataUrl = scene.getAbsolutePath();
-                   // File pdfFile = new File(dataUrl);
-                    fileName= scene.getName();
+                    // File pdfFile = new File(dataUrl);
+                    fileName = scene.getName();
                     //文件上传测试1  遍历拿到的文件scene
-                    FileInputStream inputStream = new FileInputStream(scene);
+                   /* FileInputStream inputStream = new FileInputStream(scene);
                     MultipartFile multipartFile = new MockMultipartFile("file", fileName, "text/plain", IOUtils.toByteArray(inputStream));
+                 */
+                    FileItem fileItem = XmlParse.createFileItem(scene.getPath(), scene.getName());
+                    MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
+                    fileItem.delete();
                     //调用文件上传方法
-                   String  nowNum=nowTime+""+wJNum;
-                    String  objectName = "交通事故场景1111/" + nowNum  + "/" + fileName;
-                    ResponseBodyVO<String> respon= fileDownService.upload(multipartFile, objectName);
+                    String nowNum = nowTime + "" + wJNum;
+                    String objectName = "交通事故场景1111/" + nowNum + "/" + fileName;
+                    ResponseBodyVO<String> respon = fileDownService.upload(multipartFile, objectName);
 
                     if (dataUrl.indexOf(".json") != -1) {
                         // -------------------------------- 读取结构化数据文件 --------------------------------
@@ -334,11 +341,8 @@ public class SceneAccidentService {
                         ObjectMapper objMap = new ObjectMapper();
                         JsonNode root = objMap.readTree(json);
                         //判断是否存在
-                        String sceneName=root.path("场景名称").asText();
-                        Integer sceneNum = SceneAccidentMapper.querySceneAccidentByNmae(root.path("场景名称").asText());
-                        if (sceneNum > 0) {
-                            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
-                        }
+                        String sceneName = root.path("场景名称").asText();
+                        String sceneId = SceneAccidentMapper.querySceneAccidentByNmae(root.path("场景名称").asText());
                         sceneAccidentPO = sceneAccidentPO.builder()
                                 .accidentId(StringUtil.getRandomUUID())
                                 .sceneName(root.path("场景名称").asText())
@@ -350,34 +354,299 @@ public class SceneAccidentService {
                                 .conflictType(root.path("冲突类型").asText())
                                 .sceneTime(root.path("时间").asText())
                                 .sceneWeather(root.path("天气").asText())
+                                .maxTime(root.path("max_time").asText())
                                 .isDeleted("0")
                                 .build();
                         // -------------------------------- 保存数据到 mysql --------------------------------
-                        sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
-                        sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
-                        sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
-                    }
-                    //插入地址
-                    if (null != objectName && objectName.indexOf(".json")!=-1) {
-                        sceneAccidentPO.setJsonAddress(objectName);
-                    }else if (null != objectName && objectName.indexOf(".xml")!=-1) {
-                        sceneAccidentPO.setXmlAddress(objectName);
-                    }else if (null != objectName && objectName.indexOf(".xodr")!=-1) {
-                        sceneAccidentPO.setXodrAddress(objectName);
-                    }else if (null != objectName && objectName.indexOf(".osgb")!=-1) {
-                        sceneAccidentPO.setOsgbAddress(objectName);
-                    }else if (null != objectName && objectName.indexOf(".mp4")!=-1) {
-                        sceneAccidentPO.setVideoAddress(objectName);
+                        //插入地址
+                        if (null != objectName && objectName.indexOf(".json") != -1) {
+                            sceneAccidentPO.setJsonAddress(objectName);
+                        } else if (objectName.indexOf(".xml") != -1 || objectName.indexOf(".xosc") != -1) {
+                            sceneAccidentPO.setXmlAddress(objectName);
+                        } else if (null != objectName && objectName.indexOf(".xodr") != -1) {
+                            sceneAccidentPO.setXodrAddress(objectName);
+                        } else if (null != objectName && objectName.indexOf(".osgb") != -1) {
+                            sceneAccidentPO.setOsgbAddress(objectName);
+                        } else if (null != objectName && objectName.indexOf(".mp4") != -1) {
+                            sceneAccidentPO.setVideoAddress(objectName);
+                        }
+
+                        if (ObjectUtil.isNull(sceneId)) {
+                            sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
+                            sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
+                            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+                            // return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
+                        } else {
+                            sceneAccidentPO.setAccidentId(sceneId);
+                            sceneAccidentPO.setModifyUserId(AuthUtil.getCurrentUserId());
+                            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+
+
+                        }
                     }
                 }
-            list.add(sceneAccidentPO);
+                if (ObjectUtil.isNull(sceneAccidentPO.getModifyUserId())) {
+                    list.add(sceneAccidentPO);
+                } else {
+                    updateList.add(sceneAccidentPO);
+                }
                 wJNum++;
             }
-            //SceneAccidentMapper.saveSceneAccident(sceneAccidentPO);
+            if (ObjectUtil.isNotNull(list)) {
+                SceneAccidentMapper.saveSceneAccidentList(list);
+            }
+            if (ObjectUtil.isNotNull(updateList)) {
+                SceneAccidentMapper.updateSceneAccidentList(updateList);
+            }
+            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
         } catch (Exception e) {
+            e.printStackTrace();
             return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景文件" + fileName + "解析出错");
         }
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
 
+    }
+
+    /*
+     * 获取交通事故场景数据:最新的自己获取路径
+     */
+    @SneakyThrows
+    public ResponseBodyVO<String> saveAllNew(String dataUrl1) {
+        //1 获取所有目录下所有场景
+        // String dataUrl0 = "D:\\自然驾驶场景样例";     // 场景数据根路径
+        String dataUrl0 = "D:\\自然驾驶场景样例\\2021\\20210806";
+        File[] scenes = FileUtil.getDirectory(dataUrl0).listFiles();
+        if (scenes == null) {
+            throw new RuntimeException("目录:" + dataUrl0 + " 下没有文件!");
+        }
+        try {
+            List<SceneAccidentPO> list = new ArrayList<SceneAccidentPO>();
+            List<SceneAccidentPO> updateList = new ArrayList<SceneAccidentPO>();
+            for (File scene1 : scenes) {
+                String dataUrlNew = scene1.getAbsolutePath();
+                File[] scenes1 = FileUtil.getDirectory(dataUrlNew).listFiles();
+                if (scenes1 == null) {
+                    throw new RuntimeException("目录:" + dataUrlNew + " 下没有文件!");
+                }
+
+                for (File scene : scenes1) {
+                    //判断是否为场景文件夹
+                    if (scene.isDirectory()) {
+                        String dataUrlNew1 = scene.getAbsolutePath();
+                        File[] scenes2 = FileUtil.getDirectory(dataUrlNew1).listFiles();
+                        if (scenes2 == null) {
+                            throw new RuntimeException("目录:" + dataUrlNew1 + " 下没有文件!");
+                        }
+                        SceneAccidentPO sceneAccidentPO = null;
+                        String isUpdate = "";
+                        for (File scene3 : scenes2) {
+                            String dataUrl = scene3.getAbsolutePath();
+                            if (dataUrl.indexOf(".json") != -1) {
+                                // -------------------------------- 读取结构化数据文件 --------------------------------
+                                // -------------------------------- label.json --------------------------------
+                                String json = FileUtil.readFile(dataUrl);
+                                ObjectMapper objMap = new ObjectMapper();
+                                JsonNode root = objMap.readTree(json);
+                                //判断是否存在
+                                String sceneName = root.path("场景名称").asText();
+                                String sceneId = SceneAccidentMapper.querySceneAccidentByNmae(sceneName);
+                                sceneAccidentPO = sceneAccidentPO.builder()
+                                        .accidentId(StringUtil.getRandomUUID())
+                                        .sceneName(sceneName)
+                                        .scenceResume(root.path("场景描述").asText())
+                                        .selfDriving(root.path("自车驾驶行为").asText())
+                                        .targetDriving(root.path("目标驾驶行为").asText())
+                                        .selfReaction(root.path("自车反应行为").asText())
+                                        .conflictBehavior(root.path("冲突行为").asText())
+                                        .conflictType(root.path("冲突类型").asText())
+                                        .sceneTime(root.path("时间").asText())
+                                        .sceneWeather(root.path("天气").asText())
+                                        .maxTime(root.path("max_time").asText())
+                                        .isDeleted("0")
+                                        .build();
+
+                                String xodrAderss = root.path("xodr").asText();
+                                String osgbAderss = root.path("osgb").asText();
+                                sceneAccidentPO.setOsgbAddress(dataUrl0 + osgbAderss);
+                                sceneAccidentPO.setXodrAddress(dataUrl0 + xodrAderss);
+                                // -------------------------------- 保存数据到 mysql --------------------------------
+                                if (ObjectUtil.isNull(sceneId)) {
+                                    isUpdate = "0";
+                                    sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
+                                    sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
+                                    sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+                                    // return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
+                                } else {
+                                    isUpdate = "1";
+                                    sceneAccidentPO.setAccidentId(sceneId);
+                                    sceneAccidentPO.setModifyUserId(AuthUtil.getCurrentUserId());
+                                    sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+
+                                }
+                            }
+                            //插入地址
+                            if (dataUrl.indexOf(".json") != -1) {
+                                sceneAccidentPO.setJsonAddress(dataUrl);
+                            } else if (dataUrl.indexOf(".xml") != -1 || dataUrl.indexOf(".xosc") != -1) {
+                                sceneAccidentPO.setXmlAddress(dataUrl);
+                            } /*else if (dataUrl.indexOf(".xodr") != -1) {
+                        sceneAccidentPO.setXodrAddress(dataUrl);
+                    } else if (dataUrl.indexOf(".osgb") != -1) {
+                        sceneAccidentPO.setOsgbAddress(dataUrl);
+                    }*/ else if (dataUrl.indexOf("simulation.mp4") != -1) {
+                                sceneAccidentPO.setVideoAddress(dataUrl);
+                            } else if (dataUrl.indexOf("simulation.mp4") == -1 && dataUrl.indexOf(".mp4") != -1) {
+                                sceneAccidentPO.setVideoPreview(dataUrl);
+                            }
+
+                        }
+                        if (isUpdate.equals("0")) {
+                            list.add(sceneAccidentPO);
+                        } else if (isUpdate.equals("1")) {
+                            updateList.add(sceneAccidentPO);
+                        }
+
+                    }
+
+                }
+
+            }
+            if (ObjectUtil.isNotNull(list)) {
+                SceneAccidentMapper.saveSceneAccidentList(list);
+            }
+            if (ObjectUtil.isNotNull(updateList)) {
+                SceneAccidentMapper.updateSceneAccidentList(updateList);
+            }
+            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景文件" + dataUrl0 + "解析出错");
+        }
+
+
+    }
+
+/*    public static FileItem createFileItem(String filePath, String fileName){
+        String fieldName = "file";
+        FileItemFactory factory = new DiskFileItemFactory();
+        FileItem item = factory.createItem(fieldName, "text/plain", false,fileName);
+        File newfile = new File(filePath);
+        int bytesRead = 0;
+        byte[] buffer = new byte[8192];
+        try (FileInputStream fis = new FileInputStream(newfile);
+             OutputStream os = item.getOutputStream()) {
+            while ((bytesRead = fis.read(buffer, 0, 8192))!= -1)
+            {
+                os.write(buffer, 0, bytesRead);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return item;
     }*/
+
+
+    /**
+     * 获取交通事故场景数据:
+     */
+    public ResponseBodyVO<String> importMiNio(MinioParameter parms) {
+
+        MinioParameter MI = new MinioParameter();
+
+        MI.setObjectName(parms.getObjectName());
+        List<String>  errList=new ArrayList<>();
+        List<String> list = fileDownService.listDeepOne(MI).getInfo();
+        String OsgbPath=null;
+        String XodrPath=null;
+        for (String filePath:list) {
+            if (filePath.indexOf("/OSGB") != -1) {
+                OsgbPath = filePath;
+            } else if (filePath.indexOf("/XODR") != -1) {
+                XodrPath = filePath;
+            }
+        }
+        for (String filePath:list) {
+            if(filePath.indexOf("/Scenarios")!=-1){
+                MI.setObjectName(filePath);
+                List<String> listScene = fileDownService.listDeepOne(MI).getInfo();
+                for (String scenePath:listScene) {
+
+                    try {
+                        MI.setObjectName(scenePath);
+                        List<String> listAderss = fileDownService.list(MI).getInfo();
+                        SceneAccidentPO sceneAccidentPO = null;
+                        String isupdate = null;
+                        for (String adress : listAderss) {
+                            if (adress.indexOf(".json") != -1) {
+                                MI.setObjectName(adress);
+                                Response download = fileDownService.download(MI);
+                                // -------------------------------- label.json --------------------------------
+                                String json = download.body().toString();
+                                ObjectMapper objMap = new ObjectMapper();
+                                JsonNode root = objMap.readTree(json);
+                                //判断场景名称唯一
+                                String sceneName = root.path("场景名称").asText();
+                                String sceneId = SceneAccidentMapper.querySceneAccidentByNmae(sceneName);
+                                String osgbAdress = OsgbPath + "/" + root.path("osgb").asText();
+                                String xodrAdress = XodrPath + "/" + root.path("xodr").asText();
+                                sceneAccidentPO = sceneAccidentPO.builder()
+                                        .accidentId(StringUtil.getRandomUUID())
+                                        .sceneName(sceneName)
+                                        .scenceResume(root.path("场景描述").asText())
+                                        .selfDriving(root.path("自车驾驶行为").asText())
+                                        .targetDriving(root.path("目标驾驶行为").asText())
+                                        .selfReaction(root.path("自车反应行为").asText())
+                                        .conflictBehavior(root.path("冲突行为").asText())
+                                        .conflictType(root.path("冲突类型").asText())
+                                        .sceneTime(root.path("时间").asText())
+                                        .sceneWeather(root.path("天气").asText())
+                                        .maxTime(root.path("max_time").asText())
+                                        .xodrAddress(xodrAdress)
+                                        .osgbAddress(osgbAdress)
+                                        .isDeleted("0")
+                                        .build();
+                                if (ObjectUtil.isNull(sceneId)) {
+                                    isupdate = "0";
+                                } else {
+                                    isupdate = "1";
+                                    sceneAccidentPO.setAccidentId(sceneId);
+                                }
+
+                            }
+                            if (adress.indexOf(".json") != -1) {
+                                sceneAccidentPO.setJsonAddress(adress);
+                            } else if (adress.indexOf(".xml") != -1 || adress.indexOf(".xosc") != -1) {
+                                sceneAccidentPO.setXmlAddress(adress);
+                            } else if (adress.indexOf(".xodr") != -1) {
+                                sceneAccidentPO.setXodrAddress(adress);
+                            } else if (adress.indexOf(".osgb") != -1) {
+                                sceneAccidentPO.setOsgbAddress(adress);
+                            } else if (adress.indexOf(".mp4") != -1) {
+                                sceneAccidentPO.setVideoAddress(adress);
+                            }
+
+                        }
+                        if (isupdate.equals("0")) {
+                            // -------------------------------- 保存数据到 mysql --------------------------------
+                            sceneAccidentPO.setCreateTime(TimeUtil.getNowForMysql());
+                            sceneAccidentPO.setCreateUserId(AuthUtil.getCurrentUserId());
+                            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+                            SceneAccidentMapper.saveSceneAccident(sceneAccidentPO);
+                        } else if (isupdate.equals("1")) {
+                            // -------------------------------- 修改数据到 mysql --------------------------------
+                            sceneAccidentPO.setModifyTime(TimeUtil.getNowForMysql());
+                            sceneAccidentPO.setModifyUserId(AuthUtil.getCurrentUserId());
+                            SceneAccidentMapper.updateSceneAccident(sceneAccidentPO);
+                        }
+                    }catch (Exception e){
+                        errList.add(scenePath);
+                }
+                }
+            }
+
+        }
+
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+
+    }
+
 }

+ 232 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneGeneralExampleService.java

@@ -0,0 +1,232 @@
+package com.css.simulation.resource.scene.service;
+
+
+import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.param.scene.SceneGeneralTemplateParam;
+import api.common.pojo.po.scene.SceneGeneralDataPO;
+import api.common.pojo.po.scene.SceneGeneralExamplePO;
+import api.common.pojo.po.scene.SceneGeneralTemplatePO;
+import api.common.pojo.vo.scene.SceneGeneralTemplateMbVO;
+import api.common.pojo.vo.scene.SceneGeneralTemplateVO;
+import api.common.util.*;
+import com.css.simulation.resource.common.utils.AuthUtil;
+import com.css.simulation.resource.scene.mapper.SceneGeneralDataMapper;
+import com.css.simulation.resource.scene.mapper.SceneGeneralExampleMapper;
+import com.css.simulation.resource.scene.mapper.SceneGeneralTemplateMapper;
+import com.css.simulation.resource.system.service.DictService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.*;
+
+@Slf4j
+@Service
+public class SceneGeneralExampleService {
+
+    @Resource
+    SceneGeneralExampleMapper exampleMapper;
+    @Resource
+    SceneGeneralTemplateMapper templateMapper;
+    @Resource
+    SceneGeneralDataMapper dataMapper;
+    @Resource
+    SceneGeneralTemplateService sceneGeneralTemplateService;
+
+       @SneakyThrows
+       public  ResponseBodyVO querySceneGeneralExampleById(String id) {
+
+        SceneGeneralExamplePO examplePo= exampleMapper.querySceneGeneralExampleById(id);
+        if(ObjectUtil.isNotNull(examplePo)){
+            SceneGeneralTemplatePO templatePO=templateMapper.querySceneGeneralTemplateById(examplePo.getTemplateId());
+            if(ObjectUtil.isNotNull(templatePO)&&templatePO.getIsDeleted().equals("1")){
+                examplePo.setIsTure("1");
+            }
+        }
+
+
+           //转换为vo
+           SceneGeneralTemplatePO po=new SceneGeneralTemplatePO();
+           BeanUtils.copyProperties(examplePo, po);
+           SceneGeneralTemplateVO vo=new SceneGeneralTemplateVO();
+           BeanUtils.copyProperties(po, vo);
+           List<SceneGeneralTemplateMbVO>  listMb=new ArrayList<>();
+           if(po.getObsStartX().indexOf(";")!=-1){
+               listMb= sceneGeneralTemplateService.spliceVo(po);
+           }else{
+               SceneGeneralTemplateMbVO  mbVO=new SceneGeneralTemplateMbVO();
+               BeanUtils.copyProperties(po, mbVO);
+               mbVO.setGeneralizationType(po.getGeneralizationType());
+               listMb.add(mbVO);
+           }
+           vo.setListMb(listMb);
+
+
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, vo);
+
+    }
+
+    public  ResponseBodyVO queryType() {
+
+        List<String> list= templateMapper.queryType();
+
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, list);
+
+    }
+
+    @SneakyThrows
+    public  ResponseBodyVO saveSceneGeneralExample(SceneGeneralTemplateVO vo) {
+          /* //测试用
+        SceneGeneralTemplatePO po1=templateMapper.querySceneGeneralTemplateById(po.getTemplateId());
+        BeanUtils.copyProperties(po1, po);*/
+
+        //查询泛化标志位并赋值
+        SceneGeneralTemplatePO poV= templateMapper.querySceneGeneralTemplateById(vo.getTemplateId());
+        SceneGeneralExamplePO po=new SceneGeneralExamplePO();
+        //转换为vo
+        BeanUtils.copyProperties(vo, po);
+        po.setGeneralizationType(poV.getGeneralizationType());
+        po.setEgoVelocityStatus(poV.getEgoVelocityStatus());
+        po.setEgoTrajectory(poV.getEgoTrajectory());
+        po.setObsVelocityStatus(poV.getObsVelocityStatus());
+        po.setObsTrajectory(poV.getObsTrajectory());
+        //加个唯一值,确定文件夹唯一
+        po.setUuId(StringUtil.getRandomUUID());
+
+        //合并目标物
+        List<SceneGeneralTemplateMbVO> listMb=vo.getListMb();
+
+        String  obsStartX= "";
+        String  obsStartY="";;
+        String  obsStartVelocity= "";
+        String  obsLateralAcceleration="";
+        String  obsLongitudinalAcceleration= "";
+        String  obsHeadingAngleRel= "";
+        String  obsDurationTime= "";
+        String  obsVelocityTime= "";
+        String  obsTrailTime= "";
+
+        int a=0;
+        for (SceneGeneralTemplateMbVO mbVo: listMb) {
+            if(a<1){
+                obsStartX=mbVo.getObsStartX();
+                obsStartY=mbVo.getObsStartY();
+                obsStartVelocity= mbVo.getObsStartVelocity();
+                obsLateralAcceleration=mbVo.getObsLateralAcceleration();
+                obsLongitudinalAcceleration=mbVo.getObsLongitudinalAcceleration();
+                obsHeadingAngleRel= mbVo.getObsHeadingAngleRel();
+                obsDurationTime= mbVo.getObsDurationTime();
+                obsVelocityTime=mbVo.getObsVelocityTime();
+                obsTrailTime=mbVo.getObsTrailTime();
+            }else{
+                obsStartX=obsStartX+";"+mbVo.getObsStartX();
+                obsStartY=obsStartY+";"+mbVo.getObsStartY();
+                obsStartVelocity=obsStartVelocity+";"+mbVo.getObsStartVelocity();
+                obsLateralAcceleration=obsLateralAcceleration+";"+mbVo.getObsLateralAcceleration();
+                obsLongitudinalAcceleration=obsLongitudinalAcceleration+";"+mbVo.getObsLongitudinalAcceleration();
+                obsHeadingAngleRel=obsHeadingAngleRel +";"+mbVo.getObsHeadingAngleRel();
+                obsDurationTime=obsDurationTime +";"+mbVo.getObsDurationTime();
+                obsVelocityTime=obsVelocityTime+";"+mbVo.getObsVelocityTime();
+                obsTrailTime=obsTrailTime+";"+mbVo.getObsTrailTime();
+            }
+            a++;
+        }
+
+        po.setObsStartX(obsStartX);
+        po.setObsStartY(obsStartY);
+        po.setObsStartVelocity(obsStartVelocity);
+        po.setObsLateralAcceleration(obsLateralAcceleration);
+        po.setObsLongitudinalAcceleration(obsLongitudinalAcceleration);
+        po.setObsHeadingAngleRel(obsHeadingAngleRel);
+        po.setObsDurationTime(obsDurationTime);
+        po.setObsVelocityTime(obsVelocityTime);
+        po.setObsTrailTime(obsTrailTime);
+
+        //远程调用接口
+        Map map=  beanToMap(po);
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setSocketTimeout(6*10*1000)
+                .setConnectTimeout(6*10*1000)
+                .setConnectionRequestTimeout(6*10*1000)
+                .setRedirectsEnabled(false)
+                .setExpectContinueEnabled(false)
+                .build();
+
+        String post = HttpUtil.post(HttpUtil.getHttpClient(), requestConfig, "http://47.94.105.148:5000/test_1.0", null, map);
+        JsonNode params = JsonUtil.readTree(post).get("params");
+        // 实例化 ObjectMapper 对象
+        ObjectMapper objectMapper = new ObjectMapper();
+        String newjson = objectMapper.writeValueAsString(params);
+        List<SceneGeneralDataPO>  list=JsonUtil.jsonToList(newjson,SceneGeneralDataPO.class);
+
+        String sceneGeneralizationIds=null;
+        //生成指标id
+        String sublistId=StringUtil.getRandomUUID();
+        //生成实例主键id
+        String exampleId=StringUtil.getRandomUUID();
+        for (SceneGeneralDataPO datePo:list) {
+            //生成主键id
+            String dataId=StringUtil.getRandomUUID();
+            datePo.setId(dataId);
+            datePo.setCreateTime(TimeUtil.getNowForMysql());
+            datePo.setCreateUserId(AuthUtil.getCurrentUserId());
+            datePo.setModifyTime(TimeUtil.getNowForMysql());
+            datePo.setIsDeleted("0");
+            datePo.setSceneId(po.getSceneId());
+            datePo.setTemplateId(po.getId());
+            datePo.setExampleId(exampleId);
+            datePo.setSublistId(sublistId);
+            if(ObjectUtil.isNotNull(sceneGeneralizationIds)){
+                sceneGeneralizationIds=  sceneGeneralizationIds+","+dataId;
+            }else{
+                sceneGeneralizationIds=dataId;
+            }
+        }
+        dataMapper.saveSceneGeneralDataAll(list);
+       // po.setTemplateId(po.getId());  //前端需要帮忙赋值
+        po.setId(exampleId);
+        po.setSublistId(sublistId);
+        po.setCreateTime(TimeUtil.getNowForMysql());
+        po.setSceneId(po.getSceneId());
+        po.setCreateUserId(AuthUtil.getCurrentUserId());
+        po.setModifyTime(TimeUtil.getNowForMysql());
+        po.setIsDeleted("0");
+        //po.setGeneralizationType(generalizationType);
+        exampleMapper.saveSceneGeneralExample(po);
+        Map map1=new HashMap();
+        map1.put("exampleId",exampleId);//实例id
+        map1.put("templateId",po.getTemplateId()); //模板id
+        map1.put("sceneGeneralizationIds",sceneGeneralizationIds);//泛化场景数组
+        map1.put("sublistId",sublistId); //指标id
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, map1);
+
+    }
+
+    /**
+     * 对象转Map
+     * @param object
+     * @return
+     * @throws IllegalAccessException
+     */
+    public  Map beanToMap(Object object) throws IllegalAccessException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        Field[] fields = object.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            field.setAccessible(true);
+            map.put(field.getName(), field.get(object));
+        }
+        return map;
+    }
+
+}

+ 290 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneGeneralTemplateService.java

@@ -0,0 +1,290 @@
+package com.css.simulation.resource.scene.service;
+
+
+import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.param.scene.SceneGeneralTemplateParam;
+import api.common.pojo.vo.scene.SceneGeneralTemplateMbVO;
+import api.common.pojo.vo.scene.SceneGeneralTemplateVO;
+import api.common.util.JsonUtil;
+import api.common.util.ObjectUtil;
+import api.common.util.StringUtil;
+import api.common.util.TimeUtil;
+import com.css.simulation.resource.common.utils.AuthUtil;
+import com.css.simulation.resource.scene.mapper.SceneGeneralTemplateMapper;
+import api.common.pojo.po.scene.SceneGeneralTemplatePO;
+import com.css.simulation.resource.system.service.DictService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.*;
+
+@Slf4j
+@Service
+public class SceneGeneralTemplateService {
+
+    @Resource
+    SceneGeneralTemplateMapper mapper;
+    @Autowired
+    DictService dictService;
+
+    /**
+     * 泛化模板导入:
+     *//*
+    @SneakyThrows
+    public ResponseBodyVO<String> saveSceneGeneralTemplate1() {
+            //同时支持Excel 2003、2007
+            File excelFile = new File("D:\\配置参数表样例0415.xlsx"); //创建文件对象
+            String fileName=    excelFile.getName();//文件名
+        //  String fileName=   excelFile.getAbsolutePath();//文件地址
+            // File excelFile = new File("D:\\0414.xlsx"); //创建文件对象
+            FileInputStream is = new FileInputStream(excelFile); //文件流
+            Workbook workbook = WorkbookFactory.create(is); //这种方式 Excel 2003/2007/2010 都是可以处理的
+            int sheetCount = workbook.getNumberOfSheets();  //Sheet的数量
+        List<SceneGeneralTemplatePO> list=new ArrayList<>();
+        //遍历每个Sheet
+            for (int s = 0; s < sheetCount; s++) {
+                Sheet sheet = workbook.getSheetAt(s);
+              // String aqq=sheet.getSheetName();  //文件Sheet的名称
+                int rowCount = sheet.getPhysicalNumberOfRows(); //获取总行数
+                //效验sheet页是否符合标准
+                Cell ce00 = sheet.getRow(0).getCell(0);
+                ce00.setCellType(Cell.CELL_TYPE_STRING);
+                 String   c00Value = ce00.getStringCellValue();
+                 System.out.println("测试是否符合---"+c00Value);
+                 if(c00Value!=null&&c00Value.equals("场景编号")) {
+                     //遍历每一行
+                     for (int r = 0; r < rowCount; r++) {
+                         Row row = sheet.getRow(r);
+                         int cellCount = row.getPhysicalNumberOfCells(); //获取总列数
+                         SceneGeneralTemplatePO po = new SceneGeneralTemplatePO();
+                         Field[] field = po.getClass().getDeclaredFields();
+                         //遍历每一个单元格
+                         for (int c = 0; c < cellCount; c++) {
+                             int a = c + 1;
+                             Cell cell = row.getCell(c);
+                             String cellValue = null;
+                             //在读取单元格内容前,设置所有单元格中内容都是字符串类型
+                             cell.setCellType(Cell.CELL_TYPE_STRING);
+                             //按照字符串类型读取单元格内数据
+                             cellValue = cell.getStringCellValue();
+                             *//*在这里可以对每个单元格中的值进行二次操作转化*//*
+                             //    System.out.print(cellValue + "    ");
+                             if (r > 0) {
+                                 //获取属性的名字
+                                 String name = field[a].getName();
+                                 //将属性名的第一位字母大写
+                                 name = name.substring(0, 1).toUpperCase() + name.substring(1);
+                                 //调用setter方法设属性值
+                                 Class[] parameterTypes = new Class[1];
+                                 parameterTypes[0] = field[a].getType();
+                                 Method getOrSet = po.getClass().getDeclaredMethod("set" + name, parameterTypes);
+                                 getOrSet.invoke(po, cellValue);
+                             }
+                         }
+                         System.out.println();
+                         if (r > 0) {
+                             po.setCreateTime(TimeUtil.getNowForMysql());
+                             po.setCreateUserId(AuthUtil.getCurrentUserId());
+                             po.setModifyUserId(AuthUtil.getCurrentUserId());
+                             po.setModifyTime(TimeUtil.getNowForMysql());
+                             po.setIsDeleted("0");
+                             po.setId(StringUtil.getRandomUUID());
+                             po.setFileName(fileName);
+                             list.add(po);
+                         }
+                     }
+                 }
+            }
+            if(ObjectUtil.isNotNull(list)){
+                mapper.deleteSceneGeneralTemplateAll(list.get(0));
+                mapper.saveSceneGeneralTemplateAll(list);
+                return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+            }
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, fileName+"模板解析失败,请检查模板");
+    }
+
+*/
+    /**
+     * 泛化模板导入:
+     */
+    @SneakyThrows
+    public ResponseBodyVO<String> saveSceneGeneralTemplate(File excelFile,String version) {
+        FileInputStream is = new FileInputStream(excelFile); //文件流
+        Workbook workbook = WorkbookFactory.create(is); //这种方式 Excel 2003/2007/2010 都是可以处理的
+        int sheetCount = workbook.getNumberOfSheets();  //Sheet的数量
+        List<SceneGeneralTemplatePO> list=new ArrayList<>();
+        List<String> fileNameAll=new ArrayList<>();
+        //遍历每个Sheet
+        for (int s = 0; s < sheetCount; s++) {
+            Sheet sheet = workbook.getSheetAt(s);
+            String sheetName = sheet.getSheetName();  //文件Sheet的名称
+            //验证模板名称是否正确  filrName为字典中的类别名
+           /* Map<String, String> map = dictService.getDictMapByType("fileName");
+            String fileName = map.get(sheetName);
+            if (ObjectUtil.isNotNull(fileName)) {*/
+            int rowCount = sheet.getPhysicalNumberOfRows(); //获取总行数
+            //效验sheet页是否符合标准
+            Cell ce00 = sheet.getRow(0).getCell(0);
+            //ce00.setCellType(CellType.STRING);
+            String c00Value = ce00.getStringCellValue();
+            if (c00Value != null && c00Value.equals("场景编号")) {
+                //遍历每一行
+                for (int r = 1; r < rowCount; r++) {
+                    Row row = sheet.getRow(r);
+                    int cellCount = row.getPhysicalNumberOfCells(); //获取总列数
+                    SceneGeneralTemplatePO po = new SceneGeneralTemplatePO();
+                    Field[] field = po.getClass().getDeclaredFields();
+                    //遍历每一个单元格
+                    for (int c = 0; c < cellCount; c++) {
+                        int a = c + 1;
+                        Cell cell = row.getCell(c);
+                        String cellValue = null;
+                        if (r > 0 && c == 3) {
+                            Date aaa = cell.getDateCellValue();
+                            cellValue = TimeUtil.getToStringDate(aaa, 4);
+                        } else {
+                            //在读取单元格内容前,设置所有单元格中内容都是字符串类型
+                            cell.setCellType(CellType.STRING);
+                            //按照字符串类型读取单元格内数据
+                            cellValue = cell.getStringCellValue();
+                        }
+                        /*在这里可以对每个单元格中的值进行二次操作转化*/
+                        //    System.out.print(cellValue + "    ");
+                        if (r > 0) {
+                            //获取属性的名字
+                            String name = field[a].getName();
+                            //将属性名的第一位字母大写
+                            name = name.substring(0, 1).toUpperCase() + name.substring(1);
+                            //调用setter方法设属性值
+                            Class[] parameterTypes = new Class[1];
+                            parameterTypes[0] = field[a].getType();
+                            Method getOrSet = po.getClass().getDeclaredMethod("set" + name, parameterTypes);
+                            getOrSet.invoke(po, cellValue);
+                        }
+                    }
+                    System.out.println();
+                    if (r > 0) {
+                        po.setCreateTime(TimeUtil.getNowForMysql());
+                        po.setCreateUserId(AuthUtil.getCurrentUserId());
+                        po.setModifyUserId(AuthUtil.getCurrentUserId());
+                        po.setModifyTime(TimeUtil.getNowForMysql());
+                        po.setIsDeleted("0");
+                        po.setId(StringUtil.getRandomUUID());
+                        po.setFileName(sheetName);
+                        po.setVersion(version);
+                        fileNameAll.add(sheetName);
+                        list.add(po);
+                    }
+                }
+            }
+        //}
+        }
+        if(ObjectUtil.isNotNull(list)){
+            SceneGeneralTemplatePO po=list.get(0);
+            po.setFileNameAll(fileNameAll);
+            mapper.deleteSceneGeneralTemplateAll(po);
+            mapper.saveSceneGeneralTemplateAll(list);
+            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+        }
+        return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "模板解析失败,请检查模板");
+    }
+
+    public List<SceneGeneralTemplatePO> querySceneGeneralTemplateList(SceneGeneralTemplateParam po) {
+        List<SceneGeneralTemplatePO> list=mapper.querySceneGeneralTemplateList(po);
+     Map<String,String>  scenarioRoadTypeMap= dictService.getDictMapByType("scenarioRoadType");
+        Map<String,String>  scenarioWeatherMap= dictService.getDictMapByType("scenarioWeather");
+        for (SceneGeneralTemplatePO vo : list) {
+            vo.setScenarioRoadType(scenarioRoadTypeMap.get(vo.getScenarioRoadType()));
+            vo.setScenarioWeather(scenarioWeatherMap.get(vo.getScenarioWeather()));
+        }
+        return   list;
+
+    }
+    @SneakyThrows
+    public SceneGeneralTemplateVO querySceneGeneralTemplateById(String id){
+        SceneGeneralTemplatePO po=mapper.querySceneGeneralTemplateById(id);
+       String generalizationType =JsonUtil.stringToJson(po.getGeneralizationType());
+       po.setGeneralizationType(generalizationType);
+        SceneGeneralTemplateVO vo=new SceneGeneralTemplateVO();
+       //转换为vo
+        BeanUtils.copyProperties(po, vo);
+        List<SceneGeneralTemplateMbVO>  listMb=new ArrayList<>();
+        if(po.getObsStartX().indexOf(";")!=-1){
+            listMb= spliceVo(po);
+        }else{
+            SceneGeneralTemplateMbVO  mbVO=new SceneGeneralTemplateMbVO();
+            BeanUtils.copyProperties(po, mbVO);
+            mbVO.setGeneralizationType(po.getGeneralizationType());
+            listMb.add(mbVO);
+        }
+        vo.setListMb(listMb);
+        vo.setTemplateId(vo.getId());
+        return vo;
+
+    }
+
+    public   List<SceneGeneralTemplateMbVO> spliceVo(SceneGeneralTemplatePO po) throws JsonProcessingException {
+        List<SceneGeneralTemplateMbVO>  listMb=new ArrayList<>();
+        String[]  obsStartX= po.getObsStartX().split(";");
+        String[]  obsStartY= po.getObsStartY().split(";");
+        String[]  obsStartVelocity= po.getObsStartVelocity().split(";");
+        String[]  obsLateralAcceleration= po.getObsLateralAcceleration().split(";");
+        String[]  obsLongitudinalAcceleration= po.getObsLongitudinalAcceleration().split(";");
+        String[]  obsHeadingAngleRel= po.getObsHeadingAngleRel().split(";");
+        String[]  obsVelocityStatus= po.getObsVelocityStatus().split(";");
+        String[]  obsTrajectory= po.getObsTrajectory().split(";");
+        String[]  obsDurationTime= po.getObsDurationTime().split(";");
+        String[]  obsVelocityTime= po.getObsVelocityTime().split(";");
+        String[]  obsTrailTime= po.getObsTrailTime().split(";");
+
+        String generalizationType=po.getGeneralizationType();
+        List<String> list= Arrays.asList(obsStartX);
+        for (int i=0;i<list.size();i++){
+            SceneGeneralTemplateMbVO  mbVO=new SceneGeneralTemplateMbVO();
+            mbVO.setObsStartX(list.get(i));
+            mbVO.setObsStartY(obsStartY[i]);
+            mbVO.setObsStartVelocity(obsStartVelocity[i]);
+            mbVO.setObsLateralAcceleration(obsLateralAcceleration[i]);
+            mbVO.setObsLongitudinalAcceleration(obsLongitudinalAcceleration[i]);
+            mbVO.setObsHeadingAngleRel(obsHeadingAngleRel[i]);
+            mbVO.setObsVelocityStatus(obsVelocityStatus[i]);
+            mbVO.setObsTrajectory(obsTrajectory[i]);
+            mbVO.setObsDurationTime(obsDurationTime[i]);
+            mbVO.setObsVelocityTime(obsVelocityTime[i]);
+            mbVO.setObsTrailTime(obsTrailTime[i]);
+            Map<String,Integer> map=JsonUtil.jsonToMap(generalizationType);
+            for(Map.Entry<String,Integer> entry:map.entrySet()){
+                String value= entry.getValue().toString();
+                if(value.length()>1){
+              Integer values=Integer.parseInt(value.substring(i,i+1));
+                    map.put(entry.getKey(),values);
+                }
+            }
+            mbVO.setGeneralizationType(JsonUtil.beanToJson(map));
+            listMb.add(mbVO);
+        }
+        return listMb;
+
+    }
+
+
+    public  ResponseBodyVO<String> deleteSceneGeneralTemplateById(SceneGeneralTemplatePO po) {
+        po.setModifyUserId(AuthUtil.getCurrentUserId());
+        po.setModifyTime(TimeUtil.getNowForMysql());
+        mapper.deleteSceneGeneralTemplateAll(po);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+
+
+    }
+
+}

+ 16 - 10
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/SceneNaturalService.java

@@ -48,10 +48,7 @@ public class SceneNaturalService {
         int end = param.getJsonAddress().lastIndexOf(".");
         String fileName = param.getJsonAddress().substring(idx + 1, end);
         param.setNaturalName(fileName);
-        List<SceneNaturalPO> list = sceneNaturalMapper.querySceneNaturaByName(param);
-        if (list != null && list.size() > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景编号" + fileName + "已存在,请检查");
-        }
+        String sceneId = sceneNaturalMapper.querySceneNaturaByName(fileName);
         Response download = fileDownService.download(MI);
         String json = download.body().toString();
         ObjectMapper objMap = new ObjectMapper();
@@ -109,13 +106,9 @@ public class SceneNaturalService {
                 .doubleFlashingCar(getSequenceNew(traffic, "双闪车辆"))
                 .selfBehavior(getSequenceNew(selfDrivingBehavior))
                 .targetBehavior(getSequenceNew(targetBehavior))
+                .maxTime(root.path("max_time").asText())
                 .isDeleted("0")
                 .build();
-        // -------------------------------- 保存数据到 mysql --------------------------------
-        sceneNaturalPO.setCreateTime(TimeUtil.getNowForMysql());
-        sceneNaturalPO.setCreateUserId(AuthUtil.getCurrentUserId());
-        sceneNaturalPO.setModifyTime(TimeUtil.getNowForMysql());
-
         if (null != param.getJsonAddress() && !param.getJsonAddress().equals("")) {
             sceneNaturalPO.setJsonAddress(param.getJsonAddress());
         }
@@ -135,7 +128,20 @@ public class SceneNaturalService {
             sceneNaturalPO.setVideoPreview(param.getVideoPreview());
         }
 
-        sceneNaturalMapper.saveSceneNatural(sceneNaturalPO);
+        if (ObjectUtil.isNull(sceneId)) {
+            // -------------------------------- 保存数据到 mysql --------------------------------
+            sceneNaturalPO.setCreateTime(TimeUtil.getNowForMysql());
+            sceneNaturalPO.setCreateUserId(AuthUtil.getCurrentUserId());
+            sceneNaturalPO.setModifyTime(TimeUtil.getNowForMysql());
+            sceneNaturalMapper.saveSceneNatural(sceneNaturalPO);
+          //  return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景编号" + fileName + "已存在,请检查");
+        }else{
+            // -------------------------------- 修改数据到 mysql --------------------------------
+            sceneNaturalPO.setModifyUserId(AuthUtil.getCurrentUserId());
+            sceneNaturalPO.setModifyTime(TimeUtil.getNowForMysql());
+            sceneNaturalPO.setNaturalId(sceneId);
+            sceneNaturalMapper.updateSceneNatural(sceneNaturalPO);
+        }
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
     }
 

+ 6 - 3
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/ScenePackageService.java

@@ -304,8 +304,11 @@ public class ScenePackageService {
                 params.setCreateTime(TimeUtil.getNowForMysql());
                 params.setModifyTime(TimeUtil.getNowForMysql());
                 params.setCreateUserId(AuthUtil.getCurrentUserId());
-                String uuId = StringUtil.getRandomUUID();
-                params.setId(uuId);   //主键ID
+                //添加泛化后处理
+                if(ObjectUtil.isNull(parentVoList.get(i).getId())){
+                    String uuId = StringUtil.getRandomUUID();
+                    params.setId(uuId);   //主键ID
+                }
                 params.setIsDeleted("0");
                 params.setShare(share);
                 params.setPackageLevel(level);
@@ -315,7 +318,7 @@ public class ScenePackageService {
                 if (cvoList != null && cvoList.size() > 0) {
                     //继续查找下一节点
                     int b=level+1;
-                    instShareListTree(cvoList, uuId, rootId, poList, share,b);
+                    instShareListTree(cvoList, params.getId(), rootId, poList, share,b);
                 }
                 parentVoList.remove(parentVoList.get(i));
                 i--;

+ 20 - 10
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/StandardsRegulationsService.java

@@ -46,11 +46,7 @@ public class StandardsRegulationsService {
         ObjectMapper objMap = new ObjectMapper();
         JsonNode root = objMap.readTree(json);
         String sceneName = root.path("场景名称").asText();
-        param.setSceneName(sceneName);
-        List<StandardsRegulationsPO> list = standardsRegulationsMapper.queryStandardsRegulationsByName(param);
-        if (list != null && list.size() > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
-        }
+       String sceneId = standardsRegulationsMapper.queryStandardsRegulationsByName(sceneName);
 
         StandardsRegulationsPO standardsRegulationsPO = null;
         standardsRegulationsPO = standardsRegulationsPO.builder()
@@ -58,12 +54,9 @@ public class StandardsRegulationsService {
                 .sceneName(sceneName)
                 .regulationType(root.path("法规类型").asText())
                 .standardType(root.path("标准类型").asText())
+                .maxTime(root.path("max_time").asText())
                 .isDeleted("0")
                 .build();
-        // -------------------------------- 保存数据到 mysql --------------------------------
-        standardsRegulationsPO.setCreateTime(TimeUtil.getNowForMysql());
-        standardsRegulationsPO.setModifyTime(TimeUtil.getNowForMysql());
-        standardsRegulationsPO.setCreateUserId(AuthUtil.getCurrentUserId());
         if (null != param.getJsonAddress() && !param.getJsonAddress().equals("")) {
             standardsRegulationsPO.setJsonAddress(param.getJsonAddress());
         }
@@ -82,7 +75,24 @@ public class StandardsRegulationsService {
         if (null != param.getVideoPreview() && !param.getVideoPreview().equals("")) {
             standardsRegulationsPO.setVideoPreview(param.getVideoPreview());
         }
-        standardsRegulationsMapper.saveStandardsRegulations(standardsRegulationsPO);
+
+        if (ObjectUtil.isNull(sceneId)) {
+            // -------------------------------- 保存数据到 mysql --------------------------------
+            standardsRegulationsPO.setCreateTime(TimeUtil.getNowForMysql());
+            standardsRegulationsPO.setModifyTime(TimeUtil.getNowForMysql());
+            standardsRegulationsPO.setCreateUserId(AuthUtil.getCurrentUserId());
+            standardsRegulationsMapper.saveStandardsRegulations(standardsRegulationsPO);
+
+           // return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "该场景名称" + sceneName + "已存在,请检查");
+        }else{
+            // -------------------------------- 修改数据到 mysql --------------------------------
+            standardsRegulationsPO.setRegulationsId(sceneId);
+            standardsRegulationsPO.setModifyTime(TimeUtil.getNowForMysql());
+            standardsRegulationsPO.setModifyUserId(AuthUtil.getCurrentUserId());
+            standardsRegulationsMapper.updateStandardsRegulations(standardsRegulationsPO);
+
+        }
+
 
         return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
     }

+ 140 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/XmlParse.java

@@ -0,0 +1,140 @@
+package com.css.simulation.resource.scene.service;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.springframework.stereotype.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+@Slf4j
+@Service
+public class XmlParse {
+    //泛化模板解析需要用
+    public static FileItem createFileItem(String filePath, String fileName){
+        String fieldName = "file";
+        FileItemFactory factory = new DiskFileItemFactory();
+        FileItem item = factory.createItem(fieldName, "text/plain", false,fileName);
+        File newfile = new File(filePath);
+        int bytesRead = 0;
+        byte[] buffer = new byte[8192];
+        try (FileInputStream fis = new FileInputStream(newfile);
+             OutputStream os = item.getOutputStream()) {
+            while ((bytesRead = fis.read(buffer, 0, 8192))!= -1)
+            {
+                os.write(buffer, 0, bytesRead);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return item;
+    }
+    //解析xml获取属性地址
+    public static Map getUrl(String fileUrl) throws Exception {
+        //1-获取XML-IO流
+      //  File excelFile = new File(fileUrl); //创建文件对象
+        File excelFile = new File("D:\\GB_001_TargetIdentification_001_Right.xml"); //创建文件对象
+        InputStream xmlInputStream= new FileInputStream(excelFile); //文件流
+        //2-解析XML-IO流 ,获取Document 对象,以及Document对象 的根节点
+        Element rootElement = getRootElementFromIs(xmlInputStream);
+        //3~5-从根元素解析得到元素
+       Map map= parseElementFromRoot(rootElement);//控制台输出:   
+        System.out.println("xodrName-----"+map.get("xodrName"));
+        return map;
+    }
+
+    //1-获取XML-IO流
+    private static InputStream  getXmlInputStream(String xmlPath){
+        InputStream inputStream = null;
+        try {
+            //1-把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
+            inputStream= new  FileInputStream(xmlPath);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return inputStream;
+    }
+    //2-解析XML-IO流 ,获取Document 对象,以及Document对象 的根节点
+    private static Element getRootElementFromIs(InputStream inputStream) throws Exception {
+        if(inputStream == null){
+            return  null;
+        }
+        /*
+         * javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 ,
+         * DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,
+         * 这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
+         */
+        //2-调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        //3-调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
+        DocumentBuilder docBuilder = factory.newDocumentBuilder();
+        //4-调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
+        Document doc = docBuilder.parse(inputStream);
+        //5-得到 XML 文档的根节点
+        Element root =doc.getDocumentElement();
+        //6-关闭流
+        if(inputStream != null){
+            inputStream.close();
+        }
+        return root;
+    }
+
+    //3-从根元素解析得到元素
+    private static Map parseElementFromRoot(Element root) {
+        NodeList nl = root.getChildNodes();
+        for (int i = 0; i < nl.getLength(); i++) {
+            Node node = nl.item(i);
+            if("Layout".equals(node.getNodeName())){
+                if (node instanceof Element) {
+                    Element ele = (Element) node;
+                    //4-从元素解析得到属性值
+                    return getDataFromElement(ele);
+                //5-从元素解析特定子元素并解析(以property为例)
+               // getCertainElementFromParentElement(ele);
+                }
+            }
+
+        }
+        return null;
+    }
+
+    //4-从元素解析得到属性值
+    private static Map getDataFromElement(Element ele) {
+        Map map=new HashMap<>();
+        String osgbName = ele.getAttribute("Database");//根据属性名称读取属性值
+        String xodrName= ele.getAttribute("File");
+        map.put("osgbName",osgbName);
+        map.put("xodrName",xodrName);
+        return map;
+    }
+    /*//5-从元素解析特定子元素并解析(以property为例)
+    private static void getCertainElementFromParentElement(Element ele) {
+        NodeList propertyEleList = ele.getElementsByTagName("Database");//根据标签名称获取标签元素列表
+        for (int i = 0; i < propertyEleList.getLength(); i++) {
+            Node node = propertyEleList.item(i);
+            if (node instanceof Element) {
+                Element propertyEle = (Element) node;
+                String name = propertyEle.getAttribute("Database");
+                System.out.println("propertyEle: Database =88888888= " + name);
+                String value = propertyEle.getAttribute("File");
+                System.out.println("propertyEle: File ==888888--- " + value);
+            }
+        }
+
+    }
+*/
+
+
+
+
+
+}

+ 127 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/system/ctrl/ClusterCtrl.java

@@ -0,0 +1,127 @@
+package com.css.simulation.resource.system.ctrl;
+
+import api.common.pojo.common.ResponseBodyVO;
+import api.common.pojo.constants.DictConstants;
+import api.common.pojo.param.system.ClusterParam;
+import api.common.pojo.po.system.ClusterPO;
+import api.common.pojo.vo.system.ClusterVO;
+import api.common.util.ObjectUtil;
+import com.css.simulation.resource.common.utils.AuthUtil;
+import com.css.simulation.resource.system.service.ClusterService;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+
+
+@Controller()
+@RequestMapping("/cluster")
+public class ClusterCtrl {
+
+    @Autowired
+    ClusterService clusterService;
+
+
+    /**
+     * 查询集群列表
+     */
+    @RequestMapping("/getClusterList")
+    @ResponseBody
+    public ResponseBodyVO<PageInfo<ClusterVO>> getClusterList(@RequestBody ClusterParam clusterParam){
+
+        String roleCode = AuthUtil.getCurrentUserRoleCode();
+        if(roleCode == null){
+            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE);
+        }
+        //当前账户为普通账户子账户,列表显示空
+        if(DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)){
+            clusterParam.setRoleCode("-1");//查不到
+        }
+        //当前账户为管理员账户,需要查询普通账户,设置roleCode为2
+        if(DictConstants.ROLE_CODE_ADMIN.equals(roleCode) || DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode)){
+            clusterParam.setRoleCode(DictConstants.ROLE_CODE_UESR);
+        }
+        // 当前账户为普通账户,需要查询该账户创建的普通账户子账户,设置roleCode为3及当前创建用户id
+        if(DictConstants.ROLE_CODE_UESR.equals(roleCode)){
+            String userType = AuthUtil.getCurrentUserType();
+            if("1".equals(userType)){//独占
+                clusterParam.setRoleCode(DictConstants.ROLE_CODE_SUBUESR);
+                clusterParam.setCreateUserId(AuthUtil.getCurrentUserId());
+            }else {
+                clusterParam.setRoleCode("-1"); //查不到
+            }
+
+        }
+        ResponseBodyVO<PageInfo<ClusterVO>> response = new ResponseBodyVO<PageInfo<ClusterVO>>(ResponseBodyVO.Response.SUCCESS);
+        response.setInfo(clusterService.getClusterList(clusterParam));
+        return response;
+    }
+
+    /**
+     * 新增、修改
+     */
+    @RequestMapping("/saveCluster")
+    @ResponseBody
+    public ResponseBodyVO<ClusterPO> saveCluster(@RequestBody ClusterPO clusterPO) throws Exception {
+        if(ObjectUtil.isNull(clusterPO)){
+            return new ResponseBodyVO(false, 400, "参数必传!",null);
+        }
+        ResponseBodyVO<ClusterPO> response = new ResponseBodyVO<ClusterPO>(ResponseBodyVO.Response.SUCCESS);
+        clusterPO = clusterService.saveCluster(clusterPO);
+        response.setInfo(clusterPO);
+        return response;
+    }
+
+    /**
+     * 查询集群修改历史记录
+     */
+    @RequestMapping("/getClusterHistory")
+    @ResponseBody
+    public ResponseBodyVO<PageInfo<ClusterVO>> getClusterHistory(@RequestBody ClusterParam clusterParam){
+
+        ResponseBodyVO<PageInfo<ClusterVO>> response = new ResponseBodyVO<PageInfo<ClusterVO>>(ResponseBodyVO.Response.SUCCESS);
+        response.setInfo(clusterService.getClusterHistory(clusterParam));
+        return response;
+    }
+
+    /**
+     * 查询已分配未到期节点数量
+     */
+    @RequestMapping("/getClusterNum")
+    @ResponseBody
+    public ResponseBodyVO<HashMap<String, Integer>> getClusterNum() throws Exception {
+
+        ClusterParam clusterParam = new ClusterParam();
+        ResponseBodyVO<HashMap<String, Integer>> response = new ResponseBodyVO<HashMap<String, Integer>>(ResponseBodyVO.Response.SUCCESS);
+        String roleCode = AuthUtil.getCurrentUserRoleCode();
+        if(roleCode == null){
+            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE);
+        }
+        if(DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)){
+            response.setInfo(null);
+        }
+        //当前账户为管理员账户,需要查询普通账户,设置roleCode为2
+        if(DictConstants.ROLE_CODE_ADMIN.equals(roleCode) || DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode)){
+            clusterParam.setRoleCode(DictConstants.ROLE_CODE_UESR);
+        }
+        // 当前账户为普通账户,需要查询该账户创建的普通账户子账户,设置roleCode为3及当前创建用户id
+        if(DictConstants.ROLE_CODE_UESR.equals(roleCode)){
+            String userType = AuthUtil.getCurrentUserType();
+            if("1".equals(userType)){//独占
+                clusterParam.setRoleCode(DictConstants.ROLE_CODE_SUBUESR);
+                clusterParam.setCreateUserId(AuthUtil.getCurrentUserId());
+            }else {
+                response.setInfo(null);
+            }
+
+        }
+        HashMap<String, Integer> resMap = clusterService.getClusterNum(clusterParam);
+        response.setInfo(resMap);
+        return response;
+    }
+
+}

Деякі файли не було показано, через те що забагато файлів було змінено