故障日志存储redis,mysql
master_suzejing
JangCan 2024-04-10 22:40:27 +08:00
parent a796863e54
commit a144a4d96a
13 changed files with 202 additions and 362 deletions

View File

@ -2,6 +2,8 @@ package com.zhilian.business.domain;
import lombok.Data;
import java.util.Date;
/**
* @ClassName BreakLog
* @Description TODO
@ -20,9 +22,9 @@ public class BreakLog {
/** 故障类型 */
private String breakType;
/** 结束报警时间 */
private String breakTime;
private Date breakTime;
/** 开始报警时间 */
private String breakDate;
private Date breakDate;
/** 是否报警 */
private String breakState;
/** 逻辑删除 */

View File

@ -1,6 +1,7 @@
package com.zhilian.business.remote;
import com.zhilian.business.domain.Break;
import com.zhilian.business.domain.BreakLog;
import com.zhilian.business.domain.BusinessBreak;
import com.zhilian.business.remote.factory.RemoteBreakFallbackFactory;
import com.zhilian.common.core.constant.ServiceNameConstants;
@ -15,8 +16,8 @@ public interface RemoteBreakService {
/**
*
*/
@PostMapping
public Result add(@RequestBody BusinessBreak businessBreak);
@PostMapping("logAdd")
public Result logAdd(@RequestBody BreakLog breakLog);
}

View File

@ -1,5 +1,6 @@
package com.zhilian.business.remote.factory;
import com.zhilian.business.domain.BreakLog;
import com.zhilian.business.domain.BusinessBreak;
import com.zhilian.business.remote.RemoteBreakService;
import com.zhilian.common.core.domain.Result;
@ -13,10 +14,17 @@ public class RemoteBreakFallbackFactory implements FallbackFactory<RemoteBreakSe
public RemoteBreakService create(Throwable cause) {
return new RemoteBreakService() {
@Override
public Result add(BusinessBreak businessBreak) {
public Result logAdd(BreakLog breakLog) {
log.error("故障日志服务调用失败");
return Result.error("故障日志服务调用失败");
}
};
// return new RemoteBreakService() {
// @Override
// public Result add(BusinessBreak businessBreak) {
// log.error("故障日志服务调用失败");
// return Result.error("故障日志服务调用失败");
// }
// };
}
}

View File

@ -1,23 +0,0 @@
package com.zhilian.common.resolver.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName ErrorCar
* @Description
* @Author Can.J
* @Date 2024/4/8 12:50
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ErrorCar {
private Long id;
private String vin;
private String code;
private int level;
}

View File

@ -1,47 +0,0 @@
package com.zhilian.common.resolver.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @ClassName ResolverMalfunctionLog
* @Description
* @Author Can.J
* @Date 2024/4/10 11:10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResolverMalfunctionLog {
/**
* id
*/
private Long id;
/**
*
*/
private String malfunctionCode;
/**
* VIN
*/
private String malfunctionVin;
/**
*
*/
private Date startTime;
/**
*
*/
private String breakType;
/**
*
*/
private Date endTime;
/**
*
*/
private String malfunctionTag;
}

View File

@ -79,4 +79,5 @@ public class BreakLogServiceImpl implements BreakLogService {
public int logDel(Integer breakLogId) {
return breakLogMapper.logDel(breakLogId);
}
}

View File

@ -1,33 +0,0 @@
package com.zhilian.resolver.controller;
import com.zhilian.common.core.domain.Result;
import com.zhilian.common.resolver.domain.ResolverMalfunctionLog;
import com.zhilian.resolver.service.MalfunctionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName MalfunctionController
* @Description
* @Author Can.J
* @Date 2024/4/10 11:13
*/
@RestController
@RequestMapping("/malfunction")
public class MalfunctionController {
@Autowired
private MalfunctionService malfunctionService;
/**
*
* @param resolverMalfunctionLog
* @return
*/
@PostMapping("/resolverMalfunctionInsert")
public Result resolverMalfunctionInsert(@RequestBody ResolverMalfunctionLog resolverMalfunctionLog){
Result resolverMalfunctionInsert =malfunctionService.resolverMalfunctionInsert(resolverMalfunctionLog);
return resolverMalfunctionInsert;
}
}

View File

@ -1,11 +0,0 @@
package com.zhilian.resolver.mapper;
import com.zhilian.common.core.domain.Result;
import com.zhilian.common.resolver.domain.ResolverMalfunctionLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MalfunctionMapper {
Result resolverMalfunctionInsert(ResolverMalfunctionLog resolverMalfunctionLog);
}

View File

@ -1,9 +0,0 @@
package com.zhilian.resolver.service;
import com.zhilian.common.core.domain.Result;
import com.zhilian.common.resolver.domain.ResolverMalfunctionLog;
public interface MalfunctionService {
Result resolverMalfunctionInsert(ResolverMalfunctionLog resolverMalfunctionLog);
}

View File

@ -1,23 +0,0 @@
package com.zhilian.resolver.service.impl;
import com.zhilian.common.core.domain.Result;
import com.zhilian.common.resolver.domain.ResolverMalfunctionLog;
import com.zhilian.resolver.mapper.MalfunctionMapper;
import com.zhilian.resolver.service.MalfunctionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @ClassName MalfunctionServiceImpl
* @Description
* @Author Can.J
* @Date 2024/4/10 11:12
*/
@Service
public class MalfunctionServiceImpl implements MalfunctionService {
@Autowired
private MalfunctionMapper malfunctionMapper;
@Override
public Result resolverMalfunctionInsert(ResolverMalfunctionLog resolverMalfunctionLog) {
return malfunctionMapper.resolverMalfunctionInsert(resolverMalfunctionLog);
}
}

View File

@ -1,4 +1,5 @@
package com.zhilian.resolver.service.impl.eventGeofence;
import com.zhilian.common.resolver.domain.ResolverReportData;
import com.zhilian.resolver.GeoFence;
import com.zhilian.resolver.service.ResolverEventService;
@ -24,26 +25,26 @@ public class GeofenceEventServiceImpl implements ResolverEventService {
public void execute(ResolverReportData resolverReportData) {
log.info("电子围挡执行");
String vin = resolverReportData.getVin();
log.info("vin :"+vin);
//经度
log.info("vin :" + vin);
// 经度
double pointLng = parseDouble(resolverReportData.getLongitude());
//维度
// 维度
double pointLat = parseDouble(resolverReportData.getLatitude());
// 调用电子围栏信息
// 调用电子围栏信息
GeoFence geoFence = new GeoFence();
//39.958897,116.179075; 39.950476,116.330823; 39.865149,116.290311; 39.881485,116.083631
// 廊坊经度:116.683752 维度:39.538047
geoFence.setLongitudeAndLatitude("39.538047,116.683752;39.538047,116.683752;39.538047,116.683752;39.538047,116.683752");
// 39.958897,116.179075; 39.950476,116.330823; 39.865149,116.290311; 39.881485,116.083631
// 廊坊经度116.683752 维度:39.538047
geoFence.setLongitudeAndLatitude("39.526907,116.695848;39.522727,116.686888;39.527536,116.708916;39.522847,116.684066");
String[] split = geoFence.getLongitudeAndLatitude().split(";");
// 判断点是否在电子围栏内
boolean withinFence = isWithinFence(pointLat, pointLng, Arrays.asList(split));
if(withinFence){
if (withinFence) {
log.info("在围栏内");
}else {
} else {
log.error("不在围栏内");
}
@ -55,8 +56,16 @@ public class GeofenceEventServiceImpl implements ResolverEventService {
return "geofence";
}
public boolean isWithinFence(double pointLat, double pointLng, List<String> split){
if(split.size()<4){
/**
* 线
*
* @param pointLat
* @param pointLng
* @param coordinates [1,1,2,2,3,3]
* @return truefalse
*/
private boolean isWithinFence(double pointLat, double pointLng, List<String> coordinates) {
if (coordinates.size() < 4) {
throw new IllegalArgumentException("不符合条件");
}
@ -64,14 +73,23 @@ public class GeofenceEventServiceImpl implements ResolverEventService {
double[] latitudes = new double[4];
for (int i = 0; i < 4; i++) {
String[] coordinates = split.get(i).split(",");
latitudes[i] = parseDouble(coordinates[0]);
longitudes[i] = parseDouble(coordinates[1]);
String[] coordinate = coordinates.get(i).split(",");
latitudes[i] = parseDouble(coordinate[0]);
longitudes[i] = parseDouble(coordinate[1]);
}
return isPointInRectangle(pointLat,pointLat,latitudes,longitudes);
return isPointInRectangle(pointLat, pointLng, latitudes, longitudes);
}
/**
* 线
*
* @param pointLat
* @param pointLng
* @param latitudes
* @param longitudes
* @return truefalse
*/
private boolean isPointInRectangle(double pointLat, double pointLng, double[] latitudes, double[] longitudes) {
// 根据矩形顶点顺序确定最小和最大纬度、经度
double minLatitude = Arrays.stream(latitudes).min().orElseThrow();

View File

@ -1,10 +1,7 @@
package com.zhilian.resolver.service.impl.eventMalfunction;
import com.alibaba.fastjson.JSON;
import com.zhilian.business.domain.BusinessBreak;
import com.zhilian.business.domain.BreakLog;
import com.zhilian.business.remote.RemoteBreakService;
import com.zhilian.common.redis.service.RedisService;
import com.zhilian.common.resolver.domain.ResolverMalfunctionLog;
import com.zhilian.common.resolver.domain.ResolverReportData;
import com.zhilian.resolver.mapper.UserMapper;
import com.zhilian.resolver.service.ResolverEventService;
@ -14,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@ -49,178 +48,146 @@ public class MalfunctionEventServiceImpl implements ResolverEventService {
if(isAnyFieldZero(vehicleData)){
resolverReportInfoService.saveDataToDatabaseByMalfunction(vehicleData);
BusinessBreak businessBreak = new BusinessBreak();
businessBreak.setBreakVin(vehicleData.getVin());
//测试故障日志添加
ResolverMalfunctionLog resolverMalfunctionLog = new ResolverMalfunctionLog();
resolverMalfunctionLog.setMalfunctionVin(vehicleData.getVin());
BreakLog breakLog = new BreakLog();
breakLog.setBreakVin(vehicleData.getVin());
// * 车辆状态 1正常 0故障
if(vehicleData.getVehicleStatus()==0){
businessBreak.setBreakCode("CL001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("车体故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
//测试故障日志添加
resolverMalfunctionLog.setMalfunctionCode("CL001");
breakLog.setBreakCode("CL001");
breakLog.setBreakType("车体故障");
breakLog.setBreakState("1");
}
// * 充电状态 1正常 0故障
// private int chargingStatus;
if(vehicleData.getChargingStatus()==0){
businessBreak.setBreakCode("CD001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("CD001");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// * 运行状态 1正常 0故障
if(vehicleData.getOperatingStatus()==0){
businessBreak.setBreakCode("DW001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("行驶故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DW001");
breakLog.setBreakType("行驶故障");
breakLog.setBreakState("1");
}
// * SOC 状态 1正常 0故障
if(vehicleData.getSocStatus()==0){
businessBreak.setBreakCode("SOC001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("SOC001");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// 可充电储能装置工作状态 1正常 0故障;
if(vehicleData.getChargingEnergyStorageStatus()==0){
businessBreak.setBreakCode("CDC001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("CDC001");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// 驱动电机状态 1正常 0故障
if(vehicleData.getDriveMotorStatus()==0){
businessBreak.setBreakCode("DJ001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电机故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DJ001");
breakLog.setBreakType("电机故障");
breakLog.setBreakState("1");
}
// 定位是否有效 1有效 0无效
if(vehicleData.getPositionStatus()==0){
businessBreak.setBreakCode("SOC001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("定位故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("SOC001");
breakLog.setBreakType("定位故障");
breakLog.setBreakState("1");
}
// * EAS(汽车防盗系统)状态 1正常 0故障
if(vehicleData.getEasStatus()==0){
businessBreak.setBreakCode("EAS001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("EAS故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("EAS001");
breakLog.setBreakType("EAS故障");
breakLog.setBreakState("1");
}
// * PTC(电动加热器)状态 1正常 0故障
if(vehicleData.getPtcStatus()==0){
businessBreak.setBreakCode("PTC001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("加热故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("PTC001");
breakLog.setBreakType("加热故障");
breakLog.setBreakState("1");
}
// * EPS(电动助力系统)状态 1正常 0故障
if(vehicleData.getEpsStatus()==0){
businessBreak.setBreakCode("EPS001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电动助力故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("EPS001");
breakLog.setBreakType("电动助力故障");
breakLog.setBreakState("1");
}
// * ABS(防抱死)状态 1正常 0故障
if(vehicleData.getAbsStatus()==0){
businessBreak.setBreakCode("ABS001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("ABS故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("ABS001");
breakLog.setBreakType("ABS故障");
breakLog.setBreakState("1");
}
// * MCU(电机/逆变器)状态 1正常 0故障
if(vehicleData.getMcuStatus()==0){
businessBreak.setBreakCode("MCU001");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("MCU故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("MCU001");
breakLog.setBreakType("MCU故障");
breakLog.setBreakState("1");
}
// * 动力电池加热状态 1正常 0故障
if(vehicleData.getHeatingStatus()==0){
businessBreak.setBreakCode("DC002");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DC002");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// * 动力电池当前状态 1正常 0故障
if(vehicleData.getBatteryStatus()==0){
businessBreak.setBreakCode("DC003");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DC003");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// * 动力电池保温状态 1正常 0故障
if(vehicleData.getBatteryInsulationStatus()==0){
businessBreak.setBreakCode("DC004");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电池故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DC004");
breakLog.setBreakType("电池故障");
breakLog.setBreakState("1");
}
// * DCDC(电力交换系统) 状态 1正常 0故障
if(vehicleData.getDcdcStatus()==0){
businessBreak.setBreakCode("DCDC005");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电力故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("DCDC005");
breakLog.setBreakType("电力故障");
breakLog.setBreakState("1");
}
// * CHG(充电机)状态 1正常 0故障
if(vehicleData.getChgStatus()==0){
businessBreak.setBreakCode("CDJ005");
businessBreak.setBreakDate(new Date());
businessBreak.setBreakType("电力故障");
businessBreak.setBreakState("1");
remoteBreakService.add(businessBreak);
breakLog.setBreakCode("CDJ005");
breakLog.setBreakType("电力故障");
breakLog.setBreakState("1");
}
HashSet<BreakLog> breakHash = new HashSet<>();
breakHash.add(breakLog);
redisService.setCacheSet("breakdown:gz:"+vehicleData.getVin(),breakHash);
Set<BreakLog> breakLogsFromRedis = redisService.getCacheSet("breakdown:gz:" + vehicleData.getVin());
if(breakLogsFromRedis !=null && !breakLogsFromRedis.isEmpty()){
// 将Redis中的数据遍历逐条插入数据库
for (BreakLog breakLogs : breakLogsFromRedis) {
remoteBreakService.logAdd(breakLogs);
}
}else {
log.info("没有找到对应VIN的故障记录在Redis中无需同步到数据库");
}
// String key = "breakdown";
String value = JSON.toJSONString(businessBreak);
redisService.setCacheObject("breakdown:gz:"+vehicleData.getVin(),value);
long expireTime = 30;
redisService.expire("breakdown:gz:"+vehicleData.getVin(), expireTime, TimeUnit.MINUTES);

View File

@ -1,11 +0,0 @@
<?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.zhilian.resolver.mapper.MalfunctionMapper">
<insert id="resolverMalfunctionInsert">
INSERT INTO `vehicle-resolver`.`resolver_malfunction_log` (`malfunction_code`, `malfunction_vin`, `start_time`, `break_type`, `end_time`, `malfunction_tag`)
VALUES (#{malfunctionCode}, #{malfunctionVin}, #{startTime}, #{breakType}, #{endTime}, #{malfunctionTag});
</insert>
</mapper>