From 93c20ce82e56710f7cf93789e7ac7a06153111a1 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期三, 04 六月 2025 16:13:28 +0800 Subject: [PATCH] 优化附件 --- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 162 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java index 2e30d27..9e46f1f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java @@ -1,26 +1,46 @@ package com.ruoyi.system.service.impl; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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 @@ -28,6 +48,9 @@ */ @Service public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements ICarService { + + @Value("${live.hls.output-path}") + private String hlsOutputPath; @Resource private UPExgMsgRegisterClient upExgMsgRegisterClient; @@ -37,6 +60,12 @@ @Resource private IDriverService driverService; + + @Resource + private ICarTypeService carTypeService; + + @Resource + private RedisTemplate redisTemplate; /** @@ -54,6 +83,7 @@ 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(); @@ -61,17 +91,47 @@ 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); + } + } + } /** * 获取车辆列表数据 @@ -84,4 +144,102 @@ 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(); + } + } + + + + public void taskGetCarDeviceId(){ + Object o = redisTemplate.opsForValue().get("chuzu:token"); + String access_Token = ""; + if(null == o){ + HttpRequest get = HttpUtil.createGet("http://116.169.59.170:9986/MediaAPI/Token?token=shehongchuzu"); + HttpResponse execute = get.execute(); + String body = execute.body(); + Integer expires_in = JSON.parseObject(body).getInteger("Expires_In"); + access_Token = JSON.parseObject(body).getString("Access_Token"); + redisTemplate.opsForValue().set("chuzu:token", access_Token, expires_in, TimeUnit.SECONDS); + } + //获取车辆数据 + List<Car> cars = this.list(new QueryWrapper<Car>().eq("enterprise_id", 5)); + HttpRequest get = HttpUtil.createGet("http://116.169.59.170:9986/MediaAPI/BaseInfo/GetVehicleInfo?accessToken=" + access_Token + "&tenantNo=射洪出租"); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONObject jsonObject = JSON.parseObject(body); + Integer resultState = jsonObject.getInteger("ResultState"); + if(null != resultState && 1 == resultState){ + JSONArray resultData = jsonObject.getJSONArray("ResultData"); + for (int i = 0; i < resultData.size(); i++) { + JSONObject jsonObject1 = resultData.getJSONObject(i); + String vehicleNo = jsonObject1.getString("VehicleNo"); + String Deviceid = jsonObject1.getString("Deviceid"); + cars.stream().filter(s->s.getVehicleNumber().equals(vehicleNo)).findFirst().ifPresent(car -> { + car.setDeviceId(Deviceid); + this.updateById(car); + }); + } + } + } + } -- Gitblit v1.7.1