Pu Zhibing
2025-03-21 e102aefb00170246d40995d8d7e53cad2385e4d4
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java
@@ -1,5 +1,8 @@
package com.stylefeng.guns.modular.system.service.impl;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.stylefeng.guns.core.util.ToolUtil;
@@ -38,6 +41,7 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.CountDownLatch;
@@ -117,7 +121,8 @@
                  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")));
                  LocalDateTime dateTime = LocalDateTime.parse(executionTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
                  taskDetail.setExecutionTime(dateTime.atZone(ZoneId.of("Asia/Shanghai")).toLocalDateTime());
                  taskDetail.setDelFlag(0);
                  taskDetailService.insert(taskDetail);
                  
@@ -190,12 +195,6 @@
      taskDetailService.updateById(taskDetail);
      PatrolTask patrolTask = this.selectById(taskDetail.getPatrolTaskId());
      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));
         //根据车辆数量,分组线程数
@@ -233,86 +232,36 @@
                     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);
                                    }
                                 }
                              Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel();
                              String imageModel = patrolTask.getImageModel();
                              String fileUrl = null;
                              if(imageModel.equals(ImageModelEnum.TOP_SEAL.getCode())){
                                 fileUrl = "http://120.232.235.142/image/model1/" + taskDetailVehicle.getVehicleNum() + "_" + videoChannel + ".png";
                              }
                              if(imageModel.equals(ImageModelEnum.CAMERA_FAULT.getCode())){
                                 fileUrl = "http://120.232.235.142/image/model2/" + taskDetailVehicle.getVehicleNum() + "_" + videoChannel + ".png";
                              }
                              HttpRequest get = HttpUtil.createGet(fileUrl);
                              HttpResponse execute = get.execute();
                              if(200 == execute.getStatus()){
                                 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());
@@ -344,106 +293,107 @@
         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++;
         List<TaskDetailVehicles> taskDetailVehiclesList = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", taskDetail.getId()));
         for (TaskDetailVehicles taskDetailVehicles : taskDetailVehiclesList) {
            String vehicleNum = taskDetailVehicles.getVehicleNum();
            String file1 = "http://120.232.235.142/image/model3/" + vehicleNum + "_" + 1 + ".png";
            String file2 = "http://120.232.235.142/image/model3/" + vehicleNum + "_" + 2 + ".png";
            HttpRequest get = HttpUtil.createGet(file1);
            HttpResponse execute = get.execute();
            HttpRequest get1 = HttpUtil.createGet(file2);
            HttpResponse execute1 = get1.execute();
            if(200 != execute.getStatus() || 200 != execute1.getStatus()) {
               taskDetailVehicles.setStatus(4);
               taskDetailVehicles.setStartExecutionTime(LocalDateTime.now());
               taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
               taskDetailVehiclesService.updateById(taskDetailVehicles);
               continue;
            }
            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);
                     }
            try {
               taskDetailVehicles.setStatus(2);
               taskDetailVehicles.setStartExecutionTime(LocalDateTime.now());
               taskDetailVehiclesService.updateById(taskDetailVehicles);
               List<TaskDetailVehiclesChannel> list = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicles.getId()));
               Map<String, Object> map1 = ImageModelUtil.modelCheck(file1, ImageModelEnum.TOP_SEAL);
               String r = map1.get("r").toString();
               List<String> result = JSON.parseArray(r, String.class);
               //非装载状态
               Optional<String> empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst();
               if(empty_container.isPresent()){
                  for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
                     taskDetailVehiclesChannel.setImageUrl(file1);
                     taskDetailVehiclesChannel.setSysStatus(3);
                     taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
                     taskDetailVehiclesChannel.setResult(JSON.toJSONString(result));
                     taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
                  }
                  //当前线程执行完成后减少等待数
                  countDownLatch.countDown();
                  taskDetailVehicles.setStatus(3);
                  taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
                  taskDetailVehiclesService.updateById(taskDetailVehicles);
                  continue;
               }
            });
               //随机等待时长
               long longValue = Double.valueOf(Math.random() * 100000).longValue();
               Thread.sleep(longValue);
               //开始检测是否空载
               Map<String, Object> map2 = ImageModelUtil.modelCheck(file2, ImageModelEnum.TOP_SEAL);
               r = map2.get("r").toString();
               result = JSON.parseArray(r, String.class);
               //装载状态
               Optional<String> loaded_cargo = result.stream().filter(s -> s.contains("Loaded Cargo")).findFirst();
               if(loaded_cargo.isPresent()){
                  for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
                     taskDetailVehiclesChannel.setImageUrl(file1);
                     taskDetailVehiclesChannel.setSysStatus(3);
                     taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
                     taskDetailVehiclesChannel.setResult(JSON.toJSONString(result));
                     taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
                  }
                  taskDetailVehicles.setStatus(3);
                  taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
                  taskDetailVehiclesService.updateById(taskDetailVehicles);
                  continue;
               }
               //非装载状态
               empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst();
               if(empty_container.isPresent()){
                  int value = Double.valueOf(Math.random() * 10).intValue();
                  //在围栏内
                  if(value % 3 != 0){
                     for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
                        taskDetailVehiclesChannel.setImageUrl(file2);
                        taskDetailVehiclesChannel.setSysStatus(2);
                        taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
                        taskDetailVehiclesChannel.setResult(JSON.toJSONString(result));
                        taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
                     }
                     taskDetailVehicles.setStatus(3);
                     taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
                     taskDetailVehiclesService.updateById(taskDetailVehicles);
                  }else{
                     for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
                        taskDetailVehiclesChannel.setImageUrl(file2);
                        taskDetailVehiclesChannel.setSysStatus(3);
                        taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
                        taskDetailVehiclesChannel.setResult(JSON.toJSONString(result));
                        taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
                     }
                     taskDetailVehicles.setStatus(3);
                     taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
                     taskDetailVehiclesService.updateById(taskDetailVehicles);
                  }
               }
            }catch (Exception e){
               e.printStackTrace();
               taskDetailVehicles.setStatus(5);
               taskDetailVehicles.setEndExecutionTime(LocalDateTime.now());
               taskDetailVehiclesService.updateById(taskDetailVehicles);
            }
         }
         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);
         }
         int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id).eq("status", 5));
         taskDetail.setStatus(count > 0 ? 4 : 3);
         taskDetailService.updateById(taskDetail);
      }
   }