车辆实时轨迹更新

master
shaowenhao 2023-11-26 19:33:53 +08:00
parent c686243244
commit 26ff678b46
16 changed files with 576 additions and 4 deletions

View File

@ -124,6 +124,15 @@ public class Car {
@Excel(name = "车辆状态") @Excel(name = "车辆状态")
private int status; private int status;
/**
*
*/
private String fenceName;
/**
*
*/
private String carTypeName;
public static Car carBuildAdd(CarRequest carRequest){ public static Car carBuildAdd(CarRequest carRequest){
return Car.builder() return Car.builder()
.carVinId(carRequest.getCarVinId()) .carVinId(carRequest.getCarVinId())

View File

@ -0,0 +1,214 @@
package com.god.base.server.common.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* VehicleMessage
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("vehicle_message")
public class VehicleMessage {
/**
*
*/
private String identifier;
/**
* VIN
*/
private String vin;
/**
*
*/
private String longitude;
/**
*
*/
private String latitude;
/**
*
*/
private String speed;
/**
*
*/
private String totalDistance;
/**
*
*/
private String totalVoltage;
/**
*
*/
private String joinCurrent;
/**
*
*/
private String insulationResistance;
/**
*
*/
private String gears;
/**
*
*/
private String acceleratorPedal;
/**
*
*/
private String brakePedal;
/**
*
*/
private String fuelRate;
/**
*
*/
private String motorControllerTemperature;
/**
*
*/
private String motorSpeed;
/**
*
*/
private String motorTorque;
/**
*
*/
private String motorTemperature;
/**
*
*/
private String motorVoltage;
/**
*
*/
private String motorCurrent;
/**
* SOC
*/
private String dumpEnergy;
/**
*
*/
private String maximumFeedbackPower;
/**
*
*/
private String maximumDischargePower;
/**
* BMS
*/
private String selfCheckingCounter;
/**
*
*/
private String chargingAndDischargingCurrent;
/**
* V3
*/
private String totalVoltageAtLoadEnd;
/**
*
*/
private String maximumVoltage;
/**
*
*/
private String lowestVoltageBattery;
/**
*
*/
private String maximumTemperatureBattery;
/**
*
*/
private String lowestTemperatureBattery;
/**
*
*/
private String availableBatteryCapacity;
/**
*
*/
private Integer vehicleState;
/**
*
*/
private Integer chargingState;
/**
*
*/
private Integer runningStatus;
/**
* SOC
*/
private Integer socStatus;
/**
*
*/
private Integer energyStorageDeviceState;
/**
*
*/
private Integer driveMotorCondition;
/**
*
*/
private Integer positioningState;
/**
*
*/
private Integer easStatus;
/**
*
*/
private Integer ptcStatus;
/**
*
*/
private Integer epsStatus;
/**
*
*/
private Integer absStatus;
/**
*
*/
private Integer mcuStatus;
/**
*
*/
private Integer batteryHeatingCondition;
/**
*
*/
private Integer currentBatteryStatus;
/**
*
*/
private Integer batteryInsulationStatus;
/**
*
*/
private Integer dcdcStatus;
/**
*
*/
private Integer chgStatus;
/**
*
*/
private Integer time;
}

View File

@ -0,0 +1,26 @@
package com.god.base.server.common.domainConstants;
/**
*
*/
public class RedisConstant {
/**
*
*/
public static final String CURRENT_INFO = "current_info";
/**
*
*/
public static final String CURRENT_DAY_FAULT = "current_day_fault";
/**
*
*/
public static final String CURRENT_MONTH_FAULT = "current_month_fault";
/**
*
*/
public static final String VEHICLE_INFO_TOKEN = "vehicle_info_token:";
}

View File

@ -2,6 +2,7 @@ package com.god.base.server.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.god.base.server.common.domain.Car; import com.god.base.server.common.domain.Car;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.common.domain.request.CarRequest; import com.god.base.server.common.domain.request.CarRequest;
import com.god.base.server.service.CarService; import com.god.base.server.service.CarService;
import com.god.base.server.util.AopConfig; import com.god.base.server.util.AopConfig;
@ -143,12 +144,21 @@ public class CarController extends BaseController {
util.exportExcel(response,list,"车辆信息管理"); util.exportExcel(response,list,"车辆信息管理");
} }
/** /**
* * 线
*/ */
@PostMapping @GetMapping("/onlineVehicle")
public Result sSgj(){ public Result<List<VehicleMessage>> onlineVehicle(){
return null; return carService.onlineVehicle();
}
/**
*
*/
@GetMapping("/countData")
public Result<String> countData(){
return carService.countData();
} }

View File

@ -1,6 +1,7 @@
package com.god.base.server.controller; package com.god.base.server.controller;
import com.god.base.server.common.domain.DrivingRecord; import com.god.base.server.common.domain.DrivingRecord;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.service.IDrivingRecordService; import com.god.base.server.service.IDrivingRecordService;
import com.god.common.core.domain.Result; import com.god.common.core.domain.Result;
import com.god.common.core.utils.poi.ExcelUtil; import com.god.common.core.utils.poi.ExcelUtil;
@ -13,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -110,6 +112,41 @@ public class DrivingRecordController extends BaseController {
return Result.success(drivingRecordService.deleteDrivingRecordByIds(ids)); return Result.success(drivingRecordService.deleteDrivingRecordByIds(ids));
} }
/**
*
* @param vin
* @return
*/
@PostMapping("/strtVehocle/{vin}")
public Result startVehicle(@PathVariable("vin") String vin){
DrivingRecord drivingRecord = new DrivingRecord();
drivingRecord.setVin(vin);
drivingRecord.setStartTime(new Date());
drivingRecordService.insertDrivingRecord(drivingRecord);
return Result.success();
}
/**
*
* @param id
* @return
*/
@GetMapping("/findOne/{id}")
public Result<DrivingRecord> findOne(@PathVariable("id") Long id){
DrivingRecord drivingRecord = drivingRecordService.selectDrivingRecordById(id);
return Result.success(drivingRecord);
}
/**
*
* @param id
* @return
*/
@GetMapping("trackHistory/{id}")
public Result<List<VehicleMessage>> trackHistory(@PathVariable Long id){
return null;
}
} }

View File

@ -50,4 +50,10 @@ public interface CarMapper extends BaseMapper<Car> {
* @return * @return
*/ */
List<Car> selectVehicleInfoList(CarRequest carRequest); List<Car> selectVehicleInfoList(CarRequest carRequest);
List<String> getOnlineCarIds();
Integer getOnlineCarCount();
Integer getUnOnlineCount();
} }

View File

@ -2,6 +2,7 @@ package com.god.base.server.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.god.base.server.common.domain.Car; import com.god.base.server.common.domain.Car;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.common.domain.request.CarRequest; import com.god.base.server.common.domain.request.CarRequest;
import com.god.common.core.domain.Result; import com.god.common.core.domain.Result;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -18,6 +19,15 @@ public interface CarService extends IService<Car> {
List<Car> selectCarInfoList(CarRequest carRequest); List<Car> selectCarInfoList(CarRequest carRequest);
Result<List<VehicleMessage>> onlineVehicle();
/**
*
* @return
*/
Result<String> countData();
} }

View File

@ -3,17 +3,21 @@ package com.god.base.server.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.god.base.server.common.domain.Car; import com.god.base.server.common.domain.Car;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.common.domain.request.CarRequest; import com.god.base.server.common.domain.request.CarRequest;
import com.god.base.server.common.domainConstants.RedisConstant;
import com.god.base.server.mapper.CarMapper; import com.god.base.server.mapper.CarMapper;
import com.god.base.server.service.CarService; import com.god.base.server.service.CarService;
import com.god.common.core.domain.Result; import com.god.common.core.domain.Result;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* *
@ -25,6 +29,9 @@ public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements CarSe
@Autowired @Autowired
private CarMapper carMapper; private CarMapper carMapper;
@Autowired
private RedisTemplate redisTemplate;
/** /**
* *
@ -129,5 +136,28 @@ public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements CarSe
return true; return true;
} }
/**
* 线
* @return
*/
@Override
public Result<List<VehicleMessage>> onlineVehicle() {
List<String> ids = carMapper.getOnlineCarIds();
List<VehicleMessage> messages = ids.stream().map(id -> {
VehicleMessage message = (VehicleMessage) redisTemplate.opsForValue().get(RedisConstant.CURRENT_INFO + ":" + id);
return message;
}).collect(Collectors.toList());Collectors.toList();
return Result.success(messages);
}
@Override
public Result<String> countData() {
Integer day = (Integer) redisTemplate.opsForValue().get(RedisConstant.VEHICLE_INFO_TOKEN+RedisConstant.CURRENT_DAY_FAULT);
Integer month = (Integer) redisTemplate.opsForValue().get(RedisConstant.VEHICLE_INFO_TOKEN+RedisConstant.CURRENT_MONTH_FAULT);
Integer onlineCount = carMapper.getOnlineCarCount();
Integer unOnlineCount = carMapper.getUnOnlineCount();
return Result.success(day + ":" + month + ":" + onlineCount + ":" + unOnlineCount );
}
} }

View File

@ -0,0 +1,18 @@
//package com.god.base.server.webSocket.config;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.server.ServerWebInputException;
//
///**
// * WebSocketConfig
// * 开始webSocket
// * WenHao.Sao
// */
//@Configuration
//public class WebSocketConfig {
//
// @Bean
// public ServerEndpointExporter serverEndpointExporter(){
// return new ServerEndpointExporter();
// }
//}

View File

@ -0,0 +1,29 @@
package com.god.base.server.webSocket.controller;
import com.god.base.server.webSocket.handler.SocketBatchHandler;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
/**
* @ClassName WebSocketBatchSever
* @Author WenHao.Sao
*/
@ServerEndpoint("/car/batch")
@Component
@Log4j2
public class WebSocketBatchSever {
/**
*
*/
@OnOpen
public void onOpen(Session session){
log.info("车辆大屏新连接" + session.getId());
SocketBatchHandler.sessions.add(session);
}
}

View File

@ -0,0 +1,31 @@
package com.god.base.server.webSocket.controller;
import com.god.base.server.webSocket.entity.SocketData;
import com.god.base.server.webSocket.handler.SocketHandler;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
/**
* WebSocketServer
*/
@ServerEndpoint("/vehicle/realTime/{vin}")
@Component
@Log4j2
public class WebSocketServer {
/**
*
*/
@OnOpen
public void onOpen(Session session , @PathVariable("vin") String vin){
log.info("车辆实时轨迹,新连接:{}" , session.getId());
SocketData socketData = new SocketData();
socketData.setVin(vin);
socketData.setSession(session);
SocketHandler.socketList.add(socketData);
}
}

View File

@ -0,0 +1,21 @@
package com.god.base.server.webSocket.entity;
import lombok.Data;
import javax.websocket.Session;
/**
* @ClassName SocketData
* @Author WenHao.Sao
*/
@Data
public class SocketData {
/**
* vin
*/
private String vin;
/**
*
*/
private Session session;
}

View File

@ -0,0 +1,17 @@
package com.god.base.server.webSocket.entity;
import com.god.base.server.common.domain.VehicleMessage;
import lombok.Data;
import java.util.List;
/**
* @ClassName VehicleAllData
* @Author WenHao.Sao
*/
@Data
public class VehicleAllData {
private List<VehicleMessage> messages;
private String info;
}

View File

@ -0,0 +1,57 @@
package com.god.base.server.webSocket.handler;
import com.alibaba.fastjson.JSON;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.common.domainConstants.RedisConstant;
import com.god.base.server.mapper.CarMapper;
import com.god.base.server.webSocket.entity.VehicleAllData;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.websocket.Session;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
* @author swhmac
* @Date 2023/11/20 14:37
*/
@Log4j2
@Component
public class SocketBatchHandler {
public static CopyOnWriteArrayList<Session> sessions = new CopyOnWriteArrayList<>();
@Autowired
private CarMapper carMapper;
@Autowired
private RedisTemplate redisTemplate;
@Scheduled(cron = "0/1 * * * * ?")
public void sendMessageFlush(){
for (Session session : sessions) {
List<String> ids = carMapper.getOnlineCarIds();
List<VehicleMessage> messages = ids.stream().map(id -> {
VehicleMessage message = (VehicleMessage) redisTemplate.opsForValue().get(RedisConstant.CURRENT_INFO + ":" + id);
return message;
}).collect(Collectors.toList());
Integer day = (Integer) redisTemplate.opsForValue().get(RedisConstant.VEHICLE_INFO_TOKEN+RedisConstant.CURRENT_DAY_FAULT);
Integer month = (Integer) redisTemplate.opsForValue().get(RedisConstant.VEHICLE_INFO_TOKEN+RedisConstant.CURRENT_MONTH_FAULT);
Integer onlineCount = carMapper.getOnlineCarCount();
Integer unOnlineCount = carMapper.getUnOnlineCount();
VehicleAllData vehicleAllData = new VehicleAllData();
vehicleAllData.setMessages(messages);
vehicleAllData.setInfo(day+":"+month+":"+onlineCount+":"+unOnlineCount);
try {
session.getBasicRemote().sendText(JSON.toJSONString(vehicleAllData));
} catch (Exception e) {
log.info("{}:连接中断",session.getId());
sessions.remove(session);
}
}
}
}

View File

@ -0,0 +1,42 @@
package com.god.base.server.webSocket.handler;
import com.alibaba.fastjson.JSON;
import com.god.base.server.common.domain.VehicleMessage;
import com.god.base.server.common.domainConstants.RedisConstant;
import com.god.base.server.webSocket.entity.SocketData;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.websocket.Session;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* @author swhmac
* @Date 2023/11/20 15:51
*/
@Log4j2
@Component
public class SocketHandler {
//存放每个客户端对应的MyWebSocket
public static CopyOnWriteArrayList<SocketData> socketList = new CopyOnWriteArrayList<>();
@Autowired
private RedisTemplate redisTemplate;
@Scheduled(cron = "0/1 * * * * ?")
public void sendMessageFlush(){
for (SocketData socketData : socketList) {
Session session = socketData.getSession();
VehicleMessage msg = (VehicleMessage) redisTemplate.opsForValue().get(RedisConstant.CURRENT_INFO + ":" + socketData.getVin());
try {
session.getBasicRemote().sendText(JSON.toJSONString(msg));
} catch (Exception e) {
log.info("{}:连接中断",socketData.getSession().getId());
socketList.remove(socketData);
}
}
}
}

View File

@ -40,4 +40,19 @@
</where> </where>
</select> </select>
<select id="getOnlineCarIds" resultType="java.lang.String">
select vin
from car where vehicle_status = 1
</select>
<select id="getOnlineCarCount" resultType="java.lang.Integer">
select count(*)
from t_car where status = 1
</select>
<select id="getUnOnlineCount" resultType="java.lang.Integer">
select count(*)
from t_car
</select>
</mapper> </mapper>