From f80715d5ed2072d83f908cfa56cc0bd98a628dd8 Mon Sep 17 00:00:00 2001 From: Bingkun Li Date: Thu, 22 Jan 2026 13:43:02 +0800 Subject: [PATCH] Sync with the latest code --- .../skyeye-common-extend/pom.xml | 1 + .../skyeye/common/extend/util/FileUtil.java | 24 + .../skyeye/common/extend/util/MapUtil.java | 2 +- .../skyeye/common/extend/util/NumberUtil.java | 10 + .../skyeye/common/extend/util/ObjectUtil.java | 2 +- .../skyeye-service-manager/pom.xml | 12 +- .../skyeye/jm/controller/JmJobController.java | 10 + .../skyeye/jm/dto/JmAirlinePlanParam.java | 45 ++ .../skyeye/jm/dto/JmAirlineStatusDTO.java | 3 + .../com/zhangy/skyeye/jm/entity/JmImage.java | 6 +- .../com/zhangy/skyeye/jm/entity/JmJob.java | 18 +- .../zhangy/skyeye/jm/entity/JmJobPayload.java | 9 +- .../zhangy/skyeye/jm/entity/JmJobPoint.java | 7 + .../skyeye/jm/mapper/JmAirlineExecMapper.java | 2 +- .../zhangy/skyeye/jm/mapper/JmJobMapper.java | 8 +- .../jm/service/JmAirlineExecService.java | 6 +- .../jm/service/JmAirlinePlanService.java | 29 + .../skyeye/jm/service/JmImageService.java | 2 +- .../skyeye/jm/service/JmJobService.java | 2 + .../impl/JmAirlineExecServiceImpl.java | 6 +- .../impl/JmAirlinePlanServiceImpl.java | 215 +++++++ .../jm/service/impl/JmImageServiceImpl.java | 22 +- .../jm/service/impl/JmJobExecServiceImpl.java | 12 +- .../jm/service/impl/JmJobServiceImpl.java | 122 ++-- .../service/impl/JmJobStatusServiceImpl.java | 4 +- .../jm/service/impl/JmJobUavServiceImpl.java | 5 +- .../skyeye/jm/task/JmTaskScheduler.java | 20 +- .../skyeye/publics/config/AopConfig.java | 4 +- .../publics/config/WebSocketStompConfig.java | 4 +- .../skyeye/publics/consts/CacheKey.java | 36 +- .../skyeye/publics/consts/FileTypeEnum.java | 6 +- .../skyeye/publics/consts/WebSocketKey.java | 5 + .../publics/service/SysFileTypeService.java | 2 +- .../service/impl/SysLoginServiceImpl.java | 4 +- .../skyeye/publics/utils/CoordUtil.java | 69 ++- .../py/service/impl/PyAirlineServiceImpl.java | 2 +- .../py/service/impl/PyImageServiceImpl.java | 4 +- .../skyeye/sar/consts/SarImageModeEnum.java | 29 + .../skyeye/sar/control/SarControlContext.java | 2 +- .../sar/control/SarControlUploadStrategy.java | 11 +- .../sar/controller/SarMtiController.java | 67 ++ .../skyeye/sar/dto/SarControlParamDTO.java | 7 + .../skyeye/sar/dto/SarFlightPlanDTO.java | 51 ++ .../skyeye/sar/dto/SarImagePacketDTO.java | 12 +- .../skyeye/sar/dto/SarMtiPointGroupDTO.java | 68 ++ .../skyeye/sar/dto/SarMtiQueryParam.java | 33 + .../skyeye/sar/dto/SarMtiTrailGroupDTO.java | 55 ++ .../zhangy/skyeye/sar/dto/SarMtiWsDTO.java | 43 ++ .../zhangy/skyeye/sar/entity/SarMtiBase.java | 19 + .../zhangy/skyeye/sar/entity/SarMtiPoint.java | 78 +++ .../zhangy/skyeye/sar/entity/SarMtiTrail.java | 74 +++ .../skyeye/sar/lib/SarMtiLibProcessor.java | 49 ++ .../zhangy/skyeye/sar/lib/SarMtiLibrary.java | 60 ++ .../sar/listen/SarAbstractListener.java | 26 + .../skyeye/sar/listen/SarImageListener.java | 38 +- .../skyeye/sar/listen/SarMtiListener.java | 79 +++ .../skyeye/sar/listen/SarMtiUdpProcessor.java | 194 ++++++ .../skyeye/sar/listen/SarStatusListener.java | 4 +- .../skyeye/sar/mapper/SarMtiPointMapper.java | 28 + .../skyeye/sar/mapper/SarMtiTrailMapper.java | 28 + .../sar/service/ISarMtiPointService.java | 36 ++ .../sar/service/ISarMtiTrailService.java | 26 + .../sar/service/impl/SarImageServiceImpl.java | 172 +++++- .../service/impl/SarMtiPointServiceImpl.java | 89 +++ .../service/impl/SarMtiTrailServiceImpl.java | 39 ++ .../skyeye/sar/util/SpotlightPlanner.java | 130 ++++ .../service/impl/WeatherServiceImpl.java | 2 +- .../src/main/resources/application-dev.yml | 14 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/db.sql | 582 +++++++++--------- .../mapping/jm/JmAirlineExecMapping.xml | 6 +- .../resources/mapping/jm/JmImageMapping.xml | 9 +- .../resources/mapping/jm/JmJobMapping.xml | 26 +- .../mapping/sar/SarMtiPointMapping.xml | 80 +++ .../mapping/sar/SarMtiTrailMapping.xml | 77 +++ 75 files changed, 2547 insertions(+), 538 deletions(-) create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlinePlanParam.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlinePlanService.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlinePlanServiceImpl.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/consts/SarImageModeEnum.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/controller/SarMtiController.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarFlightPlanDTO.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiPointGroupDTO.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiQueryParam.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiTrailGroupDTO.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiWsDTO.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiBase.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiPoint.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiTrail.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibProcessor.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibrary.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiListener.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiUdpProcessor.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiPointMapper.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiTrailMapper.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiPointService.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiTrailService.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiPointServiceImpl.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiTrailServiceImpl.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/util/SpotlightPlanner.java create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/sar/SarMtiPointMapping.xml create mode 100644 backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/sar/SarMtiTrailMapping.xml diff --git a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/pom.xml b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/pom.xml index 28b9e15..f19a4d6 100644 --- a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/pom.xml +++ b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/pom.xml @@ -11,6 +11,7 @@ skyeye-common-extend 扩展工具包 + 1.0.0 diff --git a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/FileUtil.java b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/FileUtil.java index 1ea8f66..4be84c1 100644 --- a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/FileUtil.java +++ b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/FileUtil.java @@ -4,6 +4,7 @@ import com.zhangy.skyeye.common.extend.exception.ServiceException; import lombok.extern.slf4j.Slf4j; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -15,6 +16,29 @@ import java.nio.file.StandardCopyOption; @Slf4j public class FileUtil { + public static byte[] read(String filePath) { + return read(new File(filePath)); + } + + /** + * 读取文件 + * + * @param file + * @return 文件数据 + */ + public static byte[] read(File file) { + if (!file.exists()) { + return null; + } + try (FileInputStream fis = new FileInputStream(file)) { + byte[] data = new byte[fis.available()]; + fis.read(data); + return data; + } catch (IOException ex) { + throw ServiceException.errorLog("读取文件[" + file.getName() + "]错误!" + ex.getMessage()); + } + } + /** * 复制文件,如果目标文件已存在则会抛异常 * @param src diff --git a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/MapUtil.java b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/MapUtil.java index 66f3d1b..4a8aba4 100644 --- a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/MapUtil.java +++ b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/MapUtil.java @@ -112,7 +112,7 @@ public class MapUtil { * @param value * @param */ - public static void putList(Map> map, String key, T value) { + public static void putList(Map> map, K key, T value) { List list; if (map.containsKey(key)) { list = map.get(key); diff --git a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/NumberUtil.java b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/NumberUtil.java index f1102b7..df5ea50 100644 --- a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/NumberUtil.java +++ b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/NumberUtil.java @@ -1,10 +1,20 @@ package com.zhangy.skyeye.common.extend.util; +import java.math.BigDecimal; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class NumberUtil { + /** + * 相加 + */ + public static double add(double v1, double v2) { + BigDecimal b1 = new BigDecimal(v1); + BigDecimal b2 = new BigDecimal(v2); + return b1.add(b2).doubleValue(); + } + /** * 判断包装类型是否非空且有效 * diff --git a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/ObjectUtil.java b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/ObjectUtil.java index 9178df3..b924cd2 100644 --- a/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/ObjectUtil.java +++ b/backend/Skyeye-sys-dev/skyeye-common/skyeye-common-extend/src/main/java/com/zhangy/skyeye/common/extend/util/ObjectUtil.java @@ -65,7 +65,7 @@ public class ObjectUtil { * @param value * @param */ - public static void put(Map> map, String key, T value) { + public static void put(Map> map, K key, T value){ MapUtil.putList(map, key, value); } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/pom.xml b/backend/Skyeye-sys-dev/skyeye-service-manager/pom.xml index ece1050..57e0701 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/pom.xml +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/pom.xml @@ -16,7 +16,7 @@ com.zhangy skyeye-common-extend - 1.0.0.RELEASE + 1.0.0 @@ -130,6 +130,16 @@ quartz-jobs 2.3.2 --> + + net.java.dev.jna + jna + 5.13.0 + + + net.java.dev.jna + jna-platform + 5.13.0 + diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/controller/JmJobController.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/controller/JmJobController.java index 12c38c4..de5b623 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/controller/JmJobController.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/controller/JmJobController.java @@ -5,6 +5,7 @@ import com.zhangy.skyeye.common.extend.anno.IgnoreAuth; import com.zhangy.skyeye.common.extend.enums.EnumUtil; import com.zhangy.skyeye.common.extend.exception.ServiceException; import com.zhangy.skyeye.common.extend.util.DateUtil; +import com.zhangy.skyeye.common.pojo.result.Result; import com.zhangy.skyeye.jm.consts.JmJobModeEnum; import com.zhangy.skyeye.jm.dto.JmJobDTO; import com.zhangy.skyeye.jm.dto.JmJobPageDTO; @@ -62,6 +63,15 @@ public class JmJobController { return jobService.selectDetail(id); } + /** + * 查询前端详情 + */ + @GetMapping("/info") + public Object selectInfo(@RequestParam Long jobId) { + JmJobDTO job = jobService.selectInfo(jobId); + return Result.successData(job == null ? null : job.getInfo1()); + } + /** * 新增 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlinePlanParam.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlinePlanParam.java new file mode 100644 index 0000000..049ef0b --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlinePlanParam.java @@ -0,0 +1,45 @@ +package com.zhangy.skyeye.jm.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zhangy.skyeye.jm.entity.JmJob; +import com.zhangy.skyeye.jm.entity.JmJobPoint; +import com.zhangy.skyeye.jm.entity.JmJobUav; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 任务 dto,用于保存接口参数 和 详情查询返回值 + */ +@Data +public class JmAirlinePlanParam implements Serializable { + + /** + * 任务目标 1 点,2 区域 + */ + private Integer targetType = 2; + + /** + * 成像模式 + * @see com.zhangy.skyeye.sar.consts.SarImageModeEnum + */ + @NotNull(message = "成像模式不能为空") + private Byte imageMode; + + /** 任务点 */ + @Valid + @NotEmpty(message = "任务点不能为空") + private List> pointList; + + /** 无人机 */ + @Valid + @NotEmpty(message = "无人机不能为空") + private List uavList; + +} + diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlineStatusDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlineStatusDTO.java index 0888857..418bc45 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlineStatusDTO.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/dto/JmAirlineStatusDTO.java @@ -49,4 +49,7 @@ public class JmAirlineStatusDTO { /** 载荷ID */ private Long payloadId; + + // 前一张右上、右下 + private Double[] beforeRight; } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmImage.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmImage.java index c75692c..853368f 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmImage.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmImage.java @@ -33,15 +33,15 @@ public class JmImage extends GeoTiffDTO { /** 影像名称,默认文件名 */ private String name; - /** 图像帧序号 */ - private Integer frameNo; - /** 文件ID */ private Long fileId; /** 归一化前最大值 */ private Float max; + /** 航线的图片序号 */ + private Integer imageNo; + /* 非数据库字段 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJob.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJob.java index 2fee533..b73baa7 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJob.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJob.java @@ -27,15 +27,29 @@ public class JmJob implements Serializable { /** 定时任务表达式 */ private String cronExpression; - - /** 航线模式;1 点模式,2 区域规划模式,3 航线创建 */ + + /** + * 航线模式 + * @see com.zhangy.skyeye.jm.consts.JmJobModeEnum + */ @NotNull(message = "航线模式不能为空") private Integer mode; + @NotNull(message = "成像模式不能为空") + private Byte imageMode; + + /** + * 任务目标 1 点,2 区域 + */ + private Integer targetType = 2; + /** 创建时间 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; + /** 前端内容 */ + private String info1; + /*====================== 任务执行字段 =====================*/ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPayload.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPayload.java index 8c7fe37..1f2e26f 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPayload.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPayload.java @@ -45,8 +45,8 @@ public class JmJobPayload implements Serializable { private Byte direction; /** 分辨率 */ - @NotNull(message = "分辨率不能为空") - private Float resolution; + //@NotNull(message = "分辨率不能为空") + private Float resolution = 0.3f; /** 极化方式 */ //@NotNull(message = "极化方式不能为空") @@ -59,8 +59,7 @@ public class JmJobPayload implements Serializable { private byte moto; /** 成像亮度倍数,用于地面端接收图片后的调整 */ - @NotNull(message = "图像亮度不能为空") - private Integer imageLight; + private Integer imageLight = 1; /** 雷达朝向与飞机朝向夹角 -180~180 */ private Integer headingDiff = 0; @@ -89,7 +88,7 @@ public class JmJobPayload implements Serializable { private String ip; /** 载荷类型 */ - private String type; + private String type = "SAR"; /** sar低精度图像 */ private List imageList; diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPoint.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPoint.java index 76c891c..a31b9c7 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPoint.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/entity/JmJobPoint.java @@ -1,10 +1,12 @@ package com.zhangy.skyeye.jm.entity; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; import java.io.Serializable; +@NoArgsConstructor @Data public class JmJobPoint implements Serializable { @@ -27,4 +29,9 @@ public class JmJobPoint implements Serializable { /** 纬度 */ @NotNull(message = "任务点纬度不能为空") private Double latitude; + + public JmJobPoint (Double longitude, Double latitude) { + this.longitude = longitude; + this.latitude = latitude; + } } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmAirlineExecMapper.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmAirlineExecMapper.java index 6733321..49f73e2 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmAirlineExecMapper.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmAirlineExecMapper.java @@ -66,7 +66,7 @@ public interface JmAirlineExecMapper { /** * 按任务删除 * - * @param jobId 任务ID,必需 + * @param jobId 任务配置ID,必需 */ int deleteByJob(Long... jobId); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmJobMapper.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmJobMapper.java index d52fd05..392e3fc 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmJobMapper.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/mapper/JmJobMapper.java @@ -2,6 +2,7 @@ package com.zhangy.skyeye.jm.mapper; import com.zhangy.skyeye.jm.dto.JmJobDTO; import com.zhangy.skyeye.jm.dto.JmJobQueryDTO; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhangy.skyeye.common.extend.dto.PageDTO; @@ -26,7 +27,12 @@ public interface JmJobMapper { * 按主键查询 */ List selectById(Long... id); - + + /** + * 查询任务的前端结构 + */ + JmJobDTO selectInfo(@Param("jobId") Long jobId); + /** * 新增 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlineExecService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlineExecService.java index 08ad396..dad4d4a 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlineExecService.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlineExecService.java @@ -50,9 +50,9 @@ public interface JmAirlineExecService { void updateNotNull(JmAirlineExec e); /** - * 按任务执行删除 + * 按任务删除 * - * @param jobExecId 任务执行ID + * @param jobId 任务配置ID */ - void deleteByJobExec(Long... jobExecId); + void deleteByJob(Long... jobId); } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlinePlanService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlinePlanService.java new file mode 100644 index 0000000..9a3a14a --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmAirlinePlanService.java @@ -0,0 +1,29 @@ +package com.zhangy.skyeye.jm.service; + +import com.zhangy.skyeye.jm.consts.JmJobModeEnum; +import com.zhangy.skyeye.jm.dto.JmJobDTO; +import com.zhangy.skyeye.jm.entity.JmAirline; +import com.zhangy.skyeye.jm.entity.JmJobPoint; +import com.zhangy.skyeye.jm.entity.JmJobUav; +import com.zhangy.skyeye.sar.consts.SarImageModeEnum; + +import java.util.List; +import java.util.Map; + +/** + * 航线规划 + */ +public interface JmAirlinePlanService { + + /** + * 规划航线 + * + * @param jobMode 任务模式 + * @param imageMode 成像模式 + * @param uavList 无人机 + * @param pointList 任务区域 + * @return K - uavId,V - airlines + */ + Map> plan(JmJobModeEnum jobMode, SarImageModeEnum imageMode, Integer targetType, + List uavList, List> pointList); +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmImageService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmImageService.java index 9128f10..8cace46 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmImageService.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmImageService.java @@ -39,7 +39,7 @@ public interface JmImageService { /** * 按航线查询低精度图像 */ - JmImage selectLowByAirline(Long airlineExecId); + List selectLowByAirline(Long airlineExecId); /** * 按主键查询详情 diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmJobService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmJobService.java index af7ec62..6c9e2e4 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmJobService.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/JmJobService.java @@ -27,6 +27,8 @@ public interface JmJobService { */ List selectById(Long... id); + JmJobDTO selectInfo(Long jobId); + /** * 查询详情 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlineExecServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlineExecServiceImpl.java index 626b719..abfb0ef 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlineExecServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlineExecServiceImpl.java @@ -93,9 +93,9 @@ public class JmAirlineExecServiceImpl implements JmAirlineExecService { @Transactional @Override - public void deleteByJobExec(Long... jobExecId) { - if (ObjectUtil.isNotEmpty(jobExecId)) { - airlineExecMapper.deleteByJob(jobExecId); + public void deleteByJob(Long... jobId) { + if (ObjectUtil.isNotEmpty(jobId)) { + airlineExecMapper.deleteByJob(jobId); } } } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlinePlanServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlinePlanServiceImpl.java new file mode 100644 index 0000000..2ba8fce --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmAirlinePlanServiceImpl.java @@ -0,0 +1,215 @@ +package com.zhangy.skyeye.jm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.zhangy.skyeye.common.extend.exception.ServiceException; +import com.zhangy.skyeye.common.extend.util.ObjectUtil; +import com.zhangy.skyeye.device.consts.PayloadTypeEnum; +import com.zhangy.skyeye.device.entity.SkyeyePayload; +import com.zhangy.skyeye.device.service.IPayloadService; +import com.zhangy.skyeye.jm.consts.JmJobModeEnum; +import com.zhangy.skyeye.jm.dto.JmSarStatusDTO; +import com.zhangy.skyeye.jm.entity.JmAirline; +import com.zhangy.skyeye.jm.entity.JmJobPayload; +import com.zhangy.skyeye.jm.entity.JmJobPoint; +import com.zhangy.skyeye.jm.entity.JmJobUav; +import com.zhangy.skyeye.jm.service.JmAirlinePlanService; +import com.zhangy.skyeye.py.dto.*; +import com.zhangy.skyeye.py.service.IPyAirlineService; +import com.zhangy.skyeye.sar.consts.SarImageModeEnum; +import com.zhangy.skyeye.sar.dto.SarFlightPlanDTO; +import com.zhangy.skyeye.sar.util.SpotlightPlanner; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 航线规划 + */ +@Service +public class JmAirlinePlanServiceImpl implements JmAirlinePlanService { + + @Autowired + private IPayloadService payloadService; + + @Autowired + private IPyAirlineService ktkxService; + + @Override + public Map> plan(JmJobModeEnum jobMode, SarImageModeEnum imageMode, Integer targetType, + List uavList, List> pointList) { + checkParam(jobMode, imageMode, targetType); + // 非航线模式需要调算法生成航线,需要从缓存取sar坐标 + Map> airlineGroup = null; + // 1)聚束 + if (imageMode == SarImageModeEnum.JS) { + return planJs(uavList.get(0), pointList); + } else if (jobMode == JmJobModeEnum.QUICK) { // 2)快速 + return ktkxService.getAirline(toKtkxParam(pointList, uavList)); + } + // 3)航线创建 + return null; + } + + /** + * 校验参数 + * + * @param jobMode + * @param imageMode + * @param uavList + * @param pointList + */ + private void checkParam(JmJobModeEnum jobMode, SarImageModeEnum imageMode, Integer targetType) { + if (imageMode == SarImageModeEnum.JS) { + if (jobMode == JmJobModeEnum.CREATE) { + throw ServiceException.noLog("航线创建模式不支持聚束模式"); + } + if (targetType == 2) { + throw ServiceException.noLog("聚束模式只能使用点模式"); + } + } + } + + /** + * 聚束模式 + * + * @param uav 无人机 + * @param points 目标点 + * @return 航线 + */ + public Map> planJs(JmJobUav uav, List> points) { + Map> result = new HashMap<>(); + // 补充载荷信息 + JmJobPayload sar = uav.getSar0(); + SkyeyePayload payload = payloadService.getOne(sar.getPayloadId()); + sar.setIp(payload.getIp()); + // 取起飞点位置 + JmSarStatusDTO statusDTO = payloadService.getLastStatus(sar.getIp()); + double startLon = statusDTO.getLongitude(); + double startLat = statusDTO.getLatitude(); + uav.setStartLon(startLon); + uav.setStartLat(startLat); + JmJobPoint home = new JmJobPoint(startLon, startLat); + for (List targets: points) { + JmJobPoint target = targets.get(0); + if (target == null) { + continue; + } + JmAirline airline = planJs(uav, home, target); + ObjectUtil.put(result, uav.getUavId(), airline); + // 初始化起点 + home.setLongitude(airline.getEndLon()); + home.setLatitude(airline.getEndLat()); + } + return result; + } + + /** + * 聚束模式 + * + * @param uav 无人机 + * @param home 起飞点 + * @param point 目标点 + * @return 航线 + */ + public JmAirline planJs(JmJobUav uav, JmJobPoint home, JmJobPoint target) { + JmJobPayload sar = uav.getSar0(); + + SarFlightPlanDTO plan = SpotlightPlanner.optimizeRoute(target.getLongitude(), target.getLatitude(), + home.getLongitude(), home.getLatitude(), + uav.getHeight(), sar.getTheta(), sar.getDirection()); + JmAirline airline = new JmAirline(); + airline.setFlightType((byte)0); + double height = plan.getHeight(); + airline.setFlightStartLon(plan.getPowerOnLon()); + airline.setFlightStartLat(plan.getPowerOnLat()); + airline.setFlightStartHeight(height); // 相对起飞点高度 + + airline.setFlightEndLon(plan.getPowerOffLon()); + airline.setFlightEndLat(plan.getPowerOffLat()); + airline.setFlightEndHeight(height); // 相对起飞点高度 + + airline.setGroundStartLon(target.getLongitude()); + airline.setGroundStartLat(target.getLatitude()); + airline.setGroundStartHeight(0d); // 相对起飞点高度 + + airline.setTargetCentroidLon(target.getLongitude()); + airline.setTargetCentroidLat(target.getLatitude()); + airline.setTargetCentroidHeight(0d); // 相对起飞点高度 + + airline.setTargetWidth(sar.getWidth()); + airline.setTargetLength(sar.getLength()); + double sarHeadingAngle = plan.getFlightHeadingAngle() - sar.getDirection() * 90; // 轴向角 + airline.setTargetHeading(sarHeadingAngle); + + airline.setStartLon(plan.getStartLon()); + airline.setStartLat(plan.getStartLat()); + airline.setStartHeight(height); // 相对起飞点高度 + + airline.setEndLon(plan.getEndLon()); + airline.setEndLat(plan.getEndLat()); + airline.setEndHeight(height); // 相对起飞点高度 + + airline.setSpeed(uav.getSpeed()); + airline.setHeight(height); + airline.setDirection(sar.getDirection()); + airline.setSquintAngle(0d); + airline.setGrazingAngle(90 - sar.getTheta()); + return airline; + } + + /** + * 转为航线算法参数 + */ + private PyAirlineParamDTO toKtkxParam(List> pointList, List uavList) { + List pyPointList = new ArrayList<>(); + List pyUavList = new ArrayList<>(); + for (int i = 0; i < uavList.size(); i++) { + JmJobUav u = uavList.get(i); + // 区域 + List points = pointList.get(i); + double[][] coords = points.stream() + .map(point -> new double[] { point.getLongitude(), point.getLatitude() }) + .toArray(double[][]::new); + pyPointList.add(new PyAirlineTargetDTO(i, coords)); + + // 载荷 + JmJobPayload sar = u.getPayloadList() + .stream() + .filter(jp -> { + Long payloadId = jp.getPayloadId(); + SkyeyePayload p = payloadService.getOne(payloadId); + if (p != null && p.getType().equals(PayloadTypeEnum.SAR.getCode())) { + jp.setIp(p.getIp()); + return true; + } + return false; + }) + .findFirst() + .orElseThrow( () -> ServiceException.errorLog("存在无人机缺少sar类型载荷")); + + PyAirlineUavDTO uav = BeanUtil.copyProperties(u, PyAirlineUavDTO.class); + JmSarStatusDTO statusDTO = payloadService.getLastStatus(sar.getIp()); + double startLon = statusDTO.getLongitude(); + double startLat = statusDTO.getLatitude(); + if (u.getStartAltitude() == null) { + u.setStartAltitude((double) statusDTO.getAltitude()); + } + uav.setId(u.getUavId()); + uav.setStartCoord(new double[] {startLon, startLat}); + uav.setEndCoord(new double[] {startLon, startLat}); + uav.setConstraint(u.getHeight()); + PyAirlinePayloadDTO payload = BeanUtil.copyProperties(sar, PyAirlinePayloadDTO.class); + payload.setType(PayloadTypeEnum.SAR.getCode()); + uav.setPayload(payload); + pyUavList.add(uav); + } + PyAirlineUavDTO[] uavs = pyUavList.toArray(new PyAirlineUavDTO[pyUavList.size()]); + PyAirlineTargetDTO[] targets = pyPointList.toArray(new PyAirlineTargetDTO[pyPointList.size()]); + + PyAirlineParamDTO param = new PyAirlineParamDTO(); + param.setTargets(targets); + param.setUavs(uavs); + return param; + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmImageServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmImageServiceImpl.java index 9253093..66bef57 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmImageServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmImageServiceImpl.java @@ -45,8 +45,8 @@ public class JmImageServiceImpl implements JmImageService { @Autowired private JmImageItemService imageItemService; -// @Autowired -// private IPyImageService detectService; + @Autowired + private IPyImageService detectService; @Autowired private JmJobPayloadService jobPayloadService; @@ -113,9 +113,9 @@ public class JmImageServiceImpl implements JmImageService { } @Override - public JmImage selectLowByAirline(Long airlineExecId) { + public List selectLowByAirline(Long airlineExecId) { List list = imageMapper.selectByAirline(FileTypeEnum.SAR_IMAGE_LOW.getValue(), airlineExecId); - return ObjectUtil.isEmpty(list) ? null : list.get(0); + return list; } @Override @@ -293,13 +293,13 @@ public class JmImageServiceImpl implements JmImageService { // 1.删除已有识别结果 imageItemService.deleteByImage(id); List list = imageMapper.selectById(id); -// for (JmImage e : list) { -// PyImageDTO[] voArr = detectService.getImageIdentify(e.toDetectParamVo()); -// if (ObjectUtil.isNotEmpty(voArr)) { -// List itemList = imageItemService.insert(e, voArr); -// e.setItemList(itemList); -// } -// } + for (JmImage e : list) { + PyImageDTO[] voArr = detectService.getImageIdentify(e.toDetectParamVo()); + if (ObjectUtil.isNotEmpty(voArr)) { + List itemList = imageItemService.insert(e, voArr); + e.setItemList(itemList); + } + } return list; } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobExecServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobExecServiceImpl.java index 5a223df..9eeff3b 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobExecServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobExecServiceImpl.java @@ -65,6 +65,9 @@ public class JmJobExecServiceImpl implements JmJobExecService { @Override public List selectByConf(Long... confId) { + if (ObjectUtil.isEmpty(confId)) { + return null; + } return jobExecMapper.selectByConf(confId); } @@ -181,14 +184,7 @@ public class JmJobExecServiceImpl implements JmJobExecService { @Override public void deleteByJobConf(Long... jobConfId) { Long[] jobExecIds = jobExecMapper.selectByConf(jobConfId).stream().map(e -> e.getId()).toArray(Long[]::new); - jmAirlineExecService.deleteByJobExec(jobExecIds); + jmAirlineExecService.deleteByJob(jobConfId); jobExecMapper.deleteByConf(jobConfId); - for (Long id : jobExecIds) { // 删除非文件管理的文件 - FileUtil.delete( - fileTypeService.getDirectoryPath(FileTypeEnum.UAV_KMZ, id)[0], - fileTypeService.getDirectoryPath(FileTypeEnum.UAV_TXT, id)[0], - fileTypeService.getDirectoryPath(FileTypeEnum.SAR_WAVE, id)[0] - ); - } } } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobServiceImpl.java index 2059b82..594fd46 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobServiceImpl.java @@ -26,17 +26,16 @@ import com.zhangy.skyeye.publics.consts.FileTypeEnum; import com.zhangy.skyeye.publics.consts.UavAirlineUploadEnum; import com.zhangy.skyeye.publics.service.SysFileTypeService; import com.zhangy.skyeye.publics.utils.CoordUtil; -import com.zhangy.skyeye.py.dto.PyAirlineParamDTO; -import com.zhangy.skyeye.py.dto.PyAirlinePayloadDTO; -import com.zhangy.skyeye.py.dto.PyAirlineTargetDTO; -import com.zhangy.skyeye.py.dto.PyAirlineUavDTO; import com.zhangy.skyeye.py.service.IPyAirlineService; import com.zhangy.skyeye.quartz.service.QuartzService; +import com.zhangy.skyeye.sar.consts.SarImageModeEnum; import com.zhangy.skyeye.sar.dto.SarControlParamDTO; import com.zhangy.skyeye.sar.enums.SarControlTypeEnum; import com.zhangy.skyeye.sar.enums.SarDirectionEnum; import com.zhangy.skyeye.sar.enums.SarIMUStatusEnum; import com.zhangy.skyeye.sar.service.ISarControlService; +import com.zhangy.skyeye.sar.service.ISarMtiPointService; +import com.zhangy.skyeye.sar.service.ISarMtiTrailService; //import com.zhangy.skyeye.smp.dto.SmpSubscriptResDTO; //import com.zhangy.skyeye.smp.dto.SmpWayPointDTO; //import com.zhangy.skyeye.smp.service.ISmpSubscriptService; @@ -53,7 +52,6 @@ import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.IntStream; @Slf4j @Service @@ -77,10 +75,12 @@ public class JmJobServiceImpl implements JmJobService { // @Autowired // private ISmpSubscriptService smpSubscriptService; - @Autowired - private ISarControlService controlInfoService; @Autowired private ISarControlService sarControlService; + @Autowired + private ISarMtiPointService sarMtiPointService; + @Autowired + private ISarMtiTrailService sarMtiTrailService; @Autowired private IPayloadService payloadService; @@ -95,6 +95,9 @@ public class JmJobServiceImpl implements JmJobService { @Autowired private QuartzService quartzService; + + @Autowired + private JmAirlinePlanService jmAirlinePlanService; @Override public IPage selectPage(JmJobPageDTO param) { @@ -136,6 +139,11 @@ public class JmJobServiceImpl implements JmJobService { return jobMapper.selectById(id); } + @Override + public JmJobDTO selectInfo(Long jobId) { + return jobMapper.selectInfo(jobId); + } + @Override public JmJobDTO selectDetail(Long id) { Map>> pointGroup = jobPointService.selectMapByJob(id); @@ -148,15 +156,11 @@ public class JmJobServiceImpl implements JmJobService { @Transactional @Override - public JmJobDTO save(JmJobModeEnum mode, JmJobDTO e) { - // 查询本次所有载荷信息 - Long[] payloadIds = e.getUavList() - .stream() - .flatMap(uav -> uav.getPayloadList().stream().map(JmJobPayload::getPayloadId)) - .toArray(Long[]::new); + public JmJobDTO save(JmJobModeEnum jobMode, JmJobDTO e) { + SarImageModeEnum imageMode = EnumUtil.parseEx(SarImageModeEnum.class, e.getImageMode()); // 非航线模式需要调算法生成航线,需要从缓存取sar坐标 - Map> airlineGroup = mode == JmJobModeEnum.CREATE - ? null : ktkxService.getAirline(toKtkxParam(e)); + Map> airlineGroup = jmAirlinePlanService.plan(jobMode, imageMode, e.getTargetType(), + e.getUavList(), e.getPointList()); // 校验并加载数据 checkAndSetUav(e.getUavList(), airlineGroup); return insert(e); @@ -190,66 +194,6 @@ public class JmJobServiceImpl implements JmJobService { return e; } - /** - * 转为航线算法参数 - */ - private PyAirlineParamDTO toKtkxParam(JmJobDTO e) { - List> pointList = e.getPointList(); - // 任务区域 - PyAirlineTargetDTO[] targets = IntStream.range(0, pointList.size()) - .mapToObj(i -> { - List list = pointList.get(i); - double[][] coords = list.stream() - .map(point -> new double[] { point.getLongitude(), point.getLatitude() }) - .toArray(double[][]::new); - return new PyAirlineTargetDTO(i, coords); - }) - .toArray(PyAirlineTargetDTO[]::new); - // 无人机 - PyAirlineUavDTO[] uavs = e.getUavList().stream() - .map(u -> { - // 载荷 - JmJobPayload sar = u.getPayloadList() - .stream() - .filter(jp -> { - Long payloadId = jp.getPayloadId(); - SkyeyePayload p = payloadService.getOne(payloadId); - if (p != null && p.getType().equals(PayloadTypeEnum.SAR.getCode())) { - jp.setIp(p.getIp()); - return true; - } - return false; - }) - .findFirst() - .orElseThrow( () -> ServiceException.errorLog("存在无人机缺少sar类型载荷")); - PyAirlineUavDTO uav = BeanUtil.copyProperties(u, PyAirlineUavDTO.class); - JmSarStatusDTO statusDTO = payloadService.getLastStatus(sar.getIp()); - double startLon = statusDTO.getLongitude(); - double startLat = statusDTO.getLatitude(); - u.setStartLon(startLon); - u.setStartLat(startLat); - u.setEndLon(startLon); - u.setEndLat(startLat); - if (u.getStartAltitude() == null) { - u.setStartAltitude((double) statusDTO.getAltitude()); - } - uav.setId(u.getUavId()); - uav.setStartCoord(new double[] {startLon, startLat}); - uav.setEndCoord(new double[] {startLon, startLat}); - uav.setConstraint(u.getHeight()); - PyAirlinePayloadDTO payload = BeanUtil.copyProperties(sar, PyAirlinePayloadDTO.class); - payload.setType(PayloadTypeEnum.SAR.getCode()); - uav.setPayload(payload); - return uav; - }) - .toArray(PyAirlineUavDTO[]::new); - - PyAirlineParamDTO param = new PyAirlineParamDTO(); - param.setTargets(targets); - param.setUavs(uavs); - return param; - } - /** * 校验载荷,有且只能有一个sar。并补充载荷信息 * @@ -351,7 +295,7 @@ public class JmJobServiceImpl implements JmJobService { airline.setDirection(sar.getDirection()); } // 每条航线同高度,故计算坐标点距离不考虑高度 - int airlineDistance = CoordUtil.getPlaneDistanceInt(airline.getStartLon(), airline.getStartLat(), airline.getEndLon(), airline.getEndLat()); + int airlineDistance = (int) CoordUtil.calculateDistance(airline.getStartLon(), airline.getStartLat(), airline.getEndLon(), airline.getEndLat()); airline.setDistance(airlineDistance); com.zhangy.skyeye.common.extend.util.BeanUtil.validationEx(airline); }); @@ -360,11 +304,30 @@ public class JmJobServiceImpl implements JmJobService { @Transactional @Override public int delete(Long... ids) { + Long[] jobExecIds = jmJobExecService.selectByConf(ids).stream().map(e -> e.getId()).toArray(Long[]::new); List list = jobMapper.selectById(ids); jobStatusService.remove(ids); jobPointService.deleteByJob(ids); jobUavService.deleteByJob(ids); jmJobExecService.deleteByJobConf(ids); + + sarMtiPointService.deleteByJob(ids); + sarMtiTrailService.deleteByJob(ids); + // 目录 + if (jobExecIds != null) { + for (Long id : jobExecIds) { + FileUtil.delete( + fileTypeService.getDirectoryPath(FileTypeEnum.UAV_KMZ, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_WAVE, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_IMAGE_LOW, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_IMAGE_LOW_SRC, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_IMAGE_HIGH, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_IMAGE_HIGH_SRC, id)[0], + fileTypeService.getDirectoryPath(FileTypeEnum.SAR_MTI_LIB, id)[0] + ); + } + } + for (JmJobDTO dto : list) { if (dto.getType() > 1) { quartzService.deleteJob(dto.getId().toString(), JmScheduleDTO.GROUP); @@ -474,7 +437,7 @@ public class JmJobServiceImpl implements JmJobService { SarControlParamDTO controlParam = new SarControlParamDTO(); controlParam.setControlType(SarControlTypeEnum.ENDALL); controlParam.setIp(ip); - controlInfoService.sendUdp(controlParam); + sarControlService.sendUdp(controlParam); // 标记缓存状态,确保断连重新发送请求时不会重复执行 // uav.setSarStatus(ExecStatusEnum.OVER); }); @@ -485,6 +448,11 @@ public class JmJobServiceImpl implements JmJobService { job.setId(id); job.setStatus(ExecStatusEnum.OVER.getValue()); jobMapper.updateNotNull(job); + + JmJobExec jobExec = new JmJobExec(); + jobExec.setConfId(id); + jobExec.setStatus(ExecStatusEnum.OVER.getValue()); + jmJobExecService.updateNotNull(jobExec); } @Override diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobStatusServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobStatusServiceImpl.java index 174bc03..04be971 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobStatusServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobStatusServiceImpl.java @@ -72,7 +72,7 @@ public class JmJobStatusServiceImpl implements JmJobStatusService { public JmAirlineStatusDTO getCurrAirline(String payloadIp) { for (JmJobStatusDTO jvo : jobStatusMap.values()) { for (JmUavStatusDTO uvo : jvo.getUavMap().values()) { - if (uvo.getSarIp().endsWith(payloadIp)) { + if (uvo.getSarIp().equals(payloadIp)) { for (JmAirlineStatusDTO a : uvo.getAirlineList()) { if (a.getStatus() == ExecStatusEnum.PROCESSING) { return a; @@ -237,7 +237,7 @@ public class JmJobStatusServiceImpl implements JmJobStatusService { ExecStatusEnum aStatus = avo.getStatus(); switch (aStatus) { case PROCESSING: - distanced += CoordUtil.getPlaneDistanceInt( + distanced += CoordUtil.calculateDistance( curr.getLongitude(), curr.getLatitude(), avo.getStartLon(), avo.getStartLat()); case NOT: diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobUavServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobUavServiceImpl.java index 486189e..b6c2627 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobUavServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/service/impl/JmJobUavServiceImpl.java @@ -50,7 +50,7 @@ public class JmJobUavServiceImpl implements JmJobUavService { @Getter private UavAirlineUploadEnum airlineUploadType; - @Value("${ld.uav.upload}") + @Value("${skyeye.uav.upload}") public void setAirlineUploadType(String value) { this.airlineUploadType = EnumUtil.parseEx(UavAirlineUploadEnum.class, value); } @@ -125,8 +125,7 @@ public class JmJobUavServiceImpl implements JmJobUavService { }) .toArray(JmJobUav[]::new) ); - String[] kmzDirPath = fileTypeService.getDirectoryPath(FileTypeEnum.UAV_KMZ, jobId); - String[] txtFilePath = fileTypeService.getFilePath(FileTypeEnum.UAV_TXT, jobId, "航线.txt"); + list.forEach(uav -> { Long uavId = uav.getUavId(); jobPayloadService.insert(jobId, uavId, uav.getPayloadList()); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/task/JmTaskScheduler.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/task/JmTaskScheduler.java index 07e4c71..04b0997 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/task/JmTaskScheduler.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/task/JmTaskScheduler.java @@ -3,6 +3,7 @@ package com.zhangy.skyeye.jm.task; import com.zhangy.skyeye.redis.utils.RedisUtil; import com.zhangy.skyeye.device.entity.SkyeyePayload; import com.zhangy.skyeye.device.service.IPayloadService; +import com.zhangy.skyeye.jm.dto.JmJobStatusDTO; import com.zhangy.skyeye.publics.consts.CacheKey; import com.zhangy.skyeye.publics.service.ISysLoginService; import com.zhangy.skyeye.sar.enums.SarControlTypeEnum; @@ -10,13 +11,16 @@ import com.zhangy.skyeye.jm.service.JmJobStatusService; import com.zhangy.skyeye.sar.exception.SarConnectException; import com.zhangy.skyeye.sar.service.ISarControlService; // import com.zhangy.skyeye.smp.dto.SmpUavStatusWsDTO; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; /** @@ -26,6 +30,10 @@ import java.util.List; @Service public class JmTaskScheduler { + @Value("${skyeye.debug:false}") + @Setter + private boolean isDebug; + @Autowired private RedisUtil redisUtil; @@ -58,11 +66,11 @@ public class JmTaskScheduler { // if (!loginService.hasLogged()) { // return; // } -// // 从缓存查询所有sar -// List sarList = payloadService.getSar(null); -// if (ObjectUtil.isEmpty(sarList)) { -// return; -// } + // 从缓存查询所有sar +// Collection list = jobStatusService.getAll(); +// Map jobSarMap = list.stream() +// .flatMap(job -> job.getUavMap().values().stream()) +// .collect(Collectors.toMap(JmUavStatusDTO::getSarId, Function.identity(), (k1, k2) -> k1)); // // 从内存查询所有任务中的雷达 // Map jobSarMap = jobStatusService.getAll().stream() // .flatMap(job -> job.getUavMap().values().stream()) @@ -107,7 +115,7 @@ public class JmTaskScheduler { */ @Scheduled(fixedRate = 10000) public void connectSar() { - if (!loginService.hasLogged()) { // 断开 + if (!loginService.hasLogged() || isDebug) { // 断开 /*Map map = redisUtil.hmget(CacheKey.SAR_CONNECTED); if (map != null && map.size() > 0) { map.keySet().forEach(ip -> controlInfoService.sendUdp((String) ip, SarControlTypeEnum.DISCONNECT)); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/AopConfig.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/AopConfig.java index 8af898b..4fa9dbb 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/AopConfig.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/AopConfig.java @@ -23,8 +23,8 @@ public class AopConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许所有路径 - .allowedOrigins("*") // 允许所有来源(生产环境指定域名) - // .allowedOriginPatterns("*") + // .allowedOrigins("*") // 允许所有来源(生产环境指定域名) + .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 方法 .allowedHeaders("*") // 允许所有请求头 .allowCredentials(false) // 是否允许发送 Cookie(true 时需要指定具体 origins) diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/WebSocketStompConfig.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/WebSocketStompConfig.java index b84bd36..c4f06ab 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/WebSocketStompConfig.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/config/WebSocketStompConfig.java @@ -24,8 +24,8 @@ public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { stompEndpointRegistry.addEndpoint(new String[]{"/ws"}) - .setAllowedOrigins(new String[]{"*"}) - // .setAllowedOriginPatterns(new String[]{"*"}) + // .setAllowedOrigins(new String[]{"*"}) + .setAllowedOriginPatterns(new String[]{"*"}) .withSockJS(); } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/CacheKey.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/CacheKey.java index 234bbbc..5ea4e0e 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/CacheKey.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/CacheKey.java @@ -5,13 +5,13 @@ package com.zhangy.skyeye.publics.consts; public class CacheKey { /*========================================== - publics 模块用 ld: 前缀 + publics 模块用 skyeye: 前缀 ==========================================*/ /** * 用户token,30分钟 */ - private static final String USER_TOEKN = "ld:user:token:%s@%s"; + private static final String USER_TOEKN = "skyeye:user:token:%s@%s"; /** * 获取token key @@ -21,32 +21,32 @@ public class CacheKey { } /*========================================== - 分布式锁用 ld:lock: 前缀 + 分布式锁用 skyeye:lock: 前缀 ==========================================*/ /** * 上传sar图像锁 */ - public static final String SAR_IMAGE_UPLOAD_LOCK = "ld:lock:image"; + public static final String SAR_IMAGE_UPLOAD_LOCK = "skyeye:lock:image"; /*========================================== - sar 模块用 ld:sar: 前缀 + sar 模块用 skyeye:sar: 前缀 ==========================================*/ /** * 控制回包,1秒 */ - private static final String SAR_CONTROL_BACK = "ld:sar:control"; + private static final String SAR_CONTROL_BACK = "skyeye:sar:control"; /** * sar状态,1秒 */ - private static final String SAR_STATUS = "ld:sar:status:"; + private static final String SAR_STATUS = "skyeye:sar:status:"; /** * 已执行连接命令的sar,永久 */ - public static final String SAR_CONNECTED = "ld:sar:connected"; + public static final String SAR_CONNECTED = "skyeye:sar:connected"; /** * 获取控制回包key:加ip @@ -63,50 +63,50 @@ public class CacheKey { } /*========================================== - device 模块用 ld:device: 前缀 + device 模块用 skyeye:device: 前缀 ==========================================*/ /** * sar载荷,永久 */ - public static final String DEVICE_SAR = "ld:device:sar"; + public static final String DEVICE_SAR = "skyeye:device:sar"; /** * 无人机,永久 */ - public static final String DEVICE_UAV = "ld:device:uav"; + public static final String DEVICE_UAV = "skyeye:device:uav"; /*========================================== - smp 模块用 ld:smp: 前缀 + smp 模块用 skyeye:smp: 前缀 ==========================================*/ /** * 运动规划响应,1秒 */ - public static final String SMP_WAYPOINT_RES = "ld:smp:waypoint:"; + public static final String SMP_WAYPOINT_RES = "skyeye:smp:waypoint:"; /** * 飞行控制响应,1秒 */ - public static final String SMP_FLIGHT_RES = "ld:smp:flight:"; + public static final String SMP_FLIGHT_RES = "skyeye:smp:flight:"; /** * 云台控制响应,1秒 */ - public static final String SMP_GIMBALMGR_RES = "ld:smp:gimbalmgr:"; + public static final String SMP_GIMBALMGR_RES = "skyeye:smp:gimbalmgr:"; /** * 数据订阅响应,1秒 */ - public static final String SMP_SUBSCRIPT_RES = "ld:smp:subscript:"; + public static final String SMP_SUBSCRIPT_RES = "skyeye:smp:subscript:"; /** * 数据订阅回传数据,1秒 */ - public static final String SMP_SUBSCRIPT_DATA = "ld:smp:subscript:"; + public static final String SMP_SUBSCRIPT_DATA = "skyeye:smp:subscript:"; /** * 相机视频流响应,1秒 */ - public static final String SMP_VIDEO_RES = "ld:smp:video:"; + public static final String SMP_VIDEO_RES = "skyeye:smp:video:"; } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/FileTypeEnum.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/FileTypeEnum.java index 7aa3762..cb3a0eb 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/FileTypeEnum.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/FileTypeEnum.java @@ -27,11 +27,7 @@ public enum FileTypeEnum implements CodeEnum { SAR_WAVE(8, "SAR波形", "/sar/wave"), - // ======================== - // 个别项目专用文件类型 - // ======================== - - UAV_TXT(101, "无人机txt", "/sar/uav/txt"), // 青岛港专用,人工拷贝航线数据到控制台 + SAR_MTI_LIB(9, "SAR运动轨迹", "/sar/mti"), ; /** 值 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/WebSocketKey.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/WebSocketKey.java index ad340df..44979e7 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/WebSocketKey.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/consts/WebSocketKey.java @@ -19,6 +19,11 @@ public interface WebSocketKey { */ String SAR_BACK_IMAGE = "/topic/image"; + /** + * 回传动点 + */ + String SAR_BACK_GMTI = "/topic/gmti"; + /*=============================== 任务管理 ===============================*/ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/SysFileTypeService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/SysFileTypeService.java index 635b6c3..3832f88 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/SysFileTypeService.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/SysFileTypeService.java @@ -13,7 +13,7 @@ public class SysFileTypeService { private String fileRoot; // 去掉末尾的路径分隔符 - @Value("${ld.file-root}") + @Value("$skyeye.file-root}") public void setFileRoot(String fileRoot) { this.fileRoot = fileRoot.endsWith("/") || fileRoot.endsWith("\\") ? fileRoot.substring(0, fileRoot.length() - 1) : fileRoot; } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/impl/SysLoginServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/impl/SysLoginServiceImpl.java index cc7f802..7e81b88 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/impl/SysLoginServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/service/impl/SysLoginServiceImpl.java @@ -22,7 +22,7 @@ public class SysLoginServiceImpl implements ISysLoginService { return Boolean.TRUE.equals(redisTemplate.execute((RedisCallback) connection -> { try (Cursor cursor = connection.scan( ScanOptions.scanOptions() - .match("ld:user:token:*") + .match("skyeye:user:token:*") .count(1) // 只需要找到1个匹配项 .build())) { return cursor.hasNext(); @@ -38,7 +38,7 @@ public class SysLoginServiceImpl implements ISysLoginService { return (int) redisTemplate.execute((RedisCallback) connection -> { int count = 0; ScanOptions options = ScanOptions.scanOptions() - .match("ld:user:token:*") + .match("skyeye:user:token:*") .count(100) // 合理的COUNT值 .build(); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/utils/CoordUtil.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/utils/CoordUtil.java index e7cf502..9e8bea8 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/utils/CoordUtil.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/publics/utils/CoordUtil.java @@ -7,8 +7,6 @@ import com.zhangy.skyeye.common.extend.util.NumberUtil; */ public class CoordUtil { - // 圆周率 - private static final double M_PI = 3.14159265358979323846; // 地球平均半径(米) private static final double EARTH_RADIUS = 6371000; // 地球赤道半径(米) @@ -19,22 +17,58 @@ public class CoordUtil { private static final double ECCENTRICITY_SQUARED = 6.69437999014e-3; /** - * 弧度转经纬度 - * - * @param rad 弧度值 - * @return + * 将角度转换为弧度 */ - public static Double radToCoord(Double rad) { - if (!NumberUtil.isValid(rad)) { - return null; - } - return rad * 180 / M_PI; + public static double toRadians(double degrees) { + return degrees * Math.PI / 180.0; + } + + /** + * 将弧度转换为角度 + */ + public static double toDegrees(double radians) { + return radians * 180.0 / Math.PI; + } + + /** + * 计算两点之间的方位角(从点1到点2,北为0°,东为90°) + */ + public static double calculateBearing(double lat1, double lon1, double lat2, double lon2) { + double lat1Rad = toRadians(lat1); + double lat2Rad = toRadians(lat2); + double lonDiffRad = toRadians(lon2 - lon1); + + double y = Math.sin(lonDiffRad) * Math.cos(lat2Rad); + double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - + Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(lonDiffRad); + + double bearing = Math.atan2(y, x); + return (toDegrees(bearing) + 360) % 360; // 转换为0-360度 + } + + /** + * 计算给定起点、方位角和距离的终点坐标 + */ + public static double[] calculateDestination(double lat, double lon, double bearing, double distance) { + double latRad = toRadians(lat); + double lonRad = toRadians(lon); + double bearingRad = toRadians(bearing); + + double angularDistance = distance / EARTH_RADIUS; + + double lat2Rad = Math.asin(Math.sin(latRad) * Math.cos(angularDistance) + + Math.cos(latRad) * Math.sin(angularDistance) * Math.cos(bearingRad)); + + double lon2Rad = lonRad + Math.atan2(Math.sin(bearingRad) * Math.sin(angularDistance) * Math.cos(latRad), + Math.cos(angularDistance) - Math.sin(latRad) * Math.sin(lat2Rad)); + + return new double[]{toDegrees(lat2Rad), toDegrees(lon2Rad)}; } /** * 两坐标点二维距离(大圆距离) */ - public static double getDistance(double lat1, double lon1, double lat2, double lon2) { + public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { // 将经纬度转换为弧度 double latDistance = Math.toRadians(lat2 - lat1); double lonDistance = Math.toRadians(lon2 - lon1); @@ -51,7 +85,7 @@ public class CoordUtil { /** * 两坐标点二维距离(平面距离) */ - public static double getPlaneDistance(double lat1, double lon1, double lat2, double lon2) { + public static double calculatePlaneDistance(double lat1, double lon1, double lat2, double lon2) { // 将经纬度转换为弧度 double lat1Rad = Math.toRadians(lat1); double lon1Rad = Math.toRadians(lon1); @@ -66,13 +100,6 @@ public class CoordUtil { return Math.sqrt(x * x + y * y); } - /** - * 两坐标点二维距离(平面距离) - */ - public static int getPlaneDistanceInt(double lat1, double lon1, double lat2, double lon2) { - return (int) Math.round(getPlaneDistance(lat1, lon1, lat2, lon2)); - } - /** * 将经纬度高度转换为ECEF坐标系下的XYZ坐标 * @param latitude 纬度(度) @@ -105,7 +132,7 @@ public class CoordUtil { * @param alt2 点2高度 * @return 三维直线距离(米) */ - public static double get3dDistance( + public static double calculate3dDistance( double lat1, double lon1, double alt1, double lat2, double lon2, double alt2) { diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyAirlineServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyAirlineServiceImpl.java index 9689620..28ac9d9 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyAirlineServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyAirlineServiceImpl.java @@ -34,7 +34,7 @@ public class PyAirlineServiceImpl implements IPyAirlineService { * 航线规划算法路径 */ @Setter - @Value("${ld.py.ktkxUrl}") + @Value("${skyeye.py.ktkxUrl}") private String url; // 判断是否为空,并剔除无需执行任务的无人机 diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyImageServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyImageServiceImpl.java index 40dc22c..a0bdc6d 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyImageServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/py/service/impl/PyImageServiceImpl.java @@ -21,7 +21,7 @@ import java.net.http.HttpResponse; * 影像识别 */ @Slf4j -// @Service +@Service public class PyImageServiceImpl implements IPyImageService { /** @@ -39,7 +39,7 @@ public class PyImageServiceImpl implements IPyImageService { } @Setter - @Value("${ld.py.detectUrl}") + @Value("${skyeye.py.detectUrl}") private String url; @Override diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/consts/SarImageModeEnum.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/consts/SarImageModeEnum.java new file mode 100644 index 0000000..1a08218 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/consts/SarImageModeEnum.java @@ -0,0 +1,29 @@ +package com.zhangy.skyeye.sar.consts; + +import com.zhangy.skyeye.common.extend.enums.CodeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * SAR成像模式 + */ +@Getter +@AllArgsConstructor +public enum SarImageModeEnum implements CodeEnum { + + TD((byte) 0, "条带"), + + JS((byte) 1, "聚束"), + + GMTI((byte) 4, "GMTI") + ; + + private byte value; + + private String text; + + @Override + public Byte getCode() { + return value; + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlContext.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlContext.java index 25d2906..926e7e4 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlContext.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlContext.java @@ -64,7 +64,7 @@ public class SarControlContext { /** * 应答超时 */ - @Value("${ld.sar.image.type:0}") + @Value("${skyeye.sar.image.type:0}") private byte imgType; @PostConstruct diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlUploadStrategy.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlUploadStrategy.java index d8a933f..f3e5bc7 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlUploadStrategy.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/control/SarControlUploadStrategy.java @@ -26,7 +26,8 @@ public class SarControlUploadStrategy implements ISarControlStrategy { /** * 有效的分辨率 */ - private final List VALID_RESOLUTIONS = Arrays.asList(0.1f, 0.2f, 0.3f, 0.5f, 1f, 3f); + private final List VALID_RESOLUTIONS = Arrays.asList(0.15f, 0.2f, 0.3f, 0.5f, 1f, 3f, 10f); + @Override public boolean supports(SarControlParamDTO param) { @@ -41,9 +42,10 @@ public class SarControlUploadStrategy implements ISarControlStrategy { throw ServiceException.noLog("航线参数airlineList不能为空"); } float resolution = param.getResolution(); - if (!VALID_RESOLUTIONS.contains(resolution)) { - throw ServiceException.noLog("无效的分辨率:" + resolution); - } + byte imageMode = param.getImageMode(); +// if (!VALID_RESOLUTIONS.contains(resolution)) { +// throw ServiceException.noLog("无效的分辨率:" + resolution); +// } return list.stream() .map(line -> { // 复制航线参数 @@ -52,6 +54,7 @@ public class SarControlUploadStrategy implements ISarControlStrategy { BeanUtil.copyProperties(param, sar, false); sar.setSubImageMode((byte)(resolution / 0.05)); sar.setControlType(SarControlTypeEnum.UPLOAD); + sar.setImageMode(imageMode); return sar; }) .collect(Collectors.toList()); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/controller/SarMtiController.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/controller/SarMtiController.java new file mode 100644 index 0000000..f5ae4ff --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/controller/SarMtiController.java @@ -0,0 +1,67 @@ +package com.zhangy.skyeye.sar.controller; + +import com.zhangy.skyeye.common.extend.util.FileUtil; +import com.zhangy.skyeye.sar.dto.SarMtiPointGroupDTO; +import com.zhangy.skyeye.sar.dto.SarMtiQueryParam; +import com.zhangy.skyeye.sar.service.ISarMtiPointService; +import com.zhangy.skyeye.sar.service.ISarMtiTrailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.Arrays; + +@Validated +@RestController +@RequestMapping("/sar/mti") +public class SarMtiController { + + @Autowired + private ISarMtiPointService sarMtiPointService; + + @Autowired + private ISarMtiTrailService sarMtiTrailService; + + + /** + * 点列表查询 + */ + @RequestMapping("/point/list") + public Object selectPointList(@Valid @RequestBody SarMtiQueryParam param) { + return sarMtiPointService.selectList(param); + } + + /** + * 轨迹列表查询 + */ + @RequestMapping("/trail/list") + public Object selectTrailList(@Valid @RequestBody SarMtiQueryParam param) { + return sarMtiTrailService.selectList(param); + } + + + @Autowired + private ISarMtiPointService mtiPointService; + @GetMapping("/testTrail") + public Object testTrail() { + // 测试数据 + long airlineId = System.currentTimeMillis(); + long payloadId = 10001l; + long jobId = 9999l; + // 取文件前8k数据作为参数 + byte[] td= FileUtil.read("D:\\测试数据\\mti1.dat"); + for (int i = 1; i*8192 < td.length; i++) { + byte[] data = Arrays.copyOfRange(td, (i-1)*8192, i*8192); + SarMtiPointGroupDTO group = SarMtiPointGroupDTO.parse(data, payloadId, airlineId); + // 保存 + if (group == null) + continue; + mtiPointService.save(jobId, jobId, payloadId, airlineId, group, data); + } + return "ok"; + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarControlParamDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarControlParamDTO.java index 5f5da1f..8baa870 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarControlParamDTO.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarControlParamDTO.java @@ -1,6 +1,7 @@ package com.zhangy.skyeye.sar.dto; import cn.hutool.core.bean.BeanUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.zhangy.skyeye.common.extend.enums.EnumUtil; import com.zhangy.skyeye.common.extend.util.ObjectUtil; import com.zhangy.skyeye.sar.enums.SarControlTypeEnum; @@ -55,6 +56,11 @@ public class SarControlParamDTO implements Serializable, IBaseCheckService { */ private byte imageBit; + /** + * 成像模式 + */ + private byte imageMode; + /** * 航线信息,若不为空则无需调用航线算法,此时可忽略参数 airlineParam */ @@ -69,6 +75,7 @@ public class SarControlParamDTO implements Serializable, IBaseCheckService { * 转实体 * @return */ + @JsonIgnore public SarControlDTO getSarControl() { SarControlDTO e = BeanUtil.copyProperties(this, SarControlDTO.class); return e; diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarFlightPlanDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarFlightPlanDTO.java new file mode 100644 index 0000000..770ca00 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarFlightPlanDTO.java @@ -0,0 +1,51 @@ +package com.zhangy.skyeye.sar.dto; + +import lombok.Data; + +@Data +public class SarFlightPlanDTO { + // 输入参数 + private double targetLat; + private double targetLon; + private double takeoffLat; + private double takeoffLon; + private double height; + private double lookAngle; + private int radarSide; + + // 计算结果 + private double slantRange; // 斜距R + private double apertureLength; // 合成孔径长度La + private double sideOffset; // 侧视偏移D_offset + private double flightHeadingAngle; // 航线方向(度) + + // 关键点坐标 + private double p0Lat; // 航迹投影点P0 + private double p0Lon; + private double startLat; // 航线起点S + private double startLon; + private double endLat; // 航线终点E + private double endLon; + private double powerOnLat; // 开机点A + private double powerOnLon; + private double powerOffLat; // 关机点B + private double powerOffLon; + + // 距离信息 + private double routeLength; // 航线段长度S->E + private double totalDistance; // 总飞行距离 + + @Override + public String toString() { + return "起点:" + startLon + "," + startLat + "\n" + + "开机点:" + powerOnLon + "," + powerOnLat + "\n" + + "投影点:" + p0Lon + "," + p0Lat + "\n" + + "关机点:" + powerOffLon + "," + powerOffLat + "\n" + + "终点:" + endLon + "," + endLat + "\n" + + "侧视方向:" +(radarSide == 1 ? "左" : "右") + "\n" + + "斜距:" + slantRange + "\n" + + "孔径:" + apertureLength + "\n" + + "航线长度:" + routeLength; + + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarImagePacketDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarImagePacketDTO.java index 54add64..8d912b2 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarImagePacketDTO.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarImagePacketDTO.java @@ -72,9 +72,6 @@ public class SarImagePacketDTO extends SarBackPacketDTO { return null; } - if (pkt.isLast) { - int x = 1; - } // 创建Packet对象 pkt.data = pktData; return pkt; @@ -86,4 +83,13 @@ public class SarImagePacketDTO extends SarBackPacketDTO { crc.update(data); return crc.getValue(); } + + @Override + public String toString() { + return "帧ID:" + sessionId + + ",帧序号:" + packetNo + + ",数据大小:" + size + + ",是否尾包:" + (isLast ? "是" : "否") + + ",校验:" + crc32; + } } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiPointGroupDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiPointGroupDTO.java new file mode 100644 index 0000000..47a91dd --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiPointGroupDTO.java @@ -0,0 +1,68 @@ +package com.zhangy.skyeye.sar.dto; + +import com.zhangy.skyeye.sar.entity.SarMtiPoint; +import lombok.Data; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Date; + +/** + * SAR回传点 + */ +@Data +public class SarMtiPointGroupDTO { + + private Long jobConfId; + + private Long jobExecId; + + private Long airlineExecId; + + private byte[] data; + + private Long payloadId; + + //-------------- + + /** + * 目标数量,最大384 + */ + private int pointNum; + + /** + * 目标点 + */ + private SarMtiPoint[] points; + + public static SarMtiPointGroupDTO parse(byte[] data, Long payloadId, Long airlineId) { + SarMtiPointGroupDTO dto = new SarMtiPointGroupDTO(); + ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN); + //System.out.println(Integer.toHexString(Short.toUnsignedInt(buffer.getShort()))); + buffer.position(510); + dto.pointNum = Short.toUnsignedInt(buffer.getShort()); + if (dto.pointNum <= 0) { + return dto; + } + dto.points = new SarMtiPoint[dto.pointNum]; + byte[] tarData = new byte[SarMtiPoint.SIZE]; + Date createTime = new Date(); + for (int i = 0; i < dto.pointNum; i++) { + buffer.get(tarData); + dto.points[i] = new SarMtiPoint(tarData, payloadId, airlineId, createTime); + } + return dto; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("目标数量:").append(pointNum).append("\n"); + if (pointNum > 0) { + for (SarMtiPoint tar : points) { + builder.append("\t").append(tar).append("\n"); + } + } + return builder.toString(); + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiQueryParam.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiQueryParam.java new file mode 100644 index 0000000..4f93f6b --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiQueryParam.java @@ -0,0 +1,33 @@ +package com.zhangy.skyeye.sar.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 列表查询参数 + */ +@Data +public class SarMtiQueryParam extends QueryDTO { + + /** + * 载荷 + */ + @NotNull(message = "载荷不能为空") + private Long payloadId; + + /** + * 开始时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + /** + * 结束时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiTrailGroupDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiTrailGroupDTO.java new file mode 100644 index 0000000..5efaec1 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiTrailGroupDTO.java @@ -0,0 +1,55 @@ +package com.zhangy.skyeye.sar.dto; + +import com.zhangy.skyeye.sar.entity.SarMtiTrail; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Date; + +/** + * mti-lib 返回结构 + */ +@Slf4j +@Data +public class SarMtiTrailGroupDTO { + + /** + * 轨迹个数,最大334 + */ + private int trailNum; + + /** + * 目标轨迹 + */ + private SarMtiTrail[] trails; + + public SarMtiTrailGroupDTO(Long payloadId, Long airlineId, byte[] data) { + ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN); + buffer.position(510); + this.trailNum = Short.toUnsignedInt(buffer.getShort()); + this.trails = new SarMtiTrail[trailNum]; + Date date = new Date(); + for (int i = 0; i < trailNum; i++) { + byte[] pointData = new byte[20]; + try { + buffer.get(pointData); + } catch (BufferUnderflowException ex) { + log.error("轨迹生成错误:字节数不够,包数据量" + data.length + ",轨迹数" + trailNum + ",i=" + i + ",剩余" + buffer.remaining()); + } + trails[i] = new SarMtiTrail(payloadId, airlineId, pointData, date); + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("轨迹数:").append(trailNum); + for (SarMtiTrail trail : trails) { + builder.append("\t").append(trail).append("\n"); + } + return builder.toString(); + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiWsDTO.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiWsDTO.java new file mode 100644 index 0000000..b89aa6c --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/dto/SarMtiWsDTO.java @@ -0,0 +1,43 @@ +package com.zhangy.skyeye.sar.dto; + +import com.zhangy.skyeye.common.extend.util.ObjectUtil; +import com.zhangy.skyeye.sar.entity.SarMtiPoint; +import com.zhangy.skyeye.sar.entity.SarMtiTrail; +import lombok.Data; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 推送运动点 + */ +@Data +public class SarMtiWsDTO { + + /** 任务配置ID */ + private Long jobId; + + /** 载荷ID */ + private Long payloadId; + + /** + * 点迹 + */ + private SarMtiPoint[] points; + + /** + * 轨迹 + */ + private Collection> trails; + + public SarMtiWsDTO(Long jobId, Long payloadId, SarMtiPoint[] points, SarMtiTrail[] trails) { + this.jobId = jobId; + this.payloadId = payloadId; + this.points = points; + if (ObjectUtil.isNotEmpty(trails)) { + this.trails = Stream.of(trails).collect(Collectors.groupingBy(SarMtiTrail::getNo)).values(); + } + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiBase.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiBase.java new file mode 100644 index 0000000..b7720f2 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiBase.java @@ -0,0 +1,19 @@ +package com.zhangy.skyeye.sar.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class SarMtiBase implements Serializable { + + /** 载荷ID */ + protected Long payloadId; + + /** 执行航线ID */ + protected Long airlineId; + + /** 创建时间 */ + protected Date createTime; +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiPoint.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiPoint.java new file mode 100644 index 0000000..bb281a4 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiPoint.java @@ -0,0 +1,78 @@ +package com.zhangy.skyeye.sar.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.zhangy.skyeye.common.extend.util.NumberUtil; +import lombok.Data; + +import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Date; + +@Data +public class SarMtiPoint extends SarMtiBase { + + @JsonIgnore + public static final int SIZE = 20; + + /** + * 编号 0-65535 + */ + private int no; + + /** + * 距离(米) + */ + private int rg; + + /** + * 方位角 LSB=0.01° + */ + private float azimuth; + + /** + * 速度 LSB=0.01m/s + */ + private float speed; + + /** + * 高度(米) + */ + private short alt; + + /** + * 幅度 LSB=0.01dB + */ + private float amp; + + /** + * 经度 LBS=1.0e-6° + */ + private double lon; + + /** + * 纬度 LBS=1.0e-6° + */ + private double lat; + + public SarMtiPoint(byte[] data, Long payloadId, Long airlineId, Date createTime) { + ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN); + this.no = Short.toUnsignedInt(buffer.getShort()); + this.rg = Short.toUnsignedInt(buffer.getShort()); + this.azimuth = buffer.getShort() / 100f; + this.speed = buffer.getShort() / 100f; + this.alt = buffer.getShort(); + this.amp = Short.toUnsignedInt(buffer.getShort()) / 100f; + this.lon = buffer.getInt() / 1_000_000.0; + this.lat = buffer.getInt() / 1_000_000.0; + this.createTime = createTime; + this.payloadId = payloadId; + this.airlineId = airlineId; + } + + @Override + public String toString() { + return "目标编号:" + no + ",距离:" + rg + ",方位角:" + azimuth + ",幅度:" + amp + + ",速度:" + speed + ",高度:" + alt + ",经度:" + lon + ",纬度:" + lat; + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiTrail.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiTrail.java new file mode 100644 index 0000000..1fa834c --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/entity/SarMtiTrail.java @@ -0,0 +1,74 @@ +package com.zhangy.skyeye.sar.entity; + +import com.zhangy.skyeye.common.extend.util.NumberUtil; +import lombok.Data; + +import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Date; + +@Data +public class SarMtiTrail extends SarMtiBase { + + /** + * 航迹批号 UINT16 0-65535 + */ + private int no; + + /** + * 航迹点高度(米) + */ + private short alt; + + /** + * 航迹点经度 + */ + private double lon; + + /** + * 航迹点纬度 + */ + private double lat; + + /** + * 速度 + */ + private float speed; + + /** + * 航向角 + */ + private float headingAngle; + + /** + * 幅度 LSB=0.01dB + */ + private float amp; + + // 预留 + + public SarMtiTrail(Long payloadId, Long airlineId, byte[] data, Date date) { + ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN); + this.no = Short.toUnsignedInt(buffer.getShort()); + this.alt = buffer.getShort(); + this.lon = buffer.getInt() / 1_000_000.0; + this.lat = buffer.getInt() / 1_000_000.0; + this.speed = buffer.getShort() / 10f; + this.headingAngle = buffer.getShort() / 10f; + this.amp = buffer.getShort() / 100f; + this.payloadId = payloadId; + this.airlineId = airlineId; + this.createTime = date; + } + + @Override + public String toString() { + return "轨迹批号:" + no + + ",经度:" + lon + + ",纬度:" + lat + + ",高度:" + alt + + ",幅度:" + amp + + ",航向角:" + headingAngle; + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibProcessor.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibProcessor.java new file mode 100644 index 0000000..1d96cbc --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibProcessor.java @@ -0,0 +1,49 @@ +package com.zhangy.skyeye.sar.lib; + +import com.sun.jna.Memory; +import com.zhangy.skyeye.common.extend.util.FileUtil; + +/** + * lib调用处理 + */ +public class SarMtiLibProcessor { + + private static final SarMtiLibrary lib = SarMtiLibrary.INSTANCE; + + private static final int OUTPUT_SIZE = 8192; + + /** + * 调用 MTIDotProc + */ + public static byte[] mtiDotProc(byte[] inputData, String outputPath) { + // 验证参数 + if (inputData == null || inputData.length == 0) { + throw new IllegalArgumentException("输入数据不能为空"); + } + if (outputPath == null || outputPath.trim().isEmpty()) { + throw new IllegalArgumentException("输出路径不能为空"); + } + // 确保输出目录存在 + FileUtil.createDir(outputPath, true); + // 执行 + try (Memory inputMem = allocateAndFill(inputData); + Memory outputMem = new Memory(OUTPUT_SIZE)) { + lib.MTIDotProc(inputMem, outputMem, outputPath); + byte[] result = new byte[OUTPUT_SIZE]; + outputMem.read(0, result, 0, OUTPUT_SIZE); + return result; + } catch (Exception e) { + throw new RuntimeException("MTIDotProc调用失败", e); + } + } + + /** + * 分配内存 + */ + private static Memory allocateAndFill(byte[] data) { + Memory mem = new Memory(data.length); + mem.write(0, data, 0, data.length); + return mem; + } + +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibrary.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibrary.java new file mode 100644 index 0000000..cead727 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/lib/SarMtiLibrary.java @@ -0,0 +1,60 @@ +package com.zhangy.skyeye.sar.lib; + +import com.sun.jna.*; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public interface SarMtiLibrary extends Library { + + /** + * 功能:获取头位置(LZX算法) + * 输入:dataAr - 数据数组指针 + * arLen - 数组长度 + * 返回:头位置 + */ + int GetHeadPosition_LZX(Pointer dataAr, long arLen); + + /** + * 功能:处理动目标检测和凝聚后的点迹,完成测角和航迹起始和跟踪 + * 输入:dataAr - 按照WAS-GMTI格式打包的点迹信息和辅助数据 + * dataRes - 处理结果输出缓冲区 + * outpath - 航迹输出文件路径 + */ + void MTIDotProc(Pointer dataAr, Pointer dataRes, String outpath); + + /** + * 功能:根据图像四个角点的经纬度,计算任意点的经纬度位置 + * 输入:pos_info - 图像四个角的经纬度位置数组 + * grid_info - 图像四个角的坐标位置数组 + * px - 像素行位置 + * py - 像素列位置 + * 输出:latlogn - 输出的经纬度位置(数组,长度为2:[经度, 纬度]) + */ + void ArbitaryPosCal(Pointer pos_info, Pointer grid_info, long px, long py, Pointer latlogn); + + + // 自定义FunctionMapper + class CustomFunctionMapper implements FunctionMapper { + @Override + public String getFunctionName(NativeLibrary library, Method method) { + switch (method.getName()) { + case "MTIDotProc": return "?MTIDotProc@@YAXPEAE0PEAD@Z"; + case "GetHeadPosition_LZX": return "?GetHeadPosition_LZX@@YAHPEAEJ@Z"; + case "ArbitaryPosCal": return "?ArbitaryPosCal@@YAXPEANPEAJJJ0@Z"; + default: return method.getName(); + } + } + } + + // 配置选项 + Map OPTIONS = new HashMap<>() {{ + put(Library.OPTION_FUNCTION_MAPPER, new CustomFunctionMapper()); + put(Library.OPTION_STRING_ENCODING, "UTF-8"); // 字符串编码,Windows中文用GBK + }}; + + // 加载库 + SarMtiLibrary INSTANCE = Native.load("MulTarTrk", SarMtiLibrary.class, OPTIONS); +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarAbstractListener.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarAbstractListener.java index de1d5e9..689c899 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarAbstractListener.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarAbstractListener.java @@ -1,5 +1,7 @@ package com.zhangy.skyeye.sar.listen; +import com.zhangy.skyeye.sar.task.DiscardOldestPolicyWithLog; +import com.zhangy.skyeye.sar.task.PriorityThreadFactory; import lombok.extern.slf4j.Slf4j; import javax.annotation.PostConstruct; @@ -12,6 +14,11 @@ import java.net.SocketTimeoutException; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; +import java.net.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.concurrent.*; + /** * 监听器抽象,使用线程池处理udp数据 */ @@ -179,4 +186,23 @@ public abstract class SarAbstractListener { return status.toString(); } + /** + * 发送ACK包 + * + * @param ack 当前包序号 + * @param ackAc 当前最大包序号 + */ + protected void sendAck(DatagramSocket socket, InetAddress addr, int port, int ack, int ackAc) { + try { + ByteBuffer bb = ByteBuffer.allocate(8); + bb.order(ByteOrder.BIG_ENDIAN); + bb.putInt(ack); + bb.putInt(ackAc); + DatagramPacket ackPacket = new DatagramPacket(bb.array(), bb.array().length, addr, port); + socket.send(ackPacket); + } catch (IOException e) { + log.error("向" + addr.getHostAddress() + "发送ACK失败: " + e.getMessage()); + } + } + } diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarImageListener.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarImageListener.java index 462ac1d..9a7bbb0 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarImageListener.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarImageListener.java @@ -71,34 +71,18 @@ public class SarImageListener extends SarAbstractListener { return; } - SarImagePacketGroupDTO group = sarImageService.putPacket(ip, backPackDTO); - if (group != null) { - Integer maxNo = group.getMaxNo(); - // 发送ACK - if (maxNo != null) { - sendAck(socket, packet.getAddress(), packet.getPort(), backPackDTO.getPacketNo(), maxNo); - } - } - } - - /** - * 发送ACK包 - * @param socket - * @param addr - * @param port - * @param ack 当前包序号 - * @param ackAc 当前最大包序号 - */ - private static void sendAck(DatagramSocket socket, InetAddress addr, int port, int ack, int ackAc) { try { - ByteBuffer bb = ByteBuffer.allocate(8); // 2 * sizeof(uint32_t) - bb.order(ByteOrder.BIG_ENDIAN); - bb.putInt(ack); - bb.putInt(ackAc); - DatagramPacket ackPacket = new DatagramPacket(bb.array(), bb.array().length, addr, port); - socket.send(ackPacket); - } catch (IOException e) { - log.error("向" + addr.getHostAddress() + "发送ACK失败: " + e.getMessage()); + SarImagePacketGroupDTO group = sarImageService.putPacket(ip, backPackDTO); + if (group != null) { + Integer maxNo = group.getMaxNo(); + // 发送ACK + if (maxNo != null) { + sendAck(socket, packet.getAddress(), packet.getPort(), backPackDTO.getPacketNo(), maxNo); + } + } + } catch (Exception ex) { + log.error("接收图像包错误:" + ex.getMessage(), ex); + return; } } } \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiListener.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiListener.java new file mode 100644 index 0000000..bb49a84 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiListener.java @@ -0,0 +1,79 @@ +package com.zhangy.skyeye.sar.listen; + +import com.zhangy.skyeye.device.service.IPayloadService; +import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO; +import com.zhangy.skyeye.jm.dto.JmUavStatusDTO; +import com.zhangy.skyeye.jm.service.JmJobStatusService; +import com.zhangy.skyeye.sar.dto.SarImagePacketDTO; +import com.zhangy.skyeye.sar.dto.SarMtiPointGroupDTO; +import com.zhangy.skyeye.sar.service.ISarMtiPointService; +import com.zhangy.skyeye.sar.task.CircularBufferQueue; +import com.zhangy.skyeye.sar.task.DiscardOldestPolicyWithLog; +import com.zhangy.skyeye.sar.task.PriorityThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 回传动点 + * + */ +@Slf4j +@Component +public class SarMtiListener extends SarAbstractListener { + + private final int port = 39004; + + private final int size = 1472 * 30; + + @Autowired + private IPayloadService payloadService; + + @Autowired + private ISarMtiPointService mtiPointService; + + @Autowired + private JmJobStatusService jmJobStatusService; + + @Autowired + private SarMtiUdpProcessor sarMtiUdpProcessor; + + @Override + protected void init() { + super.running = true; + super.port = this.port; + super.size = this.size; + executor = new ThreadPoolExecutor( + 1, 5, 30, TimeUnit.SECONDS, + new CircularBufferQueue(50), + new PriorityThreadFactory("SarMti-", Thread.MAX_PRIORITY - 1), + new DiscardOldestPolicyWithLog() + ); + } + + @Override + protected void processData(DatagramPacket packet) throws IOException { + socket.receive(packet); + // 过滤无效数据包,丢弃过小的包 + if (packet.getLength() == 0 || packet.getLength() < 17) { + return; + } + String ip = packet.getAddress().getHostAddress(); + // 处理接收到的数据 + SarImagePacketDTO packetDTO = null; + packetDTO = SarImagePacketDTO.parse(packet.getData(), packet.getLength()); + if (packetDTO == null) { + return; + } + int packetNo = packetDTO.getPacketNo(); + sendAck(socket, packet.getAddress(), packet.getPort(), packetNo, packetNo); + sarMtiUdpProcessor.putPacket(ip, packetDTO); + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiUdpProcessor.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiUdpProcessor.java new file mode 100644 index 0000000..c958193 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarMtiUdpProcessor.java @@ -0,0 +1,194 @@ +package com.zhangy.skyeye.sar.listen; + +import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO; +import com.zhangy.skyeye.jm.dto.JmUavStatusDTO; +import com.zhangy.skyeye.jm.entity.JmImage; +import com.zhangy.skyeye.jm.service.JmJobStatusService; +import com.zhangy.skyeye.sar.dto.*; +import com.zhangy.skyeye.sar.service.ISarImageService; +import com.zhangy.skyeye.sar.service.ISarMtiPointService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * 雷达回传图像处理,统一转为4通道png格式 + */ +@Primary +@Slf4j +@Service +public class SarMtiUdpProcessor extends SarAbstractUdpProcessor { + + @Autowired + private ISarImageService sarImageService; + + @Autowired + private JmJobStatusService jobStatusService; + + @Autowired + private ISarMtiPointService mtiPointService; + + private BlockingQueue packetQueue = new LinkedBlockingQueue<>(1000); + + private Thread mtiProcessThread = new Thread(this::startProcessing); + + public SarMtiUdpProcessor() { + super.running = true; + this.mtiProcessThread.start(); + } + + protected void afterJoin(byte[] framePacketData, SarImagePacketGroupDTO group) { + JmUavStatusDTO uav = jobStatusService.getCurrUav(group.getSourceIp()); + if (uav == null) { + log.info("没有任务中的雷达,丢弃GMTI包"); + return; + } + JmAirlineStatusDTO airlineDTO = uav.getCurrAirline(); + if (airlineDTO == null) { + log.info("没有进行中的航线,丢弃GMTI包"); + return; + } + Long payloadId = uav.getSarId(); + Long airlineExecId = airlineDTO.getExecId(); + try { + SarMtiPointGroupDTO mtiFrame = SarMtiPointGroupDTO.parse(framePacketData, payloadId, airlineExecId); + if (mtiFrame == null) { + log.info("无法解析,丢弃GMTI包"); + return; + } + mtiFrame.setJobConfId(uav.getJobId()); + mtiFrame.setJobExecId(uav.getJobExecId()); + mtiFrame.setPayloadId(payloadId); + mtiFrame.setAirlineExecId(airlineExecId); + mtiFrame.setData(framePacketData); + // 放入队列(非阻塞方式) + if (!packetQueue.offer(mtiFrame, 10, TimeUnit.MILLISECONDS)) { + log.warn("接收队列已满,丢弃数据包"); + } + } catch (Exception ex) { + log.error("接收gmti包错误:" + ex.getMessage(), ex); + return; + } + } + + /** + * 判断是否可以合并回图帧,首包不能丢 + * @param group + * @return + */ + public boolean canJoin(SarImagePacketGroupDTO group) { + Map packets = group.getPackets(); + //log.info("定时判断合并udp:" + group.getSessionId() + "," + packets.keySet()); + // 首包包含图片格式信息,不能丢,否则图片无法打开 + return packets.get(0) != null; + } + + /** + * 将upd分包数据合并为完整帧(帧数据 + 头尾校验),因为无法确定分包大小,分包缺失无法补充0 + * 合并后删除frameMap的分包数据 + * 使用ByteBuffer替代ByteArrayOutputStream,以减少内存分配。ByteArrayOutputStream 的 toByteArray()底层用Arrays.copyOf实现, + * 有性能开销;ByteBuffer的array()无需拷贝数组 + * @param group + * @return + */ + private byte[] join(SarImagePacketGroupDTO group) { + ByteBuffer buffer = ByteBuffer.allocate(group.getTotalSize()); + buffer.order(ByteOrder.BIG_ENDIAN); + + Map packets = group.getPackets(); + // 使用ByteBuffer的批量操作,减少系统调用 + for (int i = 0; i <= group.getLastPacket().getPacketNo(); i++) { + SarImagePacketDTO packet = packets.get(i); + if (packet != null) { + buffer.put(packet.getData(), 0, packet.getSize()); + } + } + return buffer.array(); + } + + @Override + protected String getText() { + return "雷达回图"; + } + + @Override + public SarImagePacketGroupDTO putPacket(String sourceIp, SarImagePacketDTO packet) { + // 1.包放入缓冲区 + long sessionId = packet.getSessionId(); + SarImagePacketGroupDTO group; + if (contains(sourceIp, sessionId)) { + group = get(sourceIp, sessionId); + group.put(packet); + } else { + group = SarImagePacketGroupDTO.init(sourceIp, packet); + // 将帧与航线绑定,当航线2开机但航线1的图片未传完时,用航线ID判断生成的图片是属于哪条航线 + JmAirlineStatusDTO currAirline = jobStatusService.getCurrAirline(sourceIp); + if (currAirline == null) { + return null; // 没有在执行的任务或航线 + } + group.setAirlineExecId(currAirline.getExecId()); + put(sourceIp, sessionId, group); + } + // 2.判断是否全部包到达,是则合并 + SarImagePacketDTO last = group.getLastPacket(); + // 若所有包已收到则合并 + if (last != null && last.isLast() && group.getPackets().size() == group.getMaxNo() + 1) { + log.info("[UDP] sesionid="+ packet.getSessionId() + "全部到达合并!"); + byte[] framePacketData = join(group); + afterJoin(framePacketData, group); + remove(sourceIp, sessionId); + } + return group; + } + + + @Override + protected String getProcessorName() { + return "sarImageProcessor"; + } + + @Override + protected void expireProcess(SarImagePacketGroupDTO group) { + // 定时判断:超过 PACKET_TIMEOUT 时间未收到新包且符合生成条件则合成图 + if (canJoin(group)) { + log.info("[UDP] sesionid="+ group.getSessionId() + "超时合并!"); + byte[] framePacketData = join(group); + afterJoin(framePacketData, group); + } else { // 超时且无法合并,丢弃 + Map packets = group.getPackets(); + if (packets.size() == 1 && packets.values().iterator().next().isLast()) { + // 雷达传图有bug,每帧的尾包会多发一个,丢弃且不打印日志 + } else { + log.warn(getText() + "-移除超时帧: {}", group.getSessionId()); + } + } + } + + /** + * 启动处理线程从队列消费数据 + */ + private void startProcessing() { + while (running) { + try { + SarMtiPointGroupDTO group = packetQueue.poll(100, TimeUnit.MILLISECONDS); + if (group != null) { + try { + mtiPointService.save(group.getJobConfId(), group.getJobExecId(), group.getPayloadId(), group.getAirlineExecId(), group, group.getData()); + } catch (Exception ex) { + log.error("处理gmti包错误:" + ex.getMessage(), ex); + } + } + } catch (Exception e) { + log.error("mti处理线程异常", e); + } + } + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarStatusListener.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarStatusListener.java index 8a67a1f..0eb61f6 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarStatusListener.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/listen/SarStatusListener.java @@ -40,13 +40,13 @@ public class SarStatusListener extends SarAbstractListener { /** * 应答超时 */ - @Value("${ld.sar.udp.status.answer-timeout:1}") + @Value("${skyeye.sar.udp.status.answer-timeout:1}") private int answerTimeout; /** * 连接状态超时 */ - @Value("${ld.sar.udp.status.connect-timeout:15}") + @Value("${skyeye.sar.udp.status.connect-timeout:15}") private int connectTimeout; @Autowired diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiPointMapper.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiPointMapper.java new file mode 100644 index 0000000..80fa5d7 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiPointMapper.java @@ -0,0 +1,28 @@ +package com.zhangy.skyeye.sar.mapper; + +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhangy.skyeye.common.extend.dto.PageDTO; +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.sar.entity.SarMtiPoint; + +import java.util.List; + +@Repository +public interface SarMtiPointMapper { + + /** + * 列表查询 + */ + List selectList(QueryDTO param); + + /** + * 新增 + */ + int insert(SarMtiPoint... array); + + /** + * 按任务配置删除 + */ + int deleteByJob(Long... jobId); +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiTrailMapper.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiTrailMapper.java new file mode 100644 index 0000000..62817d1 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/mapper/SarMtiTrailMapper.java @@ -0,0 +1,28 @@ +package com.zhangy.skyeye.sar.mapper; + +import org.springframework.stereotype.Repository; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhangy.skyeye.common.extend.dto.PageDTO; +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.sar.entity.SarMtiTrail; + +import java.util.List; + +@Repository +public interface SarMtiTrailMapper { + + /** + * 列表查询 + */ + List selectList(QueryDTO param); + + /** + * 新增 + */ + int insert(SarMtiTrail... array); + + /** + * 按任务配置删除 + */ + int deleteByJob(Long... jobId); +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiPointService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiPointService.java new file mode 100644 index 0000000..55add3b --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiPointService.java @@ -0,0 +1,36 @@ +package com.zhangy.skyeye.sar.service; + +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.sar.dto.SarMtiPointGroupDTO; +import com.zhangy.skyeye.sar.entity.SarMtiPoint; + +import java.util.List; + +public interface ISarMtiPointService { + + /** + * 列表查询 + */ + List selectList(QueryDTO param); + + /** + * 新增 + */ + void insert(SarMtiPoint... e); + + /** + * 解析并保存 + * + * @param jobId 执行任务ID + * @param airlineId 执行航线ID + * @param payloadId 载荷ID + * @param group 点迹分组 + * @param pointGroupData 雷达回传的点数据 + */ + void save(Long jobConfId, Long jobExecId, Long payloadId, Long airlineId, SarMtiPointGroupDTO group, byte[] pointGroupData); + + /** + * 按任务配置删除 + */ + void deleteByJob(Long... jobId); +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiTrailService.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiTrailService.java new file mode 100644 index 0000000..ea3b593 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/ISarMtiTrailService.java @@ -0,0 +1,26 @@ +package com.zhangy.skyeye.sar.service; + +import java.util.List; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhangy.skyeye.common.extend.dto.PageDTO; +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.sar.entity.SarMtiTrail; + +public interface ISarMtiTrailService { + + /** + * 列表查询 + */ + List selectList(QueryDTO param); + + /** + * 新增 + */ + void insert(SarMtiTrail... e); + + /** + * 按任务配置删除 + */ + void deleteByJob(Long... jobId); +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarImageServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarImageServiceImpl.java index 64a72ad..62f4eb2 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarImageServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarImageServiceImpl.java @@ -2,6 +2,8 @@ package com.zhangy.skyeye.sar.service.impl; import com.zhangy.skyeye.common.extend.util.MathUtil; import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO; +import com.zhangy.skyeye.common.extend.util.ObjectUtil; +import com.zhangy.skyeye.redis.utils.RedisUtil; import com.zhangy.skyeye.jm.dto.JmImageRotateDTO; import com.zhangy.skyeye.jm.dto.JmUavStatusDTO; import com.zhangy.skyeye.jm.entity.JmImage; @@ -15,13 +17,16 @@ import com.zhangy.skyeye.sar.dto.SarBackImageFrameDTO; import com.zhangy.skyeye.sar.service.ISarImageService; import com.zhangy.skyeye.sar.service.SarWsAsyncService; import com.zhangy.skyeye.sar.util.SarImageToneAdjuster; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.opencv.core.Mat; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; import java.util.Date; +import java.util.List; @Slf4j @Service @@ -39,10 +44,116 @@ public class SarImageServiceImpl implements ISarImageService { @Autowired private SarWsAsyncService sarWsAsyncService; + @Autowired + private RedisUtil redisUtil; + + // 图片最大宽度,前端说和电脑有关,4096保险点,一般是4096 8192 16384 + @Value("${skyeye.sar.image.max:4096}") + @Setter + private int IMG_MAX_WITH; + // 起始帧号 + private final String CACHE_FIELD_START_FRAME_NO = "startFrameNo"; + // 当前帧号 + private final String CACHE_FIELD_CURR_FRAME_NO = "currFrameNo"; + // 缓存超时(秒) + private final long CACHE_EXPIRE_SECOND = 24 * 3600; + + /** + * 获取基准图像信息 + * + * @param airlineId 航线执行ID + * @param singleWidth 单条图片宽度 + * @param frameNo 当前帧号 + * @return 返回非空的图像信息,其字段 imageNo 一定有值 + */ + private JmImage getBaseImage(Long airlineId, int singleWidth, int frameNo) {IMG_MAX_WITH=1; + List imageList = imageService.selectLowByAirline(airlineId); + String cacheKey = "jmImgJoin-" + airlineId; + JmImage base = null; + // 情况1:航线第一张图 + if (ObjectUtil.isEmpty(imageList)) { + base = new JmImage(); + base.setImageNo(1); + redisUtil.hset(cacheKey, CACHE_FIELD_START_FRAME_NO, frameNo, CACHE_EXPIRE_SECOND); + return base; + } + // 情况2:如果最后一张还能拼图,则直接返回继续拼 + JmImage last = imageList.get(imageList.size() - 1); + Integer startFrameNo = (Integer) redisUtil.hget(cacheKey, CACHE_FIELD_START_FRAME_NO); + int currWidth = startFrameNo == null ? 0 : singleWidth * (frameNo - startFrameNo + 1); // 图宽(当前图+基准图) + int surplusNum = (IMG_MAX_WITH - currWidth) / singleWidth; // 还可以拼图片数 + Integer baseNo = (Integer) redisUtil.hget("jmImgJoin-" + airlineId, CACHE_FIELD_CURR_FRAME_NO); + if (startFrameNo == null || currWidth < IMG_MAX_WITH || + baseNo == null || (frameNo - baseNo + 1 <= surplusNum)) { // 当前图+填充 不能超过允许拼接数 + log.info("当前宽度:" + currWidth + " < " + IMG_MAX_WITH + " 可以继续拼接"); + return last; + } + // 情况3:已经拼接到最大数量,或者当前图+填充数量超过允许拼接数量,创建新图像文件 + log.info("当前宽度:" + currWidth + " > " + IMG_MAX_WITH + " 重新拼接,当前帧号" + frameNo + "作为首帧"); + base = new JmImage(); + redisUtil.hset(cacheKey, CACHE_FIELD_START_FRAME_NO, frameNo, CACHE_EXPIRE_SECOND); + base.setImageNo(last.getImageNo() + 1); + return base; + } + + private void modCoord(SarBackImageFrameDTO imageFrame, boolean lostImage, JmAirlineStatusDTO currAirline) { + JmImageRotateDTO rotateDTO = JmImageRotateDTO.rotate(currAirline.getTargetHeading(), currAirline.getDirection()); + Double[] before = currAirline.getBeforeRight(); + boolean isFirst = before == null; + if (isFirst) { + before = new Double[4]; + currAirline.setBeforeRight(before); + } + // 使用前一张图的右侧坐标作为后一张图的左侧,前提是没丢图 + if (!isFirst && !lostImage) { + /*imageFrame.setLon1(before[0]); + imageFrame.setLat1(before[1]); + imageFrame.setLon4(before[2]); + imageFrame.setLat4(before[3]);*/ + } + before[0] = imageFrame.getLon5(); + before[1] = imageFrame.getLat5(); + before[2] = imageFrame.getLon8(); + before[3] = imageFrame.getLat8(); + /*switch (rotateDTO.getType()) { + case 0: + case 1: + // 使用前一张图的右侧坐标作为后一张图的左侧,前提是没丢图 + if (!isFirst && !lostImage) { + imageFrame.setLon1(before[0]); + imageFrame.setLat1(before[1]); + imageFrame.setLon4(before[2]); + imageFrame.setLat4(before[3]); + } else if (before == null) { + before = new Double[4]; + currAirline.setBeforeRight(before); + } + before[0] = imageFrame.getLon5(); + before[1] = imageFrame.getLat5(); + before[2] = imageFrame.getLon8(); + before[3] = imageFrame.getLat8(); + break; + case 2: + case 3: + if (!isFirst && !lostImage) { + imageFrame.setLon5(before[0]); + imageFrame.setLat5(before[1]); + imageFrame.setLon8(before[2]); + imageFrame.setLat8(before[3]); + } + before[0] = imageFrame.getLon1(); + before[1] = imageFrame.getLat1(); + before[2] = imageFrame.getLon4(); + before[3] = imageFrame.getLat4(); + break; + } */ + } + /** * 将原始图像数据保存为dat文件,图像转png并将路径推送给前端 * - * @param group 图像包分组 + * @param sourceIp + * @param airlineExecId * @param frameData 图像帧数据 * @param imageFrame 图像帧 */ @@ -67,30 +178,50 @@ public class SarImageServiceImpl implements ISarImageService { long start = System.currentTimeMillis(); // 1.保存dat(异步) sarWsAsyncService.saveImageDat(jobExecId, airlineExecId + "-" + frameNo + ".dat", frameData); - // 2.保存图像png,用航线ID命名 - String imageName = airlineExecId + ".png"; - String[] imagePath = sysFileTypeService.getFilePath(FileTypeEnum.SAR_IMAGE_LOW, jobExecId, imageName); - String currPath = imagePath[0]; - JmImage base = imageService.selectLowByAirline(airlineExecId); - // 3.生成当前图像矩阵 + + // 2.生成当前图像矩阵 Mat currImage = loadCurrImageMat(frameData, imageFrame); if (currImage == null) { return null; } + + // 3.保存图像png,用航线ID+序号命名 + JmImage base = getBaseImage(airlineExecId, currImage.width(), imageFrame.getFrameNo()); + String imageName = airlineExecId + "-" + base.getImageNo() +".png"; + String[] imagePath = sysFileTypeService.getFilePath(FileTypeEnum.SAR_IMAGE_LOW, jobExecId, imageName); + String currPath = imagePath[0]; + + System.out.println("帧:" + frameNo); + // 4.保存基准图(同步),用于下次拼接 - String basePath = sysFileTypeService.getAbsolutePath(FileTypeEnum.SAR_IMAGE_LOW, jobExecId, airlineExecId + "-base.png"); - Mat baseMat = generateBaseMat(base, currImage, frameNo, imageFrame.getMax(), basePath); + Integer baseNo = (Integer) redisUtil.hget("jmImgJoin-" + airlineExecId, CACHE_FIELD_CURR_FRAME_NO); + boolean lostImage = baseNo != null && (frameNo - baseNo > 1); // 判断是否丢图 + String basePath = sysFileTypeService.getAbsolutePath(FileTypeEnum.SAR_IMAGE_LOW, jobExecId, + airlineExecId + "-" + base.getImageNo() +"-base.png"); + Mat baseMat = generateBaseMat(base, currImage, frameNo, imageFrame.getMax(), basePath, baseNo); if (baseMat == null) { // 拼接失败 或 基准图生成失败则跳过,按丢图处理 return null; } + if (lostImage) { + log.warn("丢图"+(frameNo - baseNo)+"张!当前帧" + frameNo + ",前帧" + baseNo); + } + + //modCoord(imageFrame, lostImage, currAirline); + redisUtil.hset("jmImgJoin-" + airlineExecId, CACHE_FIELD_CURR_FRAME_NO, frameNo, CACHE_EXPIRE_SECOND);// 更新帧号 // ### 亮度调整,用于可靠udp版本图像,固定使用系数0.5 - SarImageToneAdjuster.autoToneWithClipping(baseMat, 0.5f); + // 拆分多张图片,去掉自适应调整 + if (IMG_MAX_WITH > 20000) { + SarImageToneAdjuster.autoToneWithClipping(baseMat, 0.5f); + } + // 5.保存后处理图(异步),用于前端显示 generateAfterMat(currAirline, baseMat, currPath, uav.getSarImageLight()); + // 6.更新基准图坐标和帧号 - JmImage imageInfo = saveImage(uav, airlineExecId, base, imagePath, imageFrame, frameNo); + JmImage imageInfo = saveImage(uav, airlineExecId, base, imagePath, imageFrame, frameNo, lostImage); long end = System.currentTimeMillis(); - log.info("生成"+imageFrame.getImageBitDeep()+"位雷达回传图像:帧序号" + frameNo + "," + imageInfo.getRelativePath() + ",耗时" + (end - start)/1000 + "秒"); + log.info("生成" + imageFrame.getImageBitDeep()+"位雷达回传图像:帧序号" + frameNo + "," + + imageInfo.getRelativePath() + ",耗时" + (end - start)/1000 + "秒"); return imageInfo; } @@ -137,11 +268,10 @@ public class SarImageServiceImpl implements ISarImageService { * @param imagePath 基准图路径 * @return */ - private Mat generateBaseMat(JmImage base, Mat currImage, int currNo, float currMax, String imagePath) { + private Mat generateBaseMat(JmImage base, Mat currImage, int currNo, float currMax, String imagePath, Integer baseNo) { Mat baseImage = OpenCVUtil.read(imagePath); // 从硬盘加载基准图 - Integer baseNo = base == null ? null : base.getFrameNo(); // 归一化调整 - if (base != null) { + if (base.getId() != null) { float baseMax = base.getMax(); //System.out.println("基准图:" + baseMax + ",当前图:" + currMax); if (baseMax < currMax) { @@ -162,7 +292,7 @@ public class SarImageServiceImpl implements ISarImageService { * * @param currAirline 当前航线信息 * @param baseMat 原基准图,处理后释放资源 - * @param currPath 后处理图路径,每条航线对应一张图,每次生成会覆盖 + * @param imagePath 后处理图路径,每条航线对应一张图,每次生成会覆盖 * @param imageLight 图像亮度倍数,0是不调整 */ private void generateAfterMat(JmAirlineStatusDTO currAirline, Mat baseMat, String imagePath, int imageLight) { @@ -179,11 +309,9 @@ public class SarImageServiceImpl implements ISarImageService { * @param airlineId 航线执行ID */ private JmImage saveImage(JmUavStatusDTO uav, Long airlineId, JmImage image, String[] imagePath, - SarBackImageFrameDTO imageFrame, int frameNo) { - boolean isFirst = image == null; - if (isFirst) { - image = new JmImage(); - } + SarBackImageFrameDTO imageFrame, int frameNo, boolean lostImage) { + boolean isFirst = image.getId() == null; + // 拼接后的图片的四角坐标 double minLon = isFirst ? MathUtil.min(imageFrame.getLon1(), imageFrame.getLon4(), imageFrame.getLon5(), imageFrame.getLon8()) : MathUtil.min(imageFrame.getLon1(), imageFrame.getLon4(), imageFrame.getLon5(), imageFrame.getLon8(), image.getLeft1Lon(), image.getRight1Lon()); @@ -194,8 +322,8 @@ public class SarImageServiceImpl implements ISarImageService { double maxLat = isFirst ? MathUtil.max(imageFrame.getLat1(), imageFrame.getLat4(), imageFrame.getLat5(), imageFrame.getLat8()) : MathUtil.max(imageFrame.getLat1(), imageFrame.getLat4(), imageFrame.getLat5(), imageFrame.getLat8(), image.getLeft1Lat(), image.getLeft2Lat()); // 更新坐标和序号 - image.setFrameNo(frameNo); image.updateCoord(minLon, maxLon, minLat, maxLat); + Float currMax = !isFirst && image.getMax() > imageFrame.getMax() ? image.getMax() : imageFrame.getMax(); image.setMax(currMax); image.setImageTime(imageFrame.getDate()); diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiPointServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiPointServiceImpl.java new file mode 100644 index 0000000..86ea434 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiPointServiceImpl.java @@ -0,0 +1,89 @@ +package com.zhangy.skyeye.sar.service.impl; + +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.common.extend.util.FileUtil; +import com.zhangy.skyeye.common.extend.util.ObjectUtil; +import com.zhangy.skyeye.device.service.IPayloadService; +import com.zhangy.skyeye.publics.consts.FileTypeEnum; +import com.zhangy.skyeye.publics.consts.WebSocketKey; +import com.zhangy.skyeye.publics.service.SysFileTypeService; +import com.zhangy.skyeye.sar.dto.SarMtiPointGroupDTO; +import com.zhangy.skyeye.sar.dto.SarMtiTrailGroupDTO; +import com.zhangy.skyeye.sar.dto.SarMtiWsDTO; +import com.zhangy.skyeye.sar.entity.SarMtiPoint; +import com.zhangy.skyeye.sar.entity.SarMtiTrail; +import com.zhangy.skyeye.sar.lib.SarMtiLibProcessor; +import com.zhangy.skyeye.sar.mapper.SarMtiPointMapper; +import com.zhangy.skyeye.sar.service.ISarMtiPointService; +import com.zhangy.skyeye.sar.service.ISarMtiTrailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +public class SarMtiPointServiceImpl implements ISarMtiPointService { + + @Autowired + private SarMtiPointMapper sarMtiPointMapper; + + @Autowired + private IPayloadService payloadService; + + @Autowired + private ISarMtiTrailService sarMtiTrailService; + + @Autowired + private SimpMessagingTemplate simpMessageingTemplate; + + @Autowired + private SysFileTypeService sysFileTypeService; + + @Override + public List selectList(QueryDTO param) { + return sarMtiPointMapper.selectList(param); + } + + @Transactional + @Override + public void insert(SarMtiPoint... e) { + if (ObjectUtil.isNotEmpty(e)) { + sarMtiPointMapper.insert(e); + } + } + + @Override + public void save(Long jobConfId, Long jobExecId, Long payloadId, Long airlineId, SarMtiPointGroupDTO group, byte[] pointGroupData) { + // 保存点迹 + SarMtiPoint[] points = group.getPoints(); + insert(points); + // 生成并保存轨迹 + String dirPath = jobExecId + "/" + airlineId; + String outputPath = sysFileTypeService.getDirectory(FileTypeEnum.SAR_MTI_LIB, dirPath).getAbsolutePath(); + byte[] result = null; + try { + result = SarMtiLibProcessor.mtiDotProc(pointGroupData, outputPath); + } catch (Throwable ex) { + log.error("生成GMTI轨迹错误:" + ex.getMessage()); + ex.printStackTrace(); + } + SarMtiTrailGroupDTO trailGroup = new SarMtiTrailGroupDTO(payloadId, airlineId, result); + log.info(trailGroup.toString()); + SarMtiTrail[] trails = trailGroup.getTrails(); + sarMtiTrailService.insert(trails); + // 推送 + SarMtiWsDTO ws = new SarMtiWsDTO(jobConfId, payloadId, points, trails); + simpMessageingTemplate.convertAndSend(WebSocketKey.SAR_BACK_GMTI, ws); + } + + @Override + public void deleteByJob(Long... jobId) { + if (ObjectUtil.isNotEmpty(jobId)) { + sarMtiPointMapper.deleteByJob(jobId); + } + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiTrailServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiTrailServiceImpl.java new file mode 100644 index 0000000..aa36d01 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarMtiTrailServiceImpl.java @@ -0,0 +1,39 @@ +package com.zhangy.skyeye.sar.service.impl; + +import java.util.List; + +import com.zhangy.skyeye.common.extend.util.ObjectUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.zhangy.skyeye.common.extend.dto.QueryDTO; +import com.zhangy.skyeye.sar.entity.SarMtiTrail; +import com.zhangy.skyeye.sar.mapper.SarMtiTrailMapper; +import com.zhangy.skyeye.sar.service.ISarMtiTrailService; + +@Service +public class SarMtiTrailServiceImpl implements ISarMtiTrailService { + + @Autowired + private SarMtiTrailMapper sarMtiTrailMapper; + + @Override + public List selectList(QueryDTO param) { + return sarMtiTrailMapper.selectList(param); + } + + @Transactional + @Override + public void insert(SarMtiTrail... e) { + if (ObjectUtil.isNotEmpty(e)) { + sarMtiTrailMapper.insert(e); + } + } + + @Override + public void deleteByJob(Long... jobId) { + if (ObjectUtil.isNotEmpty(jobId)) { + sarMtiTrailMapper.deleteByJob(jobId); + } + } +} \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/util/SpotlightPlanner.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/util/SpotlightPlanner.java new file mode 100644 index 0000000..7154b79 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/util/SpotlightPlanner.java @@ -0,0 +1,130 @@ +package com.zhangy.skyeye.sar.util; + +import com.zhangy.skyeye.publics.utils.CoordUtil; +import com.zhangy.skyeye.sar.dto.SarFlightPlanDTO; + +public class SpotlightPlanner { + + /** + * 规划SAR聚束模式航线 + * @param targetLat 目标点纬度(度) + * @param targetLon 目标点经度(度) + * @param takeoffLat 起飞点纬度(度) + * @param takeoffLon 起飞点经度(度) + * @param height 飞行高度(米,相对地面) + * @param lookAngle 下视角(度,从竖直方向算起) + * @param radarSide 雷达侧视方向:1 左,-1 右 + * @param flightHeadingAngle 航线方向(度,0=北,90=东),如果为null则自动计算 + */ + public static SarFlightPlanDTO planRoute(double targetLat, double targetLon, + double takeoffLat, double takeoffLon, + double height, double lookAngle, + int radarSide, Double flightHeadingAngle) { + + SarFlightPlanDTO plan = new SarFlightPlanDTO(); + plan.setTargetLat(targetLat); + plan.setTargetLon(targetLon); + plan.setTakeoffLat(takeoffLat); + plan.setTakeoffLon(takeoffLon); + plan.setHeight(height); + plan.setLookAngle(lookAngle); + plan.setRadarSide(radarSide); + + // 1. 计算斜距R + double lookAngleRad = CoordUtil.toRadians(lookAngle); + double R = height / Math.cos(lookAngleRad); + + // 2. 计算合成孔径长度La + double La = (7.2 * Math.PI * R) / 180.0; + + // 3. 计算侧视偏移距离 + double D_offset = height * Math.tan(lookAngleRad); + + // 4. 确定航线方向 + double finalFlightHeadingAngle; + if (flightHeadingAngle != null) { + finalFlightHeadingAngle = flightHeadingAngle; + } else { + // 自动计算:航线方向与起飞点到目标的连线方向相同或相反 + double bearingToTarget = CoordUtil.calculateBearing(takeoffLat, takeoffLon, targetLat, targetLon); + // 选择使得航线起点靠近起飞点的方向 + // 这里简单选择与目标方位相同的方向 + finalFlightHeadingAngle = bearingToTarget; + } + plan.setFlightHeadingAngle(finalFlightHeadingAngle); + + // 5. 计算航迹投影点P0(飞机在此点时斜距最近) + // 首先计算垂直于航线方向的方向 + double perpendicularDirection = finalFlightHeadingAngle - (radarSide == -1 ? 90 : -90); + + // 将目标点沿垂直方向移动D_offset距离得到P0 + double[] P0 = CoordUtil.calculateDestination(targetLat, targetLon, perpendicularDirection, D_offset); + plan.setP0Lat(P0[0]); + plan.setP0Lon(P0[1]); + + // 6. 计算航线起点S和终点E + // 从P0沿航线反方向移动(1*La + 100)得到S + double reverseDirection = (finalFlightHeadingAngle + 180) % 360; + double offsetDistance = La + 100.0; + + double[] S = CoordUtil.calculateDestination(P0[0], P0[1], reverseDirection, offsetDistance); + plan.setStartLat(S[0]); + plan.setStartLon(S[1]); + + // 从P0沿航线方向移动(1*La + 100)得到E + double[] E = CoordUtil.calculateDestination(P0[0], P0[1], finalFlightHeadingAngle, offsetDistance); + plan.setEndLat(E[0]); + plan.setEndLon(E[1]); + + // 7. 计算开机点A和关机点B + // A点:从S沿航线方向移动100米 + double[] A = CoordUtil.calculateDestination(S[0], S[1], finalFlightHeadingAngle, 100.0); + plan.setPowerOnLat(A[0]); + plan.setPowerOnLon(A[1]); + + // B点:从E沿航线反方向移动100米 + double[] B = CoordUtil.calculateDestination(E[0], E[1], reverseDirection, 100.0); + plan.setPowerOffLat(B[0]); + plan.setPowerOffLon(B[1]); + + // 8. 计算距离信息 + plan.setSlantRange(R); + plan.setApertureLength(La); + plan.setSideOffset(D_offset); + plan.setRouteLength(CoordUtil.calculateDistance(S[0], S[1], E[0], E[1])); + + // 计算总飞行距离(起飞点->S->E) + double distanceTakeoffToS = CoordUtil.calculateDistance(takeoffLat, takeoffLon, S[0], S[1]); + double distanceSE = plan.getRouteLength(); + // double distanceEToTakeoff = CoordUtil.calculateDistance(E[0], E[1], takeoffLat, takeoffLon); + plan.setTotalDistance(distanceTakeoffToS + distanceSE /*+ distanceEToTakeoff*/); + + return plan; + } + + /** + * 优化航线方向以最小化总飞行距离 + */ + public static SarFlightPlanDTO optimizeRoute(double targetLon, double targetLat, + double takeoffLon, double takeoffLat, + double height, double lookAngle, + int radarSide) { + double bestDirection = 0; + double minDistance = Double.MAX_VALUE; + SarFlightPlanDTO bestPlan = null; + + // 尝试36个方向(每10度一个) + for (int i = 0; i < 36; i++) { + double direction = i * 10.0; + SarFlightPlanDTO plan = planRoute(targetLat, targetLon, takeoffLat, takeoffLon, + height, lookAngle, radarSide, direction); + + if (plan.getTotalDistance() < minDistance) { + minDistance = plan.getTotalDistance(); + bestDirection = direction; + bestPlan = plan; + } + } + return bestPlan; + } +} diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/weather/service/impl/WeatherServiceImpl.java b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/weather/service/impl/WeatherServiceImpl.java index 8c227e8..a007b03 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/weather/service/impl/WeatherServiceImpl.java +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/weather/service/impl/WeatherServiceImpl.java @@ -21,7 +21,7 @@ import java.net.http.HttpResponse; public class WeatherServiceImpl implements IWeatherService { @Setter - @Value("${ld.weather.cityCode}") + @Value("${skyeye.weather.cityCode}") private String cityCode; /** 天气服务地址 */ diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application-dev.yml b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application-dev.yml index b971507..062a0fa 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application-dev.yml +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application-dev.yml @@ -37,7 +37,7 @@ spring: datasource: url: jdbc:mysql://127.0.0.1:3306/zhangy-skyeye?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false username: root - password: 'root' + password: 'P@ssw0rd' driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource @@ -50,7 +50,7 @@ spring: database: 0 host: 127.0.0.1 port: 6379 - #password: 'P@ssw0rd' + password: 'P@ssw0rd' mybatis-plus: mapper-locations: classpath*:mapping/**/*Mapping.xml @@ -68,20 +68,22 @@ jasypt: encryptor: # 指定加密算法,例如 PBEWithMD5AndDES, PBEWithHMACSHA512AndAES_256 等 algorithm: PBEWithMD5AndDES -ld: +skyeye: file-root: "d:/1/" + debug: false uav: upload: kmz sar: image: type: 1 + max: 409600000 udp: status: - answer-timeout: 1 + answer-timeout: 2 connect-timeout: 15 py: ktkxUrl: http://127.0.0.1:18090/ktkx/UavPlanning/SAR - # detectUrl: http://127.0.0.1:18091/ktkx/detect/cpu/SARCoord + detectUrl: http://127.0.0.1:18091/ktkx/detect/cpu/SARCoord weather: cityCode: 101120201 @@ -89,5 +91,5 @@ logging: file: name: "logs/" level: - com.zhangy: info + com.zhangy: debug org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler: OFF \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application.yml b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application.yml index 27df28d..8345cd0 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application.yml +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/application.yml @@ -3,4 +3,4 @@ spring: name: zy-skyeye-service profiles: active: dev - debug: true \ No newline at end of file + debug: false \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/db.sql b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/db.sql index 4512289..0f318da 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/db.sql +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/db.sql @@ -38,7 +38,7 @@ CREATE TABLE `jm_airline` ( `direction` int DEFAULT NULL COMMENT '侧视方向', `polarization` int DEFAULT NULL COMMENT '极化方式', `uav_id` bigint DEFAULT NULL COMMENT '无人机', - `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '执行状态;0 未执行,1 执行中,2 已完成', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '执行状态;0 未执行,1 执行中,2 已完成', `begin_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `start_lon` decimal(11,8) DEFAULT NULL COMMENT '航线起点经度', @@ -49,9 +49,12 @@ CREATE TABLE `jm_airline` ( `end_height` decimal(11,7) DEFAULT NULL COMMENT '航线终点高度', `distance` int DEFAULT NULL COMMENT '航线路程', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='航线'; +) ENGINE=InnoDB AUTO_INCREMENT=10031 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='航线'; LOCK TABLES `jm_airline` WRITE; + +INSERT INTO `jm_airline` VALUES (10007,10007,0,1,120.29005691,36.01991644,300.0000000,120.29271974,36.02979570,0.0000000,120.33648989,36.01164282,300.0000000,120.31593816,36.02565028,0.0000000,1088,3759,102,20.0000,300.0000000,15.000000,0.000000,0,1,0,10001,'0',NULL,NULL,120.28897329,36.02010929,300.0000000,120.33757328,36.01144955,300.0000000,5426),(10009,10009,0,1,120.27678579,36.03638988,300.0000000,120.28414188,36.05074279,0.0000000,120.29398472,36.03057420,300.0000000,120.29274764,36.04784249,0.0000000,1520,885,113,20.0000,300.0000000,9.871492,0.000000,0,1,0,10001,'0',NULL,NULL,120.27576142,36.03673616,300.0000000,120.29500894,36.03022777,300.0000000,2171),(10010,10010,0,1,120.27586637,36.03630418,300.0000000,120.27803560,36.04624313,0.0000000,120.29271000,36.03387763,300.0000000,120.28645939,36.04503176,0.0000000,1053,1016,100,20.0000,300.0000000,15.000000,0.000000,0,1,0,10001,'0',NULL,NULL,120.27477386,36.03646149,300.0000000,120.29380244,36.03372016,300.0000000,2121),(10011,10011,0,1,120.27886487,36.03684390,300.0000000,120.27992132,36.04623581,0.0000000,120.29124117,36.03592477,300.0000000,120.28611073,36.04577800,0.0000000,931,626,95,13.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,120.27775992,36.03692589,300.0000000,120.29234610,36.03584265,300.0000000,1623),(10012,10012,0,1,120.28212402,36.02245781,300.0000000,120.28504373,36.03159983,0.0000000,120.33034876,36.01227937,300.0000000,120.30915971,36.02650864,0.0000000,1012,3998,105,14.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,120.28105023,36.02268420,300.0000000,120.33142226,36.01205254,300.0000000,5633),(10013,10013,0,1,119.78843658,35.64056730,300.0000000,119.80081515,35.64062079,0.0000000,119.78867406,35.60370006,300.0000000,119.80093116,35.62218614,0.0000000,1088,3565,180,20.0000,300.0000000,15.000000,0.000000,0,1,0,10001,'0',NULL,NULL,119.78843077,35.64146854,300.0000000,119.78867986,35.60279882,300.0000000,2136),(10014,10014,0,1,119.80365875,35.63505084,300.0000000,119.81520860,35.63482363,0.0000000,119.80268651,35.60213405,300.0000000,119.81472199,35.61836434,0.0000000,1011,3160,181,20.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,119.80368537,35.63595182,300.0000000,119.80265991,35.60123306,300.0000000,1922),(10015,10015,0,1,119.79198355,35.63159700,300.0000000,119.80354251,35.63163715,0.0000000,119.79215033,35.59943003,300.0000000,119.80362627,35.61555279,0.0000000,1012,3075,180,20.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,119.79197887,35.63249824,300.0000000,119.79215500,35.59852879,300.0000000,1877),(10016,10016,0,1,119.80073821,35.62891315,300.0000000,119.81230748,35.62903312,0.0000000,119.80141448,35.58520658,300.0000000,119.81264098,35.60717864,0.0000000,1012,4356,179,20.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,119.80072426,35.62981432,300.0000000,119.80142842,35.58430540,300.0000000,2516),(10017,10017,0,1,119.80792409,35.62958687,300.0000000,119.83329888,35.62986262,0.0000000,119.80866708,35.58418495,300.0000000,119.83364816,35.60715993,0.0000000,1867,3990,179,15.0000,300.0000000,7.461581,0.000000,0,1,0,10001,'0',NULL,NULL,119.80790933,35.63048803,300.0000000,119.80868182,35.58328377,300.0000000,2610),(10019,10019,0,1,119.80487231,35.63622392,300.0000000,119.82391687,35.63599508,0.0000000,119.80415414,35.59627610,300.0000000,119.82356135,35.61601990,0.0000000,1519,3639,181,16.0000,300.0000000,9.871492,0.000000,0,1,0,10001,'0',NULL,NULL,119.80488852,35.63712507,300.0000000,119.80413795,35.59537495,300.0000000,2308),(10024,10024,0,1,119.80063681,35.62730263,300.0000000,119.81887080,35.62742026,0.0000000,119.80097235,35.59278461,300.0000000,119.81904253,35.61016020,0.0000000,1458,3069,180,15.0000,300.0000000,10.300000,0.000000,0,1,0,10001,'0',NULL,NULL,119.80062804,35.62820385,300.0000000,119.80098110,35.59188339,300.0000000,2007),(10025,10025,0,1,119.80491234,35.63844928,300.0000000,119.81646551,35.63831128,0.0000000,119.80411416,35.59405073,300.0000000,119.81606550,35.61611085,0.0000000,1011,4433,181,15.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'0',NULL,NULL,119.80492855,35.63935042,300.0000000,119.80409797,35.59314957,300.0000000,2555),(10027,10027,0,1,120.28212402,36.02245781,300.0000000,120.28504373,36.03159983,0.0000000,120.33034876,36.01227937,300.0000000,120.30915971,36.02650864,0.0000000,1012,3998,105,14.0000,300.0000000,16.000000,0.000000,0,1,0,10001,'1',NULL,'2026-01-19 13:54:21',120.28105023,36.02268420,300.0000000,120.33142226,36.01205254,300.0000000,5632); + UNLOCK TABLES; -- @@ -64,14 +67,17 @@ CREATE TABLE `jm_airline_exec` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭', `job_id` bigint DEFAULT NULL COMMENT '浠诲姟鎵ц?ID', `conf_id` bigint DEFAULT NULL COMMENT '鑸?嚎閰嶇疆ID', - `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '鎵ц?鐘舵?;0 鏈?墽琛岋紝1 鎵ц?涓?紝2 宸插畬鎴', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '鎵ц?鐘舵?;0 鏈?墽琛岋紝1 鎵ц?涓?紝2 宸插畬鎴', `begin_time` datetime DEFAULT NULL COMMENT '寮??鏃堕棿', `end_time` datetime DEFAULT NULL COMMENT '缁撴潫鏃堕棿', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='鑸?嚎鎵ц?'; +) ENGINE=InnoDB AUTO_INCREMENT=10026 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='鑸?嚎鎵ц?'; + LOCK TABLES `jm_airline_exec` WRITE; +INSERT INTO `jm_airline_exec` VALUES (10001,10001,10005,'1','2026-01-13 11:33:15',NULL),(10002,10002,10006,'1','2026-01-13 13:00:31',NULL),(10003,10003,10007,'2','2026-01-13 13:19:15','2026-01-13 13:22:50'),(10004,10004,10008,'0',NULL,NULL),(10005,10005,10009,'2','2026-01-13 13:37:49','2026-01-13 13:39:13'),(10006,10006,10010,'2','2026-01-13 14:41:12','2026-01-13 14:42:30'),(10007,10007,10011,'2','2026-01-13 14:48:49','2026-01-13 14:50:15'),(10008,10008,10012,'2','2026-01-13 14:59:06','2026-01-13 15:04:12'),(10009,10009,10013,'1','2026-01-15 10:09:42',NULL),(10010,10010,10014,'2','2026-01-15 10:19:49','2026-01-15 10:22:51'),(10011,10011,10015,'2','2026-01-15 10:35:17','2026-01-15 10:38:15'),(10012,10012,10016,'2','2026-01-15 14:17:36','2026-01-15 14:21:41'),(10013,10013,10017,'2','2026-01-15 14:33:13','2026-01-15 14:38:02'),(10014,10014,10019,'2','2026-01-15 15:09:52','2026-01-15 15:14:29'),(10015,10015,10020,'0',NULL,NULL),(10016,10016,10021,'0',NULL,NULL),(10017,10017,10023,'0',NULL,NULL),(10018,10018,10024,'2','2026-01-15 15:43:01','2026-01-15 15:47:17'),(10019,10019,10025,'0',NULL,NULL),(10021,10021,10026,'1','2026-01-16 12:17:28',NULL),(10022,10022,10027,'1','2026-01-16 12:25:19','2026-01-19 13:54:21'),(10023,10023,10028,'1','2026-01-19 13:57:05',NULL),(10024,10024,10029,'2','2026-01-19 14:26:41','2026-01-19 14:26:43'),(10025,10025,10030,'2','2026-01-19 14:29:41','2026-01-19 14:29:52'); + UNLOCK TABLES; -- @@ -82,7 +88,7 @@ DROP TABLE IF EXISTS `jm_image`; CREATE TABLE `jm_image` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', `job_id` bigint DEFAULT NULL COMMENT '任务', `uav_id` bigint DEFAULT NULL COMMENT '无人机', `payload_id` bigint DEFAULT NULL COMMENT '载荷', @@ -100,11 +106,16 @@ CREATE TABLE `jm_image` ( `max` decimal(20,6) DEFAULT NULL COMMENT '归一化前最大值', `image_time` datetime DEFAULT NULL COMMENT '图像生成时间', `create_time` datetime DEFAULT NULL COMMENT '文件上传时间', + `image_no` int DEFAULT '1' COMMENT '图像编号', + `start_frame_no` int DEFAULT NULL, + `end_frame_no` int DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='sar图像'; +) ENGINE=InnoDB AUTO_INCREMENT=10542 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='sar图像'; LOCK TABLES `jm_image` WRITE; +INSERT INTO `jm_image` VALUES (10002,'10001-1.png',10001,10001,10001,10001,10002,120.27466487,36.04481163,120.27466487,36.03287050,120.28839011,36.04481163,120.28839011,36.03287050,NULL,1000000000.000000,'2026-01-13 11:34:06','2026-01-13 11:33:26',1,NULL,NULL),(10003,'10001-2.png',10001,10001,10001,10001,10003,120.28536143,36.04260383,120.28536143,36.03068900,120.29904621,36.04260383,120.29904621,36.03068900,NULL,1000000000.000000,'2026-01-13 11:34:56','2026-01-13 11:34:15',2,NULL,NULL),(10004,'10001-3.png',10001,10001,10001,10001,10004,120.29608413,36.04043197,120.29608413,36.02850063,120.30984596,36.04043197,120.30984596,36.02850063,NULL,1000000000.000000,'2026-01-13 11:35:46','2026-01-13 11:35:06',3,NULL,NULL),(10005,'10001-4.png',10001,10001,10001,10001,10005,120.30698702,36.03819333,120.30698702,36.02632589,120.32060022,36.03819333,120.32060022,36.02632589,NULL,1000000000.000000,'2026-01-13 11:36:36','2026-01-13 11:35:56',4,NULL,NULL),(10006,'10001-5.png',10001,10001,10001,10001,10006,120.30800757,36.03605426,120.30800757,36.02154118,120.32952042,36.03605426,120.32952042,36.02154118,NULL,1000000000.000000,'2026-01-13 11:37:27','2026-01-13 11:36:47',5,NULL,NULL),(10007,'10001-6.png',10001,10001,10001,10001,10007,120.31729112,36.03683165,120.31729112,36.02517589,120.33206169,36.03683165,120.33206169,36.02517589,NULL,1000000000.000000,'2026-01-13 11:38:11','2026-01-13 11:37:37',6,NULL,NULL),(10008,'10002-1.png',10002,10001,10001,10002,10008,120.29107937,36.03472684,120.29107937,36.00582075,120.35005743,36.03472684,120.35005743,36.00582075,NULL,1000000000.000000,'2026-01-13 13:06:09','2026-01-13 13:00:41',1,NULL,NULL),(10009,'10003-1.png',10003,10001,10001,10003,10009,120.29148437,36.03477621,120.29148437,36.01796179,120.33321682,36.03477621,120.33321682,36.01796179,NULL,1000000000.000000,'2026-01-13 13:22:39','2026-01-13 13:19:25',1,NULL,NULL),(10010,'10005-1.png',10005,10001,10001,10005,10010,120.28025710,36.05817847,120.28025710,36.04009910,120.30042519,36.05817847,120.30042519,36.04009910,NULL,1000000000.000000,'2026-01-13 13:39:07','2026-01-13 13:38:10',1,NULL,NULL),(10011,'10006-1.png',10006,10001,10001,10006,10011,120.27650706,36.05158359,120.27650706,36.04036173,120.28787357,36.05158359,120.28787357,36.04036173,NULL,1000000000.000000,'2026-01-13 14:42:20','2026-01-13 14:41:28',1,NULL,NULL),(10012,'10007-1.png',10007,10001,10001,10007,10012,120.27929130,36.05099393,120.27929130,36.04120393,120.29249245,36.05099393,120.29249245,36.04120393,NULL,1000000000.000000,'2026-01-13 14:50:09','2026-01-13 14:49:01',1,NULL,NULL),(10013,'10008-1.png',10008,10001,10001,10008,10013,120.28777608,36.03521892,120.28777608,36.01794916,120.33034291,36.03521892,120.33034291,36.01794916,NULL,1000000000.000000,'2026-01-13 15:04:00','2026-01-13 14:59:45',1,NULL,NULL),(10014,'10009-1.png',10009,10001,10001,10009,10014,119.79487271,35.64118617,119.79487271,35.61794849,119.80726125,35.64118617,119.80726125,35.61794849,NULL,1000000000.000000,'2026-01-15 10:11:39','2026-01-15 10:09:52',1,NULL,NULL),(10015,'10010-1.png',10010,10001,10001,10010,10015,119.80863716,35.63507411,119.80863716,35.60094917,119.82094213,35.63507411,119.82094213,35.60094917,NULL,1000000000.000000,'2026-01-15 10:22:47','2026-01-15 10:20:01',1,NULL,NULL),(10016,'10011-1.png',10011,10001,10001,10011,10016,119.79795791,35.63169554,119.79795791,35.59927363,119.80941951,35.63169554,119.80941951,35.59927363,NULL,1000000000.000000,'2026-01-15 10:38:06','2026-01-15 10:35:26',1,NULL,NULL),(10017,'10012-1.png',10012,10001,10001,10012,10017,119.80677835,35.62921488,119.80677835,35.59505946,119.81853442,35.62921488,119.81853442,35.59505946,NULL,1000000000.000000,'2026-01-15 14:21:35','2026-01-15 14:17:52',1,NULL,NULL),(10018,'10013-1.png',10013,10001,10001,10013,10018,119.82294321,35.63014415,119.82294321,35.59359294,119.84515672,35.63014415,119.84515672,35.59359294,NULL,1000000000.000000,'2026-01-15 14:38:00','2026-01-15 14:33:56',1,NULL,NULL),(10019,'10014-1.png',10014,10001,10001,10014,10019,119.81487708,35.63639550,119.81487708,35.60045996,119.83355762,35.63639550,119.83355762,35.60045996,NULL,1000000000.000000,'2026-01-15 15:14:27','2026-01-15 15:10:15',1,NULL,NULL),(10020,'10018-1.png',10018,10001,10001,10018,10020,119.81084031,35.62776331,119.81084031,35.59730299,119.82802208,35.62776331,119.82802208,35.59730299,NULL,1000000000.000000,'2026-01-15 15:47:05','2026-01-15 15:43:30',1,NULL,NULL),(10021,'10021-1.png',10021,10001,10001,10021,10021,119.81084031,35.62776331,119.81084031,35.61833432,119.82783247,35.62776331,119.82783247,35.61833432,NULL,1000000000.000000,'2026-01-15 15:44:23','2026-01-16 12:20:12',1,NULL,NULL),(10022,'10021-2.png',10021,10001,10001,10021,10022,119.81088278,35.61866959,119.81088278,35.60895054,119.82790641,35.61866959,119.82790641,35.60895054,NULL,1000000000.000000,'2026-01-15 15:45:36','2026-01-16 12:20:41',2,NULL,NULL),(10023,'10021-3.png',10021,10001,10001,10021,10023,119.81097967,35.60909870,119.81097967,35.59925644,119.82800488,35.60909870,119.82800488,35.59925644,NULL,1000000000.000000,'2026-01-15 15:46:51','2026-01-16 12:21:06',3,NULL,NULL),(10024,'10021-4.png',10021,10001,10001,10021,10024,119.81107786,35.59932890,119.81107786,35.59730299,119.82802208,35.59932890,119.82802208,35.59730299,NULL,1000000000.000000,'2026-01-15 15:47:05','2026-01-16 12:21:29',4,NULL,NULL),(10538,'10022-1.png',10022,10001,10001,10022,10542,120.28777608,36.03521892,120.28777608,36.02278269,120.30794118,36.03521892,120.30794118,36.02278269,NULL,1000000000.000000,'2026-01-13 15:00:50','2026-01-21 09:28:43',1,4,11),(10539,'10022-2.png',10022,10001,10001,10022,10543,120.29932154,36.03275747,120.29932154,36.02004376,120.32063949,36.03275747,120.32063949,36.02004376,NULL,1000000000.000000,'2026-01-13 15:02:15','2026-01-21 09:29:09',2,12,19),(10540,'10022-3.png',10022,10001,10001,10022,10544,120.31086627,36.03029491,120.31086627,36.01727564,120.33364811,36.03029491,120.33364811,36.01727564,NULL,1000000000.000000,'2026-01-13 15:03:39','2026-01-21 09:29:48',3,20,27),(10541,'10022-4.png',10022,10001,10001,10022,10545,120.32458349,36.02742284,120.32458349,36.01794916,120.33034291,36.02742284,120.33034291,36.01794916,NULL,1000000000.000000,'2026-01-13 15:04:00','2026-01-21 09:30:28',4,28,29); + UNLOCK TABLES; -- @@ -124,7 +135,7 @@ CREATE TABLE `jm_image_item` ( `right1_lat` decimal(20,17) DEFAULT NULL COMMENT '右上纬度', `right2_lon` decimal(20,17) DEFAULT NULL COMMENT '右下经度', `right2_lat` decimal(20,17) DEFAULT NULL COMMENT '右下纬度', - `type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物体类型', + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物体类型', `conf` decimal(17,16) DEFAULT NULL COMMENT '可信度', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='图像识别物体'; @@ -133,6 +144,34 @@ LOCK TABLES `jm_image_item` WRITE; UNLOCK TABLES; +-- +-- Table structure for table `jm_image_tile` +-- + +DROP TABLE IF EXISTS `jm_image_tile`; + +CREATE TABLE `jm_image_tile` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `image_id` bigint DEFAULT NULL COMMENT '图像ID', + `file_id` bigint DEFAULT NULL COMMENT '文件', + `no` int DEFAULT NULL COMMENT '序号', + `level` int DEFAULT NULL COMMENT '级别', + `left1_lon` decimal(11,8) DEFAULT NULL COMMENT '左上经度', + `left1_lat` decimal(11,8) DEFAULT NULL COMMENT '左上纬度', + `left2_lon` decimal(11,8) DEFAULT NULL COMMENT '左下经度', + `left2_lat` decimal(11,8) DEFAULT NULL COMMENT '左下纬度', + `right1_lon` decimal(11,8) DEFAULT NULL COMMENT '右上经度', + `right1_lat` decimal(11,8) DEFAULT NULL COMMENT '右上纬度', + `right2_lon` decimal(11,8) DEFAULT NULL COMMENT '右下经度', + `right2_lat` decimal(11,8) DEFAULT NULL COMMENT '右下纬度', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='图像瓦片'; + + +LOCK TABLES `jm_image_tile` WRITE; + +UNLOCK TABLES; + -- -- Table structure for table `jm_job` -- @@ -141,19 +180,24 @@ DROP TABLE IF EXISTS `jm_job`; CREATE TABLE `jm_job` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', - `mode` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '航线模式;1 点模式,2 区域规划模式,3 航线创建', - `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '状态', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', + `mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `image_mode` int DEFAULT NULL COMMENT '成像模式', + `target_type` int DEFAULT NULL COMMENT '任务目标', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '状态', `begin_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', - `type` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '绫诲瀷', - `cron_expression` char(60) COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT 'cron琛ㄨ揪寮', + `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '绫诲瀷', + `cron_expression` char(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT 'cron琛ㄨ揪寮', `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `info1` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务'; +) ENGINE=InnoDB AUTO_INCREMENT=10031 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务'; LOCK TABLES `jm_job` WRITE; +INSERT INTO `jm_job` VALUES (10007,'123','3',0,2,'2','2026-01-13 13:13:38','2026-01-13 13:22:50','1',NULL,'2026-01-13 13:10:01',NULL),(10009,'999','3',0,2,'2','2026-01-13 13:33:22','2026-01-13 13:39:13','1',NULL,'2026-01-13 13:31:00',NULL),(10010,'00','3',0,2,'2','2026-01-13 14:39:28','2026-01-13 14:42:30','1',NULL,'2026-01-13 14:36:49',NULL),(10011,'77','3',0,2,'2','2026-01-13 14:47:39','2026-01-13 14:50:15','1',NULL,'2026-01-13 14:44:40',NULL),(10012,'33','3',0,2,'2','2026-01-13 14:56:08','2026-01-13 15:04:12','1',NULL,'2026-01-13 14:53:22',NULL),(10013,'1.15测试','3',0,2,'2','2026-01-15 10:06:47',NULL,'1',NULL,'2026-01-15 09:53:01',NULL),(10014,'1111','3',0,2,'2','2026-01-15 10:15:46','2026-01-15 10:22:51','1',NULL,'2026-01-15 10:13:35',NULL),(10015,'22222','3',0,2,'2','2026-01-15 10:35:00','2026-01-15 10:38:15','1',NULL,'2026-01-15 10:31:59',NULL),(10016,'115','3',0,2,'2','2026-01-15 14:07:17','2026-01-15 14:21:41','1',NULL,'2026-01-15 14:04:34','{\"id\":\"\",\"startAltitude\":30,\"imageLight\":1,\"imageBit\":0,\"headingDiff\":-90,\"autoFocus\":1,\"imageMode\":\"0\",\"moto\":1,\"direction\":1,\"polarization\":\"0\",\"name\":\"115\",\"airlineList\":[{\"flightStartLon\":119.80073821018544,\"flightStartLat\":35.62891314892773,\"flightStartHeight\":300,\"flightEndLon\":119.80141447969352,\"flightEndLat\":35.5852065802255,\"flightEndHeight\":300,\"groundStartLon\":119.81230747668114,\"groundStartLat\":35.629033123102914,\"groundStartHeight\":0,\"startLon\":119.80072425855812,\"startLat\":35.629814323723366,\"startHeight\":300,\"endLon\":119.80142841584234,\"endLat\":35.58430539860739,\"endHeight\":300,\"targetCentroidLon\":119.81264097626584,\"targetCentroidLat\":35.607178637131675,\"targetCentroidHeight\":0,\"targetWidth\":1011.8160824132705,\"targetLength\":4356.041705020143,\"targetHeading\":179.29432959315892,\"squintAngle\":0,\"grazingAngle\":16,\"flightType\":\"0\",\"polarization\":\"4\",\"id\":\"1768456983483\",\"boundaryLonLat\":[{\"longitude\":119.80735677558687,\"latitude\":35.58749273236161},{\"longitude\":119.81852004953684,\"latitude\":35.587606857468},{\"longitude\":119.81793124310752,\"latitude\":35.6268646032287},{\"longitude\":119.80675583683212,\"latitude\":35.62675035546838}],\"direction\":1,\"name\":\"航线1\"}],\"ratio\":\"0.3\",\"heightMode\":1,\"mode\":\"3\",\"width\":1010.020013,\"theta\":74,\"flyHeight\":300,\"initSpeed\":20,\"targetList\":[],\"loader\":10001,\"uav\":10001,\"routepoints\":[],\"waveAngle\":13,\"waveRotation\":20}'),(10017,'115-copy','3',0,2,'2','2026-01-15 14:29:08','2026-01-15 14:38:02','1',NULL,'2026-01-15 14:25:32','{\"startAltitude\":30,\"imageLight\":1,\"imageBit\":0,\"headingDiff\":-90,\"autoFocus\":1,\"imageMode\":\"0\",\"moto\":1,\"direction\":1,\"polarization\":\"0\",\"name\":\"115-copy\",\"airlineList\":[{\"flightStartLon\":119.80792408936091,\"flightStartLat\":35.62958686765528,\"flightStartHeight\":300,\"flightEndLon\":119.80866708058765,\"flightEndLat\":35.58418494658669,\"flightEndHeight\":300,\"groundStartLon\":119.83329887548062,\"groundStartLat\":35.629862619382145,\"groundStartHeight\":0,\"startLon\":119.80790933344247,\"startLat\":35.63048803371236,\"startHeight\":300,\"endLon\":119.80868181951618,\"endLat\":35.5832837732761,\"endHeight\":300,\"targetCentroidLon\":119.83364815719904,\"targetCentroidLat\":35.607159925999824,\"targetCentroidHeight\":0,\"targetWidth\":1867.269330438101,\"targetLength\":3989.799515849409,\"targetHeading\":179.31911327582733,\"squintAngle\":0,\"grazingAngle\":7.461581269999996,\"flightType\":\"0\",\"polarization\":\"4\",\"id\":\"1768456983483\",\"boundaryLonLat\":[{\"longitude\":119.8236101381489,\"latitude\":35.589071073543515},{\"longitude\":119.84421181197965,\"latitude\":35.58929159041163},{\"longitude\":119.84371176782383,\"latitude\":35.625249047322534},{\"longitude\":119.82305891084374,\"latitude\":35.625027992721606}],\"direction\":1,\"name\":\"航线1\"}],\"ratio\":\"0.3\",\"heightMode\":1,\"mode\":\"3\",\"width\":1859.38547,\"theta\":82.53841873,\"flyHeight\":300,\"initSpeed\":15,\"targetList\":[],\"loader\":10001,\"uav\":10001,\"routepoints\":[],\"waveAngle\":4.97,\"waveRotation\":20}'),(10019,'1152','3',0,2,'2','2026-01-15 14:59:12','2026-01-15 15:14:29','1',NULL,'2026-01-15 14:55:00','{\"id\":\"\",\"startAltitude\":30,\"imageLight\":1,\"imageBit\":0,\"headingDiff\":-90,\"autoFocus\":0,\"imageMode\":\"0\",\"moto\":0,\"direction\":1,\"polarization\":\"0\",\"name\":\"1152\",\"airlineList\":[{\"flightStartLon\":119.80487231070636,\"flightStartLat\":35.63622391646931,\"flightStartHeight\":300,\"flightEndLon\":119.8041541426424,\"flightEndLat\":35.596276102642406,\"flightEndHeight\":300,\"groundStartLon\":119.82391687375844,\"groundStartLat\":35.63599507517437,\"groundStartHeight\":0,\"startLon\":119.80488851954347,\"startLat\":35.637125065097614,\"startHeight\":300,\"endLon\":119.80413795028002,\"endLat\":35.59537494779093,\"endHeight\":300,\"targetCentroidLon\":119.82356134626505,\"targetCentroidLat\":35.61601990001656,\"targetCentroidHeight\":0,\"targetWidth\":1519.4268018819546,\"targetLength\":3638.8958028843845,\"targetHeading\":180.84876920334418,\"squintAngle\":0,\"grazingAngle\":9.871491509999998,\"flightType\":\"0\",\"polarization\":\"4\",\"id\":\"1768460061102\",\"boundaryLonLat\":[{\"longitude\":119.81487963473796,\"latitude\":35.59972499714156},{\"longitude\":119.83164530802136,\"latitude\":35.5995213772923},{\"longitude\":119.83224666567943,\"latitude\":35.632314759590294},{\"longitude\":119.81547377662145,\"latitude\":35.632518466042086}],\"direction\":1,\"name\":\"航线1\"}],\"ratio\":\"0.3\",\"heightMode\":1,\"mode\":\"3\",\"width\":1515.835277,\"theta\":80.12850849,\"flyHeight\":300,\"initSpeed\":16,\"targetList\":[],\"loader\":10001,\"uav\":10001,\"routepoints\":[],\"waveAngle\":7.38,\"waveRotation\":20}'),(10024,'1152','3',0,2,'2','2026-01-15 15:40:25','2026-01-15 15:47:17','1',NULL,'2026-01-15 15:37:57','{\"id\":\"\",\"startAltitude\":30,\"imageLight\":1,\"imageBit\":0,\"headingDiff\":-90,\"autoFocus\":1,\"imageMode\":\"0\",\"moto\":0,\"direction\":1,\"polarization\":\"0\",\"name\":\"1152\",\"airlineList\":[{\"flightStartLon\":119.80063680884058,\"flightStartLat\":35.62730262858534,\"flightStartHeight\":300,\"flightEndLon\":119.80097234643182,\"flightEndLat\":35.59278461283438,\"flightEndHeight\":300,\"groundStartLon\":119.81887080276802,\"groundStartLat\":35.62742025709978,\"groundStartHeight\":0,\"startLon\":119.80062804451899,\"startLat\":35.628203847305244,\"startHeight\":300,\"endLon\":119.8009811030306,\"endLat\":35.591883388783636,\"endHeight\":300,\"targetCentroidLon\":119.81904253091648,\"targetCentroidLat\":35.610160200008124,\"targetCentroidHeight\":0,\"targetWidth\":1458.1763568405293,\"targetLength\":3068.7611619812137,\"targetHeading\":179.5571481213923,\"squintAngle\":0,\"grazingAngle\":10.299999999999997,\"flightType\":\"0\",\"polarization\":\"4\",\"id\":\"1768462642355\",\"boundaryLonLat\":[{\"longitude\":119.81112879686559,\"latitude\":35.5962804274026},{\"longitude\":119.82721925650328,\"latitude\":35.596382296669475},{\"longitude\":119.82695885018106,\"latitude\":35.624039988775365},{\"longitude\":119.81086322011596,\"latitude\":35.62393808718505}],\"direction\":1,\"name\":\"航线1\"}],\"ratio\":\"0.3\",\"heightMode\":1,\"mode\":\"3\",\"width\":1454.976619,\"theta\":79.7,\"flyHeight\":300,\"initSpeed\":15,\"targetList\":[],\"loader\":10001,\"uav\":10001,\"routepoints\":[],\"waveAngle\":7.7,\"waveRotation\":20}'),(10025,'1152-yd','3',0,2,'2','2026-01-15 15:51:15',NULL,'1',NULL,'2026-01-15 15:51:08','{\"startAltitude\":30,\"imageLight\":1,\"imageBit\":0,\"headingDiff\":-90,\"autoFocus\":0,\"imageMode\":\"0\",\"moto\":1,\"direction\":1,\"polarization\":\"0\",\"name\":\"1152-yd\",\"airlineList\":[{\"flightStartLon\":119.80491233861731,\"flightStartLat\":35.63844927648335,\"flightStartHeight\":300,\"flightEndLon\":119.80411415673439,\"flightEndLat\":35.59405072676828,\"flightEndHeight\":300,\"groundStartLon\":119.81646551097994,\"groundStartLat\":35.63831128464388,\"groundStartHeight\":0,\"startLon\":119.80492854835292,\"startLat\":35.63935042476095,\"startHeight\":300,\"endLon\":119.8040979652686,\"endLat\":35.59314957159211,\"endHeight\":300,\"targetCentroidLon\":119.81606549656676,\"targetCentroidLat\":35.616110850916044,\"targetCentroidHeight\":0,\"targetWidth\":1010.9545696456903,\"targetLength\":4432.97260527253,\"targetHeading\":180.84378295015992,\"squintAngle\":0,\"grazingAngle\":16,\"flightType\":\"0\",\"polarization\":\"4\",\"id\":\"1768460061102\",\"boundaryLonLat\":[{\"longitude\":119.81012621859145,\"latitude\":35.59620342508711},{\"longitude\":119.82128083169414,\"latitude\":35.59606864596724},{\"longitude\":119.82200754624759,\"latitude\":35.636018243695716},{\"longitude\":119.81084738973384,\"latitude\":35.6361530889141}],\"direction\":1,\"name\":\"航线1\"}],\"ratio\":\"0.3\",\"heightMode\":1,\"mode\":\"3\",\"width\":1010.020013,\"theta\":74,\"flyHeight\":300,\"initSpeed\":15,\"targetList\":[],\"loader\":10001,\"uav\":10001,\"routepoints\":[],\"waveAngle\":13,\"waveRotation\":20}'),(10027,'20260116122451','3',0,1,'1','2026-01-16 12:24:59','2026-01-19 13:54:21','1',NULL,'2026-01-16 12:24:51',NULL); + UNLOCK TABLES; -- @@ -165,15 +209,18 @@ DROP TABLE IF EXISTS `jm_job_exec`; CREATE TABLE `jm_job_exec` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭', `conf_id` bigint DEFAULT NULL COMMENT '浠诲姟閰嶇疆ID', - `type` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '鎵ц?绫诲瀷', - `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '鐘舵?', + `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '鎵ц?绫诲瀷', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '1' COMMENT '鐘舵?', `begin_time` datetime DEFAULT NULL COMMENT '寮??鏃堕棿', `end_time` datetime DEFAULT NULL COMMENT '缁撴潫鏃堕棿', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='浠诲姟鎵ц?'; +) ENGINE=InnoDB AUTO_INCREMENT=10026 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='浠诲姟鎵ц?'; + LOCK TABLES `jm_job_exec` WRITE; +INSERT INTO `jm_job_exec` VALUES (10003,10007,'1','2','2026-01-13 13:13:38','2026-01-13 13:22:50'),(10005,10009,'1','2','2026-01-13 13:33:22','2026-01-13 13:39:13'),(10006,10010,'1','2','2026-01-13 14:39:28','2026-01-13 14:42:30'),(10007,10011,'1','2','2026-01-13 14:47:39','2026-01-13 14:50:15'),(10008,10012,'1','2','2026-01-13 14:56:08','2026-01-13 15:04:12'),(10009,10013,'1','2','2026-01-15 10:06:47',NULL),(10010,10014,'1','2','2026-01-15 10:15:46','2026-01-15 10:22:51'),(10011,10015,'1','2','2026-01-15 10:35:00','2026-01-15 10:38:15'),(10012,10016,'1','2','2026-01-15 14:07:17','2026-01-15 14:21:41'),(10013,10017,'1','2','2026-01-15 14:29:08','2026-01-15 14:38:02'),(10014,10019,'1','2','2026-01-15 14:59:12','2026-01-15 15:14:29'),(10018,10024,'1','2','2026-01-15 15:40:25','2026-01-15 15:47:17'),(10019,10025,'1','2','2026-01-15 15:51:15',NULL),(10022,10027,'1','1','2026-01-16 12:24:59',NULL); + UNLOCK TABLES; -- @@ -192,7 +239,7 @@ CREATE TABLE `jm_job_payload` ( `theta` decimal(10,6) DEFAULT NULL COMMENT '下视角', `reserved` decimal(7,4) DEFAULT NULL COMMENT '预留距离', `direction` int DEFAULT NULL COMMENT '侧视方向', - `resolution` decimal(2,1) DEFAULT NULL COMMENT '分辨率', + `resolution` decimal(4,2) DEFAULT NULL COMMENT '鍒嗚鲸鐜', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `auto_focus` int DEFAULT NULL COMMENT '自聚焦', `moto` int DEFAULT NULL COMMENT '运动补偿', @@ -201,8 +248,11 @@ CREATE TABLE `jm_job_payload` ( `image_bit` int DEFAULT NULL COMMENT '图像位数' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='执行任务的载荷'; + LOCK TABLES `jm_job_payload` WRITE; +INSERT INTO `jm_job_payload` VALUES (10007,10001,10001,2,1086.64120800000000,0.10000000000000,75.000000,100.0000,1,0.30,'2026-01-13 13:22:50',0,0,2,-90,0),(10009,10001,10001,2,1515.83527700000000,0.10000000000000,80.128508,100.0000,1,0.30,'2026-01-13 13:39:13',0,0,2,-90,0),(10010,10001,10001,2,1051.43237400000000,0.10000000000000,75.000000,100.0000,1,0.30,'2026-01-13 14:42:30',0,0,1,0,0),(10011,10001,10001,2,929.96996300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-13 14:50:15',0,0,1,0,0),(10012,10001,10001,2,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-13 15:04:12',0,0,1,-90,0),(10013,10001,10001,1,1086.64120800000000,0.10000000000000,75.000000,100.0000,1,0.30,NULL,0,0,1,-90,0),(10014,10001,10001,2,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-15 10:22:51',0,0,4,-90,0),(10015,10001,10001,2,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-15 10:38:15',0,0,6,-90,0),(10016,10001,10001,2,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-15 14:21:41',0,0,1,-90,0),(10017,10001,10001,2,1859.38547000000000,0.10000000000000,82.538419,100.0000,1,0.30,'2026-01-15 14:38:02',0,0,1,-90,0),(10019,10001,10001,2,1515.83527700000000,0.10000000000000,80.128508,100.0000,1,0.30,'2026-01-15 15:14:29',0,0,1,-90,0),(10024,10001,10001,2,1454.97661900000000,0.10000000000000,79.700000,100.0000,1,0.30,'2026-01-15 15:47:17',0,0,1,-90,0),(10025,10001,10001,1,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,NULL,0,1,1,-90,0),(10027,10001,10001,2,1010.02001300000000,0.10000000000000,74.000000,100.0000,1,0.30,'2026-01-19 13:54:21',0,0,1,-90,0); + UNLOCK TABLES; -- @@ -219,10 +269,13 @@ CREATE TABLE `jm_job_point` ( `longitude` decimal(11,8) DEFAULT NULL COMMENT '经度', `latitude` decimal(11,8) DEFAULT NULL COMMENT '纬度', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务点'; +) ENGINE=InnoDB AUTO_INCREMENT=10117 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务点'; + LOCK TABLES `jm_job_point` WRITE; +INSERT INTO `jm_job_point` VALUES (10026,10007,1,1,120.33501197,36.01722391),(10027,10007,1,2,120.33759988,36.02679848),(10028,10007,1,3,120.29686448,36.03408621),(10029,10007,1,4,120.29427632,36.02449250),(10038,10009,1,1,120.29403997,36.03998897),(10039,10009,1,2,120.30052317,36.05263156),(10040,10009,1,3,120.29145436,36.05569556),(10041,10009,1,4,120.28497307,36.04305387),(10042,10010,1,1,120.29098855,36.03956220),(10043,10010,1,2,120.29302934,36.04890204),(10044,10010,1,3,120.28192962,36.05050154),(10045,10010,1,4,120.27989004,36.04116125),(10046,10011,1,1,120.28910032,36.04134428),(10047,10011,1,2,120.29004134,36.04969792),(10048,10011,1,3,120.28312077,36.05021167),(10049,10011,1,4,120.28218048,36.04185811),(10050,10012,1,1,120.32921069,36.01756339),(10051,10012,1,2,120.33203547,36.02638698),(10052,10012,1,3,120.28910746,36.03545739),(10053,10012,1,4,120.28628523,36.02662680),(10054,10013,1,1,119.79502344,35.60609675),(10055,10013,1,2,119.80703606,35.60614711),(10056,10013,1,3,119.80684364,35.63827554),(10057,10013,1,4,119.79482151,35.63822515),(10058,10014,1,1,119.80872304,35.60424062),(10059,10014,1,2,119.81987533,35.60401994),(10060,10014,1,3,119.82072323,35.63248802),(10061,10014,1,4,119.80956635,35.63270879),(10062,10015,1,1,119.79811514,35.60167547),(10063,10015,1,2,119.80927773,35.60171299),(10064,10015,1,3,119.80913903,35.62943010),(10065,10015,1,4,119.79797317,35.62939257),(10066,10016,1,1,119.80735678,35.58749273),(10067,10016,1,2,119.81852005,35.58760686),(10068,10016,1,3,119.81793124,35.62686460),(10069,10016,1,4,119.80675584,35.62675036),(10070,10017,1,1,119.82361014,35.58907107),(10071,10017,1,2,119.84421181,35.58929159),(10072,10017,1,3,119.84371177,35.62524905),(10073,10017,1,4,119.82305891,35.62502799),(10078,10019,1,1,119.81487963,35.59972500),(10079,10019,1,2,119.83164531,35.59952138),(10080,10019,1,3,119.83224667,35.63231476),(10081,10019,1,4,119.81547378,35.63251847),(10098,10024,1,1,119.81112880,35.59628043),(10099,10024,1,2,119.82721926,35.59638230),(10100,10024,1,3,119.82695885,35.62403999),(10101,10024,1,4,119.81086322,35.62393809),(10102,10025,1,1,119.81012622,35.59620343),(10103,10025,1,2,119.82128083,35.59606865),(10104,10025,1,3,119.82200755,35.63601824),(10105,10025,1,4,119.81084739,35.63615309),(10110,10027,1,1,120.32921069,36.01756339),(10111,10027,1,2,120.33203547,36.02638698),(10112,10027,1,3,120.28910746,36.03545739),(10113,10027,1,4,120.28628523,36.02662680); + UNLOCK TABLES; -- @@ -245,8 +298,11 @@ CREATE TABLE `jm_job_uav` ( `height` decimal(11,7) DEFAULT NULL COMMENT '飞行高度' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='执行任务的无人机'; + LOCK TABLES `jm_job_uav` WRITE; +INSERT INTO `jm_job_uav` VALUES (10007,10001,120.33281510,36.02988310,120.33281510,36.02988310,3.0000000,NULL,NULL,20.0000,300.0000000),(10009,10001,120.30615780,36.03690650,120.30615780,36.03690650,3.0000000,NULL,NULL,20.0000,300.0000000),(10010,10001,120.27950230,36.03833110,120.27950230,36.03833110,3.0000000,NULL,NULL,20.0000,300.0000000),(10011,10001,120.29476730,36.03880770,120.29476730,36.03880770,3.0000000,NULL,NULL,13.0000,300.0000000),(10012,10001,120.28039680,36.03677340,120.28039680,36.03677340,2.0000000,NULL,NULL,14.0000,300.0000000),(10013,10001,119.79435780,35.64642500,119.79435780,35.64642500,35.3700900,NULL,NULL,20.0000,300.0000000),(10014,10001,119.79535000,35.60253600,119.79535000,35.60253600,30.0000000,NULL,NULL,20.0000,300.0000000),(10015,10001,119.81015470,35.63731100,119.81015470,35.63731100,30.0000000,NULL,NULL,20.0000,300.0000000),(10016,10001,119.79434690,35.64642630,119.79434690,35.64642630,30.0000000,NULL,NULL,20.0000,300.0000000),(10017,10001,119.81217800,35.59057730,119.81217800,35.59057730,30.0000000,NULL,NULL,15.0000,300.0000000),(10019,10001,119.79437380,35.64639780,119.79437380,35.64639780,30.0000000,NULL,NULL,16.0000,300.0000000),(10024,10001,119.81094080,35.63359480,119.81094080,35.63359480,30.0000000,NULL,NULL,15.0000,300.0000000),(10025,10001,119.81266720,35.61937290,119.81266720,35.61937290,30.0000000,NULL,NULL,15.0000,300.0000000),(10027,10001,120.01608710,40.00369990,120.01608710,40.00369990,2.0000000,NULL,NULL,14.0000,300.0000000); + UNLOCK TABLES; -- @@ -280,13 +336,123 @@ CREATE TABLE `jm_status_log` ( `angle_pitch` decimal(11,7) DEFAULT NULL COMMENT '组合导航俯仰', `antenna_azimuth` decimal(11,7) DEFAULT NULL COMMENT '天线方位角', `antenna_pitch` decimal(11,7) DEFAULT NULL COMMENT '天线俯仰角', - `is_boot` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否开机', + `is_boot` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否开机', `satellite_num` int DEFAULT NULL COMMENT 'GPS卫星数', `rtk_status` int DEFAULT NULL COMMENT 'RTK状态' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='sar状态日志'; + LOCK TABLES `jm_status_log` WRITE; + +UNLOCK TABLES; + +-- +-- Table structure for table `qrtz_calendars` +-- + +DROP TABLE IF EXISTS `qrtz_calendars`; + +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +LOCK TABLES `qrtz_calendars` WRITE; + +UNLOCK TABLES; + +-- +-- Table structure for table `qrtz_fired_triggers` +-- + +DROP TABLE IF EXISTS `qrtz_fired_triggers`; + +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `FIRED_TIME` bigint NOT NULL, + `SCHED_TIME` bigint NOT NULL, + `PRIORITY` int NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`), + KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), + KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`), + KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`), + KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +LOCK TABLES `qrtz_fired_triggers` WRITE; + +UNLOCK TABLES; + +-- +-- Table structure for table `qrtz_locks` +-- + +DROP TABLE IF EXISTS `qrtz_locks`; + +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +LOCK TABLES `qrtz_locks` WRITE; + +INSERT INTO `qrtz_locks` VALUES ('LD','STATE_ACCESS'),('LD','TRIGGER_ACCESS'); + +UNLOCK TABLES; + +-- +-- Table structure for table `qrtz_paused_trigger_grps` +-- + +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; + +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +LOCK TABLES `qrtz_paused_trigger_grps` WRITE; + +UNLOCK TABLES; + +-- +-- Table structure for table `qrtz_scheduler_state` +-- + +DROP TABLE IF EXISTS `qrtz_scheduler_state`; + +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint NOT NULL, + `CHECKIN_INTERVAL` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +LOCK TABLES `qrtz_scheduler_state` WRITE; + +INSERT INTO `qrtz_scheduler_state` VALUES ('LD','DESKTOP-MI8NC3B1768958884917',1768960599596,7500); + UNLOCK TABLES; -- @@ -323,20 +489,20 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `qrtz_triggers`; CREATE TABLE `qrtz_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `JOB_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `JOB_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `DESCRIPTION` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `NEXT_FIRE_TIME` bigint DEFAULT NULL, `PREV_FIRE_TIME` bigint DEFAULT NULL, `PRIORITY` int DEFAULT NULL, - `TRIGGER_STATE` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_TYPE` varchar(8) COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `START_TIME` bigint NOT NULL, `END_TIME` bigint DEFAULT NULL, - `CALENDAR_NAME` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `MISFIRE_INSTR` smallint DEFAULT NULL, `JOB_DATA` blob, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), @@ -355,255 +521,64 @@ CREATE TABLE `qrtz_triggers` ( CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + LOCK TABLES `qrtz_triggers` WRITE; UNLOCK TABLES; -- --- Table structure for table `qrtz_blob_triggers` +-- Table structure for table `sar_mti_point` -- -DROP TABLE IF EXISTS `qrtz_blob_triggers`; +DROP TABLE IF EXISTS `sar_mti_point`; -CREATE TABLE `qrtz_blob_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `BLOB_DATA` blob, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_blob_triggers` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_cron_triggers` --- - -DROP TABLE IF EXISTS `qrtz_cron_triggers`; - -CREATE TABLE `qrtz_cron_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `CRON_EXPRESSION` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TIME_ZONE_ID` varchar(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_cron_triggers` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_calendars` --- - -DROP TABLE IF EXISTS `qrtz_calendars`; - -CREATE TABLE `qrtz_calendars` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `CALENDAR_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `CALENDAR` blob NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -LOCK TABLES `qrtz_calendars` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_fired_triggers` --- - -DROP TABLE IF EXISTS `qrtz_fired_triggers`; - -CREATE TABLE `qrtz_fired_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `ENTRY_ID` varchar(95) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `INSTANCE_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `FIRED_TIME` bigint NOT NULL, - `SCHED_TIME` bigint NOT NULL, - `PRIORITY` int NOT NULL, - `STATE` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL, - `JOB_NAME` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `JOB_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `IS_NONCONCURRENT` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `REQUESTS_RECOVERY` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`), - KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), - KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`), - KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`), - KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_fired_triggers` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_locks` --- - -DROP TABLE IF EXISTS `qrtz_locks`; - -CREATE TABLE `qrtz_locks` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `LOCK_NAME` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_locks` WRITE; - -INSERT INTO `qrtz_locks` VALUES ('LD','STATE_ACCESS'),('LD','TRIGGER_ACCESS'); - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_paused_trigger_grps` --- - -DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; - -CREATE TABLE `qrtz_paused_trigger_grps` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_paused_trigger_grps` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_scheduler_state` --- - -DROP TABLE IF EXISTS `qrtz_scheduler_state`; - -CREATE TABLE `qrtz_scheduler_state` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `INSTANCE_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `LAST_CHECKIN_TIME` bigint NOT NULL, - `CHECKIN_INTERVAL` bigint NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -LOCK TABLES `qrtz_scheduler_state` WRITE; - -INSERT INTO `qrtz_scheduler_state` VALUES ('LD','DESKTOP-MI8NC3B1766979463433',1766979467281,7500); - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_simple_triggers` --- - -DROP TABLE IF EXISTS `qrtz_simple_triggers`; - -CREATE TABLE `qrtz_simple_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `REPEAT_COUNT` bigint NOT NULL, - `REPEAT_INTERVAL` bigint NOT NULL, - `TIMES_TRIGGERED` bigint NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - -LOCK TABLES `qrtz_simple_triggers` WRITE; - -UNLOCK TABLES; - --- --- Table structure for table `qrtz_simprop_triggers` --- - -DROP TABLE IF EXISTS `qrtz_simprop_triggers`; - -CREATE TABLE `qrtz_simprop_triggers` ( - `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL, - `STR_PROP_1` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `STR_PROP_2` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `STR_PROP_3` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `INT_PROP_1` int DEFAULT NULL, - `INT_PROP_2` int DEFAULT NULL, - `LONG_PROP_1` bigint DEFAULT NULL, - `LONG_PROP_2` bigint DEFAULT NULL, - `DEC_PROP_1` decimal(13,4) DEFAULT NULL, - `DEC_PROP_2` decimal(13,4) DEFAULT NULL, - `BOOL_PROP_1` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `BOOL_PROP_2` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - -LOCK TABLES `qrtz_simprop_triggers` WRITE; - -UNLOCK TABLES; - - --- --- Table structure for table `sys_dict_data` --- - -DROP TABLE IF EXISTS `sys_dict_data`; - -CREATE TABLE `sys_dict_data` ( +CREATE TABLE `sar_mti_point` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `dict_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类型', - `dict_label` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '描述', - `dict_value` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '值', - `dict_sort` int DEFAULT NULL COMMENT '排序', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `payload_id` bigint DEFAULT NULL COMMENT '载荷ID', + `airline_id` bigint DEFAULT NULL COMMENT '航线ID', + `no` int DEFAULT NULL COMMENT '目标编号', + `rg` int DEFAULT NULL COMMENT '距离', + `azimuth` decimal(6,2) DEFAULT NULL COMMENT '方位角', + `lon` decimal(9,6) DEFAULT NULL COMMENT '经度', + `lat` decimal(9,6) DEFAULT NULL COMMENT '纬度', + `alt` int DEFAULT NULL COMMENT '高度', + `amp` int DEFAULT NULL COMMENT '幅度', + `speed` decimal(8,2) DEFAULT NULL COMMENT '速度', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10057 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典'; +) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='mti点'; -LOCK TABLES `sys_dict_data` WRITE; -INSERT INTO `sys_dict_data` VALUES (10002,'imu_status','初始','99',1,'2025-06-30 19:24:40','2025-06-30 19:24:40'),(10003,'imu_status','准备','70',2,'2025-06-30 19:25:02','2025-06-30 19:25:02'),(10004,'imu_status','对准','60',3,'2025-06-30 19:25:12','2025-06-30 19:25:12'),(10005,'imu_status','纯惯性导航','1',4,'2025-06-30 19:26:43','2025-09-20 02:18:12'),(10006,'imu_status','位置组合','20',5,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10007,'imu_status','位置+速度组合','21',6,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10008,'imu_status','位置+速度+航向组合','22',7,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10009,'enable_status','有效','1',1,'2025-06-30 19:33:09','2025-06-30 19:33:09'),(10010,'enable_status','无效','0',2,'2025-06-30 19:33:09','2025-06-30 19:33:09'),(10011,'success_status','成功','1',1,'2025-06-30 19:34:26','2025-06-30 19:34:26'),(10012,'success_status','失败','0',2,'2025-06-30 19:34:26','2025-06-30 19:34:26'),(10013,'sar_work_status','开机','1',1,'2025-06-30 19:36:57','2025-06-30 19:36:57'),(10014,'sar_work_status','未开机','0',2,'2025-06-30 19:36:57','2025-06-30 19:36:57'),(10015,'job_mode','快速模式','1',1,'2025-07-02 01:30:59','2025-07-06 21:27:58'),(10017,'job_mode','航线创建','3',3,'2025-07-02 01:30:59','2025-07-06 21:27:58'),(10018,'job_status','执行中','1',2,'2025-07-03 00:34:59','2025-07-06 21:28:21'),(10019,'job_status','已完成','2',3,'2025-07-03 00:34:59','2025-07-06 21:28:21'),(10020,'job_status','未执行','0',1,'2025-07-06 21:28:21','2025-07-06 21:28:21'),(10021,'sar_polarization','H','0',1,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10022,'sar_polarization','V','1',2,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10023,'sar_polarization','全极化','4',3,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10024,'sar_direction','左','1',1,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10025,'sar_direction','右','-1 ',2,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10026,'sar_direction','左右交替 ','3',3,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10027,'sar_flight_type','直线轨迹','0',1,'2025-07-06 21:35:47','2025-07-06 21:35:47'),(10028,'sar_flight_type','圆迹轨迹','1',2,'2025-07-06 21:35:47','2025-07-06 21:35:47'),(10031,'payload_type','SAR','SAR',1,'2025-07-07 18:46:00','2025-07-07 18:46:00'),(10032,'sar_resolution','0.1m','0.1',1,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10033,'sar_resolution','0.2m','0.2',2,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10034,'sar_resolution','0.3m','0.3',3,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10035,'sar_resolution','0.5m','0.5',4,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10036,'sar_resolution','1m','1',5,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10037,'sar_resolution','3m','3',6,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10038,'py_detect_type','汽车','car',NULL,'2025-07-08 22:30:03','2025-07-08 22:30:03'),(10039,'rtk_status','0','无效',1,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10040,'rtk_status','1','初始化',2,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10041,'rtk_status','2','粗对准',3,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10042,'rtk_status','3','精对准',4,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10043,'rtk_status','4','单天线对准',5,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10044,'rtk_status','5','双天线对准',6,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10045,'rtk_status','6','纯惯性导航',7,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10046,'rtk_status','7','固定解粗对准',8,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10047,'rtk_status','8','固定解精对准',9,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10048,'rtk_status','9','RTK固定解',10,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10049,'rtk_status','10','RTK浮点解',11,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10050,'rtk_status','11','单点定位',12,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10051,'rtk_status','12','伪距差分或SBAS定位',13,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10052,'rtk_status','13','惯导定位',14,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10053,'rtk_status','14','用户设定位置',15,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10054,'rtk_status','99','错误',99,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10055,'job_status','准备中','3',2,'2025-09-03 03:29:49','2025-09-03 08:12:57'),(10056,'imu_status','无','0',0,'2025-06-30 19:26:43','2025-09-18 18:13:21'); +LOCK TABLES `sar_mti_point` WRITE; UNLOCK TABLES; -- --- Table structure for table `sys_dict_type` +-- Table structure for table `sar_mti_trail` -- -DROP TABLE IF EXISTS `sys_dict_type`; +DROP TABLE IF EXISTS `sar_mti_trail`; -CREATE TABLE `sys_dict_type` ( +CREATE TABLE `sar_mti_trail` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', - `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', - `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `payload_id` bigint DEFAULT NULL COMMENT '载荷ID', + `airline_id` bigint DEFAULT NULL COMMENT '航线ID', + `no` int DEFAULT NULL COMMENT '航迹批号', + `lon` decimal(9,6) DEFAULT NULL COMMENT '经度', + `lat` decimal(9,6) DEFAULT NULL COMMENT '纬度', + `alt` int DEFAULT NULL COMMENT '高度', + `amp` int DEFAULT NULL COMMENT '幅度', + `speed` decimal(8,2) DEFAULT NULL COMMENT '速度', + `heading_angle` decimal(6,2) DEFAULT NULL COMMENT '航向角', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10014 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典类型'; +) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='mti轨迹'; -LOCK TABLES `sys_dict_type` WRITE; -INSERT INTO `sys_dict_type` VALUES (10001,'imu_status','惯性导航状态',NULL),(10002,'enable_status','有效状态',NULL),(10003,'success_status','成功状态',NULL),(10004,'sar_work_status','开机状态',NULL),(10005,'job_mode','任务模式',NULL),(10006,'job_status','任务状态',NULL),(10007,'sar_polarization','极化方式',NULL),(10008,'sar_direction','侧视方向',NULL),(10009,'sar_flight_type','飞行方式',NULL),(10010,'payload_type','载荷类型',NULL),(10011,'sar_resolution','分辨率',NULL),(10012,'py_detect_type','目标识别类型',NULL),(10013,'rtk_status','RTK状态',NULL); +LOCK TABLES `sar_mti_trail` WRITE; UNLOCK TABLES; --- --- Table structure for table `sys_file` --- - DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( @@ -622,6 +597,51 @@ LOCK TABLES `sys_file` WRITE; UNLOCK TABLES; +-- +-- Table structure for table `sys_dict_data` +-- + +DROP TABLE IF EXISTS `sys_dict_data`; + +CREATE TABLE `sys_dict_data` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `dict_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类型', + `dict_label` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '描述', + `dict_value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '值', + `dict_sort` int DEFAULT NULL COMMENT '排序', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10062 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典'; + + +LOCK TABLES `sys_dict_data` WRITE; + +INSERT INTO `sys_dict_data` VALUES (10002,'imu_status','初始','99',1,'2025-06-30 19:24:40','2025-06-30 19:24:40'),(10003,'imu_status','准备','70',2,'2025-06-30 19:25:02','2025-06-30 19:25:02'),(10004,'imu_status','对准','60',3,'2025-06-30 19:25:12','2025-06-30 19:25:12'),(10005,'imu_status','纯惯性导航','1',4,'2025-06-30 19:26:43','2025-09-20 02:18:12'),(10006,'imu_status','位置组合','20',5,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10007,'imu_status','位置+速度组合','21',6,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10008,'imu_status','位置+速度+航向组合','22',7,'2025-06-30 19:26:43','2025-06-30 19:26:50'),(10009,'enable_status','有效','1',1,'2025-06-30 19:33:09','2025-06-30 19:33:09'),(10010,'enable_status','无效','0',2,'2025-06-30 19:33:09','2025-06-30 19:33:09'),(10011,'success_status','成功','1',1,'2025-06-30 19:34:26','2025-06-30 19:34:26'),(10012,'success_status','失败','0',2,'2025-06-30 19:34:26','2025-06-30 19:34:26'),(10013,'sar_work_status','开机','1',1,'2025-06-30 19:36:57','2025-06-30 19:36:57'),(10014,'sar_work_status','未开机','0',2,'2025-06-30 19:36:57','2025-06-30 19:36:57'),(10015,'job_mode','快速模式','1',1,'2025-07-02 01:30:59','2025-07-06 21:27:58'),(10017,'job_mode','航线创建','3',3,'2025-07-02 01:30:59','2025-07-06 21:27:58'),(10018,'job_status','执行中','1',2,'2025-07-03 00:34:59','2025-07-06 21:28:21'),(10019,'job_status','已完成','2',3,'2025-07-03 00:34:59','2025-07-06 21:28:21'),(10020,'job_status','未执行','0',1,'2025-07-06 21:28:21','2025-07-06 21:28:21'),(10021,'sar_polarization','H','0',1,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10022,'sar_polarization','V','1',2,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10023,'sar_polarization','全极化','4',3,'2025-07-06 21:32:53','2025-07-06 21:32:53'),(10024,'sar_direction','左','1',1,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10025,'sar_direction','右','-1 ',2,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10026,'sar_direction','左右交替 ','3',3,'2025-07-06 21:34:30','2025-07-06 21:34:30'),(10027,'sar_flight_type','直线轨迹','0',1,'2025-07-06 21:35:47','2025-07-06 21:35:47'),(10028,'sar_flight_type','圆迹轨迹','1',2,'2025-07-06 21:35:47','2025-07-06 21:35:47'),(10031,'payload_type','SAR','SAR',1,'2025-07-07 18:46:00','2025-07-07 18:46:00'),(10032,'sar_resolution','0.1m','0.1',1,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10033,'sar_resolution','0.2m','0.2',2,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10034,'sar_resolution','0.3m','0.3',3,'2025-07-07 19:05:07','2025-07-07 19:05:07'),(10035,'sar_resolution','10m','10',4,'2025-07-07 19:05:07','2026-01-09 06:26:30'),(10038,'py_detect_type','汽车','car',NULL,'2025-07-08 22:30:03','2025-07-08 22:30:03'),(10039,'rtk_status','0','无效',1,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10040,'rtk_status','1','初始化',2,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10041,'rtk_status','2','粗对准',3,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10042,'rtk_status','3','精对准',4,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10043,'rtk_status','4','单天线对准',5,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10044,'rtk_status','5','双天线对准',6,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10045,'rtk_status','6','纯惯性导航',7,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10046,'rtk_status','7','固定解粗对准',8,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10047,'rtk_status','8','固定解精对准',9,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10048,'rtk_status','9','RTK固定解',10,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10049,'rtk_status','10','RTK浮点解',11,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10050,'rtk_status','11','单点定位',12,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10051,'rtk_status','12','伪距差分或SBAS定位',13,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10052,'rtk_status','13','惯导定位',14,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10053,'rtk_status','14','用户设定位置',15,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10054,'rtk_status','99','错误',99,'2025-07-24 00:47:05','2025-07-24 00:47:05'),(10055,'job_status','准备中','3',2,'2025-09-03 03:29:49','2025-09-03 08:12:57'),(10056,'imu_status','无','0',0,'2025-06-30 19:26:43','2025-09-18 18:13:21'),(10057,'sar_image_mode','条带','0',1,'2025-06-30 11:26:43','2025-09-18 10:13:21'),(10058,'sar_image_mode','GMTI','4',4,'2025-06-30 11:26:43','2026-01-11 18:50:57'),(10059,'sar_image_mode','聚束','1',1,'2026-01-11 18:50:57','2026-01-11 18:50:57'),(10060,'job_target_type','点','1',1,'2026-01-11 18:50:57','2026-01-12 01:50:58'),(10061,'job_target_type','区域','2',2,'2026-01-11 18:50:57','2026-01-12 01:50:58'); + +UNLOCK TABLES; + +-- +-- Table structure for table `sys_dict_type` +-- + +DROP TABLE IF EXISTS `sys_dict_type`; + +CREATE TABLE `sys_dict_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10016 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典类型'; + + +LOCK TABLES `sys_dict_type` WRITE; + +INSERT INTO `sys_dict_type` VALUES (10001,'imu_status','惯性导航状态',NULL),(10002,'enable_status','有效状态',NULL),(10003,'success_status','成功状态',NULL),(10004,'sar_work_status','开机状态',NULL),(10005,'job_mode','任务模式',NULL),(10006,'job_status','任务状态',NULL),(10007,'sar_polarization','极化方式',NULL),(10008,'sar_direction','侧视方向',NULL),(10009,'sar_flight_type','飞行方式',NULL),(10010,'payload_type','载荷类型',NULL),(10011,'sar_resolution','分辨率',NULL),(10012,'py_detect_type','目标识别类型',NULL),(10013,'rtk_status','RTK状态',NULL),(10014,'sar_image_mode','成像模式',NULL),(10015,'job_target_type','任务目标',NULL); + +UNLOCK TABLES; + -- -- Table structure for table `sys_log` -- @@ -631,15 +651,16 @@ DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `type` int DEFAULT NULL COMMENT '类型', - `operate_user` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作人姓名', - `operate_desc` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '描述', - `create_time` char(19) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作时间', - `status` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作状态', - `ip` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作IP地址', - `operate` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作', + `operate_user` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作人姓名', + `operate_desc` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '描述', + `create_time` char(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作时间', + `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作状态', + `ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作IP地址', + `operate` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志'; + LOCK TABLES `sys_log` WRITE; UNLOCK TABLES; @@ -652,17 +673,18 @@ DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `account` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号', - `password` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码', - `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '状态;1 有效,0 无效', - `create_time` char(19) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建时间', - `update_time` char(19) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改时间', + `account` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '状态;1 有效,0 无效', + `create_time` char(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建时间', + `update_time` char(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户'; +) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户'; + LOCK TABLES `sys_user` WRITE; -INSERT INTO `sys_user` VALUES (10001,'admin','202cb962ac59075b964b07152d234b70','1','2022-02-11 12:00:00','2025-06-12 14:12:16'); +INSERT INTO `sys_user` VALUES (10001,'admin','202cb962ac59075b964b07152d234b70','1','2022-02-11 12:00:00','2025-06-12 14:12:16'),(10002,'test1','202cb962ac59075b964b07152d234b70','1',NULL,NULL),(10003,'test2','202cb962ac59075b964b07152d234b70','1',NULL,NULL); UNLOCK TABLES; @@ -673,17 +695,18 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `se_payload`; CREATE TABLE `se_payload` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '载荷名称', - `type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '载荷类型', - `ip` varchar(39) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'IP地址', - `dr` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '删除标识', - PRIMARY KEY (`id`) + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '载荷名称', + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '载荷类型', + `ip` varchar(39) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'IP地址', + `dr` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '删除标识', + PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='载荷'; + LOCK TABLES `se_payload` WRITE; -INSERT INTO `se_payload` VALUES (10001,'SAR-01','SAR','192.168.8.105','0'); +INSERT INTO `se_payload` VALUES (10001,'SAR-01','SAR','192.168.112.181','0'); UNLOCK TABLES; @@ -694,18 +717,17 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `se_uav`; CREATE TABLE `se_uav` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '唯一码', - `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', - `ip` varchar(39) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'ip地址', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `dr` char(1) COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '删除标志', - PRIMARY KEY (`id`) + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '唯一码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称', + `ip` varchar(39) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'ip地址', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `dr` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '删除标志', + PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='无人机'; - LOCK TABLES `se_uav` WRITE; INSERT INTO `se_uav` VALUES (10001,'A001','无人机1','192.168.3.3','2025-07-04 03:57:09','0'); -UNLOCK TABLES; +UNLOCK TABLES; \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmAirlineExecMapping.xml b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmAirlineExecMapping.xml index f61c191..d1fdd08 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmAirlineExecMapping.xml +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmAirlineExecMapping.xml @@ -140,10 +140,14 @@ - delete from jm_airline_exec where job_id in + select * + from jm_airline_exec ae + where exists( + select 1 from jm_job_exec je where ae.job_id = je.id and je.conf_id in #{item} + ) diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmImageMapping.xml b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmImageMapping.xml index 34e037d..2d79c65 100644 --- a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmImageMapping.xml +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/jm/JmImageMapping.xml @@ -11,7 +11,7 @@ m.payload_id, m.airline_id, m.file_id, - m.frame_no, + m.image_no, m.max, m.left1_lon, m.left1_lat, @@ -83,6 +83,7 @@ and f.type = #{type} + order by m.image_no + + + + where 1 = 1 + + and t.payload_id = #{payloadId} + + + and t.create_time >= #{beginTime} + + + and t.create_time <= #{endTime} + + order by t.id + + + + insert into sar_mti_point( + payload_id, + airline_id, + no, + rg, + azimuth, + lon, + lat, + alt, + amp, + speed, + create_time + ) values + + ( + #{item.payloadId}, + #{item.airlineId}, + #{item.no}, + #{item.rg}, + #{item.azimuth}, + #{item.lon}, + #{item.lat}, + #{item.alt}, + #{item.amp}, + #{item.speed}, + #{item.createTime} + ) + + + + + delete + from sar_mti_point mp + where exists(select 1 + from jm_airline_exec jae + join jm_job_exec je on jae.job_id = je.id + where mp.airline_id = jae.id + and je.conf_id in + + #{item} + + ) + + \ No newline at end of file diff --git a/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/sar/SarMtiTrailMapping.xml b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/sar/SarMtiTrailMapping.xml new file mode 100644 index 0000000..1843e11 --- /dev/null +++ b/backend/Skyeye-sys-dev/skyeye-service-manager/src/main/resources/mapping/sar/SarMtiTrailMapping.xml @@ -0,0 +1,77 @@ + + + + + + select + t.payload_id, + t.airline_id, + t.no, + t.lon, + t.lat, + t.alt, + t.amp, + t.speed, + t.heading_angle, + t.create_time + from sar_mti_trail t + + + + + + insert into sar_mti_trail( + payload_id, + airline_id, + no, + lon, + lat, + alt, + amp, + speed, + heading_angle, + create_time + ) values + + ( + #{item.payloadId}, + #{item.airlineId}, + #{item.no}, + #{item.lon}, + #{item.lat}, + #{item.alt}, + #{item.amp}, + #{item.speed}, + #{item.headingAngle}, + #{item.createTime} + ) + + + + + delete + from sar_mti_trail mp + where exists(select 1 + from jm_airline_exec jae + join jm_job_exec je on jae.job_id = je.id + where mp.airline_id = jae.id + and je.conf_id in + + #{item} + + ) + + \ No newline at end of file