From c3bfa381bfec2372c91f8c17f6f8cbf48fbd284d Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 30 五月 2025 14:11:48 +0800 Subject: [PATCH] 修改配置文件 --- guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java | 762 ++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 526 insertions(+), 236 deletions(-) diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java index 931e25e..301bf0e 100644 --- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java +++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java @@ -2,11 +2,13 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.model.PatrolTask; import com.stylefeng.guns.modular.system.model.TaskDetail; import com.stylefeng.guns.modular.system.model.TaskDetailVehicles; import com.stylefeng.guns.modular.system.model.TaskDetailVehiclesChannel; import com.stylefeng.guns.modular.system.model.enums.ImageModelEnum; +import com.stylefeng.guns.modular.system.model.enums.VideoChannelEnum; import com.stylefeng.guns.modular.system.model.vo.PatrolTaskVo; import com.stylefeng.guns.modular.system.model.vo.VehicleVo; import com.stylefeng.guns.modular.system.service.ITaskDetailService; @@ -24,7 +26,9 @@ import org.quartz.SchedulerException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.stylefeng.guns.modular.system.dao.PatrolTaskMapper; import com.stylefeng.guns.modular.system.service.IPatrolTaskService; @@ -35,7 +39,12 @@ import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.List; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * @author zhibing.pu @@ -57,6 +66,12 @@ @Autowired private QuartzUtil quartzUtil; + @Value("${maxThreadCount}") + private Integer maxThreadCount; + + @Resource + private RedisTemplate redisTemplate; + /** @@ -65,91 +80,97 @@ */ @Override public void addPatrolTask(PatrolTaskVo vo, String userId) { - if(vo.getStartTime().isAfter(vo.getEndTime())){ + if(vo.getType() == 1 && vo.getStartTime().isAfter(vo.getEndTime())){ throw new RuntimeException("结束时间不能小于开始时间"); } - //构建主数据 - PatrolTask patrolTask = new PatrolTask(); - BeanUtils.copyProperties(vo, patrolTask); - patrolTask.setCreateTime(LocalDateTime.now()); - patrolTask.setCreateUserId(Integer.valueOf(userId)); - this.insert(patrolTask); - if(vo.getType() == 2){ - //实时任务,手动添加后续逻辑中需要的数据 - LocalDateTime now = LocalDateTime.now(); - vo.setWeeks("[" + now.getDayOfWeek().getValue() + "]"); - vo.setStartTime(now); - vo.setExecutionTime(now.plusSeconds(5).format(DateTimeFormatter.ofPattern("HH:mm:ss"))); - vo.setEndTime(now.plusSeconds(10)); - } - String weeks = vo.getWeeks(); - List<Integer> week = JSON.parseArray(weeks, Integer.class); - //构建明细任务 - LocalDateTime startTime = vo.getStartTime(); - LocalDateTime endTime = vo.getEndTime(); - while (true){ - if(startTime.compareTo(endTime) >= 0){ - break; - } - int value = startTime.getDayOfWeek().getValue(); - if(week.contains(value)){ - TaskDetail taskDetail = new TaskDetail(); - taskDetail.setCode(UUIDUtil.getTimeStr()); - taskDetail.setPatrolTaskId(patrolTask.getId()); - taskDetail.setStatus(1); - String executionTime = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + vo.getExecutionTime(); - taskDetail.setExecutionTime(LocalDateTime.parse(executionTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - taskDetail.setDelFlag(0); - taskDetailService.insert(taskDetail); - - //添加任务和车船关系数据 - List<VehicleVo> vehicle = vo.getVehicle(); - for (VehicleVo vehicleVo : vehicle) { - TaskDetailVehicles taskDetailVehicles = new TaskDetailVehicles(); - taskDetailVehicles.setPatrolTaskId(patrolTask.getId()); - taskDetailVehicles.setTaskDetailId(taskDetail.getId()); - taskDetailVehicles.setVehicleId(vehicleVo.getVehicleId()); - taskDetailVehicles.setVehicleNum(vehicleVo.getVehicleNum()); - taskDetailVehicles.setVehicleType(vehicleVo.getVehicleType()); - taskDetailVehicles.setVehicleIdUnique(vehicleVo.getVehicleId() + "_" + vehicleVo.getVehicleType()); - taskDetailVehicles.setCompanyId(vehicleVo.getCompanyId()); - taskDetailVehicles.setCompanyName(vehicleVo.getCompanyName()); - taskDetailVehicles.setInspectPeriodStart(vehicleVo.getInspectPeriodStart()); - taskDetailVehicles.setInspectPeriodEnd(vehicleVo.getInspectPeriodEnd()); - taskDetailVehicles.setStatus(1); - taskDetailVehiclesService.insert(taskDetailVehicles); - - //添加任务车船视频通道关系数据 - List<Integer> videoChannel = vo.getVideoChannel(); - for (Integer s : videoChannel) { - TaskDetailVehiclesChannel taskDetailVehiclesChannel = new TaskDetailVehiclesChannel(); - taskDetailVehiclesChannel.setPatrolTaskId(patrolTask.getId()); - taskDetailVehiclesChannel.setTaskDetailId(taskDetail.getId()); - taskDetailVehiclesChannel.setTaskDetailVehiclesId(taskDetailVehicles.getId()); - taskDetailVehiclesChannel.setVideoChannel(s); - taskDetailVehiclesChannel.setSysStatus(1); - taskDetailVehiclesChannelService.insert(taskDetailVehiclesChannel); + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(new Runnable() { + @Override + public void run() { + //构建主数据 + PatrolTask patrolTask = new PatrolTask(); + BeanUtils.copyProperties(vo, patrolTask); + patrolTask.setCreateTime(LocalDateTime.now()); + patrolTask.setCreateUserId(Integer.valueOf(userId)); + PatrolTaskServiceImpl.this.insert(patrolTask); + if(vo.getType() == 2){ + //实时任务,手动添加后续逻辑中需要的数据 + LocalDateTime now = LocalDateTime.now(); + vo.setWeeks("[" + now.getDayOfWeek().getValue() + "]"); + vo.setStartTime(now); + vo.setExecutionTime(now.plusSeconds(5).format(DateTimeFormatter.ofPattern("HH:mm"))); + vo.setEndTime(now.plusSeconds(10)); + } + String weeks = vo.getWeeks(); + List<Integer> week = JSON.parseArray(weeks, Integer.class); + //构建明细任务 + LocalDateTime startTime = vo.getStartTime(); + LocalDateTime endTime = vo.getEndTime(); + while (true){ + if(startTime.compareTo(endTime) >= 0){ + break; } - } - - //添加定时任务 - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("id", taskDetail.getId()); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - try { - quartzUtil.addSimpleQuartzTask(PatrolTaskJob.class,patrolTask.getName() + "_" + taskDetail.getId(), QuartzEnum.DEFAULT_GROUP.getValue(), jobDataMap - , sdf.parse(executionTime), 0, 0); - } catch (SchedulerException e) { - throw new RuntimeException(e); - } catch (ParseException e) { - throw new RuntimeException(e); + int value = startTime.getDayOfWeek().getValue(); + if(week.contains(value)){ + TaskDetail taskDetail = new TaskDetail(); + taskDetail.setCode(UUIDUtil.getTimeStr()); + taskDetail.setPatrolTaskId(patrolTask.getId()); + taskDetail.setStatus(1); + String executionTime = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + vo.getExecutionTime(); + taskDetail.setExecutionTime(LocalDateTime.parse(executionTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + taskDetail.setDelFlag(0); + taskDetailService.insert(taskDetail); + + //添加任务和车船关系数据 + List<VehicleVo> vehicle = vo.getVehicle(); + for (VehicleVo vehicleVo : vehicle) { + TaskDetailVehicles taskDetailVehicles = new TaskDetailVehicles(); + taskDetailVehicles.setPatrolTaskId(patrolTask.getId()); + taskDetailVehicles.setTaskDetailId(taskDetail.getId()); + taskDetailVehicles.setVehicleId(vehicleVo.getVehicleId()); + taskDetailVehicles.setVehicleNum(vehicleVo.getVehicleNum()); + taskDetailVehicles.setVehicleType(vehicleVo.getVehicleType()); + taskDetailVehicles.setVehicleIdUnique(vehicleVo.getVehicleId() + "_" + vehicleVo.getVehicleType()); + taskDetailVehicles.setCompanyId(vehicleVo.getCompanyId()); + taskDetailVehicles.setCompanyName(vehicleVo.getCompanyName()); + taskDetailVehicles.setInspectPeriodStart(vehicleVo.getInspectPeriodStart()); + taskDetailVehicles.setInspectPeriodEnd(vehicleVo.getInspectPeriodEnd()); + taskDetailVehicles.setStatus(1); + taskDetailVehiclesService.insert(taskDetailVehicles); + + //添加任务车船视频通道关系数据 + List<Integer> videoChannel = vo.getVideoChannel(); + List<TaskDetailVehiclesChannel> list = new ArrayList<>(); + for (Integer s : videoChannel) { + TaskDetailVehiclesChannel taskDetailVehiclesChannel = new TaskDetailVehiclesChannel(); + taskDetailVehiclesChannel.setPatrolTaskId(patrolTask.getId()); + taskDetailVehiclesChannel.setTaskDetailId(taskDetail.getId()); + taskDetailVehiclesChannel.setTaskDetailVehiclesId(taskDetailVehicles.getId()); + taskDetailVehiclesChannel.setVideoChannel(s); + taskDetailVehiclesChannel.setSysStatus(1); + list.add(taskDetailVehiclesChannel); + } + taskDetailVehiclesChannelService.insertBatch(list); + } + + //添加定时任务 + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("id", taskDetail.getId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + try { + quartzUtil.addSimpleQuartzTask(PatrolTaskJob.class,patrolTask.getName() + "_" + taskDetail.getId(), QuartzEnum.DEFAULT_GROUP.getValue(), jobDataMap + , sdf.parse(executionTime), 0, 0); + } catch (SchedulerException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + //添加一天 + startTime = startTime.plusDays(1); } } - //添加一天 - startTime = startTime.plusDays(1); - } - - + }); } @@ -161,180 +182,449 @@ public void execute(Integer id){ //修改状态为执行中 TaskDetail taskDetail = taskDetailService.selectById(id); + if(null == taskDetail){ + log.error("定时任务执行异常,无效的数据ID:{}", id); + return; + } taskDetail.setStatus(2); taskDetailService.updateById(taskDetail); - PatrolTask patrolTask = this.selectById(taskDetail.getPatrolTaskId()); - - //获取所有在线车船 - //2018年协议车辆在线 - List<VehicleOnline> vehicleOnlines2018 = VideoGateway.queryRuntimeInfoByCache(0); - //2023年协议车辆在线 - List<VehicleOnline> vehicleOnlines203 = VideoGateway.locationRealTimeInfoCache(0); - - //获取当前任务中的车船信息 - List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id)); - int errNum = 0; - for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) { + if(!patrolTask.getImageModel().equals(ImageModelEnum.CONSTRUCTION_WASTE_LOAD.getCode())){ + //获取所有在线车船 + //2018年协议车辆在线 + List<VehicleOnline> vehicleOnlines2018 = VideoGateway.queryRuntimeInfoByCache(0); + //2023年协议车辆在线 + List<VehicleOnline> vehicleOnlines203 = VideoGateway.locationRealTimeInfoCache(0); + + //获取当前任务中的车船信息 + List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id)); + //根据车辆数量,分组线程数 + int num; + int threadCount; + if(taskDetailVehicles.size() <= maxThreadCount){ + threadCount = taskDetailVehicles.size(); + num = 1; + }else{ + num = taskDetailVehicles.size() / maxThreadCount; + if(taskDetailVehicles.size() % maxThreadCount > 0){ + num++; + } + threadCount = taskDetailVehicles.size() / num; + if(taskDetailVehicles.size() % num > 0){ + threadCount++; + } + } + + //定义线程池 + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + //定义多线程阻塞 + CountDownLatch countDownLatch = new CountDownLatch(threadCount); + for (int i = 0; i < threadCount; i++) { + int start = i * num; + int end = (i + 1) * num; + if((i + 1) == threadCount){ + end = taskDetailVehicles.size(); + } + List<TaskDetailVehicles> vehicles = taskDetailVehicles.subList(start, end); + threadPoolExecutor.execute(new Runnable() { + @Override + public void run() { + for (TaskDetailVehicles taskDetailVehicle : vehicles) { + try { + taskDetailVehicle.setStartExecutionTime(LocalDateTime.now()); + Integer taskDetailVehicleId = taskDetailVehicle.getId(); + //车船类型:1 车辆设备 2 船舶设备 + Integer vehicleType = taskDetailVehicle.getVehicleType(); + //车船id + Integer vehicleId = taskDetailVehicle.getVehicleId(); + VehicleOnline vehicleOnline1 = null; + for (VehicleOnline vehicleOnline : vehicleOnlines2018) { + if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) && + null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){ + vehicleOnline1 = vehicleOnline; + String vehicleGpsProtocol = vehicleOnline.getVehicleGpsProtocol(); + vehicleOnline1.setVehicleGpsProtocol("808-guangzhou".equals(vehicleGpsProtocol) ? "1" : "2"); + break; + } + } + if(null == vehicleOnline1){ + for (VehicleOnline vehicleOnline : vehicleOnlines203) { + if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) && + null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){ + vehicleOnline1 = vehicleOnline; + vehicleOnline1.setVehicleGpsProtocol(vehicleOnline.getVehicleGpsProtocol()); + break; + } + } + } + //不在线 + if(null == vehicleOnline1){ + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + taskDetailVehicle.setStatus(4); + taskDetailVehiclesService.updateById(taskDetailVehicle); + continue; + } + taskDetailVehicle.setVehicleGpsProtocol(vehicleOnline1.getVehicleGpsProtocol()); + taskDetailVehicle.setTerminalId(vehicleOnline1.getTerminalId()); + taskDetailVehicle.setStatus(2); + taskDetailVehiclesService.updateById(taskDetailVehicle); + + //成功 + List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId)); + //开始发送拍照指令,获取照片地址 + String vehicleGpsProtocol = vehicleOnline1.getVehicleGpsProtocol(); + String terminalId = vehicleOnline1.getTerminalId(); + for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : taskDetailVehiclesChannels) { + Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel(); + try { + if("1".equals(vehicleGpsProtocol)){ + //2018 协议 + String fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0); + if(ToolUtil.isNotEmpty(fileId)){ + String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0); + if(ToolUtil.isNotEmpty(fileUrl)){ + taskDetailVehiclesChannel.setImageUrl(fileUrl); + taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); + taskDetailVehiclesChannel.setArtificialStatus(1); + //开始调模型接口得出结果 + Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); + Boolean b = (Boolean) map.get("b"); + String r = map.get("r").toString(); + taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); + taskDetailVehiclesChannel.setResult(r); + taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + } + } + }else{ + //2023 协议 + String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0); + if(ToolUtil.isNotEmpty(fileId)){ + String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0); + if(ToolUtil.isNotEmpty(fileUrl)){ + taskDetailVehiclesChannel.setImageUrl(fileUrl); + taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); + taskDetailVehiclesChannel.setArtificialStatus(1); + //开始调模型接口得出结果 + Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); + Boolean b = (Boolean) map.get("b"); + String r = map.get("r").toString(); + taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); + taskDetailVehiclesChannel.setResult(r); + taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + } + } + } + }catch (Exception e){ + taskDetailVehiclesChannel.setResult(e.getMessage()); + taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + } + } + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + taskDetailVehicle.setStatus(3); + taskDetailVehiclesService.updateById(taskDetailVehicle); + }catch (Exception e){ + e.printStackTrace(); + //失败 + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + taskDetailVehicle.setStatus(5); + taskDetailVehiclesService.updateById(taskDetailVehicle); + } + } + //当前线程执行完成后减少等待数 + countDownLatch.countDown(); + } + }); + } try { - taskDetailVehicle.setStartExecutionTime(LocalDateTime.now()); - Integer taskDetailVehicleId = taskDetailVehicle.getId(); - //车船类型:1 车辆设备 2 船舶设备 - Integer vehicleType = taskDetailVehicle.getVehicleType(); - //车船id - Integer vehicleId = taskDetailVehicle.getVehicleId(); - VehicleOnline vehicleOnline1 = null; - for (VehicleOnline vehicleOnline : vehicleOnlines2018) { - if(vehicleOnline.getVehicleId().equals(vehicleId) && vehicleOnline.getVehicleType().equals(vehicleType)){ - vehicleOnline1 = vehicleOnline; - String vehicleGpsProtocol = vehicleOnline.getVehicleGpsProtocol(); - vehicleOnline1.setVehicleGpsProtocol("808-guangzhou".equals(vehicleGpsProtocol) ? "1" : "2"); - break; - } + countDownLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id).eq("status", 5)); + taskDetail.setStatus(count > 0 ? 4 : 3); + taskDetailService.updateById(taskDetail); + }else{ + //只处理不在线的车辆 + //获取所有在线车船 + //2018年协议车辆在线 + List<VehicleOnline> vehicleOnlines2018 = VideoGateway.queryRuntimeInfoByCache(0); + //2023年协议车辆在线 + List<VehicleOnline> vehicleOnlines203 = VideoGateway.locationRealTimeInfoCache(0); + + //获取当前任务中的车船信息 + List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id)); + //根据车辆数量,分组线程数 + int num; + int threadCount; + if(taskDetailVehicles.size() <= maxThreadCount){ + threadCount = taskDetailVehicles.size(); + num = 1; + }else{ + num = taskDetailVehicles.size() / maxThreadCount; + if(taskDetailVehicles.size() % maxThreadCount > 0){ + num++; } - if(null == vehicleOnline1){ - for (VehicleOnline vehicleOnline : vehicleOnlines203) { - if(vehicleOnline.getVehicleId().equals(vehicleId) && vehicleOnline.getVehicleType().equals(vehicleType)){ - vehicleOnline1 = vehicleOnline; - vehicleOnline1.setVehicleGpsProtocol(vehicleOnline.getVehicleGpsProtocol()); - break; - } - } + threadCount = taskDetailVehicles.size() / num; + if(taskDetailVehicles.size() % num > 0){ + threadCount++; } - //不在线 - if(null == vehicleOnline1){ - taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); - taskDetailVehicle.setStatus(4); - taskDetailVehiclesService.updateById(taskDetailVehicle); - continue; + } + + //定义线程池 + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + //定义多线程阻塞 + CountDownLatch countDownLatch = new CountDownLatch(threadCount); + for (int i = 0; i < threadCount; i++) { + int start = i * num; + int end = (i + 1) * num; + if((i + 1) == threadCount){ + end = taskDetailVehicles.size(); } - taskDetailVehicle.setStatus(2); - taskDetailVehiclesService.updateById(taskDetailVehicle); - //成功 - List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId)); - //开始发送拍照指令,获取照片地址 - String vehicleGpsProtocol = vehicleOnline1.getVehicleGpsProtocol(); - String terminalId = vehicleOnline1.getTerminalId(); - for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : taskDetailVehiclesChannels) { - Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel(); - if("1".equals(vehicleGpsProtocol)){ - //2018 协议 - String fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0); - if(null == fileId){ - log.error("2018年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel); - throw new RuntimeException(); - }else{ - //等待15秒 - Thread.sleep(15000); - - String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0); - if(null == fileUrl){ - log.error("2018年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId); - //重新发送拍摄指令,如果还是没有获取到图片,标注失败 - fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0); - if(null == fileId){ - log.error("2018年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel); - throw new Exception(); - }else{ - //等待15秒 - Thread.sleep(15000); - - fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0); - if(null == fileUrl){ - log.error("2018年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId); - throw new Exception(); - }else{ - taskDetailVehiclesChannel.setImageUrl(fileUrl); - taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); - taskDetailVehiclesChannel.setArtificialStatus(1); - //开始调模型接口得出结果 - boolean b = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); - taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); - taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + List<TaskDetailVehicles> vehicles = taskDetailVehicles.subList(start, end); + threadPoolExecutor.execute(new Runnable() { + @Override + public void run() { + for (TaskDetailVehicles taskDetailVehicle : vehicles) { + try { + taskDetailVehicle.setStartExecutionTime(LocalDateTime.now()); + Integer taskDetailVehicleId = taskDetailVehicle.getId(); + //车船类型:1 车辆设备 2 船舶设备 + Integer vehicleType = taskDetailVehicle.getVehicleType(); + //车船id + Integer vehicleId = taskDetailVehicle.getVehicleId(); + VehicleOnline vehicleOnline1 = null; + for (VehicleOnline vehicleOnline : vehicleOnlines2018) { + if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) && + null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){ + vehicleOnline1 = vehicleOnline; + String vehicleGpsProtocol = vehicleOnline.getVehicleGpsProtocol(); + vehicleOnline1.setVehicleGpsProtocol("808-guangzhou".equals(vehicleGpsProtocol) ? "1" : "2"); + break; } } - }else{ - taskDetailVehiclesChannel.setImageUrl(fileUrl); - taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); - taskDetailVehiclesChannel.setArtificialStatus(1); - //开始调模型接口得出结果 - boolean b = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); - taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); - taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); - } - } - }else{ - //2023 协议 - String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0); - if(null == fileId){ - log.error("2023年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel); - throw new Exception(); - }else{ - //等待15秒 - Thread.sleep(15000); - - String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0); - if(null == fileUrl){ - log.error("2023年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId); - //重新发送拍摄指令,如果还是没有获取图片,标注异常 - fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0); - if(null == fileId){ - log.error("2023年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel); - throw new Exception(); - }else{ - //等待15秒 - Thread.sleep(15000); - - fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0); - if(null == fileUrl){ - log.error("2023年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId); - throw new Exception(); - }else{ - taskDetailVehiclesChannel.setImageUrl(fileUrl); - taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); - taskDetailVehiclesChannel.setArtificialStatus(1); - //开始调模型接口得出结果 - boolean b = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); - taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); - taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + if(null == vehicleOnline1){ + for (VehicleOnline vehicleOnline : vehicleOnlines203) { + if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) && + null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){ + vehicleOnline1 = vehicleOnline; + vehicleOnline1.setVehicleGpsProtocol(vehicleOnline.getVehicleGpsProtocol()); + break; + } } } - }else{ - taskDetailVehiclesChannel.setImageUrl(fileUrl); - taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); - taskDetailVehiclesChannel.setArtificialStatus(1); - //开始调模型接口得出结果 - boolean b = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel())); - taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3); - taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); + //不在线 + if(null == vehicleOnline1){ + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + taskDetailVehicle.setStatus(4); + taskDetailVehiclesService.updateById(taskDetailVehicle); + } + }catch (Exception e){ + e.printStackTrace(); + //失败 + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + taskDetailVehicle.setStatus(5); + taskDetailVehiclesService.updateById(taskDetailVehicle); } } + //当前线程执行完成后减少等待数 + countDownLatch.countDown(); } - } - taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); - taskDetailVehicle.setStatus(3); - taskDetailVehiclesService.updateById(taskDetailVehicle); - }catch (Exception e){ - e.printStackTrace(); - //失败 - taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); - taskDetailVehicle.setStatus(5); - taskDetailVehiclesService.updateById(taskDetailVehicle); - errNum++; + }); + } + try { + countDownLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id).in("status", Arrays.asList(1, 2))); + if(count == 0){ + count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id).eq("status", 5)); + taskDetail.setStatus(count > 0 ? 4 : 3); + taskDetailService.updateById(taskDetail); } } - taskDetail.setStatus(0 == errNum ? 3 : 4); - taskDetailService.updateById(taskDetail); } - - - public static void main(String[] args) { - LocalDateTime now = LocalDateTime.now(); - now = now.plusDays(5); - int value = now.getDayOfWeek().getValue(); - System.err.println(value); + /** + * 变更车辆状态 + * @param vehicleNum + * @param vehicleStatus 状态(1=行驶中,2=已停止) + * @param communicationNum + * @param vehicleGpsProtocol + * @param latitude + * @param longitude + */ + @Override + public void vehicleSpeed(String vehicleNum, Integer vehicleStatus, Integer vehicleType, String communicationNum, String vehicleGpsProtocol, Double latitude, Double longitude) { + Boolean lock = redisTemplate.hasKey("model:3:lock:" + vehicleNum + vehicleType); + if(lock){ + return; + } + //添加redis 锁 + redisTemplate.opsForValue().set("model:3:lock:" + vehicleNum + vehicleType, System.currentTimeMillis(), 1, TimeUnit.MINUTES); + List<TaskDetail> taskDetails = taskDetailService.selectList(new EntityWrapper<TaskDetail>().eq("status", 2).eq("del_flag", 0)); + if(taskDetails.size() > 0){ + Set<Integer> collect = taskDetails.stream().map(TaskDetail::getPatrolTaskId).collect(Collectors.toSet()); + List<PatrolTask> patrolTasks = this.selectList(new EntityWrapper<PatrolTask>().in("id", collect).eq("image_model", ImageModelEnum.CONSTRUCTION_WASTE_LOAD.getCode())); + if(patrolTasks.size() > 0){ + List<Integer> collect1 = patrolTasks.stream().map(PatrolTask::getId).collect(Collectors.toList()); + List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("vehicleNum", vehicleNum) + .eq("vehicleType", vehicleType).eq("status", 2).in("patrol_task_id", collect1)); + if(taskDetailVehicles.size() > 0){ + TaskDetailVehicles taskDetailVehicles1 = taskDetailVehicles.get(0); + String terminalId = taskDetailVehicles1.getTerminalId(); + Integer vehicleId = taskDetailVehicles1.getVehicleId(); + String vehicleIdUnique = taskDetailVehicles1.getVehicleIdUnique(); + //开始调用顶盖模型3次判断结果 + int loaded_cargo_num = 0; + int empty_container_num = 0; + String loaded_cargo_fileUrl = ""; + String empty_container_fileUrl = ""; + String r = null; + for (int i = 0; i < 3; i++) { + //开始发送拍照指令,获取照片地址 + try { + if("1".equals(vehicleGpsProtocol)){ + //2018 协议 + String fileId = VideoGateway.cameraShot2018(terminalId, VideoChannelEnum.CONTAINER.getId(), 0); + if(ToolUtil.isNotEmpty(fileId)){ + //等待30秒 + Thread.sleep(30000); + String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0); + if(ToolUtil.isNotEmpty(fileUrl)){ + //开始调模型接口得出结果 + Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.TOP_SEAL); + r = map.get("r").toString(); + List<String> result = JSON.parseArray(r, String.class); + //装载状态 + Optional<String> loaded_cargo = result.stream().filter(s -> s.contains("Loaded Cargo")).findFirst(); + if(loaded_cargo.isPresent()){ + loaded_cargo_num++; + loaded_cargo_fileUrl = fileUrl; + } + //非装载状态 + Optional<String> empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst(); + if(empty_container.isPresent()){ + empty_container_num++; + empty_container_fileUrl = fileUrl; + } + } + } + }else{ + //2023 协议 + String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, VideoChannelEnum.CONTAINER.getId(), 0); + if(ToolUtil.isNotEmpty(fileId)){ + //等待30秒 + Thread.sleep(30000); + String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0); + if(ToolUtil.isNotEmpty(fileUrl)){ + //开始调模型接口得出结果 + Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.TOP_SEAL); + r = map.get("r").toString(); + List<String> result = JSON.parseArray(r, String.class); + //装载状态 + Optional<String> loaded_cargo = result.stream().filter(s -> s.contains("Loaded Cargo")).findFirst(); + if(loaded_cargo.isPresent()){ + loaded_cargo_num++; + loaded_cargo_fileUrl = fileUrl; + } + //非装载状态 + Optional<String> empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst(); + if(empty_container.isPresent()){ + empty_container_num++; + empty_container_fileUrl = fileUrl; + } + } + } + } + }catch (Exception e){ + e.printStackTrace(); + //执行失败 + for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) { + taskDetailVehicle.setStatus(5); + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + } + taskDetailVehiclesService.updateBatchById(taskDetailVehicles); + List<Integer> collect2 = taskDetailVehicles.stream().map(TaskDetailVehicles::getId).collect(Collectors.toList()); + //修改通道结果 + List<TaskDetailVehiclesChannel> list = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", collect2)); + for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) { + taskDetailVehiclesChannel.setResult(e.getMessage()); + } + taskDetailVehiclesChannelService.updateBatchById(list); + + //开始修改任务状态 + Set<Integer> collect3 = taskDetailVehicles.stream().map(TaskDetailVehicles::getTaskDetailId).collect(Collectors.toSet()); + for (Integer integer : collect3) { + int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", integer).in("status", Arrays.asList(1, 2))); + if(0 == count){ + TaskDetail taskDetail = new TaskDetail(); + taskDetail.setId(integer); + taskDetail.setStatus(4); + taskDetailService.updateById(taskDetail); + } + } + + //删除redis锁key + redisTemplate.delete("model:3:lock:" + vehicleNum + vehicleType); + return; + } + } + + //装载状态 + if(loaded_cargo_num > empty_container_num && 2 == vehicleStatus){ + //装载状态下,判断车辆如果车速为0,则需要判断是否在围栏内,如果在则添加标识 + //判断车辆是否在围栏内 + boolean fenceByPoint = VideoGateway.getFenceByPoint(longitude.toString(), latitude.toString(), 0); + if(fenceByPoint){ + redisTemplate.opsForValue().set("model:3:" + vehicleIdUnique, System.currentTimeMillis()); + } + + } + + //空载状态 + if(empty_container_num > loaded_cargo_num){ + //车辆空载状态,如果车辆车速大于0,且车辆有在围栏内的标识,则判定为正常倾倒 + Boolean aBoolean = redisTemplate.hasKey("model:3:" + vehicleIdUnique); + if(1 == vehicleStatus){ + for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) { + taskDetailVehicle.setStatus(3); + taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); + } + taskDetailVehiclesService.updateBatchById(taskDetailVehicles); + List<Integer> collect2 = taskDetailVehicles.stream().map(TaskDetailVehicles::getId).collect(Collectors.toList()); + //修改通道结果 + List<TaskDetailVehiclesChannel> list = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", collect2)); + for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) { + taskDetailVehiclesChannel.setImageUrl(empty_container_fileUrl); + taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now()); + taskDetailVehiclesChannel.setArtificialStatus(1); + taskDetailVehiclesChannel.setSysStatus(aBoolean ? 2 : 3); + taskDetailVehiclesChannel.setResult(r); + } + taskDetailVehiclesChannelService.updateBatchById(list); + + //开始修改任务状态 + Set<Integer> collect3 = taskDetailVehicles.stream().map(TaskDetailVehicles::getTaskDetailId).collect(Collectors.toSet()); + for (Integer integer : collect3) { + int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", integer).in("status", Arrays.asList(1, 2))); + if(0 == count){ + TaskDetail taskDetail = new TaskDetail(); + taskDetail.setId(integer); + taskDetail.setStatus(3); + taskDetailService.updateById(taskDetail); + } + } + //删除标识 + redisTemplate.delete("model:3:" + vehicleIdUnique); + } + } + } + } + } + //删除redis锁key + redisTemplate.delete("model:3:lock:" + vehicleNum + vehicleType); } } -- Gitblit v1.7.1