Compare commits

...

5 Commits

Author SHA1 Message Date
lijiayao 9e489bd4ec feat: 事件系统 2024-04-05 08:36:56 +08:00
lijiayao ed31af73b5 Merge remote-tracking branch 'origin/server_five_fufanrui' into server_five_xiaoyao
# Conflicts:
#	couplet-auth/src/main/resources/bootstrap.yml
#	couplet-gateway/src/main/resources/bootstrap.yml
#	couplet-modules/couplet-system/src/main/resources/bootstrap.yml
2024-04-04 15:05:23 +08:00
ffr 0c71aec748 车辆管理 2024-04-04 14:37:20 +08:00
ffr a9be065140 Merge branch 'server_five' of https://gitea.qinmian.online/five-groups/five-groups-couplet into server_five_fufanrui 2024-04-04 08:57:50 +08:00
ffr e027acc275 车辆管理 2024-04-03 11:38:59 +08:00
20 changed files with 331 additions and 18 deletions

View File

@ -84,10 +84,11 @@ public class Fence extends BaseEntity{
private Integer alarmStatus; private Integer alarmStatus;
@TableField(exist = false)
/** /**
* *
*/ */
@TableField(exist = false)
private Integer logoId; private Integer logoId;
@TableField(exist = false) @TableField(exist = false)
private String logoName; private String logoName;

View File

@ -0,0 +1,27 @@
package com.couplet.common.domain.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author fufanrui
* @version 1.0
* @description:
* @date 2024/4/4 14:35
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RealTimeDataRequest {
private Long userId;
private String vin;
}

View File

@ -1,5 +1,11 @@
package com.couplet.analyze.msg.consumer; package com.couplet.analyze.msg.consumer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.couplet.analyze.msg.domain.CoupletMsgData;
import com.couplet.analyze.msg.mapper.IncidentMapper;
import com.couplet.analyze.msg.service.impl.realTimeData.RealTimeJudge;
import com.couplet.common.domain.request.RealTimeDataRequest;
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Channel;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@ -10,6 +16,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/** /**
* @Author: LiJiaYao * @Author: LiJiaYao
* @Date: 2024/4/4 * @Date: 2024/4/4
@ -17,21 +30,69 @@ import org.springframework.stereotype.Component;
*/ */
@Log4j2 @Log4j2
@Component @Component
@RabbitListener(queues = "") @RabbitListener(queues = "vinQueue")
public class MsgConsumer { public class MsgConsumer {
@Autowired @Autowired
private StringRedisTemplate redisTemplate; private StringRedisTemplate redisTemplate;
@Autowired
private IncidentMapper incidentMapper;
private static final Map<String, Set<Long>> setMap = new HashMap<>();
@RabbitHandler @RabbitHandler
public void realTimeDataConsumer(Channel channel, Message message){ public void realTimeDataConsumer(RealTimeDataRequest realTimeDataRequest, Channel channel, Message message) throws IOException {
// log.info(); log.info("消息进入队列,传入的数据是:[{}]", realTimeDataRequest);
String messageId = message.getMessageProperties().getMessageId(); String messageId = message.getMessageProperties().getMessageId();
long deliveryTag = message.getMessageProperties().getDeliveryTag(); long deliveryTag = message.getMessageProperties().getDeliveryTag();
if (!redisTemplate.hasKey("消息不丢失:" + messageId)) {
redisTemplate.opsForValue().set("消息不丢失:" + messageId, "" + deliveryTag, 1, TimeUnit.MINUTES);
}
Long add = redisTemplate.opsForSet().add("消息不重复:" + messageId, messageId);
redisTemplate.expire("消息不重复:" + messageId, 5, TimeUnit.MINUTES);
try {
if (0 < add) {
JSONObject jsonObject = JSONObject.parseObject(String.valueOf(realTimeDataRequest));
String vin = jsonObject.getString("vin");
Long userId = jsonObject.getLong("userId");
RealTimeDataRequest request = new RealTimeDataRequest();
request.setVin(vin);
request.setUserId(userId);
RealTimeJudge.addRealTime(request);
//判断车辆是否有实时数据,如果没有则删除数据
if (RealTimeJudge.isJudge(realTimeDataRequest.getVin())){
log.info("开始实时数据传输:[{}]",realTimeDataRequest.getVin());
}
CoupletMsgData incident = incidentMapper.queryByIncident(realTimeDataRequest.getVin());
if (incident == null){
log.error("没有数据......");
}
redisTemplate.opsForList().rightPush("coupletMsgData", JSON.toJSONString(incident));
channel.basicAck(deliveryTag, false);
} else {
log.error("消息不能重复消费:[{}]", realTimeDataRequest);
channel.basicReject(deliveryTag, false);
}
} catch (IOException e) {
log.error("消息未进入队列,传入的信息是:【{}】", realTimeDataRequest);
String s = redisTemplate.opsForValue().get("消息不丢失:" + messageId);
Long o = Long.valueOf(s);
if (deliveryTag == o + 2) {
log.error("消息已丢失,无法传入的信息是:【{}】", realTimeDataRequest);
channel.basicNack(deliveryTag, false, false);
} else {
log.error("消息已丢失,已再次传入的信息是:【{}】", realTimeDataRequest);
channel.basicNack(deliveryTag, true, false);
}
}
} }

View File

@ -15,4 +15,11 @@ public interface IncidentMapper {
* @param coupletMsgData * @param coupletMsgData
*/ */
public void reportMapper(CoupletMsgData coupletMsgData); public void reportMapper(CoupletMsgData coupletMsgData);
/**
* vin
*/
// CoupletMsgData queryByIncident(RealTimeDataRequest realTimeDataRequest);
CoupletMsgData queryByIncident(String vin);
} }

View File

@ -2,6 +2,7 @@ package com.couplet.analyze.msg.service;
import com.couplet.analyze.msg.contents.MsgContent; import com.couplet.analyze.msg.contents.MsgContent;
import com.couplet.analyze.msg.domain.CoupletMsgData; import com.couplet.analyze.msg.domain.CoupletMsgData;
import com.couplet.common.domain.request.RealTimeDataRequest;
/** /**
* @Author: LiJiaYao * @Author: LiJiaYao
@ -25,4 +26,5 @@ public interface IncidentService {
} }

View File

@ -70,7 +70,7 @@ public class BreakdownServiceImpl extends KeyExpirationEventMessageListener impl
redisTemplate.opsForValue().set(String.valueOf(coupletMsgData),JSON.toJSONString(coupletMsgData),10, TimeUnit.MINUTES); redisTemplate.opsForValue().set(String.valueOf(coupletMsgData),JSON.toJSONString(coupletMsgData),10, TimeUnit.MINUTES);
long timeMillis = System.currentTimeMillis(); long timeMillis = System.currentTimeMillis();
log.debug("失效+key is:"+ "coupletMsgData"); log.debug("失效+key is:"+ expireKey);
log.info("故障事件结束时间:"+timeMillis); log.info("故障事件结束时间:"+timeMillis);
log.info("故障事件检测结束....."); log.info("故障事件检测结束.....");

View File

@ -1,12 +1,20 @@
package com.couplet.analyze.msg.service.impl; package com.couplet.analyze.msg.service.impl;
import com.alibaba.fastjson.JSON;
import com.couplet.analyze.msg.domain.CoupletMsgData; import com.couplet.analyze.msg.domain.CoupletMsgData;
import com.couplet.analyze.msg.mapper.IncidentMapper; import com.couplet.analyze.msg.mapper.IncidentMapper;
import com.couplet.analyze.msg.service.IncidentService; import com.couplet.analyze.msg.service.IncidentService;
import com.couplet.analyze.msg.service.impl.realTimeData.RealTimeJudge;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/** /**
* @Author: LiJiaYao * @Author: LiJiaYao
* @Date: 2024/4/2 * @Date: 2024/4/2
@ -22,6 +30,9 @@ public class RealTimeDataServiceImpl implements IncidentService {
@Autowired @Autowired
private IncidentMapper incidentMapper; private IncidentMapper incidentMapper;
@Autowired
private StringRedisTemplate redisTemplate;
/** /**
* *
* *
@ -32,8 +43,15 @@ public class RealTimeDataServiceImpl implements IncidentService {
log.info("实时数据事件开始....."); log.info("实时数据事件开始.....");
if (redisTemplate.hasKey("coupletMsgData")){
redisTemplate.delete("coupletMsgData");
}
// Set<Long> userId = setMap.get(coupletMsgData.getVin());
// if (null == userId){
// userId = new HashSet<>();
// setMap.put(coupletMsgData.getVin(),userId);
// }
// userId.add(coupletMsgData.getUserId());

View File

@ -0,0 +1,45 @@
package com.couplet.analyze.msg.service.impl.realTimeData;
import com.couplet.analyze.msg.domain.CoupletMsgData;
import com.couplet.common.domain.request.RealTimeDataRequest;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @Author: LiJiaYao
* @Date: 2024/4/4
* @Description:
*/
public class RealTimeJudge {
/**
*
*/
private static final Map<String, Set<Long>> setMap = new HashMap<>();
public static boolean isJudge(String vin){
return setMap.containsKey(vin);
}
/**
*
* @param realTimeDataRequest
* @return
*/
public static boolean addRealTime(RealTimeDataRequest realTimeDataRequest){
Set<Long> userIds = setMap.get(realTimeDataRequest.getVin());
if (userIds == null){
userIds = new HashSet<>();
setMap.put(realTimeDataRequest.getVin(),userIds);
}
userIds.add(realTimeDataRequest.getUserId());
return true;
}
}

View File

@ -4,7 +4,6 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.couplet.analyze.msg.mapper.IncidentMapper"> <mapper namespace="com.couplet.analyze.msg.mapper.IncidentMapper">
<insert id="reportMapper"> <insert id="reportMapper">
INSERT INTO `couplet-cloud`.`couplet_msg_data` INSERT INTO `couplet-cloud`.`couplet_msg_data`
(`vin`, `create_time`, `longitude`, `latitude`, (`vin`, `create_time`, `longitude`, `latitude`,
@ -71,5 +70,10 @@
#{brakePedal} #{brakePedal}
); );
</insert> </insert>
<select id="queryByIncident" resultType="com.couplet.analyze.msg.domain.CoupletMsgData"
parameterType="com.couplet.common.domain.request.RealTimeDataRequest">
SELECT * FROM couplet_msg_data WHERE vin =#{vin}
</select>
</mapper> </mapper>

View File

@ -0,0 +1,53 @@
package com.couplet.business.server.controller;
import com.couplet.business.server.service.VehicleDetectionService;
import com.couplet.common.core.domain.Result;
import com.couplet.common.domain.Vehicle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author fufanrui
* @version 1.0
* @description:
* @date 2024/4/4 10:11
*/
@RestController
@RequestMapping("detection")
public class VehicleDetectionController {
@Autowired
private VehicleDetectionService vehicleDetectionService;
/*
* @param :
* @return Result<List<Vehicle>>
* @author
* @description 线
* @date
*/
@PostMapping("/detectionList")
public Result<List<Vehicle>> detectionList() {
return Result.success(vehicleDetectionService.detectionList());
}
/*
* @param vin:
* @return Result<List<Vehicle>>
* @author
* @description vin
* @date
*/
@PostMapping("/findByVin/{vehicleId}")
public Result<List<Vehicle>> findByVin(@PathVariable("vehicleId") Integer vehicleId) {
return Result.success(vehicleDetectionService.findByVin(vehicleId));
}
}

View File

@ -0,0 +1,13 @@
package com.couplet.business.server.mapper;
import com.couplet.common.domain.Vehicle;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface VehicleDetectionMapper {
List<Vehicle> detectionList();
List<Vehicle> findByVin(Integer vehicleId);
}

View File

@ -0,0 +1,13 @@
package com.couplet.business.server.service;
import com.couplet.common.core.domain.Result;
import com.couplet.common.domain.Vehicle;
import java.util.List;
public interface VehicleDetectionService {
List<Vehicle> detectionList();
List<Vehicle> findByVin(Integer vehicleId);
}

View File

@ -61,7 +61,7 @@ public class FenceServiceImpl extends ServiceImpl<FenceMapper, Fence> implements
public void fenceInsert(HttpServletRequest request, FenceRequest fenceRequest) { public void fenceInsert(HttpServletRequest request, FenceRequest fenceRequest) {
//先添加围栏 //先添加围栏
int a= fenceMapper.insertFence(fenceRequest); fenceMapper.insertFence(fenceRequest);
String[] logoIds = fenceRequest.getLogoIds(); String[] logoIds = fenceRequest.getLogoIds();
String[] parts = new String[0]; String[] parts = new String[0];
for (String logoId : logoIds) { for (String logoId : logoIds) {

View File

@ -0,0 +1,34 @@
package com.couplet.business.server.service.impl;
import com.couplet.business.server.mapper.VehicleDetectionMapper;
import com.couplet.business.server.service.VehicleDetectionService;
import com.couplet.business.server.service.VehicleManageService;
import com.couplet.common.core.domain.Result;
import com.couplet.common.domain.Vehicle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author fufanrui
* @version 1.0
* @description:
* @date 2024/4/4 10:23
*/
@Service
public class VehicleDetectionServiceImpl implements VehicleDetectionService{
@Autowired
private VehicleDetectionMapper vehicleDetectionMapper;
@Override
public List<Vehicle> detectionList() {
return vehicleDetectionMapper.detectionList();
}
@Override
public List<Vehicle> findByVin(Integer vehicleId) {
return vehicleDetectionMapper.findByVin(vehicleId);
}
}

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.couplet.business.server.mapper.VehicleDetectionMapper">
<sql id="selectVehicle">
SELECT
v.vehicle_id,
v.vehicle_type,
v.motor_manufacturer,
v.battery_manufacturer,
v.motor_number,
v.battery_number,
v.vin,
v.vehicle_state,
v.isdelete,
t.vehicle_type_id,
t.vehicle_type_name
FROM
couplet_vehicle v
LEFT JOIN couplet_vehicle_type t ON v.vehicle_type = t.vehicle_type_id
WHERE v.isdelete = 0
</sql>
<select id="detectionList" resultType="com.couplet.common.domain.Vehicle">
<include refid="selectVehicle"/>
AND v.vehicle_state = 1
</select>
<select id="findByVin" resultType="com.couplet.common.domain.Vehicle">
<include refid="selectVehicle"/>
<if test="null!=vin and ''!=vin">
AND v.vehicle_id, = #{vehicleId}
</if>
AND v.vehicle_state = 1
</select>
</mapper>

View File

@ -15,11 +15,11 @@ spring:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置

View File

@ -17,11 +17,11 @@ spring:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置

View File

@ -17,11 +17,11 @@ spring:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置

View File

@ -4,7 +4,6 @@ server:
# Spring # Spring
spring: spring:
application: application:
# 应用名称 # 应用名称
name: couplet-system name: couplet-system

View File

@ -15,11 +15,11 @@ spring:
discovery: discovery:
# 服务注册地址 # 服务注册地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
config: config:
# 配置中心地址 # 配置中心地址
server-addr: 121.89.211.230:8848 server-addr: 121.89.211.230:8848
namespace: 172469 namespace: 968741d4-299d-483c-8d30-ede2aff8cfd4
# 配置文件格式 # 配置文件格式
file-extension: yml file-extension: yml
# 共享配置 # 共享配置