| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | @Autowired |
| | | private QuartzUtil quartzUtil; |
| | | |
| | | @Value("${maxThreadCount}") |
| | | private Integer maxThreadCount; |
| | | |
| | | @Resource |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | 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)); |
| | | //根据企业id分组用于定义多线上处理 |
| | | Set<String> collect = taskDetailVehicles.stream().map(TaskDetailVehicles::getCompanyId).collect(Collectors.toSet()); |
| | | //定义线程池 |
| | | ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(collect.size(), collect.size(), 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); |
| | | //定义多线程阻塞 |
| | | CountDownLatch countDownLatch = new CountDownLatch(collect.size()); |
| | | for (String companyId : collect) { |
| | | List<TaskDetailVehicles> vehicles = taskDetailVehicles.stream().filter(s -> s.getCompanyId().equals(companyId)).collect(Collectors.toList()); |
| | | 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(!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; |
| | | vehicleOnline1.setVehicleGpsProtocol(vehicleOnline.getVehicleGpsProtocol()); |
| | | String vehicleGpsProtocol = vehicleOnline.getVehicleGpsProtocol(); |
| | | vehicleOnline1.setVehicleGpsProtocol("808-guangzhou".equals(vehicleGpsProtocol) ? "1" : "2"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | //不在线 |
| | | if(null == vehicleOnline1){ |
| | | taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); |
| | | taskDetailVehicle.setStatus(4); |
| | | taskDetailVehiclesService.updateById(taskDetailVehicle); |
| | | continue; |
| | | } |
| | | 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)){ |
| | | //等待30秒 |
| | | Thread.sleep(30000); |
| | | 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)){ |
| | | //等待30秒 |
| | | Thread.sleep(30000); |
| | | 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); |
| | | } |
| | | 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; |
| | | } |
| | | } |
| | | }catch (Exception e){ |
| | | taskDetailVehiclesChannel.setResult(e.getMessage()); |
| | | taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel); |
| | | } |
| | | //不在线 |
| | | 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); |
| | | } |
| | | 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(); |
| | | } |
| | | //当前线程执行完成后减少等待数 |
| | | countDownLatch.countDown(); |
| | | }); |
| | | } |
| | | try { |
| | | 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++; |
| | | } |
| | | }); |
| | | 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); |
| | | } |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | //失败 |
| | | taskDetailVehicle.setEndExecutionTime(LocalDateTime.now()); |
| | | taskDetailVehicle.setStatus(5); |
| | | taskDetailVehiclesService.updateById(taskDetailVehicle); |
| | | } |
| | | } |
| | | //当前线程执行完成后减少等待数 |
| | | countDownLatch.countDown(); |
| | | } |
| | | }); |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | try { |
| | | 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); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | 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); |
| | | } |
| | | } |