opt:1.完善示教功能。2.添加 站点信息
This commit is contained in:
@@ -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) {
|
||||
|
||||
43
src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java
Normal file
43
src/main/java/org/nl/apt15e/apt/station/StationTypeEnum.java
Normal file
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<Station> {
|
||||
|
||||
JSONObject queryAllStation();
|
||||
|
||||
}
|
||||
@@ -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<StationMapper, Station> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<Station> {
|
||||
|
||||
}
|
||||
@@ -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<Object> startMapping() {
|
||||
return new ResponseEntity<>(stationService.queryAllStation(), HttpStatus.OK);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -58,7 +58,7 @@ public interface TeachingService {
|
||||
* @param mapName
|
||||
* @return
|
||||
*/
|
||||
File getRunMapZip(String mapName);
|
||||
byte[] getRunMapZip(String mapName);
|
||||
|
||||
/**
|
||||
* 同步地图到调度
|
||||
|
||||
@@ -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<String, Object> 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<String, Object> 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());
|
||||
|
||||
104
src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java
Normal file
104
src/main/java/org/nl/apt15e/apt/vehicle/ProcessZip.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.nl.apt15e.apt.dao;
|
||||
package org.nl.apt15e.apt.vehicle.dao;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.nl.apt15e.apt.dao;
|
||||
package org.nl.apt15e.apt.vehicle.dao;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user