package com.ruoyi.system.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.web.page.PageInfo;
|
import com.ruoyi.dataInterchange.api.feignClient.UPExgMsgRegisterClient;
|
import com.ruoyi.dataInterchange.api.model.enums.VehicleColorEnum;
|
import com.ruoyi.dataInterchange.api.vo.GnssDataVo;
|
import com.ruoyi.dataInterchange.api.vo.UPExgMsgRegisterVo;
|
import com.ruoyi.system.api.model.Car;
|
import com.ruoyi.system.api.model.CarType;
|
import com.ruoyi.system.api.model.Driver;
|
import com.ruoyi.system.api.model.Enterprise;
|
import com.ruoyi.system.mapper.CarMapper;
|
import com.ruoyi.system.query.CarListReq;
|
import com.ruoyi.system.query.CarListResp;
|
import com.ruoyi.system.service.ICarService;
|
import com.ruoyi.system.service.ICarTypeService;
|
import com.ruoyi.system.service.IDriverService;
|
import com.ruoyi.system.service.IEnterpriseService;
|
import com.ruoyi.system.util.JavaCVStreamUtil;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.time.LocalDateTime;
|
import java.time.ZoneOffset;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Optional;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2025/3/17 11:38
|
*/
|
@Service
|
public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements ICarService {
|
|
@Value("${live.hls.output-path}")
|
private String hlsOutputPath;
|
|
@Resource
|
private UPExgMsgRegisterClient upExgMsgRegisterClient;
|
|
@Resource
|
private IEnterpriseService enterpriseService;
|
|
@Resource
|
private IDriverService driverService;
|
|
@Resource
|
private ICarTypeService carTypeService;
|
|
@Resource
|
private RedisTemplate redisTemplate;
|
|
|
/**
|
* 定时任务存储最新的车辆数据
|
*/
|
@Override
|
public void taskSaveNewCar() {
|
Car car = this.getOne(new LambdaQueryWrapper<Car>().orderByDesc(Car::getCreateTime).last(" limit 0, 1"));
|
Long startTime = -1L;
|
if (null != car) {
|
startTime = car.getCreateTime().toEpochSecond(ZoneOffset.ofHours(8));
|
}
|
List<UPExgMsgRegisterVo> list = upExgMsgRegisterClient.getUPExgMsgRegisterListIsAfterCreateTime(startTime).getData();
|
if (null == list || list.isEmpty()) {
|
return;
|
}
|
List<Enterprise> list1 = enterpriseService.list();
|
List<Driver> driverList = driverService.list(new LambdaQueryWrapper<Driver>().eq(Driver::getStatus, 1));
|
List<Car> carList = new ArrayList<>();
|
for (UPExgMsgRegisterVo vo : list) {
|
car = new Car();
|
car.setVehicleNumber(vo.getVehicleNo());
|
car.setLicensePlateColor(VehicleColorEnum.getName(vo.getVehicleColor()));
|
Enterprise enterprise = list1.stream().filter(s -> s.getCode().equals(vo.getInferiorPlatformId().toString())).findFirst().get();
|
car.setEnterpriseId(enterprise.getId());
|
car.setOperateType(enterprise.getOperationType());
|
Optional<Driver> optional = driverList.stream().filter(s -> s.getVehicleNumber().equals(vo.getVehicleNo())).findFirst();
|
if (optional.isPresent()) {
|
car.setDriverId(optional.get().getId());
|
}
|
car.setGpsModel(vo.getTerminalModelType());
|
car.setGpsImei(vo.getTerminalSIMCode());
|
car.setLongitude(vo.getLongitude());
|
car.setLatitude(vo.getLatitude());
|
car.setCreateTime(LocalDateTime.now());
|
carList.add(car);
|
}
|
if (carList.size() > 0) {
|
this.saveBatch(carList);
|
//更新车辆类型统计数据
|
List<CarType> carTypeList = carTypeService.list();
|
List<Car> cars = this.list();
|
for (CarType carType : carTypeList) {
|
long count = cars.stream().filter(s -> s.getOperateType().equals(carType.getName())).count();
|
carType.setCarNum(count);
|
}
|
carTypeService.updateBatchById(carTypeList);
|
}
|
}
|
|
|
/**
|
* 获取车辆列表数据
|
*
|
* @param carListReq
|
* @return
|
*/
|
@Override
|
public PageInfo<CarListResp> getCarList(CarListReq carListReq) {
|
PageInfo<CarListResp> pageInfo = new PageInfo<>(carListReq.getPageCurr(), carListReq.getPageSize());
|
return this.baseMapper.getCarList(pageInfo, carListReq);
|
}
|
|
|
/**
|
* 定时任务修改车辆状态
|
*/
|
@Override
|
public void taskUpdateCarStatus() {
|
List<Car> list = this.list();
|
for (Car car : list) {
|
LambdaUpdateWrapper<Car> updateWrapper = new LambdaUpdateWrapper<>();
|
GnssDataVo gnssDataVo = (GnssDataVo) redisTemplate.opsForValue().get("location:" + car.getVehicleNumber());
|
if (null == gnssDataVo) {
|
if (car.getStatus() == 1) {
|
updateWrapper.set(Car::getDownlineTime, LocalDateTime.now());
|
}
|
updateWrapper.set(Car::getStatus, 4);
|
this.update(updateWrapper);
|
} else {
|
String dateTime = gnssDataVo.getDate() + " " + gnssDataVo.getTime();
|
LocalDateTime localDateTime = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
long second = localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
|
if (System.currentTimeMillis() / 1000 > second + 60) {
|
if (car.getStatus() == 1) {
|
updateWrapper.set(Car::getDownlineTime, LocalDateTime.now());
|
}
|
updateWrapper.set(Car::getStatus, 4);
|
this.update(updateWrapper);
|
} else {
|
if (car.getStatus() != 1) {
|
updateWrapper.set(Car::getDownlineTime, null);
|
updateWrapper.set(Car::getOnlineTime, LocalDateTime.now());
|
}
|
updateWrapper.set(Car::getStatus, 1);
|
this.update(updateWrapper);
|
}
|
}
|
}
|
}
|
|
|
/**
|
* 检测视频播放,清除没有播放的视频流
|
*/
|
@Override
|
public void taskPlayDetection(Integer deviceNumber) {
|
Car car = this.getById(deviceNumber);
|
try {
|
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
|
executorService.scheduleWithFixedDelay(new Runnable() {
|
@Override
|
public void run() {
|
if(!redisTemplate.hasKey("live:" + car.getId())){
|
String folderPath = hlsOutputPath + "hls\\" + car.getVehicleNumber();
|
JavaCVStreamUtil.close(car.getId(), folderPath);
|
}
|
}}, 1, 1, TimeUnit.MINUTES);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
|
}
|