车辆数据模拟

master
DongZeLiang 2023-11-27 14:54:12 +08:00
parent 8fd9aea58a
commit 8413e2e627
18 changed files with 371 additions and 47 deletions

View File

@ -38,4 +38,6 @@ public class VehicleController {
vehicleService.generate(sum);
return Result.success();
}
}

View File

@ -1,6 +1,9 @@
package com.muyu.controller;
import com.muyu.common.Result;
import com.muyu.domain.req.CheckPositionReq;
import com.muyu.domain.req.GearReq;
import com.muyu.domain.req.MsgReq;
import com.muyu.domain.req.VehicleInstanceListReq;
import com.muyu.domain.resp.VehicleInstanceResp;
import com.muyu.service.VehicleInstanceService;
@ -55,4 +58,35 @@ public class VehicleInstanceController {
this.vehicleInstanceService.vehicleClientClose(vin);
return Result.success();
}
/**
*
* @param checkPositionReq
* @return
*/
@PostMapping("/position/check")
public Result<String> checkPosition(@RequestBody CheckPositionReq checkPositionReq){
this.vehicleInstanceService.checkPosition(checkPositionReq);
return Result.success();
}
/**
*
* @return
*/
@PostMapping("/msg")
public Result<String> msg(@RequestBody MsgReq msgReq){
this.vehicleInstanceService.msg(msgReq);
return Result.success();
}
/**
*
* @return
*/
@PostMapping("/gear")
public Result<String> gear(@RequestBody GearReq gearReq){
this.vehicleInstanceService.gear(gearReq);
return Result.success();
}
}

View File

@ -0,0 +1,32 @@
package com.muyu.controller;
import com.muyu.common.Result;
import com.muyu.domain.PositionRouteInfo;
import com.muyu.service.PositionRouteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2023-11-27 10:50
*/
@RestController
@RequestMapping("/position")
public class VehiclePositionController {
@Autowired
private PositionRouteService positionRouteService;
@GetMapping("/list")
public Result<List<String>> listAll(){
List<PositionRouteInfo> positionRouteInfos = positionRouteService.list();
List<String> list = positionRouteInfos.stream().map(PositionRouteInfo::getName)
.toList();
return Result.success(list);
}
}

View File

@ -20,7 +20,7 @@ import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@TableName("route_info")
public class RouteInfo {
public class PositionRouteInfo {
/**
*

View File

@ -0,0 +1,28 @@
package com.muyu.domain.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author DongZl
* @description:
* @Date 2023-11-27 11:04
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CheckPositionReq {
/**
* VIN
*/
private String vin;
/**
*
*/
private String positionCode;
}

View File

@ -0,0 +1,28 @@
package com.muyu.domain.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author DongZl
* @description:
* @Date 2023-11-27 02:37
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GearReq {
/**
* VIN
*/
private String vin;
/**
*
*/
private String gear;
}

View File

@ -0,0 +1,28 @@
package com.muyu.domain.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author DongZl
* @description: msg
* @Date 2023-11-27 02:15
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MsgReq {
/**
* VIN
*/
private String vin;
/**
*
*/
private String msgCode;
}

View File

@ -6,6 +6,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author DongZl
* @description:
@ -25,12 +27,43 @@ public class VehicleInstanceResp {
/**
* 线
*/
public boolean isOnline;
private boolean isOnline;
/**
* 线
*/
private String positionCode;
/**
* 线
*/
private Integer positionLength = 0;
/**
*
*/
private String msgCode;
/**
*
*/
private String gear = "P";
/**
*
*/
private BigDecimal mileage;
public static VehicleInstanceResp instanceBuild (VehicleInstance vehicleInstance) {
return VehicleInstanceResp.builder()
.vin(vehicleInstance.getVin())
.isOnline(vehicleInstance.isOnline())
.positionCode(vehicleInstance.getPositionCode())
.positionLength(vehicleInstance.getPositionQueue().size())
.gear(vehicleInstance.getVehicleData().getGear())
.msgCode(vehicleInstance.getMsgCode())
.mileage(vehicleInstance.getVehicleData().getMileage())
.build();
}
}

View File

@ -1,12 +1,12 @@
package com.muyu.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.domain.RouteInfo;
import com.muyu.domain.PositionRouteInfo;
/**
* @author DongZl
* @description: mapper
* @Date 2023-11-20 09:32
*/
public interface RouteMapper extends BaseMapper<RouteInfo> {
public interface PositionRouteMapper extends BaseMapper<PositionRouteInfo> {
}

View File

@ -1,7 +1,7 @@
package com.muyu.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.domain.RouteInfo;
import com.muyu.domain.PositionRouteInfo;
import com.muyu.domain.model.PositionModel;
import java.util.List;
@ -11,7 +11,7 @@ import java.util.List;
* @description:
* @Date 2023-11-20 09:33
*/
public interface RouteService extends IService<RouteInfo> {
public interface PositionRouteService extends IService<PositionRouteInfo> {
/**
@ -20,4 +20,11 @@ public interface RouteService extends IService<RouteInfo> {
* @return ID
*/
public List<PositionModel> getPositionModelByRouteId(Long routeId);
/**
*
* @param positionCode
* @return
*/
List<PositionModel> getPositionModelByRouteName (String positionCode);
}

View File

@ -1,6 +1,9 @@
package com.muyu.service;
import com.muyu.domain.Vehicle;
import com.muyu.domain.req.CheckPositionReq;
import com.muyu.domain.req.GearReq;
import com.muyu.domain.req.MsgReq;
import com.muyu.domain.req.VehicleInstanceListReq;
import com.muyu.domain.resp.VehicleInstanceResp;
@ -44,4 +47,22 @@ public interface VehicleInstanceService {
* @param vin vin
*/
void vehicleClientClose (String vin);
/**
*
* @param checkPositionReq
*/
void checkPosition (CheckPositionReq checkPositionReq);
/**
*
* @param msgReq
*/
void msg (MsgReq msgReq);
/**
*
* @param gearReq
*/
void gear (GearReq gearReq);
}

View File

@ -0,0 +1,54 @@
package com.muyu.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.domain.PositionRouteInfo;
import com.muyu.domain.model.PositionModel;
import com.muyu.mapper.PositionRouteMapper;
import com.muyu.service.PositionRouteService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2023-11-20 09:34
*/
@Service
public class PositionRouteServiceImpl extends ServiceImpl<PositionRouteMapper, PositionRouteInfo> implements PositionRouteService {
/**
* ID
*
* @param routeId ID
*
* @return ID
*/
@Override
public List<PositionModel> getPositionModelByRouteId (Long routeId) {
PositionRouteInfo positionRouteInfo = this.getById(routeId);
return JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
.stream()
.map(PositionModel::strBuild)
.toList();
}
/**
*
*
* @param positionCode
*
* @return
*/
@Override
public List<PositionModel> getPositionModelByRouteName (String positionCode) {
LambdaQueryWrapper<PositionRouteInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PositionRouteInfo::getName, positionCode);
PositionRouteInfo positionRouteInfo = getOne(queryWrapper);
return JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
.stream()
.map(PositionModel::strBuild)
.toList();
}
}

View File

@ -1,35 +0,0 @@
package com.muyu.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.domain.RouteInfo;
import com.muyu.domain.model.PositionModel;
import com.muyu.mapper.RouteMapper;
import com.muyu.service.RouteService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author DongZl
* @description:
* @Date 2023-11-20 09:34
*/
@Service
public class RouteServiceImpl extends ServiceImpl<RouteMapper, RouteInfo> implements RouteService {
/**
* ID
*
* @param routeId ID
*
* @return ID
*/
@Override
public List<PositionModel> getPositionModelByRouteId (Long routeId) {
RouteInfo routeInfo = this.getById(routeId);
return JSONArray.parseArray(routeInfo.getRouteData(), String.class)
.stream()
.map(PositionModel::strBuild)
.toList();
}
}

View File

@ -1,15 +1,24 @@
package com.muyu.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.muyu.domain.PositionRouteInfo;
import com.muyu.domain.Vehicle;
import com.muyu.domain.model.PositionModel;
import com.muyu.domain.req.CheckPositionReq;
import com.muyu.domain.req.GearReq;
import com.muyu.domain.req.MsgReq;
import com.muyu.domain.req.VehicleInstanceListReq;
import com.muyu.domain.resp.VehicleInstanceResp;
import com.muyu.service.PositionRouteService;
import com.muyu.service.VehicleInstanceService;
import com.muyu.vehicle.VehicleInstance;
import com.muyu.vehicle.core.LocalContainer;
import com.muyu.vehicle.model.VehicleData;
import com.muyu.vehicle.model.properties.MqttProperties;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ -22,6 +31,10 @@ import java.util.List;
@Log4j2
@Service
public class VehicleInstanceServiceImpl implements VehicleInstanceService {
@Autowired
private PositionRouteService positionRouteService;
/**
*
*
@ -100,4 +113,48 @@ public class VehicleInstanceServiceImpl implements VehicleInstanceService {
vehicleInstance.closeClient();
}
/**
*
*
* @param checkPositionReq
*/
@Override
public void checkPosition (CheckPositionReq checkPositionReq) {
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(checkPositionReq.getVin());
List<PositionModel> positionModelList =
this.positionRouteService.getPositionModelByRouteName(checkPositionReq.getPositionCode());
vehicleInstance.settingPosition(positionModelList);
vehicleInstance.setPositionCode(checkPositionReq.getPositionCode());
}
/**
*
*
* @param msgReq
*/
@Override
public void msg (MsgReq msgReq) {
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(msgReq.getVin());
switch (msgReq.getMsgCode()){
case "上报" -> {
vehicleInstance.initVehicleThread();
vehicleInstance.startSend();
}
case "暂停" -> vehicleInstance.pauseSend();
case "停止" -> vehicleInstance.stopSend();
default -> throw new RuntimeException("车辆消息事件错误");
}
}
/**
*
*
* @param gearReq
*/
@Override
public void gear (GearReq gearReq) {
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(gearReq.getVin());
vehicleInstance.setGear(gearReq.getGear());
}
}

View File

@ -43,10 +43,15 @@ import static com.muyu.common.SystemConstant.*;
@AllArgsConstructor
public class VehicleInstance {
/**
* 线
*/
private String positionCode;
/**
*
*/
private final LinkedBlockingQueue<PositionModel> positionQueue = new LinkedBlockingQueue<>();
private LinkedBlockingQueue<PositionModel> positionQueue = new LinkedBlockingQueue<>();
/**
*
*/
@ -63,7 +68,10 @@ public class VehicleInstance {
* 线
*/
private VehicleThread vehicleThread;
/**
*
*/
private String msgCode;
/**
* 线
*/
@ -170,6 +178,7 @@ public class VehicleInstance {
* @param positionModelList 线
*/
public void settingPosition(List<PositionModel> positionModelList){
positionQueue.clear();
positionModelList.forEach(positionQueue::offer);
log.info("车辆:{} 设置路径成功", this.getVin());
}
@ -178,10 +187,12 @@ public class VehicleInstance {
* 线
*/
public void initVehicleThread() {
if (this.positionCode == null){
throw new RuntimeException("车辆["+getVin()+"]为选中路径");
}
VehicleThread vehicleThread = new VehicleThread();
vehicleThread.setVehicleInstance(this);
this.setVehicleThread(vehicleThread);
this.vehicleThread.pause();
ScheduledFuture<?> scheduledFuture = ThreadPool.submit(vehicleThread);
this.setScheduledFuture(scheduledFuture);
log.info("初始化车辆上报模拟线程开始:[{}]", this.getVin());
@ -191,21 +202,27 @@ public class VehicleInstance {
* 线
*/
public void startSend() {
this.msgCode = "上报";
this.vehicleThread.resume();
log.info("车辆[{}],开始上报", this.getVin());
}
/**
* 线
*/
public void pauseSend() {
this.msgCode = "暂停";
this.vehicleThread.pause();
log.info("车辆[{}],暂停上报", this.getVin());
}
/**
*
*/
public void stopSend() {
this.msgCode = "停止";
this.vehicleThread.stop();
log.info("车辆[{}],停止上报", this.getVin());
}
/**

View File

@ -392,9 +392,27 @@ public class VehicleData {
public static VehicleData vehicleBuild (Vehicle vehicle) {
return VehicleData.builder()
.vin(vehicle.getVin())
.gear("P")
.remainingBattery(vehicle.getRemainingBattery())
.batteryLevel(vehicle.getBatteryLevel())
.mileage(vehicle.getTotalMileage())
.vehicleStatus(1)
.chargingStatus(1)
.operatingStatus(1)
.socStatus(1)
.chargingEnergyStorageStatus(1)
.driveMotorStatus(1)
.positionStatus(1)
.easStatus(1)
.ptcStatus(1)
.epsStatus(1)
.absStatus(1)
.mcuStatus(1)
.heatingStatus(1)
.batteryStatus(1)
.batteryInsulationStatus(1)
.dcdcStatus(1)
.chgStatus(1)
.build();
}

View File

@ -1,7 +1,7 @@
insert into vehicle(vin, remaining_battery, total_mileage, battery_level, create_time)
values
('VIN1234567891234',45000,12.483, 45000, CURRENT_TIMESTAMP()),
('VIN123456789DIJE',45000,23.696, 45000, CURRENT_TIMESTAMP());
('VIN12345678912345',45000,12.483, 45000, CURRENT_TIMESTAMP()),
('VIN123456789DIJE4',45000,23.696, 45000, CURRENT_TIMESTAMP());
insert into route_info (id, name, data, create_time)
values

View File

@ -8,7 +8,7 @@ create table if not exists vehicle (
create table if not exists route_info (
`id` int primary key not null ,
`name` char (50) not null,
`name` char (3) not null,
`data` CLOB not null,
`create_time` datetime not null
) ;