From 3d5783904236666990265e074c75f2b7e0539d63 Mon Sep 17 00:00:00 2001 From: liejiu946 Date: Wed, 9 Jul 2025 10:47:29 +0800 Subject: [PATCH] =?UTF-8?q?opt:1.=E5=AE=8C=E5=96=84=E7=A4=BA=E6=95=99?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E3=80=822.=E6=B7=BB=E5=8A=A0=20=E7=AB=99?= =?UTF-8?q?=E7=82=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/apt15e/Apt15EApplication.java | 2 +- .../apt15e/apt/station/StationTypeEnum.java | 43 ++++++++ .../nl/apt15e/apt/station/dao/Station.java | 12 +- .../apt/station/service/StationService.java | 17 +++ .../service/impl/StationServiceImpl.java | 33 ++++++ .../station/service/mapper/StationMapper.java | 14 +++ .../service/rest/StationController.java | 28 +++++ .../apt/teaching/service/TeachingService.java | 2 +- .../service/impl/TeachingServiceImpl.java | 54 +++------ .../org/nl/apt15e/apt/vehicle/ProcessZip.java | 104 ++++++++++++++++++ .../{ => vehicle}/dao/VehicleException.java | 2 +- .../apt/{ => vehicle}/dao/VehicleInfo.java | 2 +- .../rest/VehicleInfoController.java | 7 +- .../service/VehicleInfoService.java | 4 +- .../service/impl/VehicleInfoServiceImpl.java | 13 +-- 15 files changed, 277 insertions(+), 60 deletions(-) create mode 100644 src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java create mode 100644 src/main/java/org/nl/apt15e/apt/station/service/StationService.java create mode 100644 src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java create mode 100644 src/main/java/org/nl/apt15e/apt/station/service/mapper/StationMapper.java create mode 100644 src/main/java/org/nl/apt15e/apt/station/service/rest/StationController.java create mode 100644 src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java rename src/main/java/org/nl/apt15e/apt/{ => vehicle}/dao/VehicleException.java (90%) rename src/main/java/org/nl/apt15e/apt/{ => vehicle}/dao/VehicleInfo.java (95%) rename src/main/java/org/nl/apt15e/apt/{ => vehicle}/rest/VehicleInfoController.java (77%) rename src/main/java/org/nl/apt15e/apt/{ => vehicle}/service/VehicleInfoService.java (54%) rename src/main/java/org/nl/apt15e/apt/{ => vehicle}/service/impl/VehicleInfoServiceImpl.java (90%) diff --git a/src/main/java/org/nl/apt15e/Apt15EApplication.java b/src/main/java/org/nl/apt15e/Apt15EApplication.java index 3a6c699..31667dc 100644 --- a/src/main/java/org/nl/apt15e/Apt15EApplication.java +++ b/src/main/java/org/nl/apt15e/Apt15EApplication.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @EnableTransactionManagement @RestController -@MapperScan("org.nl.apt15e.**.config") +@MapperScan("org.nl.apt15e.**.mapper") public class Apt15EApplication { public static void main(String[] args) { diff --git a/src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java b/src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java new file mode 100644 index 0000000..6777482 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java @@ -0,0 +1,43 @@ +package org.nl.apt15e.apt.station; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author dsh + * 2025/7/7 + */ +@Getter +@AllArgsConstructor +public enum StationTypeEnum { + + //站点类型 Station工位点 Charge充电点 Breaks休息点 Docking对接点 + STATION(1, "STATION", "工位点"), + CHARGE(2, "CHARGE", "充电点"), + BREAKS(3, "BREAKS", "休息点"), + DOCKING(4, "DOCKING", "对接点"), + + + //动作类型 Ascend升叉 Descend降叉 Move移动 Customize自定义 + ASCEND(1, "Ascend", "升叉"), + DESCEND(2, "Descend", "降叉"), + MOVE(3, "Move", "移动"), + CUSTOMIZE(4, "Customize", "自定义"); + + + /** + *索引 + */ + private final Integer index; + + /** + * 编码 + */ + private final String code; + + /** + *名称 + */ + private final String name; + +} diff --git a/src/main/java/org/nl/apt15e/apt/station/dao/Station.java b/src/main/java/org/nl/apt15e/apt/station/dao/Station.java index 522d156..1ced694 100644 --- a/src/main/java/org/nl/apt15e/apt/station/dao/Station.java +++ b/src/main/java/org/nl/apt15e/apt/station/dao/Station.java @@ -1,6 +1,9 @@ package org.nl.apt15e.apt.station.dao; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import org.springframework.stereotype.Component; import java.io.Serializable; @@ -9,12 +12,14 @@ import java.io.Serializable; * 2025/7/4 */ @Data +@TableName("station") public class Station implements Serializable { private static final long serialVersionUID = 1L; /** * 站点编码 对应地图上站点 */ + @TableId private String station_code; /** @@ -23,7 +28,12 @@ public class Station implements Serializable { private String station_name; /** - * 动作类型 + * 站点类型 (Station工位点 Charge充电点 Breaks休息点 Docking对接点) + */ + private String station_type; + + /** + * 动作类型 (Ascend升叉 Descend降叉 Move移动 Customize自定义) */ private String action_type; diff --git a/src/main/java/org/nl/apt15e/apt/station/service/StationService.java b/src/main/java/org/nl/apt15e/apt/station/service/StationService.java new file mode 100644 index 0000000..cf5399f --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/station/service/StationService.java @@ -0,0 +1,17 @@ +package org.nl.apt15e.apt.station.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.apt15e.apt.station.dao.Station; + +import java.util.List; + +/** + * @author dsh + * 2025/7/7 + */ +public interface StationService extends IService { + + JSONObject queryAllStation(); + +} diff --git a/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java b/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java new file mode 100644 index 0000000..8a030c1 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java @@ -0,0 +1,33 @@ +package org.nl.apt15e.apt.station.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.station.service.StationService; +import org.nl.apt15e.apt.station.service.mapper.StationMapper; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * @author dsh + * 2025/7/7 + */ +@Service +public class StationServiceImpl extends ServiceImpl implements StationService { + + @Resource + private StationMapper stationMapper; + + @Override + public JSONObject queryAllStation() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", HttpStatus.OK.value()); + jsonObject.put("data", stationMapper.selectList(null)); + return jsonObject; + } +} diff --git a/src/main/java/org/nl/apt15e/apt/station/service/mapper/StationMapper.java b/src/main/java/org/nl/apt15e/apt/station/service/mapper/StationMapper.java new file mode 100644 index 0000000..ecc365b --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/station/service/mapper/StationMapper.java @@ -0,0 +1,14 @@ +package org.nl.apt15e.apt.station.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.nl.apt15e.apt.station.dao.Station; + +/** + * @author dsh + * 2025/7/7 + */ +@Mapper +public interface StationMapper extends BaseMapper { + +} diff --git a/src/main/java/org/nl/apt15e/apt/station/service/rest/StationController.java b/src/main/java/org/nl/apt15e/apt/station/service/rest/StationController.java new file mode 100644 index 0000000..cb15eb0 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/station/service/rest/StationController.java @@ -0,0 +1,28 @@ +package org.nl.apt15e.apt.station.service.rest; + +import lombok.extern.slf4j.Slf4j; +import org.nl.apt15e.apt.station.service.StationService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author dsh + * 2025/7/8 + */ +@RestController +@Slf4j +@RequestMapping("/station") +public class StationController { + + @Resource + private StationService stationService; + + @GetMapping("/queryAllStation") + private ResponseEntity startMapping() { + return new ResponseEntity<>(stationService.queryAllStation(), 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 1fdf523..3a08c32 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 @@ -58,7 +58,7 @@ public interface TeachingService { * @param mapName * @return */ - File getRunMapZip(String mapName); + byte[] getRunMapZip(String mapName); /** * 同步地图到调度 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 25f1243..fc65488 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 @@ -2,30 +2,21 @@ package org.nl.apt15e.apt.teaching.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ZipUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.nl.apt15e.apt.dao.VehicleException; -import org.nl.apt15e.apt.dao.VehicleInfo; import org.nl.apt15e.apt.teaching.service.TeachingService; +import org.nl.apt15e.apt.vehicle.ProcessZip; +import org.nl.apt15e.apt.vehicle.service.impl.VehicleInfoServiceImpl; import org.nl.apt15e.common.BadRequestException; import org.nl.apt15e.util.HTTPUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import java.io.ByteArrayInputStream; +import javax.annotation.Resource; import java.io.File; -import java.nio.charset.Charset; -import java.util.Collections; import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; /** * @author dsh @@ -35,6 +26,9 @@ import java.util.zip.ZipInputStream; @Service public class TeachingServiceImpl implements TeachingService { + @Resource + private ProcessZip processZip; + @Override public Map startMapping(String mapName) { if ("".equals(mapName)){ @@ -222,7 +216,7 @@ public class TeachingServiceImpl implements TeachingService { } @Override - public File getRunMapZip(String mapName) { + public byte[] getRunMapZip(String mapName) { if ("".equals(mapName)){ throw new BadRequestException("mapName is empty"); } @@ -237,32 +231,12 @@ public class TeachingServiceImpl implements TeachingService { } // 检查响应状态码 if (response.isOk()) { - // 获取响应体内容 -// JSONObject body = JSON.parseObject(response.body()); - // 3. 将响应体写入临时ZIP文件 + // 获取zip包 byte[] zipBytes = response.bodyBytes(); - File fileName = new File(mapName); - File tempZipFile = FileUtil.writeBytes(zipBytes, FileUtil.createTempFile(fileName)); + processZip.processZipResponse(zipBytes); - // 4. 解压ZIP文件 -// File unzipDir = ZipUtil.unzip(tempZipFile, Charset.defaultCharset()); - - // 5. 处理解压后的文件 -// File[] files = unzipDir.listFiles(); -// if (files != null) { -// for (File file : files) { -// System.out.println("文件名: " + file.getName()); -// System.out.println("文件内容: "); -// System.out.println(FileUtil.readUtf8String(file)); // 读取文本内容 -// // 如果是二进制文件,使用:FileUtil.readBytes(file) -// } -// } - - // 6. 清理临时文件(可选) -// FileUtil.del(tempZipFile); -// FileUtil.del(unzipDir); log.info("获取地图包"); - return tempZipFile; + return zipBytes; } log.info("获取地图包失败"); throw new BadRequestException("获取地图包失败"); @@ -270,7 +244,8 @@ public class TeachingServiceImpl implements TeachingService { @Override public Map synchronizeMap(String mapName) { - File zipFile = this.getRunMapZip(mapName); + byte[] zipFile = this.getRunMapZip(mapName); + HttpResponse response = null; try { response = HttpRequest.post("http://192.168.100.82:8081/map/uploadFile") @@ -279,9 +254,8 @@ public class TeachingServiceImpl implements TeachingService { .header("token", "admin123") .header("name", "lx-script") .header("Content-Type", "multipart/form-data;charset=UTF-8") - .form("areaId",1) - .form("areaName","") - .form("data",zipFile) + .form("areaId", VehicleInfoServiceImpl.vehicleInfo.getAreaId()) + .form("file",zipFile,mapName+".zip") .execute(); } catch (Exception e) { log.info("同步地图到调度接口报错:{}",e.getMessage()); diff --git a/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java b/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java new file mode 100644 index 0000000..60db64d --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java @@ -0,0 +1,104 @@ +package org.nl.apt15e.apt.vehicle; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.apt15e.apt.station.StationTypeEnum; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.station.service.StationService; +import org.nl.apt15e.apt.station.service.impl.StationServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * 解析迈尔微视地图包数据 + * @author dsh + * 2025/7/7 + */ +@Service +public class ProcessZip { + + @Resource + private StationServiceImpl stationService; + + public void processZipResponse(byte[] zipBytes) { + try (ByteArrayInputStream bais = new ByteArrayInputStream(zipBytes); + ZipInputStream zis = new ZipInputStream(bais, StandardCharsets.UTF_8)) { + + ZipEntry entry; + // 遍历ZIP文件中的每个条目 + while ((entry = zis.getNextEntry()) != null) { + String entryName = entry.getName(); + + // 3. 筛选.lxmap文件 + if (entryName.toLowerCase().endsWith(".lxmap")) { + System.out.println("解析文件: " + entryName); + + // 4. 读取文件内容(使用BufferedReader按行处理) + BufferedReader reader = new BufferedReader( + new InputStreamReader(zis, StandardCharsets.UTF_8)); + + //存储站点之前先清除站点表中数据 + stationService.remove(new LambdaQueryWrapper<>()); + + String line; + int lineNumber = 0; + while ((line = reader.readLine()) != null) { + lineNumber++; + // 5. 处理每一行数据 + processLine(line, lineNumber); + } + } + } + } + catch (Exception e) { + throw new RuntimeException("处理ZIP文件失败", e); + } + } + + public void processLine(String line, int lineNumber) { + // 跳过空行 + if (line.trim().isEmpty()) { + return; + } + + // 检查是否以"Cairn: Goal"开头 + if (line.startsWith("Cairn:")) { + // 截取开头后面的数据(6个字符长度) + String dataPart = line.substring(6).trim(); + + if (!dataPart.isEmpty()) { + // 按空格分割字段(多个连续空格视为一个分隔符) + String[] processData = dataPart.split("\\s+"); + + //判断数据是否是点位数据 && 数据长度正常 && 点位类型是1工位点(站点) + //满足以上条件 目前只记录站点 + if ("Goal".equals(processData[0]) && processData.length > 9 && "1".equals(processData[8])) { + System.out.printf("行号 %d - 有效数据: %s%n", lineNumber, Arrays.toString(processData)); + Station station = new Station(); + station.setStation_code(processData[2]); + station.setStation_name(processData[2]); + station.setX(Double.valueOf(processData[5])); + station.setY(Double.valueOf(processData[6])); + station.setAngle(Double.valueOf(processData[7])); + station.setAction_type(StationTypeEnum.CUSTOMIZE.getCode()); + station.setStation_type(StationTypeEnum.STATION.getCode()); + stationService.save(station); + System.out.printf("行号 %d - 有效数据: %s%n", lineNumber, station); + } + } else { + System.out.printf("行号 %d - 警告: 'Cairn: Goal'后无内容%n", lineNumber); + } + } else { + // 非目标行,可根据需要处理或忽略 + System.out.printf("行号 %d - 忽略: %s%n", lineNumber, line); + } + } +} diff --git a/src/main/java/org/nl/apt15e/apt/dao/VehicleException.java b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleException.java similarity index 90% rename from src/main/java/org/nl/apt15e/apt/dao/VehicleException.java rename to src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleException.java index 6825ec5..8ae64f1 100644 --- a/src/main/java/org/nl/apt15e/apt/dao/VehicleException.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleException.java @@ -1,4 +1,4 @@ -package org.nl.apt15e.apt.dao; +package org.nl.apt15e.apt.vehicle.dao; import lombok.Data; diff --git a/src/main/java/org/nl/apt15e/apt/dao/VehicleInfo.java b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java similarity index 95% rename from src/main/java/org/nl/apt15e/apt/dao/VehicleInfo.java rename to src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java index 088a401..004db5f 100644 --- a/src/main/java/org/nl/apt15e/apt/dao/VehicleInfo.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/dao/VehicleInfo.java @@ -1,4 +1,4 @@ -package org.nl.apt15e.apt.dao; +package org.nl.apt15e.apt.vehicle.dao; import lombok.Data; diff --git a/src/main/java/org/nl/apt15e/apt/rest/VehicleInfoController.java b/src/main/java/org/nl/apt15e/apt/vehicle/rest/VehicleInfoController.java similarity index 77% rename from src/main/java/org/nl/apt15e/apt/rest/VehicleInfoController.java rename to src/main/java/org/nl/apt15e/apt/vehicle/rest/VehicleInfoController.java index 8c4435c..043dfd2 100644 --- a/src/main/java/org/nl/apt15e/apt/rest/VehicleInfoController.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/rest/VehicleInfoController.java @@ -1,9 +1,8 @@ -package org.nl.apt15e.apt.rest; +package org.nl.apt15e.apt.vehicle.rest; import lombok.extern.slf4j.Slf4j; -import org.nl.apt15e.apt.dao.VehicleInfo; -import org.nl.apt15e.apt.service.VehicleInfoService; -import org.nl.apt15e.common.logging.annotation.Log; +import org.nl.apt15e.apt.vehicle.dao.VehicleInfo; +import org.nl.apt15e.apt.vehicle.service.VehicleInfoService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/org/nl/apt15e/apt/service/VehicleInfoService.java b/src/main/java/org/nl/apt15e/apt/vehicle/service/VehicleInfoService.java similarity index 54% rename from src/main/java/org/nl/apt15e/apt/service/VehicleInfoService.java rename to src/main/java/org/nl/apt15e/apt/vehicle/service/VehicleInfoService.java index 493b2f2..ab90ff4 100644 --- a/src/main/java/org/nl/apt15e/apt/service/VehicleInfoService.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/service/VehicleInfoService.java @@ -1,6 +1,6 @@ -package org.nl.apt15e.apt.service; +package org.nl.apt15e.apt.vehicle.service; -import org.nl.apt15e.apt.dao.VehicleInfo; +import org.nl.apt15e.apt.vehicle.dao.VehicleInfo; /** * @author dsh diff --git a/src/main/java/org/nl/apt15e/apt/service/impl/VehicleInfoServiceImpl.java b/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java similarity index 90% rename from src/main/java/org/nl/apt15e/apt/service/impl/VehicleInfoServiceImpl.java rename to src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java index 1df1033..d4b2f8f 100644 --- a/src/main/java/org/nl/apt15e/apt/service/impl/VehicleInfoServiceImpl.java +++ b/src/main/java/org/nl/apt15e/apt/vehicle/service/impl/VehicleInfoServiceImpl.java @@ -1,19 +1,14 @@ -package org.nl.apt15e.apt.service.impl; +package org.nl.apt15e.apt.vehicle.service.impl; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.nl.apt15e.apt.dao.VehicleException; -import org.nl.apt15e.apt.dao.VehicleInfo; -import org.nl.apt15e.apt.service.VehicleInfoService; +import org.nl.apt15e.apt.vehicle.dao.VehicleException; +import org.nl.apt15e.apt.vehicle.dao.VehicleInfo; +import org.nl.apt15e.apt.vehicle.service.VehicleInfoService; import org.nl.apt15e.apt.websocket.WebSocketVehicleServer; import org.nl.apt15e.util.HTTPUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service;