| | |
| | | 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 |
| | |
| | | */ |
| | | @Service |
| | | public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements ICarService { |
| | | |
| | | @Value("${live.hls.output-path}") |
| | | private String hlsOutputPath; |
| | | |
| | | @Resource |
| | | private UPExgMsgRegisterClient upExgMsgRegisterClient; |
| | |
| | | |
| | | @Resource |
| | | private IDriverService driverService; |
| | | |
| | | @Resource |
| | | private ICarTypeService carTypeService; |
| | | |
| | | @Resource |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | |
| | | /** |
| | |
| | | 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.setLicensePlateColor(VehicleColorEnum.getName(vo.getVehicleColor())); |
| | | Enterprise enterprise = list1.stream().filter(s -> s.getCode().equals(vo.getInferiorPlatformId().toString())).findFirst().get(); |
| | | car.setEnterpriseId(enterprise.getId()); |
| | | Driver driver = driverService.getOne(new LambdaQueryWrapper<Driver>().eq(Driver::getVehicleNumber, vo.getVehicleNo()).eq(Driver::getStatus, 1)); |
| | | if (null != driver) { |
| | | car.setDriverId(driver.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); |
| | | } |
| | | this.saveBatch(carList); |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 定时保存车辆司机id |
| | | */ |
| | | @Override |
| | | public void taskSaveDriverId() { |
| | | List<Driver> driverList = driverService.list(new LambdaQueryWrapper<Driver>().eq(Driver::getStatus, 1)); |
| | | List<Car> list = this.list(new LambdaQueryWrapper<Car>().isNull(Car::getDriverId)); |
| | | for (Car car : list) { |
| | | Optional<Driver> optional = driverList.stream().filter(s -> s.getVehicleNumber().equals(car.getVehicleNumber())).findFirst(); |
| | | if (optional.isPresent()) { |
| | | car.setDriverId(optional.get().getId()); |
| | | this.updateById(car); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取车辆列表数据 |
| | | * |
| | | * @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, 3); |
| | | updateWrapper.eq(Car::getId, car.getId()); |
| | | 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, 3); |
| | | updateWrapper.eq(Car::getId, car.getId()); |
| | | this.update(updateWrapper); |
| | | } else { |
| | | if (car.getStatus() != 1) { |
| | | updateWrapper.set(Car::getDownlineTime, null); |
| | | updateWrapper.set(Car::getOnlineTime, LocalDateTime.now()); |
| | | } |
| | | updateWrapper.set(Car::getStatus, 1); |
| | | updateWrapper.eq(Car::getId, car.getId()); |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |