root 2 жил өмнө
parent
commit
111b5b375e

+ 0 - 7
api-common/pom.xml

@@ -17,16 +17,9 @@
         <jackson-core.version>2.13.1</jackson-core.version>
         <sshd-netty.version>2.8.0</sshd-netty.version>
         <dom4j.version>2.1.3</dom4j.version>
-        <tencentcloud-sdk-java.version>3.1.600</tencentcloud-sdk-java.version>
     </properties>
 
     <dependencies>
-        <!-- 腾讯云服务 -->
-        <dependency>
-            <groupId>com.tencentcloudapi</groupId>
-            <artifactId>tencentcloud-sdk-java</artifactId>
-            <version>${tencentcloud-sdk-java.version}</version>
-        </dependency>
 
         <!-- xml 处理库 -->
         <dependency>

+ 19 - 0
api-common/src/main/java/api/common/pojo/dto/SmsDTO.java

@@ -0,0 +1,19 @@
+package api.common.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SmsDTO {
+    private String secretId;
+    private String secretKey;
+    private String sdkAppId;
+    private String signName;
+    private String templateId;
+    private String phone;
+}

+ 1 - 4
pom.xml

@@ -22,6 +22,7 @@
         <module>simulation-resource-monitor</module>
         <module>simulation-resource-scene</module>
         <module>simulation-resource-video</module>
+        <module>simulation-resource-sms</module>
     </modules>
 
 
@@ -58,16 +59,12 @@
         <kubernetes-client.version>15.0.1</kubernetes-client.version>
         <snakeyaml.version>1.30</snakeyaml.version>
         <docker-java.version>3.2.13</docker-java.version>
-
     </properties>
 
 
     <!--子模块继承之后,提供作用:锁定版本 + 子 module 不用谢 groupId 和 version-->
     <dependencyManagement>
         <dependencies>
-
-
-
             <!-- 解决依赖冲突 -->
             <dependency>
                 <groupId>ch.qos.logback</groupId>

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

@@ -218,10 +218,13 @@ public class ProjectConsumer {
         VehiclePO vehiclePO = vehicleMapper.selectByVehicleConfigId(vehicleConfigId);   // 车辆
         List<CameraPO> cameraPOList = sensorCameraMapper.selectCameraByVehicleConfigId(vehicleConfigId);    // 摄像头
         List<OgtPO> ogtPOList = sensorOgtMapper.selectOgtByVehicleId(vehicleConfigId); // 完美传感器
-        // -------------------------------- 3 算法导入(一期按单机版做) --------------------------------
+        // -------------------------------- 3 算法导入 --------------------------------
         String algorithmDockerImage = projectService.handleAlgorithm(projectId, algorithmId);
         // -------------------------------- 4 发送任务消息 --------------------------------
-        projectService.sendTaskMessage(realCurrentParallelism, projectRunningKey, userId, projectId, projectType, nodeMap, algorithmDockerImage, videoTime, scenePOSet, vehiclePO, cameraPOList, ogtPOList);
+        projectService.sendTaskMessage(realCurrentParallelism, projectRunningKey, userId, projectId, projectType,
+                nodeMap, algorithmDockerImage, videoTime, scenePOSet, vehiclePO, cameraPOList, ogtPOList);
+
+
         // -------------------------------- 5 创建 pod 开始执行 --------------------------------
 //        projectService.createPod(projectId, nodeMap, algorithmDockerImage);
 

+ 0 - 1
simulation-resource-server/pom.xml

@@ -21,7 +21,6 @@
         <dependency>
             <groupId>org.apache.kafka</groupId>
             <artifactId>kafka-clients</artifactId>
-            <version>${kafka-clients.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.kafka</groupId>

+ 1 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/configuration/sms/SmsConfiguration.java

@@ -14,4 +14,5 @@ public class SmsConfiguration {
     private String signName;
     private String templateIdForReset;
     private String templateIdForCreate;
+    private String kafkaTopic;
 }

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

@@ -220,19 +220,19 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     }
 
     @Override
-    public ResponseBodyVO selectProjectById(SimulationManualProjectParam param) {
+    public ResponseBodyVO<SimulationManualProjectSingleVo> selectProjectById(SimulationManualProjectParam param) {
         if (isEmpty(param.getId())) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE);
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE);
         }
         SimulationManualProjectPo po = simulationProjectMapper.selectProjectById(param);
         if (po == null) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "没有获取到数据");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE, "没有获取到数据");
         }
 
         SimulationManualProjectSingleVo vo = new SimulationManualProjectSingleVo();
         convertPoToVo(po, vo);
 
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, vo);
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, vo);
 
     }
 
@@ -251,7 +251,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         List<SimulationManualProjectPo> pos = simulationProjectMapper.selectProjectNowRunState(idArr);
         for (SimulationManualProjectPo p : pos) {
             if (ProjectRunStateEnum.EXECUTION.getCode().equals(p.getNowRunState())) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "数据不支持删除");
+                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "数据不支持删除");
             }
         }
 
@@ -260,7 +260,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
         }
 
-        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "删除失败");
+        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "删除失败");
     }
 
     @SneakyThrows
@@ -274,7 +274,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         SimulationManualProjectPo po = simulationProjectMapper.selectProjectById(param);
 
         if (po == null) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "数据没有找到");
+            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "数据没有找到");
         }
 
         //已经完成的项目再次运行

+ 22 - 18
simulation-resource-server/src/main/java/com/css/simulation/resource/system/service/UserService.java

@@ -2,14 +2,15 @@ package com.css.simulation.resource.system.service;
 
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.constants.LogConstants;
+import api.common.pojo.dto.SmsDTO;
 import api.common.pojo.param.system.UserParam;
 import api.common.pojo.po.system.UserPO;
 import api.common.pojo.vo.system.ParameterVO;
 import api.common.pojo.vo.system.UserVO;
 import api.common.util.EncryptUtil;
+import api.common.util.JsonUtil;
 import api.common.util.ObjectUtil;
 import api.common.util.StringUtil;
-import api.common.util.TencentSMSUtil;
 import com.css.simulation.resource.common.oauth.OauthParameter;
 import com.css.simulation.resource.common.utils.AuthUtil;
 import com.css.simulation.resource.common.utils.PageUtil;
@@ -19,6 +20,7 @@ import com.css.simulation.resource.log.service.LogService;
 import com.css.simulation.resource.system.mapper.UserMapper;
 import com.github.pagehelper.PageInfo;
 import lombok.SneakyThrows;
+import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -42,6 +44,8 @@ public class UserService {
     ParameterService parameterService;
     @Resource
     SmsConfiguration smsConfiguration;
+    @Resource
+    KafkaTemplate<String, String> kafkaTemplate;
 
     public UserVO getCurrentUserInfo() {
         String userId = AuthUtil.getCurrentUserId();
@@ -129,15 +133,15 @@ public class UserService {
             userMapper.insert(userPO);
             logService.logUser(LogConstants.SYS_LOG_USER_INSERT, userPO);
 
-            // 发送短信
-            TencentSMSUtil.send(
-                    smsConfiguration.getSecretId(),
-                    smsConfiguration.getSecretKey(),
-                    smsConfiguration.getSdkAppId(),
-                    smsConfiguration.getSignName(),
-                    smsConfiguration.getTemplateIdForCreate(),
-                    new String[]{},
-                    new String[]{userPO.getPhone()}
+
+            kafkaTemplate.send(smsConfiguration.getKafkaTopic(),
+                    JsonUtil.beanToJson(SmsDTO.builder()
+                            .secretId(smsConfiguration.getSecretId())
+                            .secretKey(smsConfiguration.getSecretKey())
+                            .signName(smsConfiguration.getSignName())
+                            .templateId(smsConfiguration.getTemplateIdForCreate())
+                            .phone(userPO.getPhone())
+                            .build())
             );
 
         } else {
@@ -157,14 +161,14 @@ public class UserService {
         logService.logUser(LogConstants.SYS_LOG_USER_RESET, userPO);
 
         // 发送短信
-        TencentSMSUtil.send(
-                smsConfiguration.getSecretId(),
-                smsConfiguration.getSecretKey(),
-                smsConfiguration.getSdkAppId(),
-                smsConfiguration.getSignName(),
-                smsConfiguration.getTemplateIdForReset(),
-                new String[]{},
-                new String[]{userPO.getPhone()}
+        kafkaTemplate.send(smsConfiguration.getKafkaTopic(),
+                JsonUtil.beanToJson(SmsDTO.builder()
+                        .secretId(smsConfiguration.getSecretId())
+                        .secretKey(smsConfiguration.getSecretKey())
+                        .signName(smsConfiguration.getSignName())
+                        .templateId(smsConfiguration.getTemplateIdForCreate())
+                        .phone(userPO.getPhone())
+                        .build())
         );
     }
 

+ 109 - 0
simulation-resource-sms/pom.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>simulation-cloud</artifactId>
+        <groupId>com.css</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>simulation-resource-sms</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <tencentcloud-sdk-java.version>3.1.600</tencentcloud-sdk-java.version>
+    </properties>
+
+    <dependencies>
+
+        <!-- apache kafka - 开始 -->
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+        </dependency>
+        <!-- apache kafka - 结束 -->
+
+        <!-- 腾讯云服务 -->
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>${tencentcloud-sdk-java.version}</version>
+        </dependency>
+
+        <!-- nacos - 开始 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!-- nacos - 结束 -->
+
+        <!-- 基础 -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-loadbalancer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                    <addResources>true</addResources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 20 - 0
simulation-resource-sms/src/main/java/com/css/simulation/resource/sms/SimulationResourceSmsApplication.java

@@ -0,0 +1,20 @@
+package com.css.simulation.resource.sms;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+@SpringBootApplication
+@EnableFeignClients
+@EnableDiscoveryClient
+@EnableScheduling
+public class SimulationResourceSmsApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SimulationResourceSmsApplication.class, args);
+    }
+
+}

+ 40 - 0
simulation-resource-sms/src/main/java/com/css/simulation/resource/sms/consumer/SmsConsumer.java

@@ -0,0 +1,40 @@
+package com.css.simulation.resource.sms.consumer;
+
+
+import com.css.simulation.resource.sms.pojo.dto.SmsDTO;
+import com.css.simulation.resource.sms.util.JsonUtil;
+import com.css.simulation.resource.sms.util.TencentSMSUtil;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class SmsConsumer {
+
+    /**
+     * 任务运行前首先判断用户是否拥有可分配资源
+     *
+     * @param projectRecord 项目启动消息
+     */
+    @KafkaListener(groupId = "simulation-resource-sms", topics = "${sms.topic}")
+    @SneakyThrows
+    public void sendShortMessage(ConsumerRecord<String, String> projectRecord) {
+        String smsDTOJson = projectRecord.value();
+        SmsDTO smsDTO = JsonUtil.jsonToBean(smsDTOJson, SmsDTO.class);
+        log.info("SmsConsumer.sendShortMessage() 准备发送短信:" + smsDTOJson);
+        TencentSMSUtil.send(
+                smsDTO.getSecretId(),
+                smsDTO.getSecretKey(),
+                smsDTO.getSdkAppId(),
+                smsDTO.getSignName(),
+                smsDTO.getTemplateId(),
+                new String[]{},
+                new String[]{smsDTO.getPhone()}
+        );
+    }
+
+
+}

+ 19 - 0
simulation-resource-sms/src/main/java/com/css/simulation/resource/sms/pojo/dto/SmsDTO.java

@@ -0,0 +1,19 @@
+package com.css.simulation.resource.sms.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SmsDTO {
+    private String secretId;
+    private String secretKey;
+    private String sdkAppId;
+    private String signName;
+    private String templateId;
+    private String phone;
+}

+ 114 - 0
simulation-resource-sms/src/main/java/com/css/simulation/resource/sms/util/JsonUtil.java

@@ -0,0 +1,114 @@
+package com.css.simulation.resource.sms.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.TextNode;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class JsonUtil {
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+
+    /**
+     * bean 转成 json
+     *
+     * @param bean bean 对象
+     * @param <T>  声明为泛型方法
+     * @return json 字符串
+     * @throws JsonProcessingException 异常
+     */
+    public static <T> String beanToJson(T bean) throws JsonProcessingException {
+        return new ObjectMapper().writeValueAsString(bean);
+    }
+
+    /**
+     * json 转成 bean
+     *
+     * @param json   json 字符串
+     * @param tClass 返回值类型
+     * @param <T>    声明为泛型方法
+     * @return bean 对象
+     * @throws JsonProcessingException 异常
+     */
+    public static <T> T jsonToBean(String json, Class<T> tClass) throws JsonProcessingException {
+        return new ObjectMapper().readValue(json, tClass);
+    }
+
+    /**
+     * bean 转成 json
+     *
+     * @param list 列表对象
+     * @param <T>  声明为泛型方法
+     * @return json 字符串
+     * @throws JsonProcessingException 异常
+     */
+    public static <T> String listToJson(T list) throws JsonProcessingException {
+        return new ObjectMapper().writeValueAsString(list);
+    }
+
+
+    public static Map jsonToMap(String json) {
+        try {
+            return new ObjectMapper().readValue(json, HashMap.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new HashMap();
+    }
+
+    public static JsonNode readTree(String json) {
+        try {
+            return mapper.readTree(json);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        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());
+    }
+
+}
+

+ 1 - 1
api-common/src/main/java/api/common/util/TencentSMSUtil.java → simulation-resource-sms/src/main/java/com/css/simulation/resource/sms/util/TencentSMSUtil.java

@@ -1,4 +1,4 @@
-package api.common.util;
+package com.css.simulation.resource.sms.util;
 
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.profile.ClientProfile;