From 71f2fd8da56cc944fb7178ab99d8e62182f4e67f Mon Sep 17 00:00:00 2001 From: liejiu946 Date: Tue, 21 Oct 2025 14:31:51 +0800 Subject: [PATCH] =?UTF-8?q?opt:1.=E5=8F=96=E6=B6=88=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=E3=80=822.=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=8B=96=E5=8A=A8=E7=82=B9=E4=BA=91=E9=87=8D=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AnomalyInfoController.java | 40 +++++++ .../service/impl/TaskManageServiceImpl.java | 21 ++-- .../apt/teaching/rest/TeachingController.java | 4 +- .../apt/teaching/service/TeachingService.java | 2 +- .../service/impl/TeachingServiceImpl.java | 7 +- .../org/nl/apt15e/apt/vehicle/ProcessZip.java | 106 ++++++++++++++++++ .../apt15e/apt/vehicle/dao/VehicleInfo.java | 2 +- .../service/impl/VehicleInfoServiceImpl.java | 7 +- .../thread/ProtobufWebSocketHandler.java | 29 +++-- .../java/org/nl/apt15e/util/URLConstant.java | 7 +- 10 files changed, 201 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/nl/apt15e/apt/anomalyInfo/controller/AnomalyInfoController.java b/src/main/java/org/nl/apt15e/apt/anomalyInfo/controller/AnomalyInfoController.java index 7853394..0d531d4 100644 --- a/src/main/java/org/nl/apt15e/apt/anomalyInfo/controller/AnomalyInfoController.java +++ b/src/main/java/org/nl/apt15e/apt/anomalyInfo/controller/AnomalyInfoController.java @@ -1,14 +1,17 @@ package org.nl.apt15e.apt.anomalyInfo.controller; import com.alibaba.excel.EasyExcel; +import lombok.Value; import org.nl.apt15e.apt.anomalyInfo.dao.ErrorHandling; import org.nl.apt15e.apt.anomalyInfo.dao.ErrorInfo; import org.nl.apt15e.apt.anomalyInfo.service.AnomalyInfoService; import org.nl.apt15e.apt.anomalyInfo.service.ErrorHandlingService; import org.nl.apt15e.apt.anomalyInfo.service.ErrorInfoService; +import org.nl.apt15e.apt.vehicle.ProcessZip; import org.nl.apt15e.common.BadRequestException; import org.nl.apt15e.common.excel.ErrorHandlingListener; import org.nl.apt15e.common.excel.ErrorInfoListener; +import org.nl.apt15e.config.file.FileProperties; import org.nl.apt15e.config.language.LangProcess; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; import java.io.IOException; /** @@ -39,6 +43,12 @@ public class AnomalyInfoController { @Resource private ErrorHandlingService errorHandlingService; + @Resource + private FileProperties properties; + + @Resource + private ProcessZip processZip; + @PostMapping("/queryErrorDataByCode") public ResponseEntity queryErrorDataByCode(@RequestParam("code") String code) { return new ResponseEntity<>(anomalyInfoService.queryErrorDataByCode(code), HttpStatus.OK); @@ -80,4 +90,34 @@ public class AnomalyInfoController { return new ResponseEntity<>(LangProcess.msg("successful"),HttpStatus.OK); } + @PostMapping("/importErrorImage") + public ResponseEntity importErrorImage(@RequestParam("file") MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw new BadRequestException("文件不能为空"); + } + + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null || + (!originalFilename.toLowerCase().endsWith(".zip"))) { + throw new BadRequestException("目前只支持ZIP格式"); + } + + try { + // 创建上传目录 + File uploadDir = new File(properties.getPath().getPath()); + if (!uploadDir.exists()) { + uploadDir.mkdirs(); + } + + // 处理压缩文件 + processZip.processCompressedFile(file); + + + return new ResponseEntity<>("上传成功!",HttpStatus.OK); + + } catch (Exception e) { + throw new BadRequestException("处理文件失败:{}"+e.getMessage()); + } + } + } diff --git a/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java b/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java index b7c4b4c..270e821 100644 --- a/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java +++ b/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java @@ -91,7 +91,7 @@ public class TaskManageServiceImpl implements TaskManageService { // 当前叉腿载货状态(Ascend或者Descend) // String currentType = VehicleInfoServiceImpl.vehicleInfo.getVehiclePayloads() == 1? StationTypeEnum.ASCEND.getCode():StationTypeEnum.DESCEND.getCode(); - String currentType = Objects.equals(VehicleInfoServiceImpl.vehicleInfo.getVehiclePayloads(), 1)? StationTypeEnum.ASCEND.getCode():StationTypeEnum.DESCEND.getCode(); + String currentType = Objects.equals(VehicleInfoServiceImpl.vehicleInfo.getVehiclePayloads(), "1")? StationTypeEnum.ASCEND.getCode():StationTypeEnum.DESCEND.getCode(); for (int i = 0; i < staList.size(); i++) { String proposedAction = staList.get(i).getAction_type(); @@ -170,18 +170,23 @@ public class TaskManageServiceImpl implements TaskManageService { new QueryWrapper().lambda() .lt(Task::getTask_status, TaskStatus.FINISHED.getCode()) ); - if (ObjectUtil.isEmpty(task)) { - throw new BadRequestException(LangProcess.msg("task_Is_not_exist")); - } +// if (ObjectUtil.isEmpty(task)) { +// throw new BadRequestException(LangProcess.msg("task_Is_not_exist")); +// } try { - HttpResponse response = HTTPUtil.post(URLConstant.RCS_IP_PORT, URLConstant.CANCEL_TASK_URL + task.getTask_id(), null); + JSONObject param = new JSONObject(); + param.put("amrId", VehicleInfoServiceImpl.vehicleInfo.getId()); + //取消调度任务 + HttpResponse response = HTTPUtil.post(URLConstant.RCS_IP_PORT, URLConstant.VEHICLE_ID_CANCEL_TASK_URL, param); JSONObject result = JSONObject.parseObject(response.body()); if (result.getBoolean("state").equals(false)) { throw new BadRequestException(LangProcess.msg("error_request_rcs") + result.getString("errMsg")); } - // 取消任务 - task.setTask_status(TaskStatus.CANCELED.getCode()); - iTaskService.updateById(task); + // 取消当前任务 + if (ObjectUtil.isNotEmpty(task)) { + task.setTask_status(TaskStatus.CANCELED.getCode()); + iTaskService.updateById(task); + } } catch (Exception e) { throw new BadRequestException(LangProcess.msg("error_request_rcs") + e.getMessage()); } diff --git a/src/main/java/org/nl/apt15e/apt/teaching/rest/TeachingController.java b/src/main/java/org/nl/apt15e/apt/teaching/rest/TeachingController.java index 8cde572..da62f4e 100644 --- a/src/main/java/org/nl/apt15e/apt/teaching/rest/TeachingController.java +++ b/src/main/java/org/nl/apt15e/apt/teaching/rest/TeachingController.java @@ -104,7 +104,7 @@ public class TeachingController { } @PostMapping("/sendAutoBack") - private ResponseEntity sendAutoBack() { - return new ResponseEntity<>(teachingService.sendAutoBack(), HttpStatus.OK); + private ResponseEntity sendAutoBack(@RequestParam("isBack") Integer isBack) { + return new ResponseEntity<>(teachingService.sendAutoBack(isBack), HttpStatus.OK); } } diff --git a/src/main/java/org/nl/apt15e/apt/teaching/service/TeachingService.java b/src/main/java/org/nl/apt15e/apt/teaching/service/TeachingService.java index 1000f03..8b79cac 100644 --- a/src/main/java/org/nl/apt15e/apt/teaching/service/TeachingService.java +++ b/src/main/java/org/nl/apt15e/apt/teaching/service/TeachingService.java @@ -101,5 +101,5 @@ public interface TeachingService { /** * 打点后 自动回到上一个点 */ - Map sendAutoBack(); + Map sendAutoBack(Integer isBack); } diff --git a/src/main/java/org/nl/apt15e/apt/teaching/service/impl/TeachingServiceImpl.java b/src/main/java/org/nl/apt15e/apt/teaching/service/impl/TeachingServiceImpl.java index fc7178a..7f717d8 100644 --- a/src/main/java/org/nl/apt15e/apt/teaching/service/impl/TeachingServiceImpl.java +++ b/src/main/java/org/nl/apt15e/apt/teaching/service/impl/TeachingServiceImpl.java @@ -460,10 +460,13 @@ public class TeachingServiceImpl implements TeachingService { } @Override - public Map sendAutoBack() { + public Map sendAutoBack(Integer isBack) { + if (ObjectUtil.isEmpty(isBack)){ + throw new BadRequestException(LangProcess.msg("param_is_null")); + } JSONObject params = new JSONObject(); String attach = "{"+ - "'sub_command':0,"+ + "'sub_command':"+isBack+","+ "'param':''"+ "}"; params.put("cmd", 2212); diff --git a/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java b/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java index bc58b40..51c66f6 100644 --- a/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java @@ -22,6 +22,7 @@ import org.nl.apt15e.config.language.LangProcess; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import org.yaml.snakeyaml.Yaml; import javax.annotation.Resource; @@ -32,6 +33,9 @@ import java.awt.image.DataBufferByte; import java.io.*; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -398,4 +402,106 @@ public class ProcessZip { log.info("保存PNG失败: {}",e.getMessage()); } } + + /** + * 处理上传的异常文件 + * @param file + * @throws IOException + */ + public void processCompressedFile(MultipartFile file) throws IOException { + List skippedFiles = new ArrayList<>(); + + String filename = file.getOriginalFilename(); + String extension = filename.substring(filename.lastIndexOf(".")); + + try (InputStream inputStream = file.getInputStream()) { + if (extension.toLowerCase().equals(".zip")) { + extractZipFile(inputStream, skippedFiles); + } else { + throw new BadRequestException("不支持的压缩格式: " + extension); + } + } + } + + /** + * 解压上传异常图片压缩文件 + * @param inputStream + * @param skippedFiles + * @throws IOException + */ + private void extractZipFile(InputStream inputStream, List skippedFiles) + throws IOException { + int processedCount = 0; + int skippedCount = 0; + + try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + if (!entry.isDirectory() && isImageFile(entry.getName())) { + String filename = new File(entry.getName()).getName(); + + if (isFileExists(filename)) { + skippedFiles.add(filename); + skippedCount++; + continue; + } + + if (saveImageFile(zipInputStream, filename)) { + processedCount++; + } + } + zipInputStream.closeEntry(); + } + } + log.info("处理文件数:{},跳过文件数:{},跳过文件名称集合:{}",processedCount,skippedCount,skippedFiles); + } + + /** + * 判断是否是图片文件 + * @param filename + * @return + */ + private boolean isImageFile(String filename) { + String lowerCaseFilename = filename.toLowerCase(); + return lowerCaseFilename.endsWith(".jpg") || + lowerCaseFilename.endsWith(".jpeg") || + lowerCaseFilename.endsWith(".png") || + lowerCaseFilename.endsWith(".gif") || + lowerCaseFilename.endsWith(".bmp") || + lowerCaseFilename.endsWith(".webp"); + } + + /** + * 查看文件名是否有重名 + * @param filename + * @return + */ + private boolean isFileExists(String filename) { + File targetFile = new File(properties.getPath().getPath() + filename); + return targetFile.exists(); + } + + /** + * 保存图片文件到目录 + * @param inputStream + * @param filename + * @return + */ + private boolean saveImageFile(InputStream inputStream, String filename) { + try { + File outputFile = new File(properties.getPath().getPath() + filename); + + // 确保目录存在 + File parentDir = outputFile.getParentFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + + Files.copy(inputStream, outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + return true; + } catch (IOException e) { + log.error("保存文件失败: " + filename, e); + return false; + } + } } diff --git a/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java index 3f7184d..5e573f3 100644 --- a/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java @@ -142,6 +142,6 @@ public class VehicleInfo implements Serializable { /** * 车辆载货状态 0未载货 1载货 */ - private Integer vehiclePayloads; + private String vehiclePayloads; } diff --git a/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java b/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java index c61bf44..919b082 100644 --- a/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java @@ -78,7 +78,9 @@ public class VehicleInfoServiceImpl implements VehicleInfoService { public static VehicleInfo vehicleInfo = new VehicleInfo(); - public static Set pointCloudData = new HashSet<>(); + public static Set currentPointCloudData = new HashSet<>(); + + public static Set globalPointCloudData = new HashSet<>(); @Override public VehicleInfo getVehicleInfo() { @@ -295,7 +297,8 @@ public class VehicleInfoServiceImpl implements VehicleInfoService { if (webSocketSet.size() > 0) { webSocketSet.forEach(c -> { Map vehicleInfoMap = new HashMap<>(); - vehicleInfoMap.put("data", pointCloudData); + vehicleInfoMap.put("globalData", globalPointCloudData); + vehicleInfoMap.put("currentData", currentPointCloudData); c.sendDataToClient(vehicleInfoMap); }); } diff --git a/src/main/java/org/nl/apt15e/config/thread/ProtobufWebSocketHandler.java b/src/main/java/org/nl/apt15e/config/thread/ProtobufWebSocketHandler.java index b6804f9..f726309 100644 --- a/src/main/java/org/nl/apt15e/config/thread/ProtobufWebSocketHandler.java +++ b/src/main/java/org/nl/apt15e/config/thread/ProtobufWebSocketHandler.java @@ -61,7 +61,7 @@ public class ProtobufWebSocketHandler extends BinaryWebSocketHandler { // 自动回退状态标识 0 不处理 1 自动回退成功 2 自动回退失败 VehicleInfoServiceImpl.vehicleInfo.setAuto_back_finish(data_pool.getString("auto_back_finish")); // 车辆载货状态 0未载货 1载货 - VehicleInfoServiceImpl.vehicleInfo.setVehiclePayloads(robotBase.getPayloads()); + VehicleInfoServiceImpl.vehicleInfo.setVehiclePayloads(data_pool.getString("carry_status")); String ready = data_pool.getString("ready"); TeachingServiceImpl.teachingMappingStatus.put("mapping_return", mapping_return); TeachingServiceImpl.teachingMappingStatus.put("mapping_percent", mapping_percent); @@ -98,7 +98,8 @@ public class ProtobufWebSocketHandler extends BinaryWebSocketHandler { Robottype.LaserData laser = datagram.getLaserScan(); // 9顶部激光 if (laser.getLocation() == 9){ - Set data = new HashSet<>(); + Set globalData = new HashSet<>(); + Set currentData = new HashSet<>(); for (Robottype.Point point: laser.getScanList()){ double cosYaw = cos(VehicleInfoServiceImpl.vehicleInfo.getTheta()); double sinYaw = sin(VehicleInfoServiceImpl.vehicleInfo.getTheta()); @@ -110,12 +111,26 @@ public class ProtobufWebSocketHandler extends BinaryWebSocketHandler { DecimalFormat y_globalDF = new DecimalFormat("#.#"); String y_result = y_globalDF.format(y_global); double y_globalNum = Double.parseDouble(y_result); - PointCloudDataDto pointCloudDataDto = new PointCloudDataDto(); - pointCloudDataDto.setX(x_globalNum); - pointCloudDataDto.setY(y_globalNum); - data.add(pointCloudDataDto); + PointCloudDataDto globalPointCloudDataDto = new PointCloudDataDto(); + globalPointCloudDataDto.setX(x_globalNum); + globalPointCloudDataDto.setY(y_globalNum); + globalData.add(globalPointCloudDataDto); + + double x_current = point.getX(); + DecimalFormat x_currentDF = new DecimalFormat("#.#"); + String x_CurrentResult = x_currentDF.format(x_current); + double x_currentNum = Double.parseDouble(x_CurrentResult); + double y_current = point.getY(); + DecimalFormat y_currentDF = new DecimalFormat("#.#"); + String y_CurrentResult = y_currentDF.format(y_current); + double y_currentNum = Double.parseDouble(y_CurrentResult); + PointCloudDataDto currentPointCloudDataDto = new PointCloudDataDto(); + currentPointCloudDataDto.setX(x_currentNum); + currentPointCloudDataDto.setY(y_currentNum); + currentData.add(currentPointCloudDataDto); } - VehicleInfoServiceImpl.pointCloudData = data; + VehicleInfoServiceImpl.globalPointCloudData = globalData; + VehicleInfoServiceImpl.currentPointCloudData = currentData; } // System.out.println("Received laser_scan: " + list); break; diff --git a/src/main/java/org/nl/apt15e/util/URLConstant.java b/src/main/java/org/nl/apt15e/util/URLConstant.java index 7659638..96cf6c9 100644 --- a/src/main/java/org/nl/apt15e/util/URLConstant.java +++ b/src/main/java/org/nl/apt15e/util/URLConstant.java @@ -26,8 +26,13 @@ public class URLConstant { public final static String SEND_TASK_URL = "/task/add"; /** - * 取消任务URL + * 根据任务ID取消任务URL + 任务ID */ public final static String CANCEL_TASK_URL = "/task/cancel/"; + /** + * 根据车号ID取消任务URL + */ + public final static String VEHICLE_ID_CANCEL_TASK_URL = "/task/batchCancel"; + }