From 1a3b267685aa747621633f7f548901b03e08a2d1 Mon Sep 17 00:00:00 2001 From: chentaisen <14615430+chentaisen@user.noreply.gitee.com> Date: Sun, 29 Sep 2024 01:29:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-common/cloud-common-kafka/pom.xml | 5 +- .../kafka/config/KafkaConsumerConfig.java | 54 ++++ .../kafka/config/KafkaProducerConfig.java | 45 ---- .../kafka/config/KafkaProviderConfig.java | 45 ++++ .../kafka/constants/KafkaConstants.java | 2 - ...ot.autoconfigure.AutoConfiguration.imports | 3 +- cloud-data-processing/pom.xml | 52 ++-- .../data/processing/MyDataApplication.java | 7 +- .../controller/DataProcessingController.java | 160 ++++++++++++ .../processing/controller/TestController.java | 34 ++- .../data/processing/domain/IotDbData.java | 37 +++ .../data/processing/domain/KafkaData.java | 33 +++ .../data/processing/domain/StrategyEums.java | 62 +++++ .../data/processing/domain/req/TestReq.java | 28 +++ .../data/processing/domain/resp/TestResp.java | 24 ++ .../kafka/KafkaConsumerService.java | 43 +++- .../mapper/DataProcessingMapper.java | 37 +++ .../service/DataProcessingService.java | 63 +++++ .../impl/DataProcessingServiceImpl.java | 70 ++++++ .../processing/strategy/StrategyHandler.java | 22 ++ .../strategy/abstractStrategyRouter.java | 56 +++++ .../strategy/branch/OneBranchStrategy.java | 38 +++ .../strategy/branch/TwoBranchStrategy.java | 38 +++ .../strategy/leaves/FourLeavesStrategy.java | 27 ++ .../strategy/leaves/OneLeavesStrategy.java | 31 +++ .../strategy/leaves/ThreeLeavesStrategy.java | 27 ++ .../strategy/leaves/TwoLeavesStrategy.java | 27 ++ .../strategy/root/RootStrategy.java | 36 +++ .../src/main/resources/bootstrap.yml | 17 ++ .../processing/DataProcessingMapper.xml | 26 ++ cloud-modules/cloud-breakdown/pom.xml | 5 + cloud-modules/cloud-modules-car/pom.xml | 4 +- cloud-modules/cloud-modules-carmanage/pom.xml | 4 + .../controller/SysCarMessageController.java | 58 ++--- .../com/muyu/car/domain/SysCarMessage.java | 4 +- .../SysMessageResp.java} | 5 +- .../muyu/car/mapper/SysCarMessageMapper.java | 4 +- .../car/service/ISysCarMessageService.java | 4 +- .../impl/SysCarMessageServiceImpl.java | 6 +- .../src/main/resources/bootstrap.yml | 4 +- .../mapper/car/SysCarMessageMapper.xml | 2 +- .../pom.xml | 42 +++- .../muyu/parsing/CloudParsingApplication.java | 22 ++ .../controller/SysCarMessageController.java | 231 ++++++++++++++++++ .../com/muyu/parsing/domain/KafKaData.java | 26 ++ .../muyu/parsing/domain/SysCarMessage.java | 67 +++++ .../parsing/domain/resp/SysMessageResp.java | 22 ++ .../parsing/mapper/SysCarMessageMapper.java | 20 ++ .../main/java/com/muyu/parsing/mqtt/Demo.java | 61 +++++ .../java/com/muyu/parsing/mqtt/MqttTest.java | 192 +++++++++++++++ .../muyu/parsing/remote/CarMessageRemote.java | 19 ++ .../service/ISysCarMessageService.java | 44 ++++ .../impl/SysCarMessageServiceImpl.java | 97 ++++++++ .../src/main/resources/banner.txt | 2 + .../src/main/resources/bootstrap.yml | 77 ++++++ .../src/main/resources/logback/dev.xml | 74 ++++++ .../src/main/resources/logback/prod.xml | 81 ++++++ .../src/main/resources/logback/test.xml | 81 ++++++ .../zhangyi/rail/CloudRailApplication.java | 7 - .../rail/controller/RailController.java | 4 - .../com/zhangyi/rail/domain/SysFenceRail.java | 38 --- .../cloud-modules-system-saas/pom.xml | 4 +- .../warning/controller/WxTestController.java | 1 + cloud-modules/cloud-modules-warn/pom.xml | 3 + cloud-modules/pom.xml | 2 +- 65 files changed, 2277 insertions(+), 189 deletions(-) create mode 100644 cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaConsumerConfig.java delete mode 100644 cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProducerConfig.java create mode 100644 cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProviderConfig.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/controller/DataProcessingController.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/domain/IotDbData.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/domain/KafkaData.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/domain/StrategyEums.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/domain/req/TestReq.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/domain/resp/TestResp.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/mapper/DataProcessingMapper.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/service/DataProcessingService.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/service/impl/DataProcessingServiceImpl.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/StrategyHandler.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/abstractStrategyRouter.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/OneBranchStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/TwoBranchStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/FourLeavesStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/OneLeavesStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/ThreeLeavesStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/TwoLeavesStrategy.java create mode 100644 cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/root/RootStrategy.java create mode 100644 cloud-data-processing/src/main/resources/mapper/processing/DataProcessingMapper.xml rename cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/{VO/SysMessageVO.java => resp/SysMessageResp.java} (78%) rename cloud-modules/{cloud-modules-rail => cloud-modules-parsing}/pom.xml (70%) create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/CloudParsingApplication.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/controller/SysCarMessageController.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/KafKaData.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/SysCarMessage.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/resp/SysMessageResp.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mapper/SysCarMessageMapper.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/Demo.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/MqttTest.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/remote/CarMessageRemote.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/ISysCarMessageService.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/impl/SysCarMessageServiceImpl.java create mode 100644 cloud-modules/cloud-modules-parsing/src/main/resources/banner.txt create mode 100644 cloud-modules/cloud-modules-parsing/src/main/resources/bootstrap.yml create mode 100644 cloud-modules/cloud-modules-parsing/src/main/resources/logback/dev.xml create mode 100644 cloud-modules/cloud-modules-parsing/src/main/resources/logback/prod.xml create mode 100644 cloud-modules/cloud-modules-parsing/src/main/resources/logback/test.xml delete mode 100644 cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/CloudRailApplication.java delete mode 100644 cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/controller/RailController.java delete mode 100644 cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/domain/SysFenceRail.java diff --git a/cloud-common/cloud-common-kafka/pom.xml b/cloud-common/cloud-common-kafka/pom.xml index f4b987e..44dbe21 100644 --- a/cloud-common/cloud-common-kafka/pom.xml +++ b/cloud-common/cloud-common-kafka/pom.xml @@ -25,8 +25,9 @@ - org.springframework.kafka - spring-kafka + org.apache.kafka + kafka-clients + 3.0.0 diff --git a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaConsumerConfig.java b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaConsumerConfig.java new file mode 100644 index 0000000..21092d2 --- /dev/null +++ b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaConsumerConfig.java @@ -0,0 +1,54 @@ +package com.muyu.common.kafka.config; + +import com.muyu.common.kafka.constants.KafkaConstants; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.Deserializer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + * kafka 消息的消费者 配置类 + */ +@Configuration +public class KafkaConsumerConfig { + + @Bean + public KafkaConsumer kafkaConsumer() { + Map configs = new HashMap<>(); + //kafka服务端的IP和端口,格式:(ip:port) + configs.put("bootstrap.servers", "47.116.173.119:9092"); + //开启consumer的偏移量(offset)自动提交到Kafka + configs.put("enable.auto.commit", true); + //consumer的偏移量(offset) 自动提交的时间间隔,单位毫秒 + configs.put("auto.commit.interval", 5000); + //在Kafka中没有初始化偏移量或者当前偏移量不存在情况 + //earliest, 在偏移量无效的情况下, 自动重置为最早的偏移量 + //latest, 在偏移量无效的情况下, 自动重置为最新的偏移量 + //none, 在偏移量无效的情况下, 抛出异常. + configs.put("auto.offset.reset", "latest"); + //请求阻塞的最大时间(毫秒) + configs.put("fetch.max.wait", 500); + //请求应答的最小字节数 + configs.put("fetch.min.size", 1); + //心跳间隔时间(毫秒) + configs.put("heartbeat-interval", 3000); + //一次调用poll返回的最大记录条数 + configs.put("max.poll.records", 500); + //指定消费组 + configs.put("group.id", KafkaConstants.KafkaGrop); + //指定key使用的反序列化类 + Deserializer keyDeserializer = new StringDeserializer(); + //指定value使用的反序列化类 + Deserializer valueDeserializer = new StringDeserializer(); + //创建Kafka消费者 + KafkaConsumer kafkaConsumer = new KafkaConsumer(configs, keyDeserializer, valueDeserializer); + return kafkaConsumer; + } + +} diff --git a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProducerConfig.java b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProducerConfig.java deleted file mode 100644 index 22dc7b8..0000000 --- a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProducerConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.muyu.common.kafka.config; - - -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.common.serialization.StringSerializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.kafka.core.ProducerFactory; -import org.springframework.kafka.core.DefaultKafkaProducerFactory; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Author: 胡杨 - * @Name: KafkaProducerConfig - * @Description: kafka生产者配置类 - * @CreatedDate: 2024/9/27 下午7:38 - * @FilePath: com.muyu.common.kafka.config - * kafka生产者配置类 - */ -@Configuration -public class KafkaProducerConfig { - - @Bean - public ProducerFactory producerFactory() { - Map configProps = new HashMap<>(); - configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "47.116.173.119:9092"); - configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); - configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); - // 添加事务相关的配置 - configProps.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); - configProps.put(ProducerConfig.ACKS_CONFIG, "all"); - configProps.put(ProducerConfig.RETRIES_CONFIG, Integer.MAX_VALUE); - configProps.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "transactionalId"); - - return new DefaultKafkaProducerFactory<>(configProps); - } - - @Bean - public KafkaTemplate kafkaTemplate() { - return new KafkaTemplate<>(producerFactory()); - } -} diff --git a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProviderConfig.java b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProviderConfig.java new file mode 100644 index 0000000..07b56d3 --- /dev/null +++ b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/config/KafkaProviderConfig.java @@ -0,0 +1,45 @@ +package com.muyu.common.kafka.config; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.common.serialization.Serializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + * kafka 消息的生产者 配置类 + */ +@Configuration +public class KafkaProviderConfig { + + @Bean + public KafkaProducer kafkaProducer() { + Map configs = new HashMap<>(); + //#kafka服务端的IP和端口,格式:(ip:port) + configs.put("bootstrap.servers", "47.116.173.119:9092"); + //客户端发送服务端失败的重试次数 + configs.put("retries", 2); + //多个记录被发送到同一个分区时,生产者将尝试将记录一起批处理成更少的请求. + //此设置有助于提高客户端和服务器的性能,配置控制默认批量大小(以字节为单位) + configs.put("batch.size", 16384); + //生产者可用于缓冲等待发送到服务器的记录的总内存字节数(以字节为单位) + configs.put("buffer-memory", 33554432); + //生产者producer要求leader节点在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化 + //acks=0,设置为0,则生产者producer将不会等待来自服务器的任何确认.该记录将立即添加到套接字(socket)缓冲区并视为已发送.在这种情况下,无法保证服务器已收到记录,并且重试配置(retries)将不会生效(因为客户端通常不会知道任何故障),每条记录返回的偏移量始终设置为-1. + //acks=1,设置为1,leader节点会把记录写入本地日志,不需要等待所有follower节点完全确认就会立即应答producer.在这种情况下,在follower节点复制前,leader节点确认记录后立即失败的话,记录将会丢失. + //acks=all,acks=-1,leader节点将等待所有同步复制副本完成再确认记录,这保证了只要至少有一个同步复制副本存活,记录就不会丢失. + configs.put("acks", "-1"); + //指定key使用的序列化类 + Serializer keySerializer = new StringSerializer(); + //指定value使用的序列化类 + Serializer valueSerializer = new StringSerializer(); + //创建Kafka生产者 + KafkaProducer kafkaProducer = new KafkaProducer(configs, keySerializer, valueSerializer); + return kafkaProducer; + } + +} diff --git a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/constants/KafkaConstants.java b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/constants/KafkaConstants.java index 2b89f3c..d4c3d13 100644 --- a/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/constants/KafkaConstants.java +++ b/cloud-common/cloud-common-kafka/src/main/java/com/muyu/common/kafka/constants/KafkaConstants.java @@ -1,7 +1,5 @@ package com.muyu.common.kafka.constants; -import org.springframework.beans.factory.annotation.Value; - /** * @Author: 胡杨 * @date: 2024/7/10 diff --git a/cloud-common/cloud-common-kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/cloud-common/cloud-common-kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index cd59fdb..f4a1fdb 100644 --- a/cloud-common/cloud-common-kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/cloud-common/cloud-common-kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ -com.muyu.common.kafka.config.KafkaProducerConfig +com.muyu.common.kafka.config.KafkaConsumerConfig +com.muyu.common.kafka.config.KafkaProviderConfig diff --git a/cloud-data-processing/pom.xml b/cloud-data-processing/pom.xml index 4d65352..61b83da 100644 --- a/cloud-data-processing/pom.xml +++ b/cloud-data-processing/pom.xml @@ -11,6 +11,10 @@ cloud-data-processing + + cloud-data-processing 数据处理模块 + + 17 17 @@ -63,35 +67,49 @@ mysql-connector-j - - - com.muyu - cloud-common-datasource - - com.muyu cloud-common-datascope - - com.muyu - cloud-common-log + org.apache.iotdb + iotdb-jdbc + 0.12.1 + + + com.alibaba + druid-spring-boot-starter + 1.1.9 - + - com.muyu - cloud-common-api-doc + org.mybatis + mybatis-spring + 3.0.3 + + + com.baomidou + mybatis-plus-boot-starter + 3.5.5 - - - com.muyu - cloud-common-xxl - + + + + + + + + + + + + + + diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/MyDataApplication.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/MyDataApplication.java index 63c774a..e62b6c0 100644 --- a/cloud-data-processing/src/main/java/com/muyu/data/processing/MyDataApplication.java +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/MyDataApplication.java @@ -16,15 +16,12 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * @FilePath: com.muyu.data.processing */ -@EnableCustomConfig -//@EnableCustomSwagger2 @EnableMyFeignClients -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +@SpringBootApplication public class MyDataApplication { public static void main(String[] args) { SpringApplication.run(MyDataApplication.class, args); - System.out.println(KafkaConstants.KafkaGrop); - System.out.println(KafkaConstants.KafkaTopic); + System.out.println("MyData 模块启动成功!"); } diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/DataProcessingController.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/DataProcessingController.java new file mode 100644 index 0000000..7909d7c --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/DataProcessingController.java @@ -0,0 +1,160 @@ +package com.muyu.data.processing.controller; + +import com.muyu.common.core.domain.Result; +import com.muyu.data.processing.domain.IotDbData; +import com.muyu.data.processing.service.DataProcessingService; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.List; + +/** + * 数据处理控制层 + * + * @Author: 胡杨 + * @Name: DataProcessing + * @Description: 数据处理控制层 + * @CreatedDate: 2024/9/28 下午3:53 + * @FilePath: com.muyu.data.processing.controller + */ + +@Slf4j +@RestController +@RequestMapping("/DataProcessing") +public class DataProcessingController { + @Resource + private DataProcessingService service; + + + + @RequestMapping(value = "/createCarData", method = RequestMethod.POST) +// @Transactional(rollbackFor = Exception.class) + public Result createCarData(@RequestBody IotDbData data) { + try { + data.setTimestamp(System.currentTimeMillis()); + data.setCreateTime(new Date()); + Integer v = service.createCarData(data); + if (v == -1) { + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("创建车辆报文记录失败!" + e); + return Result.error(false); + } + } + + + /** + * 更新操作 其实也是插入操作 时间戳相同 只和时间戳相关 + * @param data + * @return + */ + @RequestMapping(value = "/updateCarData", method = RequestMethod.POST) + public Result updateCarData(@RequestBody IotDbData data) { + try { + data.setTimestamp(System.currentTimeMillis()); + data.setCreateTime(new Date()); + Integer v = service.updateCarData(data); + if (v == -1) { + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("更新车辆报文记录失败!" + e); + return Result.error(false); + } + } + + + /** + * 删除操作 要将时间戳的加号变成%2B + * @param timestamp + * @return + */ + @RequestMapping(value = "/deleteCarData", method = RequestMethod.GET) + public Result deleteCarData(String timestamp) { + try { + Integer v = service.deleteCarData(timestamp); + if (v == -1) { + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("删除车辆报文记录失败!" + e); + return Result.error(false); + } + } + + + /** + * 创建组 也就是相当于数据库 + * @return + */ + @RequestMapping(value = "/createCarDataGroup", method = RequestMethod.POST) + public Result createCarDataGroup() { + try { + Integer v = service.createCarDataGroup(); + if (v > 0) { + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("创建车辆报文记录组失败!" + e); + return Result.error(false); + } + } + + /** + * 查询所有车辆报文记录数据 + * @return + */ + @RequestMapping(value = "/queryCarData", method = RequestMethod.GET) + public Result queryCarData() { + try { + List v = service.queryCarData(); + if (v.size() > 0) { + v.forEach(x -> { + System.out.println(x.toString()); + }); + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("查询车辆报文记录组失败!" + e); + return Result.error(false); + } + } + + /** + * 查看数据库有多少组 + * + * @return + */ + @RequestMapping(value = "/selectStorageGroup", method = RequestMethod.GET) + public Result selectStorageGroup() { + try { + List v = service.selectStorageGroup(); + if (v.size() > 0) { + v.forEach(x -> { + System.out.println("group------------------" + x.toString()); + }); + return Result.success(v); + } else { + return Result.error(false); + } + } catch (Exception e) { + log.info("查询组失败!" + e); + return Result.error(false); + } + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/TestController.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/TestController.java index 55320b8..48602df 100644 --- a/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/TestController.java +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/controller/TestController.java @@ -1,16 +1,21 @@ package com.muyu.data.processing.controller; +import com.alibaba.fastjson.JSONObject; import com.muyu.common.kafka.constants.KafkaConstants; +import com.muyu.data.processing.domain.IotDbData; +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.root.RootStrategy; import jakarta.annotation.Resource; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.messaging.MessageHeaders; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import lombok.extern.slf4j.Slf4j; -import org.springframework.messaging.Message; /** + * 测试控制层 * @Author: 胡杨 * @Name: Test * @Description: @@ -22,20 +27,35 @@ import org.springframework.messaging.Message; @RequestMapping("/Test") public class TestController { @Resource - private KafkaTemplate kafkaTemplate; + private KafkaProducer kafkaProducer; @GetMapping("/testKafka") - @Transactional public void sendMsg(@RequestParam("msg") String msg) { try { - kafkaTemplate.send(KafkaConstants.KafkaTopic, msg).get(); + IotDbData iotDbData = IotDbData.builder() + .timestamp(System.currentTimeMillis()) + .vin("vin666") + .key("test") + .label("测试数据") + .value("Kafka测试") + .type("String") + .build(); + String jsonString = JSONObject.toJSONString(iotDbData); + ProducerRecord producerRecord = new ProducerRecord<>(KafkaConstants.KafkaTopic, jsonString); + kafkaProducer.send(producerRecord); System.out.println("同步消息发送成功: " + msg); } catch (Exception e) { e.printStackTrace(); System.out.println("同步消息发送失败: " + msg); } - } + @Resource + private RootStrategy rootStrategy; + + @PostMapping("/testStrategy") + public TestResp testStrategy(@RequestBody TestReq testReq) { + return rootStrategy.applyStrategy(testReq); + } } diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/IotDbData.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/IotDbData.java new file mode 100644 index 0000000..249e952 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/IotDbData.java @@ -0,0 +1,37 @@ +package com.muyu.data.processing.domain; + +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.util.Date; + +/** + * 报文信息 时序实体类 + * + * @Author: 胡杨 + * @Name: DataProcessing + * @Description: 报文信息 时序实体类 + * @CreatedDate: 2024/9/28 下午3:48 + * @FilePath: com.muyu.data.processing.domain + */ + +@EqualsAndHashCode(callSuper = true) +@Data +@ToString +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class IotDbData extends BaseEntity { + private long timestamp; + + private String vin; + + private String key; + private String label; + private String value; + private String type; + + +} + diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/KafkaData.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/KafkaData.java new file mode 100644 index 0000000..ecb45f6 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/KafkaData.java @@ -0,0 +1,33 @@ +package com.muyu.data.processing.domain; + +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; + +/** + * 报文信息 时序实体类 + * + * @Author: 胡杨 + * @Name: DataProcessing + * @Description: 报文信息 时序实体类 + * @CreatedDate: 2024/9/28 下午3:48 + * @FilePath: com.muyu.data.processing.domain + */ + +@Data +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class KafkaData implements Serializable { + + private String key; + private String label; + private String value; + private String type; + + +} + diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/StrategyEums.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/StrategyEums.java new file mode 100644 index 0000000..b018e6c --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/StrategyEums.java @@ -0,0 +1,62 @@ +package com.muyu.data.processing.domain; + +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import com.muyu.data.processing.strategy.branch.OneBranchStrategy; +import com.muyu.data.processing.strategy.branch.TwoBranchStrategy; +import com.muyu.data.processing.strategy.leaves.FourLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.OneLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.ThreeLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.TwoLeavesStrategy; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 策略选择枚举 + * + * @Author: 胡杨 + * @Name: StrategyEums + * @Description: 策略选择枚举 + * @CreatedDate: 2024/9/28 上午11:59 + * @FilePath: com.muyu.data.processing.domain + */ + +@Getter +public enum StrategyEums { + TEST1("加减法", new OneBranchStrategy()), + TEST2("乘除法", new TwoBranchStrategy()), + TEST1_1("加法", new OneLeavesStrategy()), + TEST1_2("减法", new TwoLeavesStrategy()), + TEST2_1("乘法", new ThreeLeavesStrategy()), + TEST2_2("除法", new FourLeavesStrategy()); + + private final String code; + private final StrategyHandler info; + + StrategyEums(String code, StrategyHandler info) { + this.code = code; + this.info = info; + } + + /** + * 鉴别参数是否是枚举的值 + * + * @param code 需鉴别参数 + * @return 如果存在返回结果turn, 否则返回false + */ + public static boolean isCode(String code) { + return Arrays.stream(values()) + .map(StrategyEums::getCode) + .anyMatch(c -> c.equals(code)); + } + + public static StrategyHandler getStrategy(String code) { + return Arrays.stream(values()) + .filter(c -> c.getCode().equals(code)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("参数错误")) + .getInfo(); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/req/TestReq.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/req/TestReq.java new file mode 100644 index 0000000..7a70bd4 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/req/TestReq.java @@ -0,0 +1,28 @@ +package com.muyu.data.processing.domain.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 测试入参 + * + * @Author: 胡杨 + * @Name: TestReq + * @Description: 测试入参 + * @CreatedDate: 2024/9/28 上午10:40 + * @FilePath: com.muyu.data.processing.domain.req + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TestReq { + private Integer one; + private Integer two; + + private String type1; + private String type2; +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/resp/TestResp.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/resp/TestResp.java new file mode 100644 index 0000000..8f743e0 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/domain/resp/TestResp.java @@ -0,0 +1,24 @@ +package com.muyu.data.processing.domain.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 测试出参 + * + * @Author: 胡杨 + * @Name: TestResp + * @Description: 测试出参 + * @CreatedDate: 2024/9/28 上午10:40 + * @FilePath: com.muyu.data.processing.domain.req.resp + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TestResp { + private String resp; +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/kafka/KafkaConsumerService.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/kafka/KafkaConsumerService.java index 6de9775..51857ab 100644 --- a/cloud-data-processing/src/main/java/com/muyu/data/processing/kafka/KafkaConsumerService.java +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/kafka/KafkaConsumerService.java @@ -1,12 +1,24 @@ package com.muyu.data.processing.kafka; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.nacos.shaded.com.google.common.collect.Lists; import com.muyu.common.kafka.constants.KafkaConstants; -import io.swagger.v3.oas.annotations.servers.Server; +import com.muyu.data.processing.domain.IotDbData; +import com.muyu.data.processing.domain.KafkaData; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.kafka.annotation.KafkaListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; +import java.time.Duration; +import java.util.Collection; +import java.util.List; + /** * @Author: 胡杨 * @Name: KafkaConsumerService @@ -17,10 +29,29 @@ import org.springframework.stereotype.Component; @Slf4j @Component -public class KafkaConsumerService { +public class KafkaConsumerService implements InitializingBean { + @Resource + private KafkaConsumer kafkaConsumer; - @KafkaListener(topics = {KafkaConstants.KafkaTopic}, groupId = KafkaConstants.KafkaGrop) - public void listen(String msg) { - log.info("kafka 消费消息:{}", msg); + @Override + public void afterPropertiesSet() throws Exception { + Thread thread = new Thread(() -> { + log.info("启动线程监听Topic: {}", KafkaConstants.KafkaTopic); + ThreadUtil.sleep(1000); + Collection topics = Lists.newArrayList(KafkaConstants.KafkaTopic); + kafkaConsumer.subscribe(topics); + while (true) { + ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(1000)); + for (ConsumerRecord consumerRecord : consumerRecords) { + //1.从ConsumerRecord中获取消费数据 + String originalMsg = (String) consumerRecord.value(); + log.info("从Kafka中消费的原始数据: " + originalMsg); + //2.把消费数据转换为DTO对象 + List kafkaDataList = JSONUtil.toList(originalMsg, KafkaData.class); + log.info("消费数据转换为DTO对象: " + kafkaDataList.toString()); + } + } + }); + thread.start(); } } diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/mapper/DataProcessingMapper.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/mapper/DataProcessingMapper.java new file mode 100644 index 0000000..4482b98 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/mapper/DataProcessingMapper.java @@ -0,0 +1,37 @@ +package com.muyu.data.processing.mapper; + +import com.muyu.data.processing.domain.IotDbData; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 数据处理持久层 + * + * @Author: 胡杨 + * @Name: DataPeocessingMapper + * @Description: 数据处理持久层 + * @CreatedDate: 2024/9/28 下午3:47 + * @FilePath: com.muyu.data.processing.mapper + */ + +@Repository +@Mapper +public interface DataProcessingMapper{ + + Integer createCarData(IotDbData data); + + Integer updateCarData(IotDbData data); + + Integer deleteCarData(String timestamp); + + Integer createCarDataGroup(); + + Integer createCarDataGroupElement(); + +// List queryCarData(); + + List selectStorageGroup(); + +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/service/DataProcessingService.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/service/DataProcessingService.java new file mode 100644 index 0000000..937bb17 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/service/DataProcessingService.java @@ -0,0 +1,63 @@ +package com.muyu.data.processing.service; + + +import com.muyu.data.processing.domain.IotDbData; + +import java.util.List; + +/** + * 数据处理业务层 + * + * @Author: 胡杨 + * @Name: DataProcessing + * @Description: 数据处理业务层 + * @CreatedDate: 2024/9/28 下午3:52 + * @FilePath: com.muyu.data.processing.server + */ + +public interface DataProcessingService{ + /** + * 创建车辆报文记录 + * + * @param data 数据 + * @return {@link Integer } + */ + Integer createCarData(IotDbData data); + + /** + * 更新车辆报文记录 + * + * @param data 数据 + * @return {@link Integer } + */ + Integer updateCarData(IotDbData data); + + /** + * 删除车辆报文记录 + * + * @param timestamp 时间戳 + * @return {@link Integer } + */ + Integer deleteCarData(String timestamp); + + /** + * 创建车辆报文记录组 + * + * @return {@link Integer } + */ + Integer createCarDataGroup(); + + /** + * 查询顺序 + * + * @return {@link List }<{@link IotDbData }> + */ + List queryCarData(); + /** + * 选择存储组 + * + * @return {@link List }<{@link String }> + */ + List selectStorageGroup(); + +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/service/impl/DataProcessingServiceImpl.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/service/impl/DataProcessingServiceImpl.java new file mode 100644 index 0000000..7b6139a --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/service/impl/DataProcessingServiceImpl.java @@ -0,0 +1,70 @@ +package com.muyu.data.processing.service.impl; + + +import javax.annotation.Resource; + +import com.muyu.data.processing.domain.IotDbData; +import org.springframework.stereotype.Service; +import lombok.extern.slf4j.Slf4j; +import com.muyu.data.processing.mapper.DataProcessingMapper; +import com.muyu.data.processing.service.DataProcessingService; + +import java.util.List; + +/** + * 数据处理实现层 + * + * @Author: 胡杨 + * @Name: DataProcessing + * @Description: 数据处理实现层 + * @CreatedDate: 2024/9/28 下午3:52 + * @FilePath: com.muyu.data.processing.server.impl + */ + +@Slf4j +@Service +public class DataProcessingServiceImpl implements DataProcessingService { + @Resource + private DataProcessingMapper mapper; + + @Override + public Integer createCarData(IotDbData data) { + return mapper.createCarData(data); + } + + @Override + public Integer updateCarData(IotDbData data) { + return mapper.updateCarData(data); + } + + @Override + public Integer deleteCarData(String timestamp) { + return mapper.deleteCarData(timestamp); + } + + @Override + public Integer createCarDataGroup() { + try { + Integer flag = mapper.createCarDataGroup(); + Integer flagEle = mapper.createCarDataGroupElement(); + System.out.println("\n\t执行sql数量为{}" + flagEle); + return flagEle; + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + + @Override + public List queryCarData() { +// return mapper.queryCarData(); + return null; + } + + @Override + public List selectStorageGroup() { + return mapper.selectStorageGroup(); + } + + +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/StrategyHandler.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/StrategyHandler.java new file mode 100644 index 0000000..99aa302 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/StrategyHandler.java @@ -0,0 +1,22 @@ +package com.muyu.data.processing.strategy; + +/** + * 策略控制者接口 + * @Author: 胡杨 + * @Name: StrategyHandler + * @Description: 策略控制者接口 + * @CreatedDate: 2024/9/28 上午9:35 + * @FilePath: com.muyu.data.processing.strategy + */ +public interface StrategyHandler { + + @SuppressWarnings("rawtypes") + StrategyHandler DEFAULT = t -> null; + + /** + * 执行方法 + * @param t 入参 + * @return 返回结果 + */ + R apply(T t); +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/abstractStrategyRouter.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/abstractStrategyRouter.java new file mode 100644 index 0000000..4c3b820 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/abstractStrategyRouter.java @@ -0,0 +1,56 @@ +package com.muyu.data.processing.strategy; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Objects; +/** + * 抽象策略路由 + * @Author: 胡杨 + * @Name: abstractStrategyRouter + * @Description: 抽象策略路由 + * @CreatedDate: 2024/9/28 上午9:26 + * @FilePath: com.muyu.data.processing.strategy + */ +@Slf4j +@Component +public abstract class abstractStrategyRouter { + + /** + * 策略映射器, 指定入参与出参以决定策略处理者 + * @param 策略入参 + * @param 策略出参 + */ + public interface StrategyMapper{ + // 通过入参获取对应策略处理方法,使用Map实现 + StrategyHandler getHandler(T param); + } + + /** + * 抽象注册方法 + * @return + */ + protected abstract StrategyMapper registerStrategy(); + + /** + * 默认策略处理者 + */ + @SuppressWarnings("unchecked") + private StrategyHandler defaultStrategyHandler = StrategyHandler.DEFAULT; + + + /** + * 选择策略处理者 + * @param param 入参 + * @return 策略处理结果 + */ + public R applyStrategy(T param) { + final StrategyHandler strategyHandler = registerStrategy().getHandler(param); + if (strategyHandler != null) { + return strategyHandler.apply(param); + } + // 使用默认策略处理者 + return defaultStrategyHandler.apply(param); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/OneBranchStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/OneBranchStrategy.java new file mode 100644 index 0000000..aef6611 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/OneBranchStrategy.java @@ -0,0 +1,38 @@ +package com.muyu.data.processing.strategy.branch; + +import com.muyu.data.processing.domain.StrategyEums; +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import com.muyu.data.processing.strategy.abstractStrategyRouter; +import com.muyu.data.processing.strategy.leaves.FourLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.OneLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.ThreeLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.TwoLeavesStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 1号分支策略方法实现 + * + * @Author: 胡杨 + * @Name: OneBranchStrategy + * @Description: 1号叶子策略方法实现 + * @CreatedDate: 2024/9/28 上午11:50 + * @FilePath: com.muyu.data.processing.strategy.impl + */ + +@Slf4j +@Component +public class OneBranchStrategy extends abstractStrategyRouter implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("1号分支策略方法实现,参数1:{},参数2:{},执行方法:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2()); + return applyStrategy(testReq); + } + + @Override + protected StrategyMapper registerStrategy() { + return param -> StrategyEums.getStrategy(param.getType2()); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/TwoBranchStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/TwoBranchStrategy.java new file mode 100644 index 0000000..eea73af --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/branch/TwoBranchStrategy.java @@ -0,0 +1,38 @@ +package com.muyu.data.processing.strategy.branch; + +import com.muyu.data.processing.domain.StrategyEums; +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import com.muyu.data.processing.strategy.abstractStrategyRouter; +import com.muyu.data.processing.strategy.leaves.FourLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.OneLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.ThreeLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.TwoLeavesStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 2号分支策略方法实现 + * + * @Author: 胡杨 + * @Name: TwoBranchStrategy + * @Description: 1号叶子策略方法实现 + * @CreatedDate: 2024/9/28 上午11:50 + * @FilePath: com.muyu.data.processing.strategy.impl + */ + +@Slf4j +@Component +public class TwoBranchStrategy extends abstractStrategyRouter implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("2号分支策略方法实现,参数1:{},参数2:{},执行方法:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2()); + return applyStrategy(testReq); + } + + @Override + protected StrategyMapper registerStrategy() { + return param -> StrategyEums.getStrategy(param.getType2()); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/FourLeavesStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/FourLeavesStrategy.java new file mode 100644 index 0000000..001ec8a --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/FourLeavesStrategy.java @@ -0,0 +1,27 @@ +package com.muyu.data.processing.strategy.leaves; + +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 4号处理者 + * + * @Author: 胡杨 + * @Name: FourLeavesStrategy + * @Description: 4号处理者 + * @CreatedDate: 2024/9/28 上午11:54 + * @FilePath: com.muyu.data.processing.strategy.leaves + */ + +@Slf4j +@Component +public class FourLeavesStrategy implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("4号处理者实现,参数1:{},参数2:{},执行方法:{},结果:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2(), (testReq.getOne()*1.0/testReq.getTwo())); + return new TestResp("执行4号处理者-除法"); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/OneLeavesStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/OneLeavesStrategy.java new file mode 100644 index 0000000..9599332 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/OneLeavesStrategy.java @@ -0,0 +1,31 @@ +package com.muyu.data.processing.strategy.leaves; + +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import com.muyu.data.processing.strategy.abstractStrategyRouter; +import com.muyu.data.processing.strategy.branch.OneBranchStrategy; +import com.muyu.data.processing.strategy.branch.TwoBranchStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 1号处理者 + * + * @Author: 胡杨 + * @Name: OneLeavesStrategy + * @Description: 1号处理者 + * @CreatedDate: 2024/9/28 上午11:54 + * @FilePath: com.muyu.data.processing.strategy.leaves + */ + +@Slf4j +@Component +public class OneLeavesStrategy implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("1号处理者实现,参数1:{},参数2:{},执行方法:{},结果:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2(), (testReq.getOne()+testReq.getTwo())); + return new TestResp("执行1号处理者-加法"); + } + +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/ThreeLeavesStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/ThreeLeavesStrategy.java new file mode 100644 index 0000000..c28a57b --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/ThreeLeavesStrategy.java @@ -0,0 +1,27 @@ +package com.muyu.data.processing.strategy.leaves; + +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 3号处理者 + * + * @Author: 胡杨 + * @Name: ThreeLeavesStrategy + * @Description: 3号处理者 + * @CreatedDate: 2024/9/28 上午11:54 + * @FilePath: com.muyu.data.processing.strategy.leaves + */ + +@Slf4j +@Component +public class ThreeLeavesStrategy implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("3号处理者实现,参数1:{},参数2:{},执行方法:{},结果:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2(), (testReq.getOne()*testReq.getTwo())); + return new TestResp("执行3号处理者-乘法"); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/TwoLeavesStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/TwoLeavesStrategy.java new file mode 100644 index 0000000..1174ab7 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/leaves/TwoLeavesStrategy.java @@ -0,0 +1,27 @@ +package com.muyu.data.processing.strategy.leaves; + +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 2号处理者 + * + * @Author: 胡杨 + * @Name: TwoLeavesStrategy + * @Description: 2号处理者 + * @CreatedDate: 2024/9/28 上午11:54 + * @FilePath: com.muyu.data.processing.strategy.leaves + */ + +@Slf4j +@Component +public class TwoLeavesStrategy implements StrategyHandler { + @Override + public TestResp apply(TestReq testReq) { + log.info("2号处理者实现,参数1:{},参数2:{},执行方法:{},结果:{}", testReq.getOne(), testReq.getTwo(), testReq.getType2(), (testReq.getOne()-testReq.getTwo())); + return new TestResp("执行2号处理者-减法"); + } +} diff --git a/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/root/RootStrategy.java b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/root/RootStrategy.java new file mode 100644 index 0000000..9df6ce2 --- /dev/null +++ b/cloud-data-processing/src/main/java/com/muyu/data/processing/strategy/root/RootStrategy.java @@ -0,0 +1,36 @@ +package com.muyu.data.processing.strategy.root; + +import com.muyu.common.core.utils.StringUtils; +import com.muyu.data.processing.domain.StrategyEums; +import com.muyu.data.processing.domain.req.TestReq; +import com.muyu.data.processing.domain.resp.TestResp; +import com.muyu.data.processing.strategy.StrategyHandler; +import com.muyu.data.processing.strategy.abstractStrategyRouter; +import com.muyu.data.processing.strategy.branch.OneBranchStrategy; +import com.muyu.data.processing.strategy.branch.TwoBranchStrategy; +import com.muyu.data.processing.strategy.leaves.FourLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.OneLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.ThreeLeavesStrategy; +import com.muyu.data.processing.strategy.leaves.TwoLeavesStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 策略路由实现 + * + * @Author: 胡杨 + * @Name: RootStrategy + * @Description: 策略路由实现 + * @CreatedDate: 2024/9/28 上午10:39 + * @FilePath: com.muyu.data.processing.strategy.impl + */ + +@Slf4j +@Component +public class RootStrategy extends abstractStrategyRouter { + @Override + protected StrategyMapper registerStrategy() { + return param -> StrategyEums.getStrategy(param.getType1()); + } + +} diff --git a/cloud-data-processing/src/main/resources/bootstrap.yml b/cloud-data-processing/src/main/resources/bootstrap.yml index 010e1a4..a1de498 100644 --- a/cloud-data-processing/src/main/resources/bootstrap.yml +++ b/cloud-data-processing/src/main/resources/bootstrap.yml @@ -11,6 +11,22 @@ nacos: # SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all # Spring spring: + datasource: + username: root + password: root + driver-class-name: org.apache.iotdb.jdbc.IoTDBDriver + url: jdbc:iotdb://47.116.173.119:6667/ + initial-size: 5 + min-idle: 10 + max-active: 20 + max-wait: 60000 + remove-abandoned: true + remove-abandoned-timeout: 30 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + test-while-idle: false + test-on-borrow: false + test-on-return: false amqp: deserialization: trust: @@ -61,3 +77,4 @@ spring: logging: level: com.muyu.system.mapper: DEBUG + diff --git a/cloud-data-processing/src/main/resources/mapper/processing/DataProcessingMapper.xml b/cloud-data-processing/src/main/resources/mapper/processing/DataProcessingMapper.xml new file mode 100644 index 0000000..fab3dd1 --- /dev/null +++ b/cloud-data-processing/src/main/resources/mapper/processing/DataProcessingMapper.xml @@ -0,0 +1,26 @@ + + + + + + insert into root.one.data(timestamp, CarData_id, CarData_num, CarData_name,create_time) values(#{timestamp},#{CarDataId},#{CarDataNum},#{CarDataName},#{createTime}); + + + + delete from root.one.data where timestamp = ${timestamp}; + + + + insert into root.one.data(timestamp, CarData_id, CarData_num, CarData_name,create_time) values(2021-11-24T18:28:20.689+08:00,#{CarDataId},#{CarDataNum},#{CarDataName},#{createTime}); + + + + SET STORAGE GROUP TO root.one.data + + + CREATE TIMESERIES root.one.data.CarData_num WITH DATATYPE=INT32, ENCODING=PLAIN, COMPRESSOR=SNAPPY; + + + diff --git a/cloud-modules/cloud-breakdown/pom.xml b/cloud-modules/cloud-breakdown/pom.xml index 03dc09d..4b8728c 100644 --- a/cloud-modules/cloud-breakdown/pom.xml +++ b/cloud-modules/cloud-breakdown/pom.xml @@ -10,6 +10,11 @@ cloud-breakdown + + + cloud-breakdown 故障 + + pom cloud-breakdown-common diff --git a/cloud-modules/cloud-modules-car/pom.xml b/cloud-modules/cloud-modules-car/pom.xml index c7daf6d..d2e4afd 100644 --- a/cloud-modules/cloud-modules-car/pom.xml +++ b/cloud-modules/cloud-modules-car/pom.xml @@ -10,7 +10,9 @@ cloud-modules-car - + + cloud-modules-car 电子围栏 + 17 17 diff --git a/cloud-modules/cloud-modules-carmanage/pom.xml b/cloud-modules/cloud-modules-carmanage/pom.xml index 1bf3c20..e9f29c5 100644 --- a/cloud-modules/cloud-modules-carmanage/pom.xml +++ b/cloud-modules/cloud-modules-carmanage/pom.xml @@ -96,6 +96,10 @@ bcpkix-jdk15on 1.70 + + com.muyu + cloud-common-kafka + diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/controller/SysCarMessageController.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/controller/SysCarMessageController.java index 7833309..a61e4ef 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/controller/SysCarMessageController.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/controller/SysCarMessageController.java @@ -1,44 +1,36 @@ package com.muyu.car.controller; +import com.alibaba.fastjson2.JSONObject; +import com.muyu.car.domain.SysCarMessage; +import com.muyu.car.domain.resp.SysMessageResp; +import com.muyu.car.service.ISysCarMessageService; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.core.web.controller.BaseController; + +import com.muyu.common.security.annotation.RequiresPermissions; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import com.alibaba.fastjson2.JSONObject; -import com.muyu.car.domain.SysCarMessage; -import com.muyu.car.domain.SysMessageType; -import com.muyu.car.domain.VO.SysMessageVO; -import com.muyu.car.service.ISysCarMessageService; -import jakarta.servlet.http.HttpServletResponse; - -import javax.annotation.Resource; - -import jakarta.servlet.http.HttpSession; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.muyu.common.security.annotation.RequiresPermissions; -import com.muyu.common.core.web.controller.BaseController; -import com.muyu.common.core.domain.Result; -import com.muyu.common.core.utils.poi.ExcelUtil; -import com.muyu.common.security.utils.SecurityUtils; -import org.springframework.validation.annotation.Validated; -import com.muyu.common.core.web.page.TableDataInfo; - /** * 车辆报文记录Controller * * @author muyu * @date 2024-09-18 */ +@Slf4j @RestController @RequestMapping("/messageInfo") public class SysCarMessageController extends BaseController { @@ -48,10 +40,12 @@ public class SysCarMessageController extends BaseController { private HttpSession session; static String TEST = "56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56"; + /** * 查询车辆报文记录列表 */ // @RequiresPermissions("message:message:list") + @Transactional @GetMapping("/list") public Result> list(SysCarMessage sysCarMessage) throws ExecutionException, InterruptedException { List list = sysCarMessageService.selectSysCarMessageList(sysCarMessage); @@ -83,16 +77,16 @@ public class SysCarMessageController extends BaseController { for (int i = 0; i < futures.size(); i++) { results[i] = futures.get(i).get(); } - JSONObject jsonObject = new JSONObject(); - jsonObject.put("results", results); - System.out.println(jsonObject); + String jsonString = JSONObject.toJSONString(results); + + log.info("消息发送成功:{}", jsonString); return Result.success(list); } @RequiresPermissions("message:message:dobList") @GetMapping("/dobList") - public Result> dobList(SysMessageVO sysMessageVO) { - List list = sysCarMessageService.dobList(sysMessageVO); + public Result> dobList(SysMessageResp sysMessageResp) { + List list = sysCarMessageService.dobList(sysMessageResp); return Result.success(list); } diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/SysCarMessage.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/SysCarMessage.java index 0f045c9..78f0b19 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/SysCarMessage.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/SysCarMessage.java @@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import java.io.Serializable; + /** * 车辆报文记录对象 sys_car_message * @@ -24,7 +26,7 @@ import com.baomidou.mybatisplus.annotation.IdType; @NoArgsConstructor @AllArgsConstructor @TableName("sys_car_message") -public class SysCarMessage { +public class SysCarMessage implements Serializable { private static final long serialVersionUID = 1L; /** 自增主键 */ diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/VO/SysMessageVO.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/resp/SysMessageResp.java similarity index 78% rename from cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/VO/SysMessageVO.java rename to cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/resp/SysMessageResp.java index 47f05ee..f357790 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/VO/SysMessageVO.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/domain/resp/SysMessageResp.java @@ -1,6 +1,5 @@ -package com.muyu.car.domain.VO; +package com.muyu.car.domain.resp; -import com.muyu.common.core.annotation.Excel; import lombok.*; /** @@ -11,7 +10,7 @@ import lombok.*; */ @Data -public class SysMessageVO { +public class SysMessageResp { private static final long serialVersionUID = 1L; private Long id; private String modelCode; diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/mapper/SysCarMessageMapper.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/mapper/SysCarMessageMapper.java index b41073c..8d7dadb 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/mapper/SysCarMessageMapper.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/mapper/SysCarMessageMapper.java @@ -4,7 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.muyu.car.domain.SysCarMessage; -import com.muyu.car.domain.VO.SysMessageVO; +import com.muyu.car.domain.resp.SysMessageResp; import org.apache.ibatis.annotations.Mapper; /** @@ -15,5 +15,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SysCarMessageMapper extends BaseMapper{ - ListdobList(SysMessageVO sysMessageVO); + ListdobList(SysMessageResp sysMessageResp); } diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/ISysCarMessageService.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/ISysCarMessageService.java index 2911f76..95c84e3 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/ISysCarMessageService.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/ISysCarMessageService.java @@ -4,7 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.muyu.car.domain.SysCarMessage; -import com.muyu.car.domain.VO.SysMessageVO; +import com.muyu.car.domain.resp.SysMessageResp; /** * 车辆报文记录Service接口 @@ -14,7 +14,7 @@ import com.muyu.car.domain.VO.SysMessageVO; */ public interface ISysCarMessageService extends IService { - ListdobList(SysMessageVO sysMessageVO); + ListdobList(SysMessageResp sysMessageResp); /** * 精确查询车辆报文记录 * diff --git a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/impl/SysCarMessageServiceImpl.java b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/impl/SysCarMessageServiceImpl.java index 0a52977..66b325e 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/impl/SysCarMessageServiceImpl.java +++ b/cloud-modules/cloud-modules-carmanage/src/main/java/com/muyu/car/service/impl/SysCarMessageServiceImpl.java @@ -5,7 +5,7 @@ import java.util.List; import com.muyu.car.domain.SysCar; import com.muyu.car.domain.SysCarMessage; import com.muyu.car.domain.SysMessageType; -import com.muyu.car.domain.VO.SysMessageVO; +import com.muyu.car.domain.resp.SysMessageResp; import com.muyu.car.mapper.SysCarMessageMapper; import com.muyu.car.service.ISysCarMessageService; import org.springframework.beans.factory.annotation.Autowired; @@ -29,8 +29,8 @@ public class SysCarMessageServiceImpl private SysCarMessageMapper mapper; @Override - public List dobList(SysMessageVO sysMessageVO) { - return mapper.dobList(sysMessageVO); + public List dobList(SysMessageResp sysMessageResp) { + return mapper.dobList(sysMessageResp); } /** diff --git a/cloud-modules/cloud-modules-carmanage/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-carmanage/src/main/resources/bootstrap.yml index 46654cc..a1c92e8 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-carmanage/src/main/resources/bootstrap.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 10010 + port: 10011 # nacos线上地址 nacos: @@ -19,7 +19,7 @@ spring: allow-bean-definition-overriding: true application: # 应用名称 - name: cloud-car + name: cloud-parsing profiles: # 环境配置 active: dev diff --git a/cloud-modules/cloud-modules-carmanage/src/main/resources/mapper/car/SysCarMessageMapper.xml b/cloud-modules/cloud-modules-carmanage/src/main/resources/mapper/car/SysCarMessageMapper.xml index 3b10785..c49f3d1 100644 --- a/cloud-modules/cloud-modules-carmanage/src/main/resources/mapper/car/SysCarMessageMapper.xml +++ b/cloud-modules/cloud-modules-carmanage/src/main/resources/mapper/car/SysCarMessageMapper.xml @@ -27,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - SELECT sys_car_message.*,sys_message_type.message_name FROM sys_car_message LEFT JOIN sys_message_type ON sys_message_type.message_code=sys_car_message.message_type_code diff --git a/cloud-modules/cloud-modules-rail/pom.xml b/cloud-modules/cloud-modules-parsing/pom.xml similarity index 70% rename from cloud-modules/cloud-modules-rail/pom.xml rename to cloud-modules/cloud-modules-parsing/pom.xml index 2353a2c..7f2fd25 100644 --- a/cloud-modules/cloud-modules-rail/pom.xml +++ b/cloud-modules/cloud-modules-parsing/pom.xml @@ -2,21 +2,23 @@ + 4.0.0 - cloud-modules com.muyu + cloud-modules 3.6.3 - 4.0.0 - - cloud-modules-rail + cloud-modules-parsing + + cloud-modules-parsing 协议解析模块 + 17 17 + UTF-8 - com.alibaba.cloud @@ -59,17 +61,45 @@ cloud-common-datascope + com.muyu - cloud-common-core + cloud-common-log + com.muyu cloud-common-api-doc + + + com.muyu + cloud-common-xxl + + + com.muyu + cloud-common-rabbit + + + + org.bouncycastle + bcpkix-jdk15on + 1.70 + + + + com.muyu + cloud-common-kafka + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.2 + diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/CloudParsingApplication.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/CloudParsingApplication.java new file mode 100644 index 0000000..673e3c5 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/CloudParsingApplication.java @@ -0,0 +1,22 @@ +package com.muyu.parsing; + +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableMyFeignClients; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 系统模块 + * + * @author muyu + */ +@EnableCustomConfig +//@EnableCustomSwagger2 +@EnableMyFeignClients +@SpringBootApplication +public class CloudParsingApplication { + public static void main(String[] args) { + SpringApplication.run(CloudParsingApplication.class, args); + } + +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/controller/SysCarMessageController.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/controller/SysCarMessageController.java new file mode 100644 index 0000000..d76bbd5 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/controller/SysCarMessageController.java @@ -0,0 +1,231 @@ +package com.muyu.parsing.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.kafka.constants.KafkaConstants; +import com.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.parsing.domain.KafKaData; +import com.muyu.parsing.domain.SysCarMessage; +import com.muyu.parsing.domain.resp.SysMessageResp; +import com.muyu.parsing.service.ISysCarMessageService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; +import org.eclipse.paho.client.mqttv3.*; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +/** + * 车辆报文记录Controller + * + * @author muyu + * @date 2024-09-18 + */ +@Slf4j +@RestController +@RequestMapping("/messageInfo") +public class SysCarMessageController extends BaseController { + @Resource + private ISysCarMessageService sysCarMessageService; + @Resource + private KafkaProducer kafkaProducer; + static String TEST = "56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56"; + +// @Autowired +// private KafkaTemplate kafkaTemplate; + + + + + /** + * 查询车辆报文记录列表 + */ +// @RequiresPermissions("message:message:list") + @Transactional + @GetMapping("/list") + public Result> list(SysCarMessage sysCarMessage) throws ExecutionException, InterruptedException { + + List list = sysCarMessageService.selectSysCarMessageList(sysCarMessage); + if (list == null || list.isEmpty()) { + return Result.error(); //为空返回错误信息 + } + String[] test = TEST.split(" "); + String[] results = new String[list.size()]; + List> futures = new ArrayList<>(); + + for (SysCarMessage carMessage : list) { + futures.add(CompletableFuture.supplyAsync(() -> { + int start = Integer.parseInt(carMessage.getMessageStartIndex()) - 1; + int end = Integer.parseInt(carMessage.getMessageEndIndex()); + StringBuilder hexBuilder = new StringBuilder(); + for (int i = start; i < end; i++) { + hexBuilder.append(test[i]); + } + String hex = hexBuilder.toString(); + char[] result = new char[hex.length() / 2]; + for (int x = 0; x < hex.length(); x += 2) { + int high = Character.digit(hex.charAt(x), 16); + int low = Character.digit(hex.charAt(x + 1), 16); + result[x / 2] = (char) ((high << 4) + low); + } + return new String(result); + })); + } + for (int i = 0; i < futures.size(); i++) { + results[i] = futures.get(i).get(); + + } + log.info("======================={}", results); + String jsonString = """ + [{ + "key": "vin", + "label": "VIN码", + "type": "String", + "value": "vin131413534474" + },{ + "key": "timestamp", + "label": "时间戳", + "type": "String", + "value": "1727525252127" + },{ + "key": "latitude", + "label": "纬度", + "type": "String", + "value": "66.898" + },{ + "key": "longitude", + "label": "经度", + "type": "String", + "value": "99.124" + }]"""; + + ProducerRecord producerRecord = new ProducerRecord<>(KafkaConstants.KafkaTopic, jsonString); + kafkaProducer.send(producerRecord); + log.info("消息发送成功:{}", jsonString); + return Result.success(list); + } + + + @RequiresPermissions("message:message:dobList") + @GetMapping("/dobList") + public Result> dobList(SysMessageResp sysMessageResp) { + List list = sysCarMessageService.dobList(sysMessageResp); + return Result.success(list); + } + + + /** + * 导出车辆报文记录列表 + */ + @RequiresPermissions("message:message:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysCarMessage sysCarMessage) { + List list = sysCarMessageService.selectSysCarMessageList(sysCarMessage); + ExcelUtil util = new ExcelUtil(SysCarMessage.class); + util.exportExcel(response, list, "车辆报文记录数据"); + } + + /** + * 获取车辆报文记录详细信息 + */ + @RequiresPermissions("message:message:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) { + return success(sysCarMessageService.selectSysCarMessageById(id)); + } + + /** + * 新增车辆报文记录 + */ + @RequiresPermissions("message:message:add") + @PostMapping + public Result add( + @Validated @RequestBody SysCarMessage sysCarMessage) { + if (sysCarMessageService.checkIdUnique(sysCarMessage)) { + return error("新增 车辆报文记录 '" + sysCarMessage + "'失败,车辆报文记录已存在"); + } + return toAjax(sysCarMessageService.save(sysCarMessage)); + } + + /** + * 修改车辆报文记录 + */ + @RequiresPermissions("message:message:edit") + @PutMapping + public Result edit( + @Validated @RequestBody SysCarMessage sysCarMessage) { + if (!sysCarMessageService.checkIdUnique(sysCarMessage)) { + return error("修改 车辆报文记录 '" + sysCarMessage + "'失败,车辆报文记录不存在"); + } + return toAjax(sysCarMessageService.updateById(sysCarMessage)); + } + + /** + * 删除车辆报文记录 + */ + @RequiresPermissions("message:message:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) { + sysCarMessageService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } + +// public String message() { +// String topic = "vehicle"; +// String content = "Message from MqttPublishSample"; +// int qos = 2; +// String broker = "tcp://106.15.136.7:1883"; +// String clientId = "JavaSample"; +// try { +// // 第三个参数为空,默认持久化策略 +// MqttClient sampleClient = new MqttClient(broker, clientId); +// MqttConnectOptions connOpts = new MqttConnectOptions(); +// connOpts.setCleanSession(true); +// System.out.println("Connecting to broker: " + broker); +// sampleClient.connect(connOpts); +// sampleClient.subscribe(topic, 0); +// sampleClient.setCallback(new MqttCallback() { +// // 连接丢失 +// @Override +// public void connectionLost(Throwable throwable) { +// +// } +// +// // 连接成功 +// @Override +// public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { +// System.out.println(new String(mqttMessage.getPayload())); +// } +// +// // 接收信息 +// @Override +// public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { +// +// } +// }); +// } catch (MqttException me) { +// System.out.println("reason " + me.getReasonCode()); +// System.out.println("msg " + me.getMessage()); +// System.out.println("loc " + me.getLocalizedMessage()); +// System.out.println("cause " + me.getCause()); +// System.out.println("excep " + me); +// me.printStackTrace(); +// } +// return this.messageArrived(); +// } + +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/KafKaData.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/KafKaData.java new file mode 100644 index 0000000..c188170 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/KafKaData.java @@ -0,0 +1,26 @@ +package com.muyu.parsing.domain; + +import lombok.*; + +import java.io.Serializable; + +/** + * 报文消息 ktlv + * + * @ClassName KafKaData + * @Description 描述 + * @Author Chen + * @Date 2024/9/28 20:41 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString// +public class KafKaData implements Serializable { + private String key; + private String value; + private String type; + private String label; +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/SysCarMessage.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/SysCarMessage.java new file mode 100644 index 0000000..8683e7b --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/SysCarMessage.java @@ -0,0 +1,67 @@ +package com.muyu.parsing.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.muyu.common.core.annotation.Excel; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serializable; + +/** + * 车辆报文记录对象 sys_car_message + * + * @author muyu + * @date 2024-09-18 + */ + +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_car_message") +public class SysCarMessage implements Serializable { + private static final long serialVersionUID = 1L; + + /** 自增主键 */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 车辆型号编码 */ + @Excel(name = "车辆型号编码") + private String modelCode; + + /** 车辆报文类型编码 */ + @Excel(name = "i") + private String messageTypeCode; + + /** 开始位下标 */ + @Excel(name = "开始位下标") + private String messageStartIndex; + + /** 结束位下标 */ + @Excel(name = "结束位下标") + private String messageEndIndex; + + /** 报文分类 */ + @Excel(name = "报文分类") + private String messageType; + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("modelCode", getModelCode()) + .append("messageTypeCode", getMessageTypeCode()) + .append("messageStartIndex", getMessageStartIndex()) + .append("messageEndIndex", getMessageEndIndex()) + .append("messageType", getMessageType()) + .toString(); + } +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/resp/SysMessageResp.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/resp/SysMessageResp.java new file mode 100644 index 0000000..b218863 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/domain/resp/SysMessageResp.java @@ -0,0 +1,22 @@ +package com.muyu.parsing.domain.resp; + +import lombok.Data; + +/** + * 车辆报文类型对象 sys_message_type + * + * @author muyu + * @date 2024-09-18 + */ + +@Data +public class SysMessageResp { + private static final long serialVersionUID = 1L; + private Long id; + private String modelCode; + private String messageTypeCode; + private String messageStartIndex; + private String messageEndIndex; + private String messageType; + private String messageName; +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mapper/SysCarMessageMapper.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mapper/SysCarMessageMapper.java new file mode 100644 index 0000000..df2e16a --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mapper/SysCarMessageMapper.java @@ -0,0 +1,20 @@ +package com.muyu.parsing.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import com.muyu.parsing.domain.SysCarMessage; +import com.muyu.parsing.domain.resp.SysMessageResp; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 车辆报文记录Mapper接口 + * + * @author muyu + * @date 2024-09-18 + */ +@Mapper +public interface SysCarMessageMapper extends BaseMapper{ + ListdobList(SysMessageResp sysMessageResp); +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/Demo.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/Demo.java new file mode 100644 index 0000000..af89588 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/Demo.java @@ -0,0 +1,61 @@ +package com.muyu.parsing.mqtt; + +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; + +/** + * 测试MQTT + * + * @ClassName demo + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/27 22:27 + */ +public class Demo { + + public static void main(String[] args) { + + String topic = "vehicle"; + String content = "Message from MqttPublishSample"; + int qos = 2; + String broker = "tcp://106.54.193.225:1883"; + String clientId = "JavaSample"; + + try { + // 第三个参数为空,默认持久化策略 + MqttClient sampleClient = new MqttClient(broker, clientId); + MqttConnectOptions connOpts = new MqttConnectOptions(); + connOpts.setCleanSession(true); + System.out.println("Connecting to broker: " + broker); + sampleClient.connect(connOpts); + sampleClient.subscribe(topic, 0); + sampleClient.setCallback(new MqttCallback() { + // 连接丢失 + @Override + public void connectionLost(Throwable throwable) { + + } + + // 连接成功 + @Override + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { + System.out.println(new String(mqttMessage.getPayload())); + } + + // 接收信息 + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + + } + }); + } catch (MqttException me) { + System.out.println("reason " + me.getReasonCode()); + System.out.println("msg " + me.getMessage()); + System.out.println("loc " + me.getLocalizedMessage()); + System.out.println("cause " + me.getCause()); + System.out.println("excep " + me); + me.printStackTrace(); + } + } + +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/MqttTest.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/MqttTest.java new file mode 100644 index 0000000..add2731 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/mqtt/MqttTest.java @@ -0,0 +1,192 @@ +package com.muyu.parsing.mqtt; + +import com.muyu.common.kafka.constants.KafkaConstants; +import com.muyu.parsing.domain.SysCarMessage; +import com.muyu.parsing.service.impl.SysCarMessageServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.eclipse.paho.client.mqttv3.*; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + + +/** + * @ClassName MqttTest + * @Description 描述 + * @Author Chen + * @Date 2024/9/28 23:49 + */ +@Slf4j +@Component +public class MqttTest { + @Resource + private KafkaProducer kafkaProducer; + @Resource + private SysCarMessageServiceImpl sysCarMessageService; + @PostConstruct + public void Test() { + String topic = "vehicle"; + String content = "Message from MqttPublishSample"; + int qos = 2; + String broker = "tcp://106.15.136.7:1883"; + String clientId = "JavaSample"; + + try { + // 第三个参数为空,默认持久化策略 + MqttClient sampleClient = new MqttClient(broker, clientId); + MqttConnectOptions connOpts = new MqttConnectOptions(); + connOpts.setCleanSession(true); + System.out.println("Connecting to broker: " + broker); + sampleClient.connect(connOpts); + sampleClient.subscribe(topic, 0); + sampleClient.setCallback(new MqttCallback() { + // 连接丢失 + @Override + public void connectionLost(Throwable throwable) { + + } + + // 连接成功 + @Override + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { + List list = sysCarMessageService.selectSysCarMessageLists(1, 1); + String string = new String(mqttMessage.getPayload()); + System.out.println(new String(mqttMessage.getPayload())); + String[] test = string.split(" "); + String[] results = new String[list.size()]; + List> futures = new ArrayList<>(); + + for (SysCarMessage carMessage : list) { + futures.add(CompletableFuture.supplyAsync(() -> { + int start = Integer.parseInt(carMessage.getMessageStartIndex()) - 1; + int end = Integer.parseInt(carMessage.getMessageEndIndex()); + StringBuilder hexBuilder = new StringBuilder(); + for (int i = start; i < end; i++) { + hexBuilder.append(test[i]); + } + String hex = hexBuilder.toString(); + char[] result = new char[hex.length() / 2]; + for (int x = 0; x < hex.length(); x += 2) { + int high = Character.digit(hex.charAt(x), 16); + int low = Character.digit(hex.charAt(x + 1), 16); + result[x / 2] = (char) ((high << 4) + low); + } + return new String(result); + })); + } + for (int i = 0; i < futures.size(); i++) { + results[i] = futures.get(i).get(); + } + log.info("======================={}", results); + String jsonString = """ + [{ + "key": "vin", + "label": "VIN码", + "type": "String", + "value": "vin131413534474" + },{ + "key": "timestamp", + "label": "时间戳", + "type": "String", + "value": "1727525252127" + },{ + "key": "latitude", + "label": "纬度", + "type": "String", + "value": "66.898" + },{ + "key": "longitude", + "label": "经度", + "type": "String", + "value": "99.124" + }]"""; + + ProducerRecord producerRecord = new ProducerRecord<>(KafkaConstants.KafkaTopic, jsonString); + kafkaProducer.send(producerRecord); + log.info("消息发送成功:{}", jsonString); + + } + + // 接收信息 + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + + } + +// public Result> list(SysCarMessage sysCarMessage) throws ExecutionException, InterruptedException { +// List list = sysCarMessageService.selectSysCarMessageList(sysCarMessage); +// if (list == null || list.isEmpty()) { +// return Result.error(); //为空返回错误信息 +// } +// String[] test = TEST.split(" "); +// String[] results = new String[list.size()]; +// List> futures = new ArrayList<>(); +// +// for (SysCarMessage carMessage : list) { +// futures.add(CompletableFuture.supplyAsync(() -> { +// int start = Integer.parseInt(carMessage.getMessageStartIndex()) - 1; +// int end = Integer.parseInt(carMessage.getMessageEndIndex()); +// StringBuilder hexBuilder = new StringBuilder(); +// for (int i = start; i < end; i++) { +// hexBuilder.append(test[i]); +// } +// String hex = hexBuilder.toString(); +// char[] result = new char[hex.length() / 2]; +// for (int x = 0; x < hex.length(); x += 2) { +// int high = Character.digit(hex.charAt(x), 16); +// int low = Character.digit(hex.charAt(x + 1), 16); +// result[x / 2] = (char) ((high << 4) + low); +// } +// return new String(result); +// })); +// } +// for (int i = 0; i < futures.size(); i++) { +// results[i] = futures.get(i).get(); +// } +// log.info("======================={}", results); +// String jsonString = """ +// [{ +// "key": "vin", +// "label": "VIN码", +// "type": "String", +// "value": "vin131413534474" +// },{ +// "key": "timestamp", +// "label": "时间戳", +// "type": "String", +// "value": "1727525252127" +// },{ +// "key": "latitude", +// "label": "纬度", +// "type": "String", +// "value": "66.898" +// },{ +// "key": "longitude", +// "label": "经度", +// "type": "String", +// "value": "99.124" +// }]"""; +// +// ProducerRecord producerRecord = new ProducerRecord<>(KafkaConstants.KafkaTopic, jsonString); +// kafkaProducer.send(producerRecord); +// log.info("消息发送成功:{}", jsonString); +// return Result.success(list); +// } + + }); + } catch (MqttException me) { + System.out.println("reason " + me.getReasonCode()); + System.out.println("msg " + me.getMessage()); + System.out.println("loc " + me.getLocalizedMessage()); + System.out.println("cause " + me.getCause()); + System.out.println("excep " + me); + me.printStackTrace(); + } + } +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/remote/CarMessageRemote.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/remote/CarMessageRemote.java new file mode 100644 index 0000000..7ffeb01 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/remote/CarMessageRemote.java @@ -0,0 +1,19 @@ +package com.muyu.parsing.remote; + +import com.muyu.common.core.domain.Result; +import com.muyu.parsing.domain.SysCarMessage; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +/** + * @ClassName CarMessageRemote + * @Description 描述 + * @Author Chen + * @Date 2024/9/28 23:45 + */ + +//public interface CarMessageRemote { +// @GetMapping("/list") +// public Result> list(SysCarMessage sysCarMessage); +//} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/ISysCarMessageService.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/ISysCarMessageService.java new file mode 100644 index 0000000..66338af --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/ISysCarMessageService.java @@ -0,0 +1,44 @@ +package com.muyu.parsing.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.muyu.parsing.domain.SysCarMessage; +import com.muyu.parsing.domain.resp.SysMessageResp; + + +import java.util.List; + +/** + * 车辆报文记录Service接口 + * + * @author muyu + * @date 2024-09-18 + */ +public interface ISysCarMessageService extends IService { + + ListdobList(SysMessageResp sysMessageResp); + /** + * 精确查询车辆报文记录 + * + * @param id 车辆报文记录主键 + * @return 车辆报文记录 + */ + public SysCarMessage selectSysCarMessageById(Long id); + + /** + * 查询车辆报文记录列表 + * + * @param sysCarMessage 车辆报文记录 + * @return 车辆报文记录集合 + */ + public List selectSysCarMessageList(SysCarMessage sysCarMessage); + + /** + * 判断 车辆报文记录 id是否唯一 + * @param sysCarMessage 车辆报文记录 + * @return 结果 + */ + Boolean checkIdUnique(SysCarMessage sysCarMessage); + +// Boolean checkById(SysCarMessage sysCarMessage); + +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/impl/SysCarMessageServiceImpl.java b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/impl/SysCarMessageServiceImpl.java new file mode 100644 index 0000000..90a1b83 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/java/com/muyu/parsing/service/impl/SysCarMessageServiceImpl.java @@ -0,0 +1,97 @@ +package com.muyu.parsing.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.muyu.common.core.utils.StringUtils; +import com.muyu.parsing.domain.SysCarMessage; +import com.muyu.parsing.domain.resp.SysMessageResp; +import com.muyu.parsing.mapper.SysCarMessageMapper; +import com.muyu.parsing.service.ISysCarMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.List; + +/** + * 车辆报文记录Service业务层处理 + * + * @author muyu + * @date 2024-09-18 + */ +@Service +public class SysCarMessageServiceImpl + extends ServiceImpl + implements ISysCarMessageService { + @Autowired + private SysCarMessageMapper mapper; + + @Override + public List dobList(SysMessageResp sysMessageResp) { + return mapper.dobList(sysMessageResp); + } + + /** + * 精确查询车辆报文记录 + * + * @param id 车辆报文记录主键 + * @return 车辆报文记录 + */ + @Override + public SysCarMessage selectSysCarMessageById(Long id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(SysCarMessage::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询车辆报文记录列表 + * + * @param sysCarMessage 车辆报文记录 + * @return 车辆报文记录 + */ + @Override + public List selectSysCarMessageList(SysCarMessage sysCarMessage) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotEmpty(sysCarMessage.getModelCode())) { + queryWrapper.eq(SysCarMessage::getModelCode, sysCarMessage.getModelCode()); + } + if (StringUtils.isNotEmpty(sysCarMessage.getMessageType())) { + queryWrapper.eq(SysCarMessage::getMessageType, sysCarMessage.getMessageType()); + } + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * + * @param sysCarMessage 车辆报文记录 + * @return 车辆报文记录 + */ + @Override + public Boolean checkIdUnique(SysCarMessage sysCarMessage) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCarMessage::getId, sysCarMessage.getId()); + return this.count(queryWrapper) > 0; + } + + public List selectSysCarMessageLists(int id, int modelCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCarMessage::getModelCode, id); + queryWrapper.eq(SysCarMessage::getMessageType, modelCode); + return this.list(queryWrapper); + } +// +// @Override +// public Boolean checkById(SysMessageType sysMessageType) { +// LambdaQueryWrapper sysCarMessageLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// sysCarMessageLambdaQueryWrapper.eq(SysCarMessage::getMessageType, sysMessageType); +//// sysCarMessageLambdaQueryWrapper.eq(SysCarMessage::getMessageType, sysMessageType); +// sysCarMessageLambdaQueryWrapper.eq(SysCarMessage::get, sysMessageType); +//// return this.count(sysCarMessageLambdaQueryWrapper) > 0; +// } + +} diff --git a/cloud-modules/cloud-modules-parsing/src/main/resources/banner.txt b/cloud-modules/cloud-modules-parsing/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/cloud-modules/cloud-modules-parsing/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-parsing/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..e940514 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/resources/bootstrap.yml @@ -0,0 +1,77 @@ +# Tomcat +server: + port: 10010 + +# nacos线上地址 +nacos: + addr: 49.235.136.60:8848 + user-name: nacos + password: nacos + namespace: wyh +# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all +# Spring +spring: + amqp: + deserialization: + trust: + all: true + main: + allow-bean-definition-overriding: true + application: + # 应用名称 + name: cloud-parsing + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: ${nacos.addr} + # # nacos用户名 + # username: ${nacos.user-name} + # # nacos密码 + # password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + config: + # 服务注册地址 + server-addr: ${nacos.addr} + # # nacos用户名 + # username: ${nacos.user-name} + # # nacos密码 + # password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + # 系统共享配置 + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # 系统环境Config共享配置 + - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # xxl-job 配置文件 + - application-xxl-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # rabbit 配置文件 + - application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.muyu.system.mapper: DEBUG +#mqtt: +# host:tcp://172.0.0.1:1883 +# userName: root +# passWord: 11 +### MQTT## +mqtt: + host: tcp://192.168.10.198:1883 + userName: root + passWord: 123456 + qos: 1 + clientId: ClientId_local #ClientId_local必须唯一 比如你已经定了叫ABC 那你就一直叫ABC 其他地方就不要使用ABC了 + timeout: 10 + keepalive: 20 + topic1: A/pick/warn/# #符号是代表整个warn下面的全部子主题 没有理解的话 可以百度仔细理解一下 + topic2: A/cmd/resp + topic3: ABCF + topic4: ABCH diff --git a/cloud-modules/cloud-modules-parsing/src/main/resources/logback/dev.xml b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/dev.xml new file mode 100644 index 0000000..d1b5629 --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/dev.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-parsing/src/main/resources/logback/prod.xml b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/prod.xml new file mode 100644 index 0000000..76a0d8f --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/prod.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-parsing/src/main/resources/logback/test.xml b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/test.xml new file mode 100644 index 0000000..76a0d8f --- /dev/null +++ b/cloud-modules/cloud-modules-parsing/src/main/resources/logback/test.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/CloudRailApplication.java b/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/CloudRailApplication.java deleted file mode 100644 index f490e2a..0000000 --- a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/CloudRailApplication.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.zhangyi.rail; - -public class CloudRailApplication { - public static void main(String[] args) { - - } -} diff --git a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/controller/RailController.java b/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/controller/RailController.java deleted file mode 100644 index be833e0..0000000 --- a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/controller/RailController.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.zhangyi.rail.controller; - -public class RailController { -} diff --git a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/domain/SysFenceRail.java b/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/domain/SysFenceRail.java deleted file mode 100644 index dc11dbd..0000000 --- a/cloud-modules/cloud-modules-rail/src/main/java/com/zhangyi/rail/domain/SysFenceRail.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.zhangyi.rail.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.muyu.common.core.annotation.Excel; -import lombok.*; -import lombok.experimental.SuperBuilder; - -@Data -@Setter -@Getter -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -@TableName("sys_corpuscle_fence") -public class SysFenceRail { -private static final long seriaversionUID =1L; -/** 自增主键 */ -@TableId(type = IdType.AUTO) - private Long id; - -/** 围栏编码 */ -@Excel(name="围栏编码") - private String fenceCode; - /**围栏名称**/ - @Excel(name = "围栏名称") - private String fenceName; - - /**围栏类型**/ - @Excel(name = "围栏类型") - private Long fenceType; - - - - - -} diff --git a/cloud-modules/cloud-modules-system-saas/pom.xml b/cloud-modules/cloud-modules-system-saas/pom.xml index b9983d0..f685a22 100644 --- a/cloud-modules/cloud-modules-system-saas/pom.xml +++ b/cloud-modules/cloud-modules-system-saas/pom.xml @@ -10,7 +10,9 @@ cloud-modules-system-saas - + + cloud-modules-system-saas saas + 17 17 diff --git a/cloud-modules/cloud-modules-warn/cloud-warn-server/src/main/java/com/muyu/warning/controller/WxTestController.java b/cloud-modules/cloud-modules-warn/cloud-warn-server/src/main/java/com/muyu/warning/controller/WxTestController.java index b512b94..5c53107 100644 --- a/cloud-modules/cloud-modules-warn/cloud-warn-server/src/main/java/com/muyu/warning/controller/WxTestController.java +++ b/cloud-modules/cloud-modules-warn/cloud-warn-server/src/main/java/com/muyu/warning/controller/WxTestController.java @@ -24,6 +24,7 @@ import java.security.NoSuchAlgorithmException; import java.util.*; /** + * 微信公众号 * @Author: Chen * @name:GetWxController */ diff --git a/cloud-modules/cloud-modules-warn/pom.xml b/cloud-modules/cloud-modules-warn/pom.xml index 7e15d11..40cd030 100644 --- a/cloud-modules/cloud-modules-warn/pom.xml +++ b/cloud-modules/cloud-modules-warn/pom.xml @@ -10,6 +10,9 @@ cloud-modules-warn + + 预警 + pom cloud-warn-common diff --git a/cloud-modules/pom.xml b/cloud-modules/pom.xml index 1d52970..ca4da81 100644 --- a/cloud-modules/pom.xml +++ b/cloud-modules/pom.xml @@ -15,9 +15,9 @@ cloud-modules-system-saas cloud-breakdown cloud-modules-car - cloud-modules-rail cloud-modules-warn cloud-modules-carmanage + cloud-modules-parsing cloud-modules