Compare commits

...

52 Commits

Author SHA1 Message Date
张腾 d7a1d79a12 代码优化结构和功能
-调整控制器类中的依赖注入方式,使用 @Autowired 注解- 简化 CarOnlineConsumer 类,移除不必要的代码
- 重构 FaultCodeServiceImpl 类,删除未使用的导入和变量
-调整 pom.xml 文件,移除重复的依赖项
-优化 RabbitListenerConfigurer 类,添加缺失的注解和配置
-调整 VehicleCacheCarInformationAddService、VehicleCacheCarInformationService 和 VehicleCacheCarInformationUpdService 类,移除未使用的代码
2024-10-11 21:29:35 +08:00
张腾 5d4b1dbe67 Merge branch 'dev' into dev.carData 2024-10-10 17:23:54 +08:00
张腾 628b8d1fab 重构车辆上线消息消费逻辑并优化网关路由配置
- 重构了CarOnlineConsumer类,实现了车辆上线消息的监听和处理
- 新增了车辆网关交换机、队列和绑定的配置- 引入了cloud-modules-enterprise-cache依赖
- 添加了VehicleGatewayConstants类,用于定义车辆网关相关的常量
2024-10-10 17:23:41 +08:00
Yueng 5b7de4a971 Merge remote-tracking branch 'origin/dev.yang' into dev 2024-10-10 14:26:19 +08:00
Yueng ecd84b4672 find()预警缓存 2024-10-10 14:25:35 +08:00
Yueng 1ccf7419ae Merge remote-tracking branch 'origin/dev.yang' into dev 2024-10-10 13:48:16 +08:00
Yueng 7d0d0418c6 find()优化缓存 2024-10-10 12:29:51 +08:00
张腾 e986ab4a17 Merge branch 'dev' into dev.carData
# Conflicts:
#	cloud-modules/cloud-Saas-Service/pom.xml
#	cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/consumer/CarOnlineConsumer.java
#	cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-cache/pom.xml
2024-10-09 14:28:40 +08:00
WeiRan 2a85b2bb67 Merge remote-tracking branch 'origin/dev' into dev 2024-10-09 14:22:16 +08:00
Aaaaaaaa 918b5223a8 Merge remote-tracking branch 'origin/dev' into dev 2024-10-09 14:21:03 +08:00
Aaaaaaaa 581e344fdf 更新 Nacos 服务地址并调整 MQTT 测试代码
- 将 Nacos 服务地址从本地更改为指定的线上地址(159.75.188.178:8848)
- 分别更新了 cloud-modules-carData 和 cloud-modules-enterprise 项目的 bootstrap.yml 文件
2024-10-09 14:20:27 +08:00
WeiRan e172137feb Merge branch 'dev.wei' into dev 2024-10-09 14:20:08 +08:00
WeiRan 82a7117e22 fix():修改路径冲突导致的报错 2024-10-09 14:19:39 +08:00
yuan 7e0594185b feat():车辆网关 2024-10-09 14:05:18 +08:00
Yueng 82bbab11db find()更新缓存 2024-10-09 14:02:15 +08:00
Yueng b2a2a2bcb7 Merge branch 'dev' of https://gitea.qinmian.online/a_bazu/cloud-server-8 into dev
# Conflicts:
#	cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/car/gateway/service/impl/VehicleInformationServiceImpl.java
#	cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/car/instance/GenerateInstance.java
#	cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/server/service/impl/FirmPermissionServiceImpl.java
2024-10-09 14:00:59 +08:00
Yueng 4a005b3df0 Merge branch 'dev.yang' into dev 2024-10-09 13:59:14 +08:00
Yueng f7143fede7 find()更新缓存 2024-10-09 13:57:18 +08:00
WeiRan 2e7169d5ed Merge branch 'dev.wei' into dev 2024-10-08 22:41:35 +08:00
WeiRan 3e73a8598a feat():完善企业权限分配功能 2024-10-08 22:40:43 +08:00
yuan 26e1591f43 feat():增加ip轮询 2024-10-08 20:01:54 +08:00
yuan e990dd304f Merge branch 'refs/heads/dev.cargateway' into dev 2024-10-08 19:54:40 +08:00
yuan 046b924c96 feat():增加ip轮询 2024-10-08 19:52:50 +08:00
Yueng daf43b843b Merge remote-tracking branch 'origin/dev.yang' into dev 2024-10-08 19:05:51 +08:00
Yueng 36c1f661b6 find()故障规则创建时查询列表添加新的缓存 2024-10-08 19:05:12 +08:00
Yueng 50b462ae60 find()更新pom配置 2024-10-08 18:16:55 +08:00
Yueng 8fa84a4562 find()更新pom配置 2024-10-08 18:13:25 +08:00
张腾 c42adb48cc 优化车辆上线时的故障码缓存逻辑
- 修改CarOnlineConsumer类,实现车辆上线时从VehicleCacheFaultCodeAddService获取故障码缓存并存入本地缓存
- 新增IdentifyingFailuresListener类,用于监听ES保存事件,根据车辆VIN查询并处理故障码
- 调整IotDBController类,注释掉未使用的批量插入记录方法
- 更新相关依赖配置,引入cloud-modules-enterprise-cache等依赖
2024-10-08 11:54:54 +08:00
张腾 2864df2549 重构车辆数据处理模块
- 新增 CacheUtil 类用于缓存管理
- 添加车辆上线和下线的 RabbitMQ 消息消费者- 实现基于事件的 IoTDB 数据持久化逻辑
- 重构 Kafka 消费者,支持多线程处理
- 移除多个不再使用的类和接口
2024-10-08 11:51:39 +08:00
张腾 fe70b7d3c1 Merge branch 'dev.carData' into dev
# Conflicts:
#	cloud-modules/cloud-modules-protocolparsing/src/main/java/com/muyu/mqtt/MqttTest.java
2024-10-08 09:23:27 +08:00
Yueng 54f0aee961 Merge remote-tracking branch 'origin/dev.yang' into dev
# Conflicts:
#	cloud-auth/src/main/resources/bootstrap.yml
#	cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml
2024-10-08 01:45:18 +08:00
Yueng 015d7c0896 fine()添加故障缓存 2024-10-08 01:42:44 +08:00
WeiRan d947e9fbff Merge branch 'dev' of https://gitea.qinmian.online/a_bazu/cloud-server-8 into dev 2024-10-08 00:15:56 +08:00
yuan 0523876861 feat():车辆网关:fluxmq通过rabbitmq发送vin 2024-10-08 00:11:37 +08:00
yuan f6c0b72e18 Merge branch 'refs/heads/dev.cargateway' into dev
# Conflicts:
#	cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/car/gateway/service/impl/VehicleInformationServiceImpl.java
2024-10-08 00:08:37 +08:00
yuan 9185f33c0c feat():车辆网关:fluxmq通过rabbitmq发送vin 2024-10-08 00:01:57 +08:00
WeiRan 748d4be165 Merge branch 'dev.wei' into dev 2024-10-07 23:48:17 +08:00
WeiRan df1c9ad9e8 feat():修改企业入驻 2024-10-07 23:44:14 +08:00
yuan 1a65c83a56 feat():车辆网关:fluxmq通过rabbitmq发送vin 2024-10-07 22:40:12 +08:00
yuan 4ae60743fa Merge branch 'refs/heads/dev.cargateway' into dev
# Conflicts:
#	cloud-auth/src/main/resources/bootstrap.yml
#	cloud-gateway/src/main/resources/bootstrap.yml
#	cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml
#	cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml
#	cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml
#	cloud-modules/pom.xml
#	cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml
2024-10-07 22:38:04 +08:00
Aaaaaaaa 9486710ae8 美化代码和注释
删除了 CarMessageServiceImpl 中未使用的 RedisTemplate 注释。
2024-10-07 21:54:32 +08:00
Aaaaaaaa e6e7e58f95 移除冗余代码并优化Kafka配置
- 删除了KafkaConstants、KafkaConsumerConfig和KafkaProviderConfig类,这些类已被移动到其他项目中
-简化了KafkaConfig类,移除了其中的kafkaProducer方法,该方法已被移动到其他类中
- 在MqttTest类中更新了Kafka主题的硬编码值
- 移除了oneMse类,该类用于测试,目前不再需要
- 在ProtocolApplication的main方法中添加了一个空的System.out.println语句,用于调试或日志记录
2024-10-07 14:22:46 +08:00
WeiRan 7063af945e feat():完成saas切换登录切换数据源 2024-10-06 20:17:45 +08:00
Yueng bb56bc2393 fine()添加故障缓存 2024-10-06 19:02:37 +08:00
Aaaaaaaa 00d1eb18d1 新增本地缓存工具类和缓存实体类,优化报文解析服务
- 新增 CacheUtill 工具类,实现本地缓存功能,包括添加、获取、移除缓存和定时清理过期缓存
- 新增 MyCache 实体类,用于缓存键值对数据及过期时间
- 新增 oneMse测试类(具体用途待明确)- 在 CarMessageServiceImpl 中注释掉未使用的 RedisTemplate 相关代码
- 在 pom.xml 中添加 caffeine 依赖,用于本地缓存
- 移除 Demo 类中关于 MQTT 和 Kafka 的测试代码- 在 MqttTest 类中简化 Kafka 生产者发送消息的逻辑
2024-10-06 16:31:26 +08:00
Yueng 6e4b268730 fine()添加车辆缓存 2024-10-06 10:57:31 +08:00
张腾 aeec2245c0 重构车辆数据处理模块
- 新增 CacheUtil 类用于缓存管理
- 添加车辆上线和下线的 RabbitMQ 消息消费者- 实现基于事件的 IoTDB 数据持久化逻辑
- 重构 Kafka 消费者,支持多线程处理
- 移除多个不再使用的类和接口
2024-10-06 09:45:37 +08:00
yuan 43c74b9978 feat():redis存储创建的实例信息 2024-10-04 14:28:38 +08:00
Aaaaaaaa f3c90ada2a 新增bootstrap.yml配置文件
添加了bootstrap.yml配置文件,包含了服务器端口、Nacos配置、Spring应用配置等。这个新文件将有助于应用在启动时读取必要的配置信息,从而与Nacos进行服务注册和配置管理。
2024-10-02 10:37:56 +08:00
Yueng c34bec050c Merge branch 'dev' into dev.yang 2024-09-30 10:21:47 +08:00
Yueng a399073121 Merge branch 'master' into dev.yang
# Conflicts:
#	pom.xml
2024-09-30 10:18:45 +08:00
Yueng fde90181c0 fine()配置修改 2024-09-27 16:04:55 +08:00
1778 changed files with 5029 additions and 187956 deletions

View File

@ -57,7 +57,6 @@
<groupId>com.muyu</groupId> <groupId>com.muyu</groupId>
<artifactId>cloud-common-api-doc</artifactId> <artifactId>cloud-common-api-doc</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -18,6 +18,9 @@ import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.annotation.Resource;
import java.util.Map;
/** /**
* token * token
* *
@ -34,9 +37,10 @@ public class TokenController {
@PostMapping("login") @PostMapping("login")
public Result<?> login (@RequestBody LoginBody form) { public Result<?> login (@RequestBody LoginBody form) {
// 用户登录 // 用户登录
LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(),form.getFirmName());
// 获取登录token // 获取登录token
return Result.success(tokenService.createToken(userInfo)); Map<String, Object> token = tokenService.createToken(userInfo);
return Result.success(token);
} }
@DeleteMapping("logout") @DeleteMapping("logout")

View File

@ -17,7 +17,18 @@ public class LoginBody {
*/ */
private String password; private String password;
/**
*
*/
private String firmName;
public String getFirmName() {
return firmName;
}
public void setFirmName(String firmName) {
this.firmName = firmName;
}
public String getUsername () { public String getUsername () {
return username; return username;

View File

@ -14,7 +14,7 @@ import com.muyu.common.core.utils.ip.IpUtils;
import com.muyu.common.redis.service.RedisService; import com.muyu.common.redis.service.RedisService;
import com.muyu.common.security.utils.SecurityUtils; import com.muyu.common.security.utils.SecurityUtils;
import com.muyu.common.system.domain.Firm; import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.remote.RemoteFirmService; import com.muyu.common.system.domain.SysUserMessage;
import com.muyu.common.system.remote.RemoteUserService; import com.muyu.common.system.remote.RemoteUserService;
import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.domain.LoginUser; import com.muyu.common.system.domain.LoginUser;
@ -31,9 +31,6 @@ public class SysLoginService {
@Autowired @Autowired
private RemoteUserService remoteUserService; private RemoteUserService remoteUserService;
@Autowired
private RemoteFirmService remoteFirmService;
@Autowired @Autowired
private SysPasswordService passwordService; private SysPasswordService passwordService;
@ -46,7 +43,7 @@ public class SysLoginService {
/** /**
* *
*/ */
public LoginUser login (String username, String password) { public LoginUser login (String username, String password,String firmName) {
// 用户名或密码为空 错误 // 用户名或密码为空 错误
if (StringUtils.isAnyBlank(username, password)) { if (StringUtils.isAnyBlank(username, password)) {
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写"); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
@ -71,7 +68,24 @@ public class SysLoginService {
throw new ServiceException("很遗憾访问IP已被列入系统黑名单"); throw new ServiceException("很遗憾访问IP已被列入系统黑名单");
} }
// 查询用户信息 // 查询用户信息
Result<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); Result<LoginUser> userResult = null;
//根据企业名称查询数据源
if (StringUtils.isNotEmpty(firmName)){
Result<String> result = remoteUserService.selectByfirmName(firmName);
if (result.getData()!=null){
SysUserMessage sysUserMessage = new SysUserMessage();
sysUserMessage.setUsername(username);
sysUserMessage.setPassword(password);
sysUserMessage.setDatabaseName(result.getData());
//查询这个数据源中的登录账号和密码
userResult = remoteUserService.selectuser(sysUserMessage);
}
}
// userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在"); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
@ -118,7 +132,7 @@ public class SysLoginService {
throw new ServiceException("密码长度必须在5到20个字符之间"); throw new ServiceException("密码长度必须在5到20个字符之间");
} }
String firmName = registerBody.getFirmName(); String firmName = registerBody.getFirmName();
Result<Firm> byFirmName = remoteFirmService.findByFirmName(firmName); Result<Firm> byFirmName = remoteUserService.findByFirmName(firmName);
Firm data = byFirmName.getData(); Firm data = byFirmName.getData();
if (null != data){ if (null != data){
throw new ServiceException("公司名称已经存在"); throw new ServiceException("公司名称已经存在");

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: xxy namespace: eight
# Spring # Spring
spring: spring:
application: application:

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>cloud-common</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>cloud-common-cache</artifactId>
<description>
cloud-modules-cache 缓存基准
</description>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-redis</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,33 @@
package com.muyu.common.cache;
import com.muyu.common.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* @Authoryang
* @Packagecom.muyu.common
* @Projectcloud-server-8
* @nameCacheAbsBacis
* @Date2024/9/30 11:19
*/
public abstract class CacheAbsBasic<K,V> implements CacheBasic<K,V>{
@Autowired
private RedisService redisService;
@Override
public void put(K key, V value) {
redisService.setCacheObject(encode(key),value);
}
@Override
public V get(K key) {
return redisService.getCacheObject(encode(key));
}
@Override
public void remove(K key) {
redisService.deleteObject(encode(key));
}
}

View File

@ -0,0 +1,18 @@
package com.muyu.common.cache;
/**
*
* @Authoryang
* @Packagecom.muyu.common.cache
* @Projectcloud-server-8
* @nameCacheBasic
* @Date2024/9/30 11:41
*/
public interface CacheBasic<K,V> extends PrimaryKeyBasic<K>{
void put(K key,V value);
V get(K key);
void remove(K key);
}

View File

@ -0,0 +1,34 @@
package com.muyu.common.cache;
/**
*
* @Authoryang
* @Packagecom.muyu.common.cache
* @Projectcloud-server-8
* @namePrimaryKeyBasic
* @Date2024/9/30 11:35
*/
public interface PrimaryKeyBasic <K>{
/**
* key
* @return
*/
public String keyPre();
/**
*
* @param key
* @return
*/
public default String encode(K key){
return key.toString();
}
/**
* key
* @param key Key
* @return Key
*/
public K decode(String key);
}

View File

@ -56,5 +56,5 @@ public class SecurityConstants {
*/ */
public static final String ROLE_PERMISSION = "role_permission"; public static final String ROLE_PERMISSION = "role_permission";
public static final String SAAS_KEY = "ent-code"; public static final String SAAS_KEY = "saas_key";
} }

View File

@ -1,54 +0,0 @@
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<String, Object> configs = new HashMap<>();
//kafka服务端的IP和端口,格式:(ip:port)
configs.put("bootstrap.servers", "60.204.221.52: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;
}
}

View File

@ -1,45 +0,0 @@
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<String, Object> 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;
}
}

View File

@ -1,9 +0,0 @@
package com.muyu.common.kafka.constants;
public class KafkaConstants {
public final static String KafkaTopic = "carJsons";
// public final static String KafkaGrop = "kafka_grop";
}

View File

@ -17,7 +17,8 @@ import java.util.HashMap;
* @Date2024/9/28 12:19 * @Date2024/9/28 12:19
*/ */
@Configuration @Configuration
public class KafkaConfig { public class
KafkaConfig {
@Bean @Bean
public KafkaProducer kafkaProducer(){ public KafkaProducer kafkaProducer(){

View File

@ -1,16 +1,22 @@
package com.muyu.common.rabbit; package com.muyu.common.rabbit;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistrar; import org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistrar;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory; import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
@Configuration @Configuration
public class RabbitListenerConfigurer implements org.springframework.amqp.rabbit.annotation.RabbitListenerConfigurer { public class RabbitListenerConfigurer implements org.springframework.amqp.rabbit.annotation.RabbitListenerConfigurer {
static { static {
System.setProperty("spring.amqp.deserialization.trust.all", "true"); System.setProperty("spring.amqp.deserialization.trust.all", "true");
} }

View File

@ -255,4 +255,14 @@ public class RedisService {
public Collection<String> keys (final String pattern) { public Collection<String> keys (final String pattern) {
return redisTemplate.keys(pattern); return redisTemplate.keys(pattern);
} }
// /**
// * 获取使用的对象的次数
// * @param key Redis键
// * @param hKey Hash键
// */
// public void getNumber (final String key, final String hKey){
// Object o = redisTemplate.opsForHash().get(key, hKey);
// }
} }

View File

@ -11,7 +11,8 @@ import com.muyu.cloud.common.saas.domain.model.EntInfo;
import com.muyu.cloud.common.saas.exception.SaaSException; import com.muyu.cloud.common.saas.exception.SaaSException;
import com.muyu.common.core.domain.Result; import com.muyu.common.core.domain.Result;
import com.muyu.common.core.utils.SpringUtils; import com.muyu.common.core.utils.SpringUtils;
import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.remote.RemoteUserService; import com.muyu.common.system.remote.RemoteUserService;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
@ -36,16 +37,17 @@ public class ManyDataSource implements ApplicationRunner{
private List<EntInfo> dataSourceInfoList(){ private List<EntInfo> dataSourceInfoList(){
RemoteUserService remoteUserService = SpringUtils.getBean(RemoteUserService.class); RemoteUserService remoteUserService = SpringUtils.getBean(RemoteUserService.class);
Result<List<SysUser>> tableDataInfoResult = remoteUserService.companyList(); Result<List<Firm>> tableDataInfoResult = remoteUserService.selectAll();
if (tableDataInfoResult==null){ if (tableDataInfoResult==null){
throw new SaaSException("saas远调数据源错误"); throw new SaaSException("saas远调数据源错误");
} }
List<SysUser> data = tableDataInfoResult.getData(); List<Firm> data = tableDataInfoResult.getData();
if (tableDataInfoResult.getCode() ==Result.SUCCESS && data !=null){ if (tableDataInfoResult.getCode() ==Result.SUCCESS && data !=null){
List<EntInfo> list = new ArrayList<>(); List<EntInfo> list = new ArrayList<>();
for (SysUser row : data) { for (Firm row : data) {
list.add( list.add(
EntInfo.builder() EntInfo.builder()
.firmKey(row.getFirmName())
.entCode(row.getDatabaseName()) .entCode(row.getDatabaseName())
.ip(DatasourceContent.IP) .ip(DatasourceContent.IP)
.port(DatasourceContent.PORT) .port(DatasourceContent.PORT)
@ -82,7 +84,8 @@ public class ManyDataSource implements ApplicationRunner{
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
DruidDataSourceFactory druidDataSourceFactory = SpringUtils.getBean(DruidDataSourceFactory.class); DruidDataSourceFactory druidDataSourceFactory = SpringUtils.getBean(DruidDataSourceFactory.class);
DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class); DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class);
for (EntInfo entInfo : dataSourceInfoList()) { List<EntInfo> entInfos = this.dataSourceInfoList();
for (EntInfo entInfo : entInfos) {
DataSourceInfo dataSourceInfo = DataSourceInfo.hostAndPortBuild( DataSourceInfo dataSourceInfo = DataSourceInfo.hostAndPortBuild(
entInfo.getEntCode(), entInfo.getIp(), entInfo.getPort() entInfo.getEntCode(), entInfo.getIp(), entInfo.getPort()
); );

View File

@ -8,7 +8,6 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* @author DongZl
* @description: * @description:
* @Date 2023-8-1 11:15 * @Date 2023-8-1 11:15
*/ */

View File

@ -19,7 +19,6 @@ public class DruidDataSourceFactory {
/** /**
* @Description: * @Description:
* @Author Dongzl
*/ */
public DruidDataSource create(DataSourceInfo dataSourceInfo) { public DruidDataSource create(DataSourceInfo dataSourceInfo) {
DruidDataSource druidDataSource = new DruidDataSource(); DruidDataSource druidDataSource = new DruidDataSource();
@ -33,7 +32,7 @@ public class DruidDataSourceFactory {
log.info("{} -> 数据源连接成功", dataSourceInfo.getKey()); log.info("{} -> 数据源连接成功", dataSourceInfo.getKey());
return druidDataSource; return druidDataSource;
} catch (SQLException throwables) { } catch (SQLException throwables) {
log.error("数据源 {} 连接失败,用户名:{},密码 {}",dataSourceInfo.getUrl(),dataSourceInfo.getUserName(),dataSourceInfo.getPassword()); log.error("数据源 {} 连接失败,用户名:{},密码 {}, 四百原因:{}",dataSourceInfo.getUrl(),dataSourceInfo.getUserName(),dataSourceInfo.getPassword(),throwables);
return null; return null;
} }
} }

View File

@ -8,5 +8,5 @@ package com.muyu.cloud.common.saas.contents;
*/ */
public class SaaSConstant { public class SaaSConstant {
public final static String SAAS_KEY = "ent-code"; public final static String SAAS_KEY = "saas_key";
} }

View File

@ -17,6 +17,8 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public class EntInfo { public class EntInfo {
private String firmKey;
private String entCode; private String entCode;
private String ip; private String ip;

View File

@ -4,6 +4,7 @@ import com.muyu.cloud.common.many.datasource.holder.DynamicDataSourceHolder;
import com.muyu.cloud.common.many.datasource.role.DynamicDataSource; import com.muyu.cloud.common.many.datasource.role.DynamicDataSource;
import com.muyu.cloud.common.saas.contents.SaaSConstant; import com.muyu.cloud.common.saas.contents.SaaSConstant;
import com.muyu.cloud.common.saas.exception.SaaSException; import com.muyu.cloud.common.saas.exception.SaaSException;
import com.muyu.common.core.constant.SecurityConstants;
import com.muyu.common.core.utils.ServletUtils; import com.muyu.common.core.utils.ServletUtils;
import com.muyu.common.core.utils.SpringUtils; import com.muyu.common.core.utils.SpringUtils;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@ -25,8 +26,11 @@ public class SaaSInterceptor implements AsyncHandlerInterceptor {
return true; return true;
} }
// SaaSConstant.SAAS_KEY
// SecurityConstants.SAAS_KEY
String SaaSKey = ServletUtils.getHeader(request, SaaSConstant.SAAS_KEY); String SaaSKey = ServletUtils.getHeader(request, SaaSConstant.SAAS_KEY);
if (SaaSKey == null) { if (SaaSKey == null || "".equals(SaaSKey)) {
throw new SaaSException("SaaS非法访问"); throw new SaaSException("SaaS非法访问");
}else { }else {
DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class); DynamicDataSource dynamicDataSource = SpringUtils.getBean(DynamicDataSource.class);

View File

@ -62,6 +62,7 @@ public class TokenService {
Map<String, Object> rspMap = new HashMap<String, Object>(); Map<String, Object> rspMap = new HashMap<String, Object>();
rspMap.put("access_token", JwtUtils.createToken(claimsMap)); rspMap.put("access_token", JwtUtils.createToken(claimsMap));
rspMap.put("expires_in", expireTime); rspMap.put("expires_in", expireTime);
rspMap.put("saas_key", loginUser.getSysUser().getDatabaseName());
return rspMap; return rspMap;
} }

View File

@ -1,5 +1,6 @@
package com.muyu.common.system.domain; package com.muyu.common.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -21,6 +22,7 @@ public class Firm {
/** /**
* *
*/ */
@TableId(value = "firm_id")
private Integer firmId; private Integer firmId;
/** /**

View File

@ -63,4 +63,14 @@ public class LoginUser implements Serializable {
*/ */
private SysUser sysUser; private SysUser sysUser;
/**
*
*/
private Firm firm;
/**
*
*/
private String firmName;
} }

View File

@ -1,5 +1,6 @@
package com.muyu.common.system.domain; package com.muyu.common.system.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.muyu.common.core.annotation.Excel; import com.muyu.common.core.annotation.Excel;
import com.muyu.common.core.annotation.Excel.ColumnType; import com.muyu.common.core.annotation.Excel.ColumnType;
import com.muyu.common.core.annotation.Excel.Type; import com.muyu.common.core.annotation.Excel.Type;

View File

@ -0,0 +1,32 @@
package com.muyu.common.system.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Authorweiran
* @Packagecom.muyu.system.domain
* @Projectcloud-server-8
* @nameSysUserMessage
* @Date2024/10/2 10:25
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SysUserMessage {
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
*
*/
private String databaseName;
}

View File

@ -1,23 +0,0 @@
package com.muyu.common.system.remote;
import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result;
import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.remote.factory.RemoteFirmFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Author
* @Packagecom.muyu.common.system.remote
* @Projectcloud-server-8
* @nameRemoteFirmService
* @Date2024/9/25 22:21
*/
@FeignClient(contextId = "remoteFirmService", value = ServiceNameConstants.SYSTEM_SERVICE,fallbackFactory = RemoteFirmFallbackFactory.class)
public interface RemoteFirmService {
@RequestMapping("/firm/findByFirmName/{firmName}")
public Result<Firm> findByFirmName(@PathVariable("firmName") String firmName);
}

View File

@ -3,7 +3,9 @@ package com.muyu.common.system.remote;
import com.muyu.common.core.constant.SecurityConstants; import com.muyu.common.core.constant.SecurityConstants;
import com.muyu.common.core.constant.ServiceNameConstants; import com.muyu.common.core.constant.ServiceNameConstants;
import com.muyu.common.core.domain.Result; import com.muyu.common.core.domain.Result;
import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.domain.SysUserMessage;
import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory; import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory;
import com.muyu.common.system.domain.LoginUser; import com.muyu.common.system.domain.LoginUser;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
@ -42,4 +44,27 @@ public interface RemoteUserService {
@GetMapping("/user/companyList") @GetMapping("/user/companyList")
public Result<List<SysUser>> companyList (); public Result<List<SysUser>> companyList ();
@GetMapping("/user/selectByfirmName/{firmName}")
public Result<String> selectByfirmName(@PathVariable("firmName") String firmName);
/**
*
* @param sysUserMessage
* @return
*/
@PostMapping("/user/selectuser")
public Result<LoginUser> selectuser(@RequestBody SysUserMessage sysUserMessage );
/**
*
* @param firmName
* @return
*/
@RequestMapping("/firm/findByFirmName/{firmName}")
public Result<Firm> findByFirmName(@PathVariable("firmName") String firmName);
@RequestMapping("/firm/selectAll")
public Result<List<Firm>> selectAll();
} }

View File

@ -1,29 +0,0 @@
package com.muyu.common.system.remote.factory;
import com.muyu.common.core.domain.Result;
import com.muyu.common.core.exception.ServiceException;
import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.remote.RemoteFirmService;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.common.system.remote.factory
* @Projectcloud-server-8
* @nameRemoteFirmFallbackFactory
* @Date2024/9/25 22:22
*/
@Component
public class RemoteFirmFallbackFactory implements FallbackFactory<RemoteFirmService> {
@Override
public RemoteFirmService create(Throwable cause) {
return new RemoteFirmService() {
@Override
public Result<Firm> findByFirmName(String firmName) {
throw new ServiceException(cause.getCause().toString());
}
};
}
}

View File

@ -1,6 +1,8 @@
package com.muyu.common.system.remote.factory; package com.muyu.common.system.remote.factory;
import com.muyu.common.core.domain.Result; import com.muyu.common.core.domain.Result;
import com.muyu.common.system.domain.Firm;
import com.muyu.common.system.domain.SysUserMessage;
import com.muyu.common.system.remote.RemoteUserService; import com.muyu.common.system.remote.RemoteUserService;
import com.muyu.common.system.domain.SysUser; import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.domain.LoginUser; import com.muyu.common.system.domain.LoginUser;
@ -38,6 +40,26 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
public Result<List<SysUser>> companyList() { public Result<List<SysUser>> companyList() {
return Result.error("发现用户失败:" + throwable.getMessage()); return Result.error("发现用户失败:" + throwable.getMessage());
} }
@Override
public Result<String> selectByfirmName(String firmName) {
return Result.error("信息查询失败:" + throwable.getMessage());
}
@Override
public Result<LoginUser> selectuser(SysUserMessage sysUserMessage) {
return Result.error("信息查询失败:" + throwable.getMessage());
}
@Override
public Result<Firm> findByFirmName(String firmName) {
return Result.error("信息查询失败:" + throwable.getMessage());
}
@Override
public Result<List<Firm>> selectAll() {
return Result.error("信息查询失败:" + throwable.getMessage());
}
}; };
} }
} }

View File

@ -1,4 +1,3 @@
com.muyu.common.system.remote.factory.RemoteUserFallbackFactory com.muyu.common.system.remote.factory.RemoteUserFallbackFactory
com.muyu.common.system.remote.factory.RemoteLogFallbackFactory com.muyu.common.system.remote.factory.RemoteLogFallbackFactory
com.muyu.common.system.remote.factory.RemoteFileFallbackFactory com.muyu.common.system.remote.factory.RemoteFileFallbackFactory
com.muyu.common.system.remote.factory.RemoteFirmFallbackFactory

View File

@ -22,6 +22,7 @@
<module>cloud-common-rabbit</module> <module>cloud-common-rabbit</module>
<module>cloud-common-saas</module> <module>cloud-common-saas</module>
<module>cloud-common-wechat</module> <module>cloud-common-wechat</module>
<module>cloud-common-cache</module>
<module>cloud-common-kafka</module> <module>cloud-common-kafka</module>
</modules> </modules>

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: xxy namespace: eight
# Spring # Spring
spring: spring:

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>cloud-server</artifactId>
<version>3.6.3</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>cloud-Saas-Service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- MuYu Common DataSource -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datasource</artifactId>
</dependency>
<!-- MuYu Common DataScope -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datascope</artifactId>
</dependency>
<!-- MuYu Common Log -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-api-doc</artifactId>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-electronic-common</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>6.0.0</version>
</dependency>
</dependencies>
<build>
<finalName>clod-Saas-Service</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- &lt;!&ndash; 加入maven deploy插件当在deploy时忽略些model&ndash;&gt; -->
<!-- <plugin> -->
<!-- <groupId>org.apache.maven.plugins</groupId> -->
<!-- <artifactId>maven-deploy-plugin</artifactId> -->
<!-- <version>3.1.1</version> -->
<!-- <configuration> -->
<!-- <skip>true</skip> -->
<!-- </configuration> -->
<!-- </plugin> -->
</plugins>
</build>
</project>

View File

@ -0,0 +1,124 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>cloud-modules</artifactId>
<version>3.6.3</version>
</parent>
<description>
cloud-modules-car-gateway车辆网关模块
</description>
<artifactId>cloud-modules-car-gateway</artifactId>
<packaging>jar</packaging>
<name>cloud-modules-car-gateway</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- MuYu Common DataSource -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datasource</artifactId>
</dependency>
<!-- MuYu Common DataScope -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datascope</artifactId>
</dependency>
<!-- MuYu Common Log -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-log</artifactId>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-api-doc</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-rabbit</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ecs20140526</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,20 @@
package com.muyu.car;
import com.muyu.common.security.annotation.EnableMyFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author
* @Packagecom.muyu.car
* @Projectcloud-server-8
* @nameCloudCarGatewayApplication
* @Date2024/9/29 10:50
*/
@EnableMyFeignClients
@SpringBootApplication
public class CloudCarGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(CloudCarGatewayApplication.class, args);
}
}

View File

@ -0,0 +1,50 @@
package com.muyu.car;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MqttPublishSample {
public static void main(String[] args) {
String topic = "vehicle";
String content = "Message from MqttPublishSample";
int qos = 2;
String broker = "tcp://120.55.62.0: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();
}
}
}

View File

@ -0,0 +1,55 @@
package com.muyu.car.domain.api.req;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @Author
* @Packagecom.muyu.car.domain.api.req
* @Projectcloud-server-8
* @nameVehicleConnectionReq
* @Date2024/10/2 4:12
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class VehicleConnectionReq {
/**
* {
* "vehicleVin": "VIN1234567894",
* "timestamp": "11111",
* "username": "你好",
* "nonce": "33"
* }
*/
/**
* vin
*/
@JSONField(name = "vehicleVin")
private String vehicleVin;
/**
*
*/
private String timestamp;
/**
*
*/
@JSONField(name = "username")
private String username;
/**
*
*/
private String nonce;
/**
*
*/
private String password;
}

View File

@ -0,0 +1,35 @@
package com.muyu.car.domain.example;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @Author
* @Packagecom.muyu.car.domain
* @Projectcloud-server-8
* @nameExampleInformation
* @Date2024/9/29 10:01
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExampleInformation {
/**
* ID
*/
private String InstanceId;
/**
* IP
*/
private String IpAddress;
/**
*
*/
private String status;
}

View File

@ -0,0 +1,30 @@
package com.muyu.car.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model
* @Projectcloud-server-8
* @nameMqttServerModel
* @Date2024/10/7 6:40
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MqttServerModel {
/**
* MQTT
*/
private String broker;
/**
* MQTT
*/
private String topic;
}

View File

@ -0,0 +1,86 @@
package com.muyu.car.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model
* @Projectcloud-server-8
* @nameVehicle
* @Date2024/10/6 10:33
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class VehicleInformation {
/**
* ID
*/
private String carInformationId ;
/**
* VIN
*/
private String carInformationVIN ;
/**
*
*/
private String carInformationLicensePlate ;
/**
*
*/
private String carInformationBrand ;
/**
*
*/
private String carInformationColor ;
/**
*
*/
private String carInformationDriver ;
/**
*
*/
private String carInformationExamineEnddata ;
/**
*
*/
private String carInformationMotorManufacturer ;
/**
*
*/
private String carInformationMotorModel ;
/**
*
*/
private String carInformationBatteryManufacturer ;
/**
*
*/
private String carInformationBatteryModel ;
/**
* ID
*/
private String carInformationFence ;
/**
* ID
*/
private String carInformationType ;
/**
* (0 1 )
*/
private String carInformationFocus ;
/**
* id
*/
private String carStrategyId ;
/**
* (1.线 2.线 3. 4. 5.)
*/
private String carInformationState ;
}

View File

@ -0,0 +1,51 @@
package com.muyu.car.domain.model.properties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model.properties
* @Projectcloud-server-8
* @nameMqttProperties
* @Date2024/10/6 8:24
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MqttProperties {
/**
*
*/
private String broker;
/**
*
*/
private String topic;
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
* ID
*/
private String clientId;
/**
*
*/
private int qos = 0;
}

View File

@ -0,0 +1,39 @@
package com.muyu.car.domain.model.properties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author
* @Packagecom.muyu.car.domain.model.properties
* @Projectcloud-server-8
* @nameMqttServerModel
* @Date2024/10/6 8:25
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MqttServerModel {
private static final Logger log = LoggerFactory.getLogger(MqttServerModel.class);
/**
* MQTT
*/
private String broker;
/**
* MQTT
*/
private String topic;
public String getBroker () {
log.info("broker: {}", broker);
return broker.contains("tcp://") ? broker : "tcp://" + broker + ":1883";
}
}

View File

@ -0,0 +1,35 @@
package com.muyu.car.gateway.controller;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInformationService;
import com.muyu.common.core.domain.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
*
* @Author
* @Packagecom.muyu.car.gateway.controller
* @Projectcloud-server-8
* @nameVehicleInformationController
* @Date2024/10/6 2:39
*/
@RestController
@RequestMapping("/verify")
public class VehicleInformationController {
@Autowired
private VehicleInformationService vehicleInformationService;
@PostMapping("/vehicleConnection")
public Result<MqttServerModel> getVehicleData(
@Validated @RequestBody VehicleConnectionReq vehicleConnectionReq
) {
return Result.success(vehicleInformationService.getVehicleData(vehicleConnectionReq));
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.car.gateway.controller;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInstanceService;
import com.muyu.common.core.domain.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
*
* @Author
* @Packagecom.muyu.car.gateway.controller
* @Projectcloud-server-8
* @nameVehicleInformation
* @Date2024/10/4 9:40
*/
@RestController
@RequestMapping("/vehicle")
public class VehicleInstanceController {
@Autowired private VehicleInstanceService vehicleInstanceService;
}

View File

@ -0,0 +1,53 @@
package com.muyu.car.gateway.mq;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.car.gateway.mq
* @Projectcloud-server-8
* @nameCreateExchange
* @Date2024/10/7 8:53
*/
@Log4j2
@Component
public class CreateExchange implements ApplicationRunner {
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void run(ApplicationArguments args) {
log.info("=====>开始创建交换机");
try {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 创建Fanout类型的交换机
FanoutExchange exchange = new FanoutExchange("ONLINE_EXCHANGE", true, false);
rabbitAdmin.declareExchange(exchange);
// 创建队列
Queue queue = new Queue("GO_ONLINE", true, false, false);
rabbitAdmin.declareQueue(queue);
// Fanout交换机绑定
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
log.info("=====>交换机创建成功");
log.info("=====>队列创建成功并绑定到交换机");
}catch (Exception e) {
log.info(e.getMessage());
}
}
}

View File

@ -0,0 +1,17 @@
package com.muyu.car.gateway.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
/**
* @Author
* @Packagecom.muyu.car.gateway.service
* @Projectcloud-server-8
* @nameVehicleInformationService
* @Date2024/10/6 2:40
*/
public interface VehicleInformationService{
MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq);
}

View File

@ -0,0 +1,13 @@
package com.muyu.car.gateway.service;
import com.muyu.car.domain.model.VehicleInformation;
/**
* @Author
* @Packagecom.muyu.car.gateway.service
* @Projectcloud-server-8
* @nameVehicleInstanceService
* @Date2024/10/6 10:05
*/
public interface VehicleInstanceService {
}

View File

@ -0,0 +1,79 @@
package com.muyu.car.gateway.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInformationService;
import com.muyu.car.mapper.VehicleInformationMapper;
import com.muyu.common.redis.service.RedisService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* @Author
* @Packagecom.muyu.car.gateway.service.impl
* @Projectcloud-server-8
* @nameVehicleInformationServiceImpl
* @Date2024/10/6 2:41
*/
@Log4j2
@Service
public class VehicleInformationServiceImpl implements VehicleInformationService{
@Autowired private VehicleInformationMapper vehicleInformationMapper;
@Autowired private RedisService redisService;
@Override
public MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq) {
log.info("车辆连接请求:[{}]",vehicleConnectionReq);
vehicleConnectionReq.setPassword(vehicleConnectionReq.getVehicleVin()+vehicleConnectionReq.getTimestamp()+vehicleConnectionReq.getNonce());
List<String> selectVehicle =vehicleInformationMapper.selectVehicleVin(vehicleConnectionReq.getVehicleVin());
if(selectVehicle.isEmpty()) {
vehicleInformationMapper.addVehicleConnection(vehicleConnectionReq);
log.info("车辆预上线成功");
}else {
log.info("车辆无法重复预上线");
}
// 获取名为 "ipList" 的列表
List<String> ipList = redisService.getCacheList("ipList");
if (ipList.isEmpty()) {
return null;
}
// 获取当前使用的索引位置
String indexStr = redisService.getCacheObject("currentIndex");
int index = indexStr!= null? Integer.parseInt(indexStr) : 0;
String selectedIp = ipList.get(index);
// 获取该 IP 的使用次数
String countStr = redisService.getCacheMapValue("ipCounts", selectedIp);
log.info("IP:[{}]车辆连接数:[{}]",selectedIp,countStr);
int count = countStr!= null? Integer.parseInt(countStr) : 0;
if (count < 12) {
// 使用次数加一
count++;
redisService.setCacheMapValue("ipCounts", selectedIp, String.valueOf(count));
// 更新索引
index = (index + 1) % ipList.size();
redisService.setCacheObject("currentIndex", String.valueOf(index));
return new MqttServerModel("tcp://"+selectedIp.substring(1,selectedIp.length()-1)+":1883","vehicle");
} else {
// 如果使用次数达到 12 次,跳过该 IP 并更新索引
index = (index + 1) % ipList.size();
redisService.setCacheObject("currentIndex", String.valueOf(index));
return getVehicleData(vehicleConnectionReq);
}
}
}

View File

@ -0,0 +1,18 @@
package com.muyu.car.gateway.service.impl;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInstanceService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
* @Author
* @Packagecom.muyu.car.gateway.service.impl
* @Projectcloud-server-8
* @nameVehicleInstanceServceImpl
* @Date2024/10/6 10:06
*/
@Log4j2
@Service
public class VehicleInstanceServiceImpl implements VehicleInstanceService {
}

View File

@ -0,0 +1,36 @@
package com.muyu.car.instance;
import org.springframework.stereotype.Component;
/**
* AccessKey ID Secret
* @Author
* @Packagecom.muyu.car.domain
* @Projectcloud-server-8
* @nameCreateClient
* @Date2024/9/29 10:41
*/
@Component
public class CreateClient {
/**
* <b>description</b> :
* <p>使AK&amp;SKClient</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.ecs20140526.Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式更多鉴权访问方式请参见https://help.aliyun.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId("LTAI5tFtQk1KbwRBXM5pHVWw")
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret("GLByUZqUqgR600eTpGmfb52ZT93mu9");
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new com.aliyun.ecs20140526.Client(config);
}
}

View File

@ -0,0 +1,102 @@
package com.muyu.car.instance;
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
import com.aliyun.tea.*;
import com.aliyun.teautil.models.RuntimeOptions;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.Set;
/**
*
* @Author
* @Packagecom.muyu.car.domain
* @Projectcloud-server-8
* @nameDelInstance
* @Date2024/9/29 10:42
*/
@Log4j2
@Component
@Tag(name = "程序停止删除实例")
public class DelInstance implements DisposableBean {
public static void delInstance() throws Exception {
// 创建ECS客户端对象用于后续调用ECS相关API
com.aliyun.ecs20140526.Client client = CreateClient.createClient();
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId("cn-hangzhou");
//创建运行时选择对象,用于配置运行时的选项参数
RuntimeOptions runtimeOptions = new RuntimeOptions();
//获取实例列表
DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
//提取实例ID集合
ArrayList<String> list = new ArrayList<>();
DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()) {
list.add(instance.getInstanceId());
}
log.info("Instance IDs: " + list);
// 创建删除实例请求对象,并设置请求参数
com.aliyun.ecs20140526.models.DeleteInstancesRequest deleteInstancesRequest = new com.aliyun.ecs20140526.models.DeleteInstancesRequest()
//设置地域ID指定删除实例的地域
.setRegionId("cn-hangzhou")
// 设置DryRun为true,用于验证请求是否可以成功,但不实际执行删除操作
.setDryRun(false)
// 设置Force为true表示即使实例有正在运行的任务也强制删除实例
.setForce(true)
// 设置TerminateSubscription为true表示删除按订阅付费的实例时终止订阅
.setTerminateSubscription(true)
.setInstanceId(list);
//创建运行时选项对象,用于配置运行时的选项参数
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.deleteInstancesWithOptions(deleteInstancesRequest, runtime);
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
@Override
public void destroy() throws Exception {
log.info("===============>开始执行删除实例方法");
delInstance();
// 连接到Redis服务器
Jedis jedis = new Jedis("159.75.188.178", 6379);
// 指定要删除的文件夹(命名空间)
String namespace = "InstanceIdKey:";
// 获取所有以namespace为前缀的键
Set<String> keys = jedis.keys(namespace + "*");
// 如果存在键,则删除它们
if (keys.size() > 0) {
jedis.del(keys.toArray(new String[0]));
}
// 关闭连接
jedis.close();
}
}

View File

@ -0,0 +1,120 @@
package com.muyu.car.instance;
import com.aliyun.ecs20140526.models.*;
import com.aliyun.tea.TeaException;
import com.muyu.car.domain.example.ExampleInformation;
import com.muyu.common.redis.service.RedisService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
*
* @Author
* @Packagecom.muyu.car.domain
* @Projectcloud-server-8
* @nameGenerateInstance
* @Date2024/9/29 10:42
*/
@Component
@Log4j2
@Tag(name = "启动时创建实例")
public class GenerateInstance implements ApplicationRunner {
@Autowired private RedisService redisService;
/**
*
* @throws Exception
*/
public static List<String> generateInstance() throws Exception {
// 创建ECS客户端对象用于后续调用ECS相关API
com.aliyun.ecs20140526.Client client = CreateClient.createClient();
com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk()
.setSize("40")
.setCategory("cloud_essd");
com.aliyun.ecs20140526.models.RunInstancesRequest runInstancesRequest = new com.aliyun.ecs20140526.models.RunInstancesRequest()
// 设置地域ID
.setRegionId("cn-hangzhou")
// 设置镜像ID
.setImageId("m-bp1hkxfctk751s62jqhq")
// 设置实例类型
.setInstanceType("ecs.t6-c1m1.large")
// 设置安全组ID
.setSecurityGroupId("sg-bp1a7fk8js5pn3fw9p2m")
// 设置虚拟交换机ID
.setVSwitchId("vsw-bp193np7r01vssqxhh24e")
// 设置实例名称
.setInstanceName("server-mqtt")
// 设置实例付费类型为后付费按量付费
.setInstanceChargeType("PostPaid")
// 设置互联网最大出带宽为1 Mbps
.setInternetMaxBandwidthOut(1)
// 设置系统盘配置
.setSystemDisk(systemDisk)
// 设置主机名
.setHostName("root")
// 设置实例密码
.setPassword("EightGroup123.")
// 设置创建实例的数量
.setAmount(2);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runtime);
// 获取body返回值对象
RunInstancesResponseBody body = runInstancesResponse.getBody();
ArrayList<String> list = new ArrayList<>();
// 得到实例ID数组
for (String instance : body.getInstanceIdSets().getInstanceIdSet()) {
list.add(instance);
}
log.info("实例ID:{}",list);
return list;
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return null;
}
@Override
public void run(ApplicationArguments args) throws Exception {
List<String> InstanceIds = generateInstance();
log.info("创建实例成功");
log.info("正在加载实例");
Thread.sleep(30000);
List<ExampleInformation> exampleInformations = QueryInstance.queryInstance(InstanceIds);
log.info("加载成功");
ArrayList<String> list = new ArrayList<>();
for (ExampleInformation exampleInformation : exampleInformations) {
redisService.setCacheObject("InstanceIdKey:"+exampleInformation.getInstanceId(),exampleInformation);
list.add(exampleInformation.getIpAddress());
}
redisService.setCacheList("ipList",list);
log.info("实例信息:{}",exampleInformations);
}
}

View File

@ -0,0 +1,69 @@
package com.muyu.car.instance;
import com.alibaba.fastjson.JSON;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.muyu.car.domain.example.ExampleInformation;
import lombok.extern.log4j.Log4j2;
import java.util.ArrayList;
import java.util.List;
/**
*
* @Author
* @Packagecom.muyu.car.instance
* @Projectcloud-server-8
* @nameQueryInstance
* @Date2024/9/29 8:58
*/
@Log4j2
public class QueryInstance {
public static List<ExampleInformation> queryInstance(List<String> instanceIds) throws Exception {
com.aliyun.ecs20140526.Client client = CreateClient.createClient();
com.aliyun.ecs20140526.models.DescribeInstancesRequest describeInstancesRequest = new com.aliyun.ecs20140526.models.DescribeInstancesRequest()
.setInstanceIds(JSON.toJSONString(instanceIds))
.setRegionId("cn-hangzhou");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
ArrayList<ExampleInformation> exampleInformations = new ArrayList<>();
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()){
ExampleInformation exampleInformation = new ExampleInformation();
exampleInformation.setInstanceId(instance.getInstanceId());
log.info("实例ID:{}",exampleInformation.getInstanceId());
exampleInformation.setStatus(instance.getStatus());
log.info("实例状态:{}",exampleInformation.getStatus());
exampleInformation.setIpAddress(String.valueOf(instance.getPublicIpAddress().getIpAddress()));
log.info("实例IP:{}",exampleInformation.getIpAddress());
exampleInformations.add(exampleInformation);
}
log.info("实例信息:{}",exampleInformations);
return exampleInformations;
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return null;
}
}

View File

@ -0,0 +1,21 @@
package com.muyu.car.mapper;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.car.mapper
* @Projectcloud-server-8
* @nameVehicleInformationMapper
* @Date2024/10/6 2:19
*/
@Mapper
public interface VehicleInformationMapper {
void addVehicleConnection(VehicleConnectionReq vehicleConnectionReq);
List<String> selectVehicleVin(@Param("vehicleVin") String vehicleVin);
}

View File

@ -0,0 +1,71 @@
package com.muyu.car.util;
import lombok.extern.log4j.Log4j2;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.SecureRandom;
@Log4j2
public class MD5Util {
private static final Integer SALT_LENGTH = 12;
/**
* byte16
* @param b
* @return
*/
public static String byteToHexString(byte[] b) {
StringBuilder hexString = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
hexString.append(hex.toUpperCase());
}
return hexString.toString();
}
/**
*
* @param str
* @return
*/
public static String encrypted (String str) {
try {
// 声明加密后的口令数组变量
byte[] pwd = null;
// 随机数生成器
SecureRandom random = new SecureRandom();
// 声明盐数组变量
byte[] salt = new byte[SALT_LENGTH];
// 将随机数放入盐变量中
random.nextBytes(salt);
// 声明消息摘要对象
MessageDigest md = null;
// 创建消息摘要
md = MessageDigest.getInstance("MD5");
// 将盐数据传入消息摘要对象
md.update(salt);
// 将口令的数据传给消息摘要对象
md.update(str.getBytes(StandardCharsets.UTF_8));
// 获得消息摘要的字节数组
byte[] digest = md.digest();
// 因为要在口令的字节数组中存放盐,所以加上盐的字节长度
pwd = new byte[digest.length + SALT_LENGTH];
// 将盐的字节拷贝到生成的加密口令字节数组的前12个字节以便在验证口令时取出盐
System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
// 将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);
// 将字节数组格式加密后的口令转化为16进制字符串格式的口令
return byteToHexString(pwd);
}catch (Exception exception){
log.info("md5加密失败[{}]", str, exception);
return str;
}
}
}

View File

@ -0,0 +1,2 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-car-gateway"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.@//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.muyu.car.mapper.VehicleInformationMapper">
<insert id="addVehicleConnection">
INSERT INTO `vehicle_connection` (`vin`, `timestamp`, `username`, `nonce`,`password`) VALUES (#{vehicleVin}, #{timestamp}, #{username}, #{nonce},#{password});
</insert>
<select id="selectVehicleVin" resultType="java.lang.String">
select
`vin`, `timestamp`, `username`, `nonce`,`password`
from
`vehicle_connection`
where `vin` = #{vehicleVin}
</select>
</mapper>

View File

@ -8,12 +8,10 @@
<artifactId>cloud-modules</artifactId> <artifactId>cloud-modules</artifactId>
<version>3.6.3</version> <version>3.6.3</version>
</parent> </parent>
<artifactId>cloud-modules-carData</artifactId>
<description> <description>
数据处理模块 cloud-modules-carData数据处理模块
</description> </description>
<artifactId>cloud-modules-carData</artifactId>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
@ -21,7 +19,10 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-modules-enterprise-cache</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos --> <!-- SpringCloud Alibaba Nacos -->
<dependency> <dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>com.alibaba.cloud</groupId>
@ -99,5 +100,11 @@
<groupId>com.muyu</groupId> <groupId>com.muyu</groupId>
<artifactId>cloud-common-rabbit</artifactId> <artifactId>cloud-common-rabbit</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-modules-enterprise-cache</artifactId>
<version>3.6.3</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,9 +1,11 @@
package com.muyu.carData; package com.muyu.carData;
import com.muyu.carData.listener.MyListener; import com.muyu.common.security.annotation.EnableCustomConfig;
import com.muyu.common.security.annotation.EnableMyFeignClients; import com.muyu.common.security.annotation.EnableMyFeignClients;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableAsync;
/** /**
* @Author * @Author
@ -14,11 +16,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
*/ */
@SpringBootApplication @SpringBootApplication
@EnableMyFeignClients @EnableMyFeignClients
@EnableCustomConfig
@EnableAsync
@EnableCaching
public class CarDataApplication { public class CarDataApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication application = new SpringApplication(CarDataApplication.class); SpringApplication.run(CarDataApplication.class,args);
application.addListeners(new MyListener());
application.run(args);
} }
} }

View File

@ -1,15 +1,22 @@
package com.muyu.carData.config.lotdbconfig; package com.muyu.carData.config.lotdbconfig;
import org.apache.iotdb.rpc.IoTDBConnectionException; import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.Session; import org.apache.iotdb.session.Session;
import org.apache.iotdb.session.SessionDataSet;
import org.apache.iotdb.session.pool.SessionPool; import org.apache.iotdb.session.pool.SessionPool;
import org.apache.iotdb.tsfile.read.common.Field;
import org.apache.iotdb.tsfile.read.common.RowRecord;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
@ -76,6 +83,66 @@ public class IotDBSessionConfig {
} }
/**
*
* @param deviceId
* @param time
* @param measurements
* @param values
*/
public void execute(String deviceId,long time,List<String> measurements,List<String> values){
if (CollectionUtils.isEmpty(measurements) && !CollectionUtils.isEmpty(values)){
try {
iotSession().insertAlignedRecord(deviceId,time,measurements,values);
} catch (IoTDBConnectionException e) {
throw new RuntimeException(e);
} catch (StatementExecutionException e) {
throw new RuntimeException(e);
}
}
}
/**
*
* @param sql
* @return
*/
public List<HashMap<String,Object>> executeQuery(String sql){
logger.info("sql:{}",sql);
List<HashMap<String,Object>> list = new ArrayList<>();
try {
SessionDataSet sessionDataSet = iotSession().executeQueryStatement(sql);
int fetchSize = sessionDataSet.getFetchSize();
List<String> columnNames = sessionDataSet.getColumnNames();
logger.info("columnNames:{}",columnNames);
List<String> columnTypes = sessionDataSet.getColumnTypes();
logger.info("columnTypes:{}",columnTypes);
if (fetchSize > 0){
while (sessionDataSet.hasNext()){
HashMap<String, Object> map = new HashMap<>();
RowRecord next = sessionDataSet.next();
List<Field> fields = next.getFields();
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
String key = field.getStringValue();
Object value = field.getObjectValue(field.getDataType());
map.put(key,value);
}
list.add(map);
}
sessionDataSet.closeOperationHandle();
}
} catch (StatementExecutionException e) {
throw new RuntimeException(e);
} catch (IoTDBConnectionException e) {
throw new RuntimeException(e);
}
return list;
}

View File

@ -0,0 +1,34 @@
package com.muyu.carData.consumer;
import com.muyu.carData.util.CacheUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/** 线
* @Author
* @Packagecom.muyu.carData.consumer
* @Projectcloud-server-8
* @nameCarOffConsumer
* @Date2024/10/4 14:30
*/
@Log4j2
@Component
public class CarOffConsumer {
@Autowired
private CacheUtil cacheUtil;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "CAR_OFFLINE",durable = "true"),
exchange = @Exchange(value = "CAR_OFF_EXCHANGE",type = "fanout")
))
public void inline(String vin){
log.info("车辆vin:{},车辆下线成功!开始消费...");
cacheUtil.remove(vin);
}
}

View File

@ -0,0 +1,60 @@
package com.muyu.carData.consumer;
import com.muyu.carData.util.CacheUtil;
import com.muyu.enterprise.cache.faultCode.VehicleCacheFaultCodeAddService;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**线
* @Author
* @Packagecom.muyu.carData.consumer
* @Projectcloud-server-8
* @nameCarOnlineConsumer
* @Date2024/10/4 14:27
*/
@Log4j2
@Component
public class CarOnlineConsumer {
@Autowired
private CacheUtil cacheUtil;
@Autowired
private VehicleCacheFaultCodeAddService vehicleCacheCarInformationAddService;
@RabbitListener(queues = "myQueue",containerFactory = "rabbitListenerContainerFactory")
public void consumeMessage(String message) {
// 处理接收到的消息
log.info("接收到消息======>>" + message);
}
/*
@Bean
public DirectExchange initVehicleGatewayExchange(){
return new DirectExchange(VehicleGatewayConstants.VEHICLE_GETAWAY_EXCHANGE);
}*/
/*@Bean
@Primary
public Queue initQueue(){
return new Queue("gateway", true);
}
@Bean
public Binding binding1a(DirectExchange initVehicleGatewayExchange,
Queue initQueue) {
return BindingBuilder.bind(initQueue)
.to(initVehicleGatewayExchange)
.with(VehicleGatewayConstants.VEHICLE_GETAWAY_ROUTING_KEY);
}
@RabbitListener(queues = "gateway")
public void msg(@RequestBody WebHookConnection webHookConnection){
log.info("消费者接收到车辆上线信息:{}",webHookConnection);
}*/
}

View File

@ -1,19 +1,23 @@
package com.muyu.carData.consumer; package com.muyu.carData.consumer;
import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson.JSONObject;
import cn.hutool.json.JSONUtil; import com.muyu.carData.event.EventPublisher;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.muyu.carData.pojo.Student;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.Duration; import java.time.Duration;
import java.util.Collection; import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* @Author * @Author
@ -24,33 +28,43 @@ import java.util.Collection;
*/ */
@Component @Component
@Log4j2 @Log4j2
public class MyKafkaConsumer implements InitializingBean { public class MyKafkaConsumer implements ApplicationRunner, ApplicationListener<ContextClosedEvent> {
@Autowired @Autowired
private KafkaConsumer kafkaConsumer; private KafkaConsumer kafkaConsumer;
@Autowired
private EventPublisher eventPublisher;
private final String topicName = "carJsons"; private final String topicName = "carJsons";
private final ExecutorService executorService = Executors.newFixedThreadPool(10);
@Override @Override
public void afterPropertiesSet() throws Exception { public void run(ApplicationArguments args) throws Exception {
log.info("启动线程开始监听topic:{}",topicName); log.info("开始监听kafka-topic:{}",topicName);
Thread thread = new Thread(() -> { List<String> topics = Collections.singletonList(topicName);
ThreadUtil.sleep(1000); kafkaConsumer.subscribe(topics);
Collection<String> topics = Lists.newArrayList(topicName);
kafkaConsumer.subscribe(topics);
while (true){
ConsumerRecords<String,String> consumerRecords = kafkaConsumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//从consumerRecord中获取消费数据
String value = consumerRecord.value();
log.info("从Kafka中消费的原始数据===============>>{}",value);
}
}
});
thread.start();
log.info("启动线程结束监听topic:{}",topicName); while (true){
ConsumerRecords<String,String> consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100));
consumerRecords.forEach(record ->{
executorService.submit(() -> handleRecord(record));
log.info("数据为:{},消费成功!",record);
});
}
}
private void handleRecord(ConsumerRecord<String,String> record) {
String value = record.value();
JSONObject jsonObject = JSONObject.parseObject(value);
eventPublisher.publishEvent(jsonObject);
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
log.info("关闭kafka和线程");
kafkaConsumer.close();
executorService.shutdown();
} }
} }

View File

@ -0,0 +1,22 @@
package com.muyu.carData.consumer;
/**
* @Author
* @Packagecom.muyu.common.rabbit.contants
* @Projectcloud-server-8
* @nameVehicleGatewayContantsA
* @Date2024/10/10 9:02
*/
public class VehicleGatewayConstants {
/**
*
*/
public final static String VEHICLE_GETAWAY_EXCHANGE = "vehicle.getaway";
/**
* 线A
*/
public final static String VEHICLE_GETAWAY_ROUTING_KEY = "vehicle.getaway.online";
}

View File

@ -1,3 +1,4 @@
/*
package com.muyu.carData.controller; package com.muyu.carData.controller;
import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Cache;
@ -8,13 +9,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
*/
/** /**
* @Author * @Author
* @Packagecom.muyu.carData.controller * @Packagecom.muyu.carData.controller
* @Projectcloud-server-8 * @Projectcloud-server-8
* @nameTestController * @nameTestController
* @Date2024/9/26 23:56 * @Date2024/9/26 23:56
*/ *//*
@RestController @RestController
@RequestMapping("/testCache") @RequestMapping("/testCache")
@Log4j2 @Log4j2
@ -42,3 +45,4 @@ public class CacheController {
} }
} }
*/

View File

@ -1,3 +1,4 @@
/*
package com.muyu.carData.controller; package com.muyu.carData.controller;
import com.muyu.carData.config.lotdbconfig.IotDBSessionConfig; import com.muyu.carData.config.lotdbconfig.IotDBSessionConfig;
@ -17,13 +18,15 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
*/
/** /**
* @Author * @Author
* @Packagecom.muyu.carData.testcontroller * @Packagecom.muyu.carData.testcontroller
* @Projectcloud-server-8 * @Projectcloud-server-8
* @nameIotDBController * @nameIotDBController
* @Date2024/9/28 23:58 * @Date2024/9/28 23:58
*/ *//*
@RequestMapping("/iotdb") @RequestMapping("/iotdb")
@RestController @RestController
@Log4j2 @Log4j2
@ -33,14 +36,16 @@ public class IotDBController {
@Autowired @Autowired
private IotDBSessionConfig iotDBSessionConfig; private IotDBSessionConfig iotDBSessionConfig;
/** */
/**
* *
* @param insertSize * @param insertSize
* @param count * @param count
* @return * @return
* @throws IoTDBConnectionException * @throws IoTDBConnectionException
* @throws StatementExecutionException * @throws StatementExecutionException
*/ *//*
@GetMapping("/insertData/{insertSize}/{count}") @GetMapping("/insertData/{insertSize}/{count}")
public String insert(@PathVariable(name = "insertSize") int insertSize,@PathVariable(name = "count") int count) throws IoTDBConnectionException, StatementExecutionException { public String insert(@PathVariable(name = "insertSize") int insertSize,@PathVariable(name = "count") int count) throws IoTDBConnectionException, StatementExecutionException {
Session session = iotDBSessionConfig.iotSession(); Session session = iotDBSessionConfig.iotSession();
@ -82,7 +87,7 @@ public class IotDBController {
} }
/* @GetMapping("/batchInsertRecords/{num}") @GetMapping("/batchInsertRecords/{num}")
public String batchInsertRecords(@PathVariable Integer num){ public String batchInsertRecords(@PathVariable Integer num){
String deviceId = "root.yang"; String deviceId = "root.yang";
@ -109,5 +114,6 @@ public class IotDBController {
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
deviceIds.add() deviceIds.add()
} }
}*/ }
} }
*/

View File

@ -1,3 +1,4 @@
/*
package com.muyu.carData.controller; package com.muyu.carData.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -9,13 +10,15 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
*/
/** /**
* @Author * @Author
* @Packagecom.muyu.carData.testcontroller * @Packagecom.muyu.carData.testcontroller
* @Projectcloud-server-8 * @Projectcloud-server-8
* @nameKafkaProducerController * @nameKafkaProducerController
* @Date2024/9/28 15:10 * @Date2024/9/28 15:10
*/ *//*
@RestController @RestController
@RequestMapping("/produce") @RequestMapping("/produce")
@Log4j2 @Log4j2
@ -43,3 +46,4 @@ public class KafkaProducerController {
} }
*/

View File

@ -15,8 +15,12 @@ public class EsSaveEvent extends ApplicationEvent {
private JSONObject data; private JSONObject data;
public EsSaveEvent(JSONObject source) { public EsSaveEvent(Object source,JSONObject data) {
super(source); super(source);
this.data = source; this.data = data;
}
public JSONObject getData(){
return data;
} }
} }

View File

@ -0,0 +1,15 @@
package com.muyu.carData.event;
import org.springframework.context.ApplicationListener;
/**
* @Author
* @Packagecom.muyu.carData.event
* @Projectcloud-server-8
* @nameEventListener
* @Date2024/10/4 10:39
*/
public interface EventListener extends ApplicationListener<EsSaveEvent> {
void onEvent(EsSaveEvent event);
}

View File

@ -0,0 +1,28 @@
package com.muyu.carData.event;
import com.alibaba.fastjson.JSONObject;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.carData.event
* @Projectcloud-server-8
* @nameEventPublisher
* @Date2024/10/4 10:40
*/
@Component
public class EventPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
public void publishEvent(JSONObject message){
EsSaveEvent esSaveEvent = new EsSaveEvent(this, message);
publisher.publishEvent(esSaveEvent);
}
}

View File

@ -1,22 +0,0 @@
package com.muyu.carData.listener;
import com.muyu.carData.event.EsSaveEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.carData.listener
* @Projectcloud-server-8
* @nameCustomEventListener
* @Date2024/9/29 23:49
*/
@Component
public class CustomEventListener {
@EventListener
public void handMyEvent(EsSaveEvent event){
//处理事件详情
}
}

View File

@ -0,0 +1,42 @@
package com.muyu.carData.listener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.muyu.carData.event.EsSaveEvent;
import com.muyu.carData.event.EventListener;
import com.muyu.carData.util.CacheUtil;
import com.muyu.domain.FaultCodeCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.carData.listener
* @Projectcloud-server-8
* @nameIdentifyingFailuresListener
* @Date2024/10/8 11:22
*/
@Component
@Slf4j
public class IdentifyingFailuresListener implements EventListener {
@Autowired
private CacheUtil cacheUtil;
@Override
public void onEvent(EsSaveEvent event) {
log.info("规则预警事件开始...");
JSONObject data = event.getData();
String vin = (String) data.get("vin");
String str = cacheUtil.get(vin).toString();
FaultCodeCache faultCodeCache = JSON.parseObject(str, FaultCodeCache.class);
log.info("规则预警事件结束...");
}
@Override
public void onApplicationEvent(EsSaveEvent event) {
onEvent(event);
}
}

View File

@ -0,0 +1,45 @@
package com.muyu.carData.listener;
import com.alibaba.fastjson.JSONObject;
import com.muyu.carData.config.lotdbconfig.IotDBSessionConfig;
import com.muyu.carData.event.EsSaveEvent;
import com.muyu.carData.event.EventListener;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.carData.listener
* @Projectcloud-server-8
* @nameInsertIotDBListener
* @Date2024/10/6 9:25
*/
@Log4j2
@Component
public class InsertIotDBListener implements EventListener {
@Override
public void onEvent(EsSaveEvent event) {
JSONObject jsonObject = event.getData();
log.info("持久化:监听到数据:{}", jsonObject);
List<String> keys = new ArrayList<>();
List<String> values = new ArrayList<>();
jsonObject.forEach((key,value) -> {
keys.add(key);
values.add((String) value);
});
IotDBSessionConfig iotDBSessionConfig = new IotDBSessionConfig();
long time = System.currentTimeMillis();
iotDBSessionConfig.execute("root.vehicle",time,keys,values);
log.info("数据写入成功");
}
@Override
public void onApplicationEvent(EsSaveEvent event) {
onEvent(event);
}
}

View File

@ -1,20 +0,0 @@
package com.muyu.carData.listener;
import com.muyu.carData.event.EsSaveEvent;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.ApplicationListener;
/**
* @Author
* @Packagecom.muyu.carData.listener
* @Projectcloud-server-8
* @nameMyListener
* @Date2024/9/29 21:18
*/
@Log4j2
public class MyListener implements ApplicationListener<EsSaveEvent> {
@Override
public void onApplicationEvent(EsSaveEvent event) {
log.info("监听到自定义事件........");
}
}

View File

@ -1,41 +0,0 @@
package com.muyu.carData.pojo;
import com.muyu.carData.config.cacheconfig.ExpiryTime;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* @Author
* @Packagecom.muyu.carData.pojo
* @Projectcloud-server-8
* @nameStudent
* @Date2024/9/27 0:40
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Student extends ExpiryTime{
/**
*
*/
private Integer id;
/**
*
*/
private String name;
/**
*
*/
private String sex;
/**
*
*/
private long time = System.currentTimeMillis();
}

View File

@ -1,29 +0,0 @@
package com.muyu.carData.pulisher;
import com.alibaba.fastjson.JSONObject;
import com.muyu.carData.event.EsSaveEvent;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.carData.pulisher
* @Projectcloud-server-8
* @nameCustomEventPublisher
* @Date2024/9/29 23:51
*/
@Log4j2
@Component
@AllArgsConstructor
public class CustomEventPublisher {
private ApplicationEventPublisher applicationEventPublisher;
public void publish(JSONObject data){
EsSaveEvent esSaveEvent = new EsSaveEvent(data);
applicationEventPublisher.publishEvent(esSaveEvent);
log.info("事件发布成功 - 消息是:{}",data);
}
}

View File

@ -0,0 +1,37 @@
package com.muyu.carData.util;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.carData.util
* @Projectcloud-server-8
* @nameCacheUtil
* @Date2024/10/4 10:42
*/
@Component
public class CacheUtil<T> {
private final Cache<String,T> cache;
public CacheUtil() {
this.cache = Caffeine.newBuilder()
.maximumSize(500L)
.build();
}
public T get(String key) {
return (T)cache.getIfPresent(key);
}
public void put(String key, T value) {
cache.put(key, value);
}
public void remove(String key) {
cache.invalidate(key);
}
}

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.muyu</groupId>
<artifactId>cloud-modules-enterprise</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>cloud-modules-enterprise-cache</artifactId>
<description>
cloud-modules-enterprise-cache 缓存模块
</description>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-modules-enterprise-common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-cache</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,24 @@
package com.muyu.enterprise.cache.car;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.req.CarInformationAddReq;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheCarInformationAddService extends CacheAbsBasic<String, CarInformationAddReq> {
@Override
public String keyPre() {
return "CarInformationAddReq:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,27 @@
package com.muyu.enterprise.cache.car;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.resp.CarInformationResp;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheCarInformationService extends CacheAbsBasic<String, List<CarInformationResp>> {
@Override
public String keyPre() {
return "CarInformation:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,24 @@
package com.muyu.enterprise.cache.car;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.req.CarInformationUpdReq;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheCarInformationUpdService extends CacheAbsBasic<String, CarInformationUpdReq> {
@Override
public String keyPre() {
return "CarInformationUpdReq:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.enterprise.cache.car;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.CarFence;
import com.muyu.domain.CarType;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheCarTypeService extends CacheAbsBasic<String, CarType> {
@Override
public String keyPre() {
return "CarType:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.enterprise.cache.fault;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.FaultCode;
import com.muyu.domain.resp.CarFenceResp;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheFaultService extends CacheAbsBasic<String, FaultCode> {
@Override
public String keyPre() {
return "FaultCode:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,26 @@
package com.muyu.enterprise.cache.faultCode;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.FaultCodeCache;
import com.muyu.domain.req.CarInformationAddReq;
import com.muyu.domain.req.FaultCodeAddReq;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheFaultCodeAddService extends CacheAbsBasic<String, FaultCodeCache> {
@Override
public String keyPre() {
return "FaultCodeCache:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.enterprise.cache.fence;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.CarFence;
import com.muyu.domain.resp.CarFenceResp;
/**
* add
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheFenceAddService extends CacheAbsBasic<String, CarFence> {
@Override
public String keyPre() {
return "CarFenceAdd:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,28 @@
package com.muyu.enterprise.cache.fence;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.CarFence;
import com.muyu.domain.CarInformation;
import com.muyu.domain.resp.CarFenceResp;
import java.util.List;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheFenceService extends CacheAbsBasic<String, CarFenceResp> {
@Override
public String keyPre() {
return "CarFenceResp:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,27 @@
package com.muyu.enterprise.cache.warn;
import com.muyu.common.cache.CacheAbsBasic;
import com.muyu.domain.WarnStrategy;
import com.muyu.domain.resp.CarFenceResp;
import java.util.List;
/**
*
* @Authoryang
* @Packagecom.muyu.cache
* @Projectcloud-server-8
* @nameVehicleCacheService
* @Date2024/9/30 11:50
*/
public class VehicleCacheWarnService extends CacheAbsBasic<String, List<WarnStrategy>> {
@Override
public String keyPre() {
return "WarnStrategy:info:";
}
@Override
public String decode(String key) {
return key.replace("vehicle:info:","");
}
}

View File

@ -0,0 +1,9 @@
com.muyu.enterprise.cache.car.VehicleCacheCarInformationService
com.muyu.enterprise.cache.car.VehicleCacheCarInformationAddService
com.muyu.enterprise.cache.car.VehicleCacheCarInformationUpdService
com.muyu.enterprise.cache.car.VehicleCacheCarTypeService
com.muyu.enterprise.cache.faultCode.VehicleCacheFaultCodeAddService
com.muyu.enterprise.cache.fence.VehicleCacheFenceService
com.muyu.enterprise.cache.fence.VehicleCacheFenceAddService
com.muyu.enterprise.cache.fault.VehicleCacheFaultService
com.muyu.enterprise.cache.warn.VehicleCacheWarnService

View File

@ -15,8 +15,8 @@
cloud-modules-enterprise-common 企业业务common cloud-modules-enterprise-common 企业业务common
</description> </description>
<properties> <properties>
<maven.compiler.source>21</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies> <dependencies>

View File

@ -1,5 +1,7 @@
package com.muyu.domain; package com.muyu.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -25,6 +27,7 @@ public class CarFenceClazz {
/** /**
* ID * ID
*/ */
@TableId(value = "clazz_id",type = IdType.AUTO)
private Integer clazzId; private Integer clazzId;
/** /**
* *

View File

@ -1,5 +1,7 @@
package com.muyu.domain; package com.muyu.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -25,6 +27,7 @@ public class CarFenceType {
/** /**
* ID * ID
*/ */
@TableId(value = "type_id",type = IdType.AUTO)
private Integer typeId; private Integer typeId;
/** /**
* *

View File

@ -71,8 +71,8 @@ public class CarInformation {
/** /**
* ID * ID
*/ */
@Schema(title = "车辆类型外键ID", type = "Integer") // @Schema(title = "车辆类型外键ID", type = "Long")
private Integer carInformationType; private Long carInformationType;
/** /**
* *
*/ */
@ -107,6 +107,13 @@ public class CarInformation {
*/ */
private Integer carInformationState; private Integer carInformationState;
/**
* id
*/
private Integer carStrategyId;
public static CarInformation carInformationBuilder(CarInformation carInformation) { public static CarInformation carInformationBuilder(CarInformation carInformation) {
return CarInformation.builder() return CarInformation.builder()
.carInformationId(carInformation.getCarInformationId()) .carInformationId(carInformation.getCarInformationId())
@ -147,4 +154,23 @@ public class CarInformation {
.carInformationMotorModel(carInformation.getCarInformationMotorModel()) .carInformationMotorModel(carInformation.getCarInformationMotorModel())
.build(); .build();
} }
public static CarInformation carInformationListBuilder(CarInformation carInformation) {
return CarInformation.builder()
.carInformationId(carInformation.getCarInformationId())
.carInformationVIN(carInformation.getCarInformationVIN())
.carInformationLicensePlate(carInformation.getCarInformationLicensePlate())
.carInformationBrand(carInformation.getCarInformationBrand())
.carInformationColor(carInformation.getCarInformationColor())
.carInformationDriver(carInformation.getCarInformationDriver())
.carInformationMotorManufacturer(carInformation.getCarInformationMotorManufacturer())
.carInformationMotorModel(carInformation.getCarInformationMotorModel())
.carInformationBatteryManufacturer(carInformation.getCarInformationBatteryManufacturer())
.carInformationBatteryModel(carInformation.getCarInformationBatteryModel())
.carInformationFence(carInformation.getCarInformationFence())
.carInformationType(carInformation.getCarInformationType())
.carInformationMotorModel(carInformation.getCarInformationMotorModel())
.carStrategyId(carInformation.getCarStrategyId())
.build();
}
} }

View File

@ -1,5 +1,7 @@
package com.muyu.domain; package com.muyu.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -25,6 +27,7 @@ public class CarMessage {
/** /**
* *
*/ */
@TableId(value = "message_type_id",type = IdType.AUTO)
private Long messageTypeId; private Long messageTypeId;
/** /**
* *

View File

@ -1,5 +1,7 @@
package com.muyu.domain; package com.muyu.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -26,7 +28,8 @@ public class CarType {
/** /**
* ID * ID
*/ */
private long carTypeId; @TableId(value = "car_type_id",type = IdType.AUTO)
private Long carTypeId;
/** /**
* *
*/ */

View File

@ -36,7 +36,7 @@ public class FaultCode {
*Id *Id
*/ */
@TableId(value = "faultcode_id",type = IdType.AUTO) @TableId(value = "faultcode_id",type = IdType.AUTO)
private long faultcodeId; private Long faultcodeId;
/** /**
*Id *Id
*/ */
@ -85,7 +85,7 @@ public class FaultCode {
public static FaultCode addfaultcode(FaultCodeAddReq faultCodeAddReq){ public static FaultCode addfaultcode(FaultCodeAddReq faultCodeAddReq){
return FaultCode.builder() return FaultCode.builder()
.faultcodeId(0) .faultcodeId(faultCodeAddReq.getFaultcodeId())
.messageTypeId(faultCodeAddReq.getMessageTypeId()) .messageTypeId(faultCodeAddReq.getMessageTypeId())
.faultcodeNumber(faultCodeAddReq.getFaultcodeNumber()) .faultcodeNumber(faultCodeAddReq.getFaultcodeNumber())
.faultGroup(faultCodeAddReq.getFaultGroup()) .faultGroup(faultCodeAddReq.getFaultGroup())
@ -97,7 +97,7 @@ public class FaultCode {
public static FaultCode updfaultcode(FaultCodeUpdReq faultCodeUpdReq){ public static FaultCode updfaultcode(FaultCodeUpdReq faultCodeUpdReq){
return FaultCode.builder() return FaultCode.builder()
.faultcodeId(0) .faultcodeId(0L)
.messageTypeId(faultCodeUpdReq.getMessageTypeId()) .messageTypeId(faultCodeUpdReq.getMessageTypeId())
.faultcodeNumber(faultCodeUpdReq.getFaultcodeNumber()) .faultcodeNumber(faultCodeUpdReq.getFaultcodeNumber())
.faultGroup(faultCodeUpdReq.getFaultGroup()) .faultGroup(faultCodeUpdReq.getFaultGroup())

Some files were not shown because too many files have changed in this diff Show More