Merge remote-tracking branch 'origin/master'

master
chenchenxinhai 2023-11-26 19:44:04 +08:00
commit f08b15903d
25 changed files with 1225 additions and 39 deletions

View File

@ -0,0 +1,32 @@
package com.god.base.server.common.constants;
/**
*
*/
public class VehicleConstant {
/**
*
*/
public static final Integer VEHICLE_START = 1;
/**
*
*/
public static final Integer VEHICLE_END = 0 ;
/**
*
*/
public static final String VEHICLE_STATUS_UPDATE_QUEUE = "vehicle_status_update_queue";
/**
*
*/
public static final String VEHICLE_INFO_MAP = "vehicle_info_map";
}

View File

@ -12,8 +12,7 @@ import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @ClassName Car
* @Author WenHao.Sao
*
*/
@Data
@AllArgsConstructor
@ -22,6 +21,8 @@ import java.util.Date;
@TableName(value = "t_car")
public class Car {
private static final long serialVersionUID = 1L;
/**
* Vin
*/
@ -123,6 +124,15 @@ public class Car {
@Excel(name = "车辆状态")
private int status;
/**
*
*/
private String fenceName;
/**
*
*/
private String carTypeName;
public static Car carBuildAdd(CarRequest carRequest){
return Car.builder()
.carVinId(carRequest.getCarVinId())

View File

@ -0,0 +1,66 @@
package com.god.base.server.common.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.god.common.core.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("driving_record")
@Builder
public class DrivingRecord {
private static final long serialVersionUID = 1L;
/**
* id
*/
private long id;
/**
* vin
*/
private String vin;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "开始时间" , width = 30 , dateFormat = "yyyy-MM-dd")
private Date startTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "结束时间" , width = 30 , dateFormat = "yyyy-MM-dd")
private Date endTime;
/**
*
*/
private String startKey;
/**
*
*/
private String endKey;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id",getId())
.append("vin",getVin())
.append("startTime",getStartTime())
.append("endTime",getEndKey())
.append("startKey",getStartKey())
.append("endKey",getEndKey())
.toString();
}
}

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

@ -6,7 +6,7 @@ server:
spring:
application:
# 应用名称
name: god-car-management
name: god-car-base
profiles:
# 环境配置
active: dev

View File

@ -2,8 +2,10 @@ package com.god.base.server.controller;
import com.alibaba.fastjson.JSONObject;
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.service.CarService;
import com.god.base.server.util.AopConfig;
import com.god.common.core.domain.Result;
import com.god.common.core.utils.poi.ExcelUtil;
import com.god.common.core.web.controller.BaseController;
@ -34,6 +36,9 @@ public class CarController extends BaseController {
@Autowired
private CarService carService;
@Autowired
private AopConfig aopConfig;
/**
*
@ -41,19 +46,10 @@ public class CarController extends BaseController {
@RequiresPermissions
@GetMapping("/list")
public Result<TableDataInfo<Car>> list(@RequestBody CarRequest carRequest){
log.info("功能介绍车辆信息列表查看,请求方式:{},请求路径:{},请求参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(carRequest));
startPage();//设置请求分页数据
List<Car> list = carService.selectCarInfoList(carRequest);
log.info("功能介绍车辆信息列表查看,响应方式:{},响应路径:{},响应参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(list));
return getDataTable(list);
}
@ -148,12 +144,21 @@ public class CarController extends BaseController {
util.exportExcel(response,list,"车辆信息管理");
}
/**
*
* 线
*/
@PostMapping
public Result sSgj(){
return null;
@GetMapping("/onlineVehicle")
public Result<List<VehicleMessage>> onlineVehicle(){
return carService.onlineVehicle();
}
/**
*
*/
@GetMapping("/countData")
public Result<String> countData(){
return carService.countData();
}

View File

@ -0,0 +1,182 @@
package com.god.base.server.controller;
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.common.core.domain.Result;
import com.god.common.core.utils.poi.ExcelUtil;
import com.god.common.core.web.controller.BaseController;
import com.god.common.core.web.page.TableDataInfo;
import com.god.common.log.annotation.Log;
import com.god.common.log.enums.BusinessType;
import com.god.common.security.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
/**
* DrivingRecordController
*/
@RestController
@RequestMapping("/record")
public class DrivingRecordController extends BaseController {
@Autowired
private IDrivingRecordService drivingRecordService;
/**
*
*
* @param drivingRecord
* @return
*/
@RequiresPermissions("record:record:list")
@GetMapping("list")
public Result<TableDataInfo<DrivingRecord>> list(DrivingRecord drivingRecord){
//设置请求分页数据
startPage();
List<DrivingRecord> list = drivingRecordService.selectDrivingRecordList(drivingRecord);
return getDataTable(list);
}
/**
*
* @param response
* @param drivingRecord
*/
@RequiresPermissions("record:record:export")
@Log(title = "车辆行驶记录" , businessType = BusinessType.EXPORT) // 导出
@PostMapping("export")
public void export(HttpServletResponse response , DrivingRecord drivingRecord)
{
List<DrivingRecord> list = drivingRecordService.selectDrivingRecordList(drivingRecord);
ExcelUtil<DrivingRecord> util = new ExcelUtil<>(DrivingRecord.class);
//对list数据源将其里面的数据导入到excel表中
util.exportExcel(response , list , "车辆行驶记录数据");
}
/**
*
* @param id
* @return
*/
@GetMapping(value = "/{id}")
public Result getInfo(@PathVariable("id") Long id){ //操作信息提醒
//返回成功数据 | 查询车辆行驶记录
return Result.success(drivingRecordService.selectDrivingRecordById(id));
}
/**
*
* @param drivingRecord
* @return
*/
@RequiresPermissions("record:record:add")
@Log(title = "车辆行驶记录" , businessType = BusinessType.INSERT) // 新增
@PostMapping
public Result add(@RequestBody DrivingRecord drivingRecord){
//响应返回结果 | 新增车辆行驶记录
return Result.success(drivingRecordService.insertDrivingRecord(drivingRecord));
}
/**
*
* @param drivingRecord
* @return
*/
@RequiresPermissions("record:record:edit")
@Log(title = "车辆行驶记录" , businessType = BusinessType.UPDATE) // 修改
@PutMapping
public Result edit(@RequestBody DrivingRecord drivingRecord)
{
//响应返回结果 | 修改车辆行驶记录
return Result.success(drivingRecordService.updateDrivingRecord(drivingRecord));
}
/**
*
* @param ids
* @return
*/
@RequiresPermissions("record:record:remove")
@Log(title = "车辆行驶记录" , businessType = BusinessType.DELETE) // 删除
@DeleteMapping("/{ids}")
public Result remove(@PathVariable Long[] 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

@ -15,6 +15,8 @@ import com.god.base.common.domain.request.FenceAddRequest;
import com.god.base.common.domain.request.FenceQueryRequest;
import com.god.base.server.service.FenceService;
import com.god.common.core.web.page.TableDataInfo;
import com.god.common.log.annotation.Log;
import com.god.common.log.enums.BusinessType;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@ -42,15 +44,10 @@ public class FenceController {
* @return
*/
@PostMapping("/insertFence")
@Log(title = "添加围栏", businessType = BusinessType.INSERT)
public Result<String> insertFence(@RequestBody @Validated FenceAddRequest fenceAddRequest){
log.info("功能介绍新增电子围栏,请求方式;{},请求路径:{},请求参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(fenceAddRequest));
//围栏添加
fenceService.save(Fence.fenceBuildAdd(fenceAddRequest));
return Result.success();
}
@ -61,12 +58,8 @@ public class FenceController {
* @return
*/
@PostMapping("/updateFence")
@Log(title = "编辑围栏",businessType = BusinessType.UPDATE)
public Result<String> updateFence(@RequestBody @Validated Fence fence){
log.info("功能介绍:编辑围栏信息,请求方式:{},请求路径:{},请求参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(fence));
//编辑电子围栏信息
fenceService.updateById(fence);
@ -80,12 +73,8 @@ public class FenceController {
* @return
*/
@GetMapping("/deleteFence")
@Log(title = "根据围栏编号删除围栏",businessType = BusinessType.DELETE)
public Result<String> deleteFence(@RequestParam("fenceId") Integer fenceId){
log.info("功能介绍:通过围栏编号删除围栏,请求方式:{},请求路径:{},请求参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(fenceId));
//根据围栏编号删除围栏
fenceService.removeById(fenceId);
return Result.success();
@ -98,16 +87,10 @@ public class FenceController {
* @return
*/
@PostMapping("/fenceListAndPage")
@Log(title = "查询围栏信息",businessType = BusinessType.FORCE)
public Result<TableDataInfo<Fence>> fenceListAndPage(@RequestBody FenceQueryRequest fenceQueryRequest){
log.info("功能介绍:查询围栏列表,请求方式:{},请求路径:{},请求参数:{}",
request.getMethod(),
request.getRequestURL(),
JSONObject.toJSONString(fenceQueryRequest));
//分页查询围栏列表
TableDataInfo<Fence> dataInfo = fenceService.fenceListAndPage(fenceQueryRequest);
return Result.success(dataInfo);
}
}

View File

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

View File

@ -0,0 +1,68 @@
package com.god.base.server.mapper;
import com.god.base.server.common.domain.DrivingRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* mapper
*/
@Mapper
public interface DrivingRecordMapper {
/**
*
* @param drivingRecord
* @return
*/
List<DrivingRecord> selectDrivingRecordList(DrivingRecord drivingRecord);
/**
*
* @param id
* @return
*/
DrivingRecord selectDrivingRecordById(@Param("id") Long id);
/**
*
* @param drivingRecord
* @return
*/
int insertDrivingRecord(DrivingRecord drivingRecord);
/**
*
* @param drivingRecord
* @return
*/
int updateDrivingRecord(DrivingRecord drivingRecord);
/**
*
* @param ids
* @return
*/
int deleteDrivingRecordByIds(@Param("ids") Long[] ids);
}

View File

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

View File

@ -0,0 +1,65 @@
package com.god.base.server.service;
import com.god.base.server.common.domain.DrivingRecord;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Service
*/
public interface IDrivingRecordService {
/**
*
* @param drivingRecord
* @return
*/
List<DrivingRecord> selectDrivingRecordList(DrivingRecord drivingRecord);
/**
*
* @param id
* @return
*/
DrivingRecord selectDrivingRecordById(@Param("id") Long id);
/**
*
* @param drivingRecord
* @return
*/
int insertDrivingRecord(DrivingRecord drivingRecord);
/**
*
* @param drivingRecord
* @return
*/
int updateDrivingRecord(DrivingRecord drivingRecord);
int deleteDrivingRecordByIds(Long[] ids);
}

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.extension.service.impl.ServiceImpl;
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.domainConstants.RedisConstant;
import com.god.base.server.mapper.CarMapper;
import com.god.base.server.service.CarService;
import com.god.common.core.domain.Result;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
/**
*
@ -25,6 +29,9 @@ public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements CarSe
@Autowired
private CarMapper carMapper;
@Autowired
private RedisTemplate redisTemplate;
/**
*
@ -129,5 +136,28 @@ public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements CarSe
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,99 @@
package com.god.base.server.service.impl;
import com.god.base.server.common.domain.DrivingRecord;
import com.god.base.server.mapper.DrivingRecordMapper;
import com.god.base.server.service.IDrivingRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @ClassName IDrivingRecordServiceImpl
* @Author WenHao.Sao
*/
/**
* Service
*/
@Service
public class IDrivingRecordServiceImpl implements IDrivingRecordService {
@Autowired
private DrivingRecordMapper drivingRecordMapper;
@Override
public List<DrivingRecord> selectDrivingRecordList(DrivingRecord drivingRecord) {
return drivingRecordMapper.selectDrivingRecordList(drivingRecord);
}
/**
*
* @param id
* @return
*/
@Override
public DrivingRecord selectDrivingRecordById(Long id) {
return drivingRecordMapper.selectDrivingRecordById(id);
}
/**
*
* @param drivingRecord
* @return
*/
@Override
public int insertDrivingRecord(DrivingRecord drivingRecord) {
return drivingRecordMapper.insertDrivingRecord(drivingRecord);
}
/**
*
* @param drivingRecord
* @return
*/
@Override
public int updateDrivingRecord(DrivingRecord drivingRecord) {
//修改车辆行驶记录
return drivingRecordMapper.updateDrivingRecord(drivingRecord);
}
/**
*
* @param ids
* @return
*/
@Override
public int deleteDrivingRecordByIds(Long[] ids) {
//批量删除车辆行驶记录
return drivingRecordMapper.deleteDrivingRecordByIds(ids);
}
}

View File

@ -0,0 +1,67 @@
package com.god.base.server.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* aop
*/
@Aspect
@Component
public class AopConfig {
//日志打印
private Logger logger = LoggerFactory.getLogger(this.getClass());
ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* @Description:
*/
@Pointcut("execution(* com.god.base.server.controller.*.*(..))")
public void print(){}
@Around("print()")
public Object LogStart(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
threadLocal.set(System.currentTimeMillis());
//使用ServletRequestAttributes请求上下文获取更多
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String typeName = proceedingJoinPoint.getSignature().getDeclaringTypeName();
String name = proceedingJoinPoint.getSignature().getName();
//使用数据来获取参数
Object[] pointArgs = proceedingJoinPoint.getArgs();
ObjectMapper objectMapper = new ObjectMapper();
logger.info("—_—方—_—_—法_—_—_—启—_—_—动—_—_—开—_—_—始—_—_—希—_—_—望—_—_—无—_—_—B—_—_—U—_—_—G—_—");
logger.info("|调用前是: 【{}】", typeName);
logger.info("|方法名称: 【{}】", name);
logger.info("|传递参数: 【{}】", objectMapper.writeValueAsString(objectMapper));
logger.info("|URL: 【{}】", request.getRequestURI().toString());
logger.info("IP: 【{}】", request.getRemoteAddr());
logger.info("______________________________________________________________________");
Object proceed = proceedingJoinPoint.proceed();
logger.info("|调用前是: 【{}】", typeName);
logger.info("|方法名称: 【{}】", name);
logger.info("|传递参数: 【{}】", objectMapper.writeValueAsString(objectMapper));
logger.info("|URL: 【{}】", request.getRequestURI().toString());
logger.info("IP: 【{}】", request.getRemoteAddr());
logger.info("|耗时: 【{}】", System.currentTimeMillis() - threadLocal.get());
return proceed;
}
}

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>
</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>

View File

@ -0,0 +1,93 @@
<?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.god.base.server.mapper.DrivingRecordMapper">
<resultMap id="DrivingRecordResult" type="com.god.base.server.common.domain.DrivingRecord">
<result property="id" column="id"/>
<result property="vin" column="vin"/>
<result property="startTime" column="start_time"/>
<result property="startKey" column="start_key"/>
<result property="endTime" column="end_time"/>
<result property="endKey" column="end_key"/>
</resultMap>
<sql id="selectDrivingRecordVo">
select id , vin ,start_time ,end_time , start_key , end_key , from driving_record
</sql>
<!-- 查询车辆行驶记录列表-->
<select id="selectDrivingRecordList" resultType="com.god.base.server.common.domain.DrivingRecord">
<include refid="selectDrivingRecordVo"/>
<where>
<if test="vin != null and vin != '' "> and vin = #{vin} </if>
<if test="startTime != null"> and start_time = #{startTime} </if>
<if test="endTime != null"> and endTime = #{endTime} </if>
</where>
</select>
<!-- 查询车辆行驶记录-->
<select id="selectDrivingRecordById" resultType="com.god.base.server.common.domain.DrivingRecord">
<include refid="selectDrivingRecordVo"/>
where id = #{id}
</select>
<!-- 新增车辆行驶记录 -->
<insert id="insertDrivingRecord" parameterType="com.god.base.server.common.domain.DrivingRecord" useGeneratedKeys="true" keyProperty="id" >
insert into driving_record
<trim prefix="(" suffix= ")" suffixOverrides=",">
<if test="vin != null and vin != '' ">vin,</if>
<if test="startTime != null">start_time,</if>
<if test="endTime != null">end_time,</if>
<if test="startTime != null ">start_time,</if>
<if test="endKey != null">end_key,</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test="vin != null and vin != '' ">#{vin},</if>
<if test="startTime != null">#{startTime},</if>
<if test="endTime != null">#{endTime},</if>
<if test="startKey != null ">#{startKey},</if>
<if test="endKey != null">#{endKey},</if>
</trim>
</insert>
<!-- 修改车辆行驶记录-->
<update id="updateDrivingRecord" parameterType="com.god.base.server.common.domain.DrivingRecord">
update driving_record
<trim prefix="SET" suffixOverrides=",">
<if test="vin != null and vin != '' ">vin = #{vin},</if>
<if test="startTime != null">start_time = #{startTime},</if>
<if test="endTime != null">end_time = #{endTime},</if>
<if test="startKey != null ">start_time = #{startKey},</if>
<if test="endKey != null">end_key = #{endKey},</if>
</trim>
where id = #{id}
</update>
<!-- 批量删除车辆行驶数据-->
<delete id="deleteDrivingRecordByIds" parameterType="String">
delete from drving_record where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{ids}
</foreach>
</delete>
</mapper>