root 2 gadi atpakaļ
vecāks
revīzija
9d82b89b39

+ 24 - 5
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/consumer/ProjectConsumer.java

@@ -28,6 +28,7 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.FutureTask;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -87,13 +88,25 @@ public class ProjectConsumer {
     @Resource(name = "myKafkaAdmin")
     Admin kafkaAdminClient;
 
-
     /**
      * 接收到运行信息立即复制一份数据作为运行数据
      *
      * @param projectRecord 项目启动消息
      */
     @KafkaListener(groupId = "simulation-resource-scheduler", topics = "${scheduler.start-topic}")
+    @SneakyThrows
+    public void acceptMessage(ConsumerRecord<String, String> projectRecord) {
+        String initialProjectJson = projectRecord.value();
+        ProjectMessageDTO projectMessageDTO = JsonUtil.jsonToBean(initialProjectJson, ProjectMessageDTO.class);
+        String projectId = projectMessageDTO.getProjectId();        // 手动执行项目 id 或 自动执行子项目 id
+        FutureTask<Integer> createTaskAndFixDataFutureTask = new FutureTask<>(() -> {
+            createTaskAndFixData(projectRecord);
+            return 1024;
+        });
+        new Thread(createTaskAndFixDataFutureTask, "project-fix-" + projectId).start();
+    }
+
+
     @SneakyThrows
     public void createTaskAndFixData(ConsumerRecord<String, String> projectRecord) {
         //* -------------------------------- 0 读取消息,创建临时目录 --------------------------------
@@ -410,6 +423,8 @@ public class ProjectConsumer {
         List<NodeTO> nodeListToCount = projectUtil.getNodeListToCount(nodeMap);
         int messageNumber = 0;
         ApacheKafkaUtil.createTopic(kafkaAdminClient, projectId, realCurrentParallelism, (short) 1);   // 创建主题
+        // 需要即时启动的任务(并行度的大小)
+        List<String> yamlListToRun = new ArrayList<>(realCurrentParallelism);
         for (String taskJsonPath : taskJsonList) {
             String taskId = FileUtil.getFilenameWithoutSuffix(taskJsonPath);
             //TODO 设置任务重试次数为 0,方便任务进行最大3次的重试。
@@ -421,7 +436,6 @@ public class ProjectConsumer {
             stringRedisTemplate.opsForValue().set(taskMessageKey, taskJson);
 
             //4-5 将 projectId 作为 topic 名称,根据 parallelism 分散发送 task 信息到 kafka
-
             kafkaTemplate.send(projectId, messageNumber % currentParallelism, "", taskJson)
                     .addCallback(success -> {
                         // 消息发送到的topic
@@ -447,13 +461,18 @@ public class ProjectConsumer {
                         });
                         String currentNodeNameValue = currentNodeName.get();
                         int currentCountValue = currentCount.get();
-                        projectManager.createTempYaml(projectId, algorithmDockerImage, currentNodeNameValue, partition
-                                , offset, currentCountValue);
+                        String tempYaml = projectManager.createTempYaml(projectId, algorithmDockerImage
+                                , currentNodeNameValue, partition, offset, currentCountValue);
+                        if (currentCountValue == 0) {
+                            yamlListToRun.add(tempYaml);
+                        }
                     }, failure -> log.error("------- 发送消息失败:" + failure.getMessage()));
             messageNumber++;
-
         }
         log.info("ProjectService--sendTaskMessage 共发送了 " + messageNumber + " 条消息!");
+        for (String yaml : yamlListToRun) {
+            projectUtil.createPod2(yaml);
+        }
     }
 
     @KafkaListener(groupId = "simulation-resource-scheduler", topics = "${scheduler.stop-topic}")

+ 5 - 4
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/ProjectManager.java

@@ -32,7 +32,7 @@ public class ProjectManager {
      * @param algorithmDockerImage
      */
     @SneakyThrows
-    public void createTempYaml(String projectId,
+    public String createTempYaml(String projectId,
                                String algorithmDockerImage,
                                String nodeName,
                                int kafkaPartition,
@@ -57,8 +57,9 @@ public class ProjectManager {
         FileUtil.writeStringToLocalFile(replace9, podYamlDirectory + podYaml);
 //        log.info("ProjectService--createPod 在节点 " + nodeName + " 开始执行 pod。");
 //        projectUtil.createPod(nodeName, podName, tempPodString);
-        if (count == 0) {
-            projectUtil.createPod2(nodeName, podYamlDirectory + podYaml);
-        }
+        return podYamlDirectory + podYaml;
+//        if (count == 0) {
+//            projectUtil.createPod2(podYamlDirectory + podYaml);
+//        }
     }
 }

+ 13 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/pojo/to/TaskMessageTO.java

@@ -0,0 +1,13 @@
+package com.css.simulation.resource.scheduler.pojo.to;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaskMessageTO {
+}

+ 179 - 181
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/ProjectService.java

@@ -8,13 +8,13 @@ import com.css.simulation.resource.scheduler.configuration.git.GitConfiguration;
 import com.css.simulation.resource.scheduler.configuration.kubernetes.KubernetesConfiguration;
 import com.css.simulation.resource.scheduler.manager.ProjectManager;
 import com.css.simulation.resource.scheduler.mapper.*;
-import com.css.simulation.resource.scheduler.pojo.po.*;
-import com.css.simulation.resource.scheduler.pojo.to.*;
+import com.css.simulation.resource.scheduler.pojo.po.AlgorithmPO;
+import com.css.simulation.resource.scheduler.pojo.po.IndexTemplatePO;
+import com.css.simulation.resource.scheduler.pojo.po.ScenePO;
+import com.css.simulation.resource.scheduler.pojo.to.PrefixTO;
 import com.css.simulation.resource.scheduler.util.*;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.minio.MinioClient;
-import io.minio.errors.*;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.client.config.RequestConfig;
@@ -28,13 +28,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 @Service
@@ -209,178 +204,178 @@ public class ProjectService {
     }
 
 
-    /**
-     * @param parallelism          并行度
-     * @param projectRunningPrefix
-     * @param userId
-     * @param projectId
-     * @param projectType
-     * @param nodeMap              节点
-     * @param algorithmDockerImage 算法
-     * @param videoTime            视频长度
-     * @param scenePOSet
-     * @param vehiclePO
-     * @param cameraPOList
-     * @param ogtPOList
-     */
-    @SneakyThrows
-    public void sendTaskMessage(int parallelism,
-                                String projectRunningPrefix,
-                                String userId,
-                                String projectId,
-                                String projectType,
-                                Map<String, Integer> nodeMap,
-                                String algorithmDockerImage,
-                                Long videoTime,
-                                Set<ScenePO> scenePOSet,
-                                VehiclePO vehiclePO,
-                                List<CameraPO> cameraPOList,
-                                List<OgtPO> ogtPOList) {
-        List<NodeTO> nodeListToCount = projectUtil.getNodeListToCount(nodeMap);
-        final int[] messageNumber = CollectionUtil.createIntArray(0);
-        ApacheKafkaUtil.createTopic(kafkaAdminClient, projectId, parallelism, (short) 1);   // 创建主题
-        log.info("ProjectService--sendTaskMessage 项目 " + projectId + " 获得的包括的场景信息为:" + scenePOSet);
-        for (ScenePO scenePO : scenePOSet) {
-            String sceneId = scenePO.getId();
-            //3-1 可能会存在多个指标下有同样的场景,所以会查出多个指标,多个指标的场景需要发送多次
-            List<String> lastTargetIdList = null;
-            if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
-                lastTargetIdList = indexMapper.selectLeafIndexIdByManualProjectIdAndSceneId(projectId, "%" + sceneId + "%");
-            } else if (DictConstants.PROJECT_TYPE_AUTO_SUB.equals(projectType)) {
-                lastTargetIdList = indexMapper.selectLeafIndexIdByAutoSubProjectIdAndSceneId(projectId, "%" + sceneId + "%");
-            }
-            lastTargetIdList.forEach(lastTargetId -> {
-                String taskId = StringUtil.getRandomUUID();
-                String taskRetryPrefix = projectRunningPrefix + ":task:" + taskId + ":retry";
-                String taskMessagePrefix = projectRunningPrefix + ":task:" + taskId + ":message";
-                // 设置任务重试次数为 0,方便任务进行最大3次的重试。
-                stringRedisTemplate.opsForValue().set(taskRetryPrefix, "0");
-                // 保存任务信息
-                TaskPO taskPO = TaskPO.builder() // run_start_time 和 run_end_time 不填
-                        .id(taskId)
-                        .pId(projectId)
-                        .sceneId(sceneId)
-                        .lastTargetId(lastTargetId)
-                        .sceneName(scenePO.getName())
-                        .sceneType(scenePO.getType())
-                        .runState(DictConstants.TASK_PENDING)
-                        .runResultFilePath(projectResultPathOfMinio + projectId + "/" + taskId)
-                        .build();
-                taskPO.setCreateTime(TimeUtil.getNowForMysql());
-                taskPO.setCreateUserId(userId);
-                taskPO.setModifyTime(TimeUtil.getNowForMysql());
-                taskPO.setModifyUserId(userId);
-                taskPO.setModifyTime(TimeUtil.getNowForMysql());
-                taskPO.setIsDeleted("0");
-                taskMapper.insert(taskPO);
-                // 下载 xodr 和 osgb 供仿真后生成 xosc
-                String scenarioOdr = scenePO.getScenarioOdr();
-                String scenarioOsgb = scenePO.getScenarioOsgb();
-                String[] splitXodr = scenarioOdr.split("/");
-                String xodrName = splitXodr[splitXodr.length - 1];
-                String[] splitOsgb = scenarioOsgb.split("/");
-                String osgbName = splitOsgb[splitOsgb.length - 1];
-                try {
-                    String xodrPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + xodrName;
-                    String xodrPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + ".xodr";
-                    String osgbPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + osgbName;
-                    String osgbPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + ".osgb";
-                    MinioUtil.downloadToFile(minioClient, bucketName, scenarioOdr, xodrPathOfLinux);
-                    MinioUtil.uploadFromFile(minioClient, xodrPathOfLinux, bucketName, xodrPathOfMinio);
-                    log.info("ProjectService--sendTaskMessage 已经将 xodr 上传到 minio 的结果文件目录:" + xodrPathOfMinio);
-                    MinioUtil.downloadToFile(minioClient, bucketName, scenarioOsgb, osgbPathOfLinux);
-                    MinioUtil.uploadFromFile(minioClient, osgbPathOfLinux, bucketName, osgbPathOfMinio);
-                    log.info("ProjectService--sendTaskMessage 已经将 osgb 上传到 minio 的结果文件目录:" + osgbPathOfMinio);
-                } catch (IOException | ServerException | InsufficientDataException | ErrorResponseException |
-                         NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException |
-                         XmlParserException | InternalException e) {
-                    throw new RuntimeException(e);
-                }
-
-                // 组装 task 消息
-                TaskTO taskTO = TaskTO.builder()
-                        .info(InfoTO.builder()
-                                .project_id(taskPO.getPId())
-                                .task_id(taskPO.getId())
-                                .task_path(taskPO.getRunResultFilePath())
-                                .default_time(videoTime)
-                                .build())
-                        .scenario(ScenarioTO.builder()
-                                .scenario_osc(scenePO.getScenarioOsc())
-                                .scenario_odr(scenarioOdr)
-                                .scenario_osgb(scenarioOsgb)
-                                .build())
-                        .vehicle(VehicleTO.builder()
-                                .model(ModelTO.builder()
-                                        .model_label(vehiclePO.getModelLabel())
-                                        .build())
-                                .dynamics(DynamicsTO.builder()
-                                        .dynamics_maxspeed(vehiclePO.getMaxSpeed())
-                                        .dynamics_enginepower(vehiclePO.getEnginePower())
-                                        .dynamics_maxdecel(vehiclePO.getMaxDeceleration())
-                                        .dynamics_maxsteering(vehiclePO.getMaxSteeringAngle())
-                                        .dynamics_mass(vehiclePO.getMass())
-                                        .dynamics_frontsurfaceeffective(vehiclePO.getFrontSurfaceEffective())
-                                        .dynamics_airdragcoefficient(vehiclePO.getAirDragCoefficient())
-                                        .dynamics_rollingresistance(vehiclePO.getRollingResistanceCoefficient())
-                                        .dynamics_wheeldiameter(vehiclePO.getWheelDiameter())
-                                        .dynamics_wheeldrive(vehiclePO.getWheelDrive())
-                                        .dynamics_overallefficiency(vehiclePO.getOverallEfficiency())
-                                        .dynamics_distfront(vehiclePO.getFrontDistance())
-                                        .dynamics_distrear(vehiclePO.getRearDistance())
-                                        .dynamics_distleft(vehiclePO.getLeftDistance())
-                                        .dynamics_distright(vehiclePO.getRightDistance())
-                                        .dynamics_distheight(vehiclePO.getHeightDistance())
-                                        .dynamics_wheelbase(vehiclePO.getWheelbase())
-                                        .build())
-                                .sensors(SensorsTO.builder()   // 根据 vehicleId 查询绑定的传感器列表
-                                        .camera(cameraPOList)
-                                        .OGT(ogtPOList)
-                                        .build())
-                                .build())
-                        .build();
-
-                //4-4 将对象转成 json
-                String taskJson = "";
-                try {
-                    taskJson = JsonUtil.beanToJson(taskTO);
-                } catch (JsonProcessingException e) {
-                    e.printStackTrace();
-                }
-                //4-5 将 projectId 作为 topic 名称,根据 parallelism 分散发送 task 信息到 kafka
-                String finalTaskJson = taskJson;
-                stringRedisTemplate.opsForValue().set(taskMessagePrefix, finalTaskJson);
-                kafkaTemplate.send(projectId, messageNumber[0] % parallelism, "", taskJson).addCallback(success -> {
-                    // 消息发送到的topic
-                    String topic = success.getRecordMetadata().topic();
-                    // 消息发送到的分区
-                    int partition = success.getRecordMetadata().partition();
-                    // 消息在分区内的offset
-                    long offset = success.getRecordMetadata().offset();
-                    log.info("------- ProjectConsumer 发送消息成功, 主题 topic 为:" + topic + " 分区 partition 为:" + partition + " 偏移量为:" + offset + " 消息体为:" + finalTaskJson);
-                    //4-6 发送成功过的同时创建 pod.yaml 文件并把文件地址存到 redis
-                    // 选一个count 最少的node,如果 count 是 0 则直接启动。
-                    AtomicReference<String> currentNodeName = new AtomicReference<>("");
-                    AtomicInteger currentCount = new AtomicInteger(Integer.MAX_VALUE);
-                    nodeListToCount.forEach(nodeTO -> {
-                        int tempCount = nodeTO.getCount();
-                        String tempNodeName = nodeTO.getNodeName();
-                        if (tempCount < currentCount.get()) {
-                            currentCount.set(tempCount);
-                            currentNodeName.set(tempNodeName);
-                            nodeTO.setCount(tempCount + 1);
-                        }
-                    });
-                    String currentNodeNameValue = currentNodeName.get();
-                    int currentCountValue = currentCount.get();
-                    projectManager.createTempYaml(projectId, algorithmDockerImage, currentNodeNameValue, partition, offset, currentCountValue);
-                }, failure -> log.error("------- 发送消息失败:" + failure.getMessage()));
-                messageNumber[0] = messageNumber[0] + 1;
-            });
-        }
-        log.info("ProjectService--sendTaskMessage 共发送了 " + messageNumber[0] + " 条消息!");
-
-    }
+//    /**
+//     * @param parallelism          并行度
+//     * @param projectRunningPrefix
+//     * @param userId
+//     * @param projectId
+//     * @param projectType
+//     * @param nodeMap              节点
+//     * @param algorithmDockerImage 算法
+//     * @param videoTime            视频长度
+//     * @param scenePOSet
+//     * @param vehiclePO
+//     * @param cameraPOList
+//     * @param ogtPOList
+//     */
+//    @SneakyThrows
+//    public void sendTaskMessage(int parallelism,
+//                                String projectRunningPrefix,
+//                                String userId,
+//                                String projectId,
+//                                String projectType,
+//                                Map<String, Integer> nodeMap,
+//                                String algorithmDockerImage,
+//                                Long videoTime,
+//                                Set<ScenePO> scenePOSet,
+//                                VehiclePO vehiclePO,
+//                                List<CameraPO> cameraPOList,
+//                                List<OgtPO> ogtPOList) {
+//        List<NodeTO> nodeListToCount = projectUtil.getNodeListToCount(nodeMap);
+//        final int[] messageNumber = CollectionUtil.createIntArray(0);
+//        ApacheKafkaUtil.createTopic(kafkaAdminClient, projectId, parallelism, (short) 1);   // 创建主题
+//        log.info("ProjectService--sendTaskMessage 项目 " + projectId + " 获得的包括的场景信息为:" + scenePOSet);
+//        for (ScenePO scenePO : scenePOSet) {
+//            String sceneId = scenePO.getId();
+//            //3-1 可能会存在多个指标下有同样的场景,所以会查出多个指标,多个指标的场景需要发送多次
+//            List<String> lastTargetIdList = null;
+//            if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
+//                lastTargetIdList = indexMapper.selectLeafIndexIdByManualProjectIdAndSceneId(projectId, "%" + sceneId + "%");
+//            } else if (DictConstants.PROJECT_TYPE_AUTO_SUB.equals(projectType)) {
+//                lastTargetIdList = indexMapper.selectLeafIndexIdByAutoSubProjectIdAndSceneId(projectId, "%" + sceneId + "%");
+//            }
+//            lastTargetIdList.forEach(lastTargetId -> {
+//                String taskId = StringUtil.getRandomUUID();
+//                String taskRetryPrefix = projectRunningPrefix + ":task:" + taskId + ":retry";
+//                String taskMessagePrefix = projectRunningPrefix + ":task:" + taskId + ":message";
+//                // 设置任务重试次数为 0,方便任务进行最大3次的重试。
+//                stringRedisTemplate.opsForValue().set(taskRetryPrefix, "0");
+//                // 保存任务信息
+//                TaskPO taskPO = TaskPO.builder() // run_start_time 和 run_end_time 不填
+//                        .id(taskId)
+//                        .pId(projectId)
+//                        .sceneId(sceneId)
+//                        .lastTargetId(lastTargetId)
+//                        .sceneName(scenePO.getName())
+//                        .sceneType(scenePO.getType())
+//                        .runState(DictConstants.TASK_PENDING)
+//                        .runResultFilePath(projectResultPathOfMinio + projectId + "/" + taskId)
+//                        .build();
+//                taskPO.setCreateTime(TimeUtil.getNowForMysql());
+//                taskPO.setCreateUserId(userId);
+//                taskPO.setModifyTime(TimeUtil.getNowForMysql());
+//                taskPO.setModifyUserId(userId);
+//                taskPO.setModifyTime(TimeUtil.getNowForMysql());
+//                taskPO.setIsDeleted("0");
+//                taskMapper.insert(taskPO);
+//                // 下载 xodr 和 osgb 供仿真后生成 xosc
+//                String scenarioOdr = scenePO.getScenarioOdr();
+//                String scenarioOsgb = scenePO.getScenarioOsgb();
+//                String[] splitXodr = scenarioOdr.split("/");
+//                String xodrName = splitXodr[splitXodr.length - 1];
+//                String[] splitOsgb = scenarioOsgb.split("/");
+//                String osgbName = splitOsgb[splitOsgb.length - 1];
+//                try {
+//                    String xodrPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + xodrName;
+//                    String xodrPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + ".xodr";
+//                    String osgbPathOfLinux = linuxTempPath + "video/" + projectId + "/" + taskId + "/" + osgbName;
+//                    String osgbPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + ".osgb";
+//                    MinioUtil.downloadToFile(minioClient, bucketName, scenarioOdr, xodrPathOfLinux);
+//                    MinioUtil.uploadFromFile(minioClient, xodrPathOfLinux, bucketName, xodrPathOfMinio);
+//                    log.info("ProjectService--sendTaskMessage 已经将 xodr 上传到 minio 的结果文件目录:" + xodrPathOfMinio);
+//                    MinioUtil.downloadToFile(minioClient, bucketName, scenarioOsgb, osgbPathOfLinux);
+//                    MinioUtil.uploadFromFile(minioClient, osgbPathOfLinux, bucketName, osgbPathOfMinio);
+//                    log.info("ProjectService--sendTaskMessage 已经将 osgb 上传到 minio 的结果文件目录:" + osgbPathOfMinio);
+//                } catch (IOException | ServerException | InsufficientDataException | ErrorResponseException |
+//                         NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException |
+//                         XmlParserException | InternalException e) {
+//                    throw new RuntimeException(e);
+//                }
+//
+//                // 组装 task 消息
+//                TaskTO taskTO = TaskTO.builder()
+//                        .info(InfoTO.builder()
+//                                .project_id(taskPO.getPId())
+//                                .task_id(taskPO.getId())
+//                                .task_path(taskPO.getRunResultFilePath())
+//                                .default_time(videoTime)
+//                                .build())
+//                        .scenario(ScenarioTO.builder()
+//                                .scenario_osc(scenePO.getScenarioOsc())
+//                                .scenario_odr(scenarioOdr)
+//                                .scenario_osgb(scenarioOsgb)
+//                                .build())
+//                        .vehicle(VehicleTO.builder()
+//                                .model(ModelTO.builder()
+//                                        .model_label(vehiclePO.getModelLabel())
+//                                        .build())
+//                                .dynamics(DynamicsTO.builder()
+//                                        .dynamics_maxspeed(vehiclePO.getMaxSpeed())
+//                                        .dynamics_enginepower(vehiclePO.getEnginePower())
+//                                        .dynamics_maxdecel(vehiclePO.getMaxDeceleration())
+//                                        .dynamics_maxsteering(vehiclePO.getMaxSteeringAngle())
+//                                        .dynamics_mass(vehiclePO.getMass())
+//                                        .dynamics_frontsurfaceeffective(vehiclePO.getFrontSurfaceEffective())
+//                                        .dynamics_airdragcoefficient(vehiclePO.getAirDragCoefficient())
+//                                        .dynamics_rollingresistance(vehiclePO.getRollingResistanceCoefficient())
+//                                        .dynamics_wheeldiameter(vehiclePO.getWheelDiameter())
+//                                        .dynamics_wheeldrive(vehiclePO.getWheelDrive())
+//                                        .dynamics_overallefficiency(vehiclePO.getOverallEfficiency())
+//                                        .dynamics_distfront(vehiclePO.getFrontDistance())
+//                                        .dynamics_distrear(vehiclePO.getRearDistance())
+//                                        .dynamics_distleft(vehiclePO.getLeftDistance())
+//                                        .dynamics_distright(vehiclePO.getRightDistance())
+//                                        .dynamics_distheight(vehiclePO.getHeightDistance())
+//                                        .dynamics_wheelbase(vehiclePO.getWheelbase())
+//                                        .build())
+//                                .sensors(SensorsTO.builder()   // 根据 vehicleId 查询绑定的传感器列表
+//                                        .camera(cameraPOList)
+//                                        .OGT(ogtPOList)
+//                                        .build())
+//                                .build())
+//                        .build();
+//
+//                //4-4 将对象转成 json
+//                String taskJson = "";
+//                try {
+//                    taskJson = JsonUtil.beanToJson(taskTO);
+//                } catch (JsonProcessingException e) {
+//                    e.printStackTrace();
+//                }
+//                //4-5 将 projectId 作为 topic 名称,根据 parallelism 分散发送 task 信息到 kafka
+//                String finalTaskJson = taskJson;
+//                stringRedisTemplate.opsForValue().set(taskMessagePrefix, finalTaskJson);
+//                kafkaTemplate.send(projectId, messageNumber[0] % parallelism, "", taskJson).addCallback(success -> {
+//                    // 消息发送到的topic
+//                    String topic = success.getRecordMetadata().topic();
+//                    // 消息发送到的分区
+//                    int partition = success.getRecordMetadata().partition();
+//                    // 消息在分区内的offset
+//                    long offset = success.getRecordMetadata().offset();
+//                    log.info("------- ProjectConsumer 发送消息成功, 主题 topic 为:" + topic + " 分区 partition 为:" + partition + " 偏移量为:" + offset + " 消息体为:" + finalTaskJson);
+//                    //4-6 发送成功过的同时创建 pod.yaml 文件并把文件地址存到 redis
+//                    // 选一个count 最少的node,如果 count 是 0 则直接启动。
+//                    AtomicReference<String> currentNodeName = new AtomicReference<>("");
+//                    AtomicInteger currentCount = new AtomicInteger(Integer.MAX_VALUE);
+//                    nodeListToCount.forEach(nodeTO -> {
+//                        int tempCount = nodeTO.getCount();
+//                        String tempNodeName = nodeTO.getNodeName();
+//                        if (tempCount < currentCount.get()) {
+//                            currentCount.set(tempCount);
+//                            currentNodeName.set(tempNodeName);
+//                            nodeTO.setCount(tempCount + 1);
+//                        }
+//                    });
+//                    String currentNodeNameValue = currentNodeName.get();
+//                    int currentCountValue = currentCount.get();
+//                    projectManager.createTempYaml(projectId, algorithmDockerImage, currentNodeNameValue, partition, offset, currentCountValue);
+//                }, failure -> log.error("------- 发送消息失败:" + failure.getMessage()));
+//                messageNumber[0] = messageNumber[0] + 1;
+//            });
+//        }
+//        log.info("ProjectService--sendTaskMessage 共发送了 " + messageNumber[0] + " 条消息!");
+//
+//    }
 
 
     /**
@@ -556,6 +551,9 @@ public class ProjectService {
     @SneakyThrows
     public void stopProject(String projectId, String projectType) {
 
+        //1 判断项目是否已经运行
+
+
         //7 删除 kafka 消息
         ApacheKafkaUtil.deleteTopic(kafkaAdminClient, projectId);
 

+ 3 - 3
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/ProjectUtil.java

@@ -178,7 +178,7 @@ public class ProjectUtil {
         }
         for (String absolutePath : list) {
             if (absolutePath.contains(nodeName) && absolutePath.contains(projectId)) {
-                createPod2(nodeName, absolutePath);
+                createPod2(absolutePath);
                 log.info("ProjectUtil--createNextPod 创建项目 " + projectId + " 的下一个 pod。");
                 return;
             }
@@ -208,11 +208,11 @@ public class ProjectUtil {
     }
 
     /**
-     * @param nodeName    节点名称
      * @param podYamlPath pod 文件内容
      */
     @SneakyThrows
-    public void createPod2(String nodeName, String podYamlPath) {
+    public void createPod2(String podYamlPath) {
+        String nodeName = new File(podYamlPath).getName().split("#")[0];
         String podName = podYamlPath.split("#")[1].split("\\.")[0];
         stringRedisTemplate.opsForValue().set("pod:" + podName + ":node", nodeName);    // 将 pod 运行在哪个 node 上记录到 redis
         KubernetesUtil.createNs(apiClient, kubernetesConfiguration.getNamespace());

+ 108 - 105
simulation-resource-server/src/main/java/com/css/simulation/resource/scene/service/ScenePackageService.java

@@ -43,19 +43,18 @@ public class ScenePackageService {
     private SceneGeneralTemplateMapper sceneGeneralTemplateMapper;
 
 
-
     /**
      * 测试包数据录入大保存:
      */
     @SneakyThrows
-    public ResponseBodyVO<String> saveScenePackage(List<ScenePackageSublistVO> params,Integer isLcw) {
+    public ResponseBodyVO<String> saveScenePackage(List<ScenePackageSublistVO> params, Integer isLcw) {
         List<ScenePackageSublistVO> listSublictTree = new ArrayList<>();
         ScenePackagePO po = new ScenePackagePO();
         for (ScenePackageSublistVO vo : params) {
             po.setPackageName(vo.getSublistName());
             po.setCreateUserId(AuthUtil.getCurrentUserId());
             po.setShare("0");
-            ScenePackageNewVO scenePackageNewVO  = scenePackageMapper.queryByPackageName(po);
+            ScenePackageNewVO scenePackageNewVO = scenePackageMapper.queryByPackageName(po);
             if (ObjectUtil.isNotNull(scenePackageNewVO)) {
                 return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "测试包名称:" + po.getPackageName() + "已存在,请重新命名");
             }
@@ -74,11 +73,11 @@ public class ScenePackageService {
         po.setCreateUserId(AuthUtil.getCurrentUserId());
 
         List<ScenePackageSublistPO> poList = new ArrayList<>();
-        List<ScenePackageSublistPO> treeList=new ArrayList<>();
-        if(isLcw==1){
+        List<ScenePackageSublistPO> treeList = new ArrayList<>();
+        if (isLcw == 1) {
             treeList = instShareListTreeLCW(listSublictTree, uuId, uuId, poList, "0", 1);
 
-        }else{
+        } else {
             treeList = instShareListTree(listSublictTree, uuId, uuId, poList, "0", 1);
         }
         //校验指标名称唯一
@@ -281,11 +280,11 @@ public class ScenePackageService {
         po.setModifyTime(TimeUtil.getNowForMysql());
         po.setCreateUserId(AuthUtil.getCurrentUserId());
         po.setPackageCode(StringUtil.getRandomCode());
-        String uuId ="";
+        String uuId;
         if (ObjectUtil.isNotNull(scenePackageNewVO)) {
-           uuId =scenePackageNewVO.getPackageId();
-        }else{
-           uuId = StringUtil.getRandomUUID();
+            uuId = scenePackageNewVO.getPackageId();
+        } else {
+            uuId = StringUtil.getRandomUUID();
         }
         po.setPackageId(uuId);
         po.setIsDeleted("0");
@@ -293,12 +292,13 @@ public class ScenePackageService {
         List<ScenePackageSublistPO> poList = new ArrayList<>();
         List<ScenePackageSublistVO> listSublist = selectScenePackageSubListTree(null, true, params.getPackageId());
         List<ScenePackageSublistPO> treeList = instShareListTreeFX(listSublist, uuId, uuId, poList, "1", 1);
+        log.info("指标树为:" + treeList);
         if (treeList != null && treeList.size() > 1) {
-            Set set = new HashSet();
-            Map map = new HashMap<>();
+            Set<String> set = new HashSet<>();
+            Map<String, String> map = new HashMap<>();
             //打分规则
-            ScoringRulesParam scoringRulesParam=new ScoringRulesParam();
-            ScoringRulesParam gyParam=new ScoringRulesParam();
+            ScoringRulesParam scoringRulesParam = new ScoringRulesParam();
+            ScoringRulesParam gyParam = new ScoringRulesParam();
             for (ScenePackageSublistPO vo : treeList) {
                 Object sublistName = map.get(vo.getSublistName());
                 if (ObjectUtil.isNull(sublistName)) {
@@ -308,17 +308,18 @@ public class ScenePackageService {
                 }
                 //分享打分规则
                 scoringRulesParam.setRulesId(vo.getPackageAndRules());
-                ScoringRulesPO syPo= scoringRulesMapper.queryScoringRules( scoringRulesParam);//私有
+                ScoringRulesPO syPo = scoringRulesMapper.queryScoringRules(scoringRulesParam);//私有
+                log.info("打分规则为:" + syPo);
                 gyParam.setShare("1");
                 gyParam.setRuleName(syPo.getRuleName());
-                ScoringRulesPO gyPo=scoringRulesMapper.queryScoringRulesByRuleName(gyParam);
-                if(ObjectUtil.isNotNull(gyPo)){
+                ScoringRulesPO gyPo = scoringRulesMapper.queryScoringRulesByRuleName(gyParam);
+                if (ObjectUtil.isNotNull(gyPo)) {
                     syPo.setRulesId(gyPo.getRulesId());
                     syPo.setShare("1");
                     syPo.setModifyTime(TimeUtil.getNowForMysql());
                     syPo.setModifyUserId(AuthUtil.getCurrentUserId());
                     scoringRulesMapper.updateScoringRules(syPo);
-                }else{
+                } else {
                     syPo.setCreateTime(TimeUtil.getNowForMysql());
                     syPo.setModifyTime(TimeUtil.getNowForMysql());
                     syPo.setRulesId(StringUtil.getRandomUUID());
@@ -333,57 +334,58 @@ public class ScenePackageService {
 
                 //分享场景
                 //自然场景
-                String sceneNaturalIds=vo.getSceneNaturalIds();
-                if(ObjectUtil.isNotNull(sceneNaturalIds)){
-                    String sceneNaturalIdsGy="";
-                    List<String> sceneNaturalIdList=Arrays.asList(sceneNaturalIds.split(","));
-                    SceneNaturalPO SceneNaturalparm=new SceneNaturalPO();
+                String sceneNaturalIds = vo.getSceneNaturalIds();
+                if (ObjectUtil.isNotNull(sceneNaturalIds)) {
+                    String sceneNaturalIdsGy = "";
+                    List<String> sceneNaturalIdList = Arrays.asList(sceneNaturalIds.split(","));
+                    SceneNaturalPO SceneNaturalparm = new SceneNaturalPO();
                     SceneNaturalparm.setShare("1");
-                    for (String naturalId: sceneNaturalIdList) {
-                        SceneNaturalPO SceneNaturalPOSy= sceneNaturalMapper.querySceneNaturalById(naturalId);
+                    for (String naturalId : sceneNaturalIdList) {
+                        SceneNaturalPO SceneNaturalPOSy = sceneNaturalMapper.querySceneNaturalById(naturalId);
                         SceneNaturalparm.setNaturalName(SceneNaturalPOSy.getNaturalName());
-                       SceneNaturalPO sceneNaturalPOByName= sceneNaturalMapper.querySceneNaturaByName(SceneNaturalparm);
+                        SceneNaturalPO sceneNaturalPOByName = sceneNaturalMapper.querySceneNaturaByName(SceneNaturalparm);
                         SceneNaturalPOSy.setShare("1");
                         //是否已存在
-                       if(ObjectUtil.isNotNull(sceneNaturalPOByName)){
+                        if (ObjectUtil.isNotNull(sceneNaturalPOByName)) {
                           /* if(!sceneNaturalPOByName.getShare().equals("1")){
 
                            }*/
-                           SceneNaturalPOSy.setNaturalId(sceneNaturalPOByName.getNaturalId());
-                           SceneNaturalPOSy.setModifyTime(TimeUtil.getNowForMysql());
-                           SceneNaturalPOSy.setModifyUserId(AuthUtil.getCurrentUserId());
-                           sceneNaturalMapper.updateSceneNatural(SceneNaturalPOSy);
-                       }else{
-                           SceneNaturalPOSy.setNaturalId(StringUtil.getRandomUUID());
-                           SceneNaturalPOSy.setCreateTime(TimeUtil.getNowForMysql());
-                           SceneNaturalPOSy.setCreateUserId(AuthUtil.getCurrentUserId());
-                           SceneNaturalPOSy.setModifyTime(TimeUtil.getNowForMysql());
-                           SceneNaturalPOSy.setModifyUserId("");
-                           sceneNaturalMapper.saveSceneNatural(SceneNaturalPOSy);
-                       }
-                       if(ObjectUtil.isNull(sceneNaturalIdsGy)){
-                           sceneNaturalIdsGy=SceneNaturalPOSy.getNaturalId();
-                       }else{
-                           sceneNaturalIdsGy=sceneNaturalIdsGy+","+SceneNaturalPOSy.getNaturalId();
-                       }
+                            SceneNaturalPOSy.setNaturalId(sceneNaturalPOByName.getNaturalId());
+                            SceneNaturalPOSy.setModifyTime(TimeUtil.getNowForMysql());
+                            SceneNaturalPOSy.setModifyUserId(AuthUtil.getCurrentUserId());
+                            sceneNaturalMapper.updateSceneNatural(SceneNaturalPOSy);
+                        } else {
+                            SceneNaturalPOSy.setNaturalId(StringUtil.getRandomUUID());
+                            SceneNaturalPOSy.setCreateTime(TimeUtil.getNowForMysql());
+                            SceneNaturalPOSy.setCreateUserId(AuthUtil.getCurrentUserId());
+                            SceneNaturalPOSy.setModifyTime(TimeUtil.getNowForMysql());
+                            SceneNaturalPOSy.setModifyUserId("");
+                            sceneNaturalMapper.saveSceneNatural(SceneNaturalPOSy);
+                        }
+                        if (ObjectUtil.isNull(sceneNaturalIdsGy)) {
+                            sceneNaturalIdsGy = SceneNaturalPOSy.getNaturalId();
+                        } else {
+                            sceneNaturalIdsGy = sceneNaturalIdsGy + "," + SceneNaturalPOSy.getNaturalId();
+                        }
                     }
                     vo.setSceneNaturalIds(sceneNaturalIdsGy);
-                };
+                }
+                ;
 
                 //标准法规
-                String sceneStatueIds=vo.getSceneStatueIds();
-                if(ObjectUtil.isNotNull(sceneStatueIds)){
-                    String sceneStatueIdsGy="";
-                    List<String> sceneStatueIdList=Arrays.asList(sceneStatueIds.split(","));
-                    StandardsRegulationsPO standardsRegulationsPO=new StandardsRegulationsPO();
+                String sceneStatueIds = vo.getSceneStatueIds();
+                if (ObjectUtil.isNotNull(sceneStatueIds)) {
+                    String sceneStatueIdsGy = "";
+                    List<String> sceneStatueIdList = Arrays.asList(sceneStatueIds.split(","));
+                    StandardsRegulationsPO standardsRegulationsPO = new StandardsRegulationsPO();
                     standardsRegulationsPO.setShare("1");
-                    for (String sceneStatueId: sceneStatueIdList) {
-                        StandardsRegulationsPO standardsRegulationsPOSy= standardsRegulationsMapper.queryStandardsRegulationsById(sceneStatueId);
+                    for (String sceneStatueId : sceneStatueIdList) {
+                        StandardsRegulationsPO standardsRegulationsPOSy = standardsRegulationsMapper.queryStandardsRegulationsById(sceneStatueId);
                         standardsRegulationsPO.setSceneName(standardsRegulationsPOSy.getSceneName());
-                        StandardsRegulationsPO StandardsRegulationsByName= standardsRegulationsMapper.queryStandardsRegulationsByName(standardsRegulationsPO);
+                        StandardsRegulationsPO StandardsRegulationsByName = standardsRegulationsMapper.queryStandardsRegulationsByName(standardsRegulationsPO);
                         standardsRegulationsPOSy.setShare("1");
                         //是否已存在
-                        if(ObjectUtil.isNotNull(StandardsRegulationsByName)){
+                        if (ObjectUtil.isNotNull(StandardsRegulationsByName)) {
                           /* if(!sceneNaturalPOByName.getShare().equals("1")){
 
                            }*/
@@ -391,7 +393,7 @@ public class ScenePackageService {
                             standardsRegulationsPOSy.setModifyTime(TimeUtil.getNowForMysql());
                             standardsRegulationsPOSy.setModifyUserId(AuthUtil.getCurrentUserId());
                             standardsRegulationsMapper.updateStandardsRegulations(standardsRegulationsPOSy);
-                        }else{
+                        } else {
                             standardsRegulationsPOSy.setRegulationsId(StringUtil.getRandomUUID());
                             standardsRegulationsPOSy.setCreateTime(TimeUtil.getNowForMysql());
                             standardsRegulationsPOSy.setCreateUserId(AuthUtil.getCurrentUserId());
@@ -400,29 +402,30 @@ public class ScenePackageService {
                             standardsRegulationsMapper.saveStandardsRegulations(standardsRegulationsPOSy);
                         }
 
-                        if(ObjectUtil.isNull(sceneStatueIdsGy)){
-                            sceneStatueIdsGy=standardsRegulationsPOSy.getRegulationsId();
-                        }else{
-                            sceneStatueIdsGy=sceneStatueIdsGy+","+standardsRegulationsPOSy.getRegulationsId();
+                        if (ObjectUtil.isNull(sceneStatueIdsGy)) {
+                            sceneStatueIdsGy = standardsRegulationsPOSy.getRegulationsId();
+                        } else {
+                            sceneStatueIdsGy = sceneStatueIdsGy + "," + standardsRegulationsPOSy.getRegulationsId();
                         }
                     }
                     vo.setSceneStatueIds(sceneStatueIdsGy);
-                };
+                }
+                ;
 
                 //交通事故
-                String sceneTrafficIds=vo.getSceneTrafficIds();
-                if(ObjectUtil.isNotNull(sceneTrafficIds)){
-                    String sceneTrafficIdsGy="";
-                    List<String> sceneTrafficIdList=Arrays.asList(sceneTrafficIds.split(","));
-                    SceneAccidentPO sceneAccidentPO=new SceneAccidentPO();
+                String sceneTrafficIds = vo.getSceneTrafficIds();
+                if (ObjectUtil.isNotNull(sceneTrafficIds)) {
+                    String sceneTrafficIdsGy = "";
+                    List<String> sceneTrafficIdList = Arrays.asList(sceneTrafficIds.split(","));
+                    SceneAccidentPO sceneAccidentPO = new SceneAccidentPO();
                     sceneAccidentPO.setShare("1");
-                    for (String sceneStatueId: sceneTrafficIdList) {
+                    for (String sceneStatueId : sceneTrafficIdList) {
                         SceneAccidentPO sceneAccidentPOSy = sceneAccidentMapper.querySceneAccidentById(sceneStatueId);
                         sceneAccidentPO.setSceneName(sceneAccidentPOSy.getSceneName());
-                        SceneAccidentPO sceneAccidentPOByName=  sceneAccidentMapper.querySceneAccidentByNmae(sceneAccidentPO);
+                        SceneAccidentPO sceneAccidentPOByName = sceneAccidentMapper.querySceneAccidentByNmae(sceneAccidentPO);
                         sceneAccidentPOSy.setShare("1");
                         //是否已存在
-                        if(ObjectUtil.isNotNull(sceneAccidentPOByName)){
+                        if (ObjectUtil.isNotNull(sceneAccidentPOByName)) {
                           /* if(!sceneNaturalPOByName.getShare().equals("1")){
 
                            }*/
@@ -430,7 +433,7 @@ public class ScenePackageService {
                             sceneAccidentPOSy.setModifyTime(TimeUtil.getNowForMysql());
                             sceneAccidentPOSy.setModifyUserId(AuthUtil.getCurrentUserId());
                             sceneAccidentMapper.updateSceneAccident(sceneAccidentPOSy);
-                        }else{
+                        } else {
                             sceneAccidentPOSy.setAccidentId(StringUtil.getRandomUUID());
                             sceneAccidentPOSy.setCreateTime(TimeUtil.getNowForMysql());
                             sceneAccidentPOSy.setCreateUserId(AuthUtil.getCurrentUserId());
@@ -438,14 +441,15 @@ public class ScenePackageService {
                             sceneAccidentPOSy.setModifyUserId("");
                             sceneAccidentMapper.saveSceneAccident(sceneAccidentPOSy);
                         }
-                        if(ObjectUtil.isNull(sceneTrafficIdsGy)){
-                            sceneTrafficIdsGy=sceneAccidentPOSy.getAccidentId();
-                        }else{
-                            sceneTrafficIdsGy=sceneTrafficIdsGy+","+sceneAccidentPOSy.getAccidentId();
+                        if (ObjectUtil.isNull(sceneTrafficIdsGy)) {
+                            sceneTrafficIdsGy = sceneAccidentPOSy.getAccidentId();
+                        } else {
+                            sceneTrafficIdsGy = sceneTrafficIdsGy + "," + sceneAccidentPOSy.getAccidentId();
                         }
                     }
                     vo.setSceneTrafficIds(sceneTrafficIdsGy);
-                };
+                }
+                ;
 
                 //泛化模板
                /* String sceneGeneralizationIds=vo.getSceneGeneralizationIds();
@@ -478,30 +482,30 @@ public class ScenePackageService {
                     }
                 };*/
                 //泛化
-                String templateId=vo.getTemplateId();
-                if(ObjectUtil.isNotNull(templateId)){
-                    SceneGeneralTemplatePO sceneGeneralTemplatePO=new SceneGeneralTemplatePO();
+                String templateId = vo.getTemplateId();
+                if (ObjectUtil.isNotNull(templateId)) {
+                    SceneGeneralTemplatePO sceneGeneralTemplatePO = new SceneGeneralTemplatePO();
                     sceneGeneralTemplatePO.setShare("1");
                     SceneGeneralTemplatePO sceneGeneralTemplatePOSy = sceneGeneralTemplateMapper.querySceneGeneralTemplateById(templateId);
                     sceneGeneralTemplatePO.setSceneId(sceneGeneralTemplatePOSy.getSceneId());
-                    SceneGeneralTemplatePO sceneGeneralTemplatePOByName=  sceneGeneralTemplateMapper.querySceneGeneralTemplateByName(sceneGeneralTemplatePO);
+                    SceneGeneralTemplatePO sceneGeneralTemplatePOByName = sceneGeneralTemplateMapper.querySceneGeneralTemplateByName(sceneGeneralTemplatePO);
                     sceneGeneralTemplatePOSy.setShare("1");
                     //是否已存在
-                    if(ObjectUtil.isNotNull(sceneGeneralTemplatePOByName)){
-                    sceneGeneralTemplatePOSy.setId(sceneGeneralTemplatePOByName.getId());
-                    sceneGeneralTemplatePOSy.setModifyTime(TimeUtil.getNowForMysql());
-                    sceneGeneralTemplatePOSy.setModifyUserId(AuthUtil.getCurrentUserId());
-                    sceneGeneralTemplateMapper.updateSceneGeneralTemplate(sceneGeneralTemplatePOSy);
-                }else{
-                    String uuFhId=StringUtil.getRandomUUID();
-                    sceneGeneralTemplatePOSy.setId(uuFhId);
-                    sceneGeneralTemplatePOSy.setCreateTime(TimeUtil.getNowForMysql());
-                    sceneGeneralTemplatePOSy.setCreateUserId(AuthUtil.getCurrentUserId());
-                    sceneGeneralTemplatePOSy.setModifyTime(TimeUtil.getNowForMysql());
-                    sceneGeneralTemplatePOSy.setModifyUserId("");
-                    sceneGeneralTemplateMapper.saveSceneGeneralTemplate(sceneGeneralTemplatePOSy);
-                    vo.setTemplateId(uuFhId);
-                }
+                    if (ObjectUtil.isNotNull(sceneGeneralTemplatePOByName)) {
+                        sceneGeneralTemplatePOSy.setId(sceneGeneralTemplatePOByName.getId());
+                        sceneGeneralTemplatePOSy.setModifyTime(TimeUtil.getNowForMysql());
+                        sceneGeneralTemplatePOSy.setModifyUserId(AuthUtil.getCurrentUserId());
+                        sceneGeneralTemplateMapper.updateSceneGeneralTemplate(sceneGeneralTemplatePOSy);
+                    } else {
+                        String uuFhId = StringUtil.getRandomUUID();
+                        sceneGeneralTemplatePOSy.setId(uuFhId);
+                        sceneGeneralTemplatePOSy.setCreateTime(TimeUtil.getNowForMysql());
+                        sceneGeneralTemplatePOSy.setCreateUserId(AuthUtil.getCurrentUserId());
+                        sceneGeneralTemplatePOSy.setModifyTime(TimeUtil.getNowForMysql());
+                        sceneGeneralTemplatePOSy.setModifyUserId("");
+                        sceneGeneralTemplateMapper.saveSceneGeneralTemplate(sceneGeneralTemplatePOSy);
+                        vo.setTemplateId(uuFhId);
+                    }
                 }
 
             }
@@ -510,7 +514,6 @@ public class ScenePackageService {
             }
 
 
-
         }
         //判断是否存在,存在覆盖
         if (ObjectUtil.isNotNull(scenePackageNewVO)) {
@@ -521,7 +524,7 @@ public class ScenePackageService {
             scenePackagePO.setPackageId(scenePackageNewVO.getPackageId());
             scenePackageMapper.updateScenePackage(scenePackagePO);
             scenePackageSublistMapper.deleteScenePackageSublist(scenePackageNewVO.getPackageId());
-        }else{
+        } else {
             scenePackageMapper.saveScenePackage(po);
         }
         scenePackageSublistMapper.saveScenePackageSublistAll(treeList);
@@ -553,8 +556,8 @@ public class ScenePackageService {
             if (ObjectUtil.isNull(parentVoList.get(i).getSceneGeneralizationIds())) {
                 String uuId = StringUtil.getRandomUUID();
                 params.setId(uuId);   //主键ID
-            }else if(ObjectUtil.isNotNull(parentVoList.get(i).getSceneGeneralizationIds())){
-                    scenePackageSublistMapper.deleteScenePackageSublistById(parentVoList.get(i).getId());
+            } else if (ObjectUtil.isNotNull(parentVoList.get(i).getSceneGeneralizationIds())) {
+                scenePackageSublistMapper.deleteScenePackageSublistById(parentVoList.get(i).getId());
             }
             params.setIsDeleted("0");
             params.setShare(share);
@@ -584,18 +587,18 @@ public class ScenePackageService {
     //查询个人测试包数量
     @SneakyThrows
     public Map queryPackageCount() {
-        ScenePackagePO params=new ScenePackagePO();
+        ScenePackagePO params = new ScenePackagePO();
         params.setCreateUserId(AuthUtil.getCurrentUserId());
         params.setShare("0");
-        int myPackageCount= scenePackageMapper.queryPackageCount(params);
+        int myPackageCount = scenePackageMapper.queryPackageCount(params);
         HashMap<String, Integer> sceneParam = parameterService.getSceneParam();
-        sceneParam.put("myPackageCount",myPackageCount);//场景包数量
+        sceneParam.put("myPackageCount", myPackageCount);//场景包数量
         return sceneParam;
     }
 
 
     public List<ScenePackageSublistPO> instShareListTreeFX(List<ScenePackageSublistVO> parentVoList,
-                                                         String scenePackageId, String rootId, List<ScenePackageSublistPO> poList
+                                                           String scenePackageId, String rootId, List<ScenePackageSublistPO> poList
             , String share, Integer level) {
         //获取子节点集合
         for (int i = 0; i < parentVoList.size(); i++) {
@@ -611,11 +614,11 @@ public class ScenePackageService {
             if (ObjectUtil.isNull(parentVoList.get(i).getSceneGeneralizationIds())) {
                 String uuId = StringUtil.getRandomUUID();
                 params.setId(uuId);   //主键ID
-            }else if(ObjectUtil.isNotNull(parentVoList.get(i).getSceneGeneralizationIds())){
-                if(share.equals("1")){
+            } else if (ObjectUtil.isNotNull(parentVoList.get(i).getSceneGeneralizationIds())) {
+                if (share.equals("1")) {
                     String uuId = StringUtil.getRandomUUID();
                     params.setId(uuId);
-                }else{
+                } else {
                     scenePackageSublistMapper.deleteScenePackageSublistById(parentVoList.get(i).getId());
                 }
             }
@@ -637,7 +640,7 @@ public class ScenePackageService {
     }
 
     public List<ScenePackageSublistPO> instShareListTreeLCW(List<ScenePackageSublistVO> parentVoList,
-                                                           String scenePackageId, String rootId, List<ScenePackageSublistPO> poList
+                                                            String scenePackageId, String rootId, List<ScenePackageSublistPO> poList
             , String share, Integer level) {
         //获取子节点集合
         for (int i = 0; i < parentVoList.size(); i++) {