From 345d50b52f2a111aa625b809278811959f9dccb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Wed, 4 Feb 2026 09:54:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/api/RemoteAircraftFlyService.java | 62 ++++++++++++++ .../api/domain/DroneCurrentStatusVO.java | 30 +++++++ .../api/domain/DroneFlightControlRequest.java | 41 ++++++++++ .../api/domain/DroneRealtimeInfoVO.java | 58 +++++++++++++ .../api/domain/DroneTakeoffResponseVO.java | 30 +++++++ .../device/api/enums/DroneCommandEnum.java | 81 +++++++++++++++++++ .../api/enums/DroneCurrentStatusEnum.java | 61 ++++++++++++++ .../api/enums/DroneMissionStatusEnum.java | 81 +++++++++++++++++++ .../device/api/enums/DroneSpeedEnum.java | 46 +++++++++++ .../RemoteAircraftFlyFallbackFactory.java | 56 +++++++++++++ 10 files changed, 546 insertions(+) create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/RemoteAircraftFlyService.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneCurrentStatusVO.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneFlightControlRequest.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneRealtimeInfoVO.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneTakeoffResponseVO.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCommandEnum.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCurrentStatusEnum.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneMissionStatusEnum.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneSpeedEnum.java create mode 100644 ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/factory/RemoteAircraftFlyFallbackFactory.java diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/RemoteAircraftFlyService.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/RemoteAircraftFlyService.java new file mode 100644 index 0000000..fcca8db --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/RemoteAircraftFlyService.java @@ -0,0 +1,62 @@ +package com.ruoyi.device.api; + +import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.device.api.domain.DroneCurrentStatusVO; +import com.ruoyi.device.api.domain.DroneFlightControlRequest; +import com.ruoyi.device.api.domain.DroneRealtimeInfoVO; +import com.ruoyi.device.api.domain.DroneTakeoffResponseVO; +import com.ruoyi.device.api.factory.RemoteAircraftFlyFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +/** + * 无人机飞控服务 + * + * @author ruoyi + * @date 2026-02-04 + */ +@FeignClient(contextId = "remoteAircraftFlyService", value = ServiceNameConstants.DEVICE_SERVICE, fallbackFactory = RemoteAircraftFlyFallbackFactory.class) +public interface RemoteAircraftFlyService +{ + /** + * 无人机飞控命令 + * + * @param request 飞控命令请求 + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/drone/flight-control") + R flightControl(@RequestBody DroneFlightControlRequest request, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 无人机实时信息展示 + * + * @param taskId 任务ID + * @param source 请求来源 + * @return 实时信息 + */ + @GetMapping("/drone/realtime-info/{taskId}") + R getRealtimeInfo(@PathVariable("taskId") Long taskId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 无人机当前状态查询 + * + * @param dockId 机场ID + * @param source 请求来源 + * @return 当前状态 + */ + @GetMapping("/drone/current-status/{dockId}") + R getCurrentStatus(@PathVariable("dockId") Long dockId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 无人机起飞接口 + * + * @param dockId 机场ID + * @param source 请求来源 + * @return 起飞响应(任务ID和任务状态) + */ + @PostMapping("/drone/takeoff/{dockId}") + R takeoff(@PathVariable("dockId") Long dockId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneCurrentStatusVO.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneCurrentStatusVO.java new file mode 100644 index 0000000..df277b0 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneCurrentStatusVO.java @@ -0,0 +1,30 @@ +package com.ruoyi.device.api.domain; + +import com.ruoyi.device.api.enums.DroneCurrentStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 无人机当前状态查询对象 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Data +@Schema(description = "无人机当前状态查询对象") +public class DroneCurrentStatusVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 机场ID */ + @Schema(description = "机场ID", example = "1") + private Long dockId; + + /** 当前状态 */ + @Schema(description = "当前状态: TAKEOFF_FAILED-起飞失败, FLYING-飞行中, POINTING-指点中, HOVERING-悬停中, RETURNING-返航中, LANDING-降落中", + allowableValues = {"TAKEOFF_FAILED", "FLYING", "POINTING", "HOVERING", "RETURNING", "LANDING"}, + example = "HOVERING") + private DroneCurrentStatusEnum currentStatus; +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneFlightControlRequest.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneFlightControlRequest.java new file mode 100644 index 0000000..6e2b0cb --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneFlightControlRequest.java @@ -0,0 +1,41 @@ +package com.ruoyi.device.api.domain; + +import com.ruoyi.device.api.enums.DroneCommandEnum; +import com.ruoyi.device.api.enums.DroneSpeedEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 无人机飞控命令请求对象 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Data +@Schema(description = "无人机飞控命令请求对象") +public class DroneFlightControlRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Schema(description = "任务ID", example = "1") + private Long taskId; + + /** 飞控命令 */ + @Schema(description = "飞控命令: FORWARD-前进, BACKWARD-后退, LEFT-左移, RIGHT-右移, ROTATE_LEFT-左旋, ROTATE_RIGHT-右旋, UP-上升, DOWN-下降, RETURN_HOME-返航, EMERGENCY_STOP-急停", + allowableValues = {"FORWARD", "BACKWARD", "LEFT", "RIGHT", "ROTATE_LEFT", "ROTATE_RIGHT", "UP", "DOWN", "RETURN_HOME", "EMERGENCY_STOP"}, + example = "FORWARD") + private DroneCommandEnum command; + + /** 速度调整:快、默认、慢 */ + @Schema(description = "速度调整: FAST-快, NORMAL-默认, SLOW-慢", + allowableValues = {"FAST", "NORMAL", "SLOW"}, + example = "NORMAL") + private DroneSpeedEnum speed; + + /** 幅度调整:数值类型 */ + @Schema(description = "幅度调整(数值类型,单位:米)", example = "10") + private Integer amplitude; +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneRealtimeInfoVO.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneRealtimeInfoVO.java new file mode 100644 index 0000000..20130c2 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneRealtimeInfoVO.java @@ -0,0 +1,58 @@ +package com.ruoyi.device.api.domain; + +import com.ruoyi.device.api.enums.DroneMissionStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 无人机实时信息展示对象 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Data +@Schema(description = "无人机实时信息展示对象") +public class DroneRealtimeInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 爬升速度 */ + @Schema(description = "爬升速度(单位:m/s)", example = "5") + private Integer climbSpeed; + + /** 平飞速度 */ + @Schema(description = "平飞速度(单位:m/s)", example = "15") + private Integer cruiseSpeed; + + /** 距离机场 */ + @Schema(description = "距离机场(单位:米)", example = "1000") + private Integer distanceToAirport; + + /** 无人机高度 */ + @Schema(description = "无人机高度(单位:米)", example = "100") + private Integer altitude; + + /** 无人机俯仰角 */ + @Schema(description = "无人机俯仰角(单位:度,范围:-90~90)", example = "0") + private Integer pitch; + + /** 无人机偏航角 */ + @Schema(description = "无人机偏航角(单位:度,范围:0~360)", example = "180") + private Integer yaw; + + /** 云台俯仰角 */ + @Schema(description = "云台俯仰角(单位:度,范围:-90~90)", example = "-45") + private Integer gimbalPitch; + + /** 云台偏航角 */ + @Schema(description = "云台偏航角(单位:度,范围:0~360)", example = "90") + private Integer gimbalYaw; + + /** 无人机任务状态 */ + @Schema(description = "无人机任务状态: IDLE-空闲, SELF_CHECKING-自检中, SELF_CHECK_FAILED-自检失败, TAKING_OFF-起飞中, TAKEOFF_FAILED-起飞失败, FLYING-飞行中, POINTING-指点中, HOVERING-悬停中, RETURNING-返航中, LANDING-降落中", + allowableValues = {"IDLE", "SELF_CHECKING", "SELF_CHECK_FAILED", "TAKING_OFF", "TAKEOFF_FAILED", "FLYING", "POINTING", "HOVERING", "RETURNING", "LANDING"}, + example = "FLYING") + private DroneMissionStatusEnum missionStatus; +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneTakeoffResponseVO.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneTakeoffResponseVO.java new file mode 100644 index 0000000..a5113b5 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/domain/DroneTakeoffResponseVO.java @@ -0,0 +1,30 @@ +package com.ruoyi.device.api.domain; + +import com.ruoyi.device.api.enums.DroneMissionStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 无人机起飞响应对象 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Data +@Schema(description = "无人机起飞响应对象") +public class DroneTakeoffResponseVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Schema(description = "任务ID", example = "1001") + private Long taskId; + + /** 无人机任务状态 */ + @Schema(description = "无人机任务状态: IDLE-空闲, SELF_CHECKING-自检中, SELF_CHECK_FAILED-自检失败, TAKING_OFF-起飞中, TAKEOFF_FAILED-起飞失败, FLYING-飞行中, POINTING-指点中, HOVERING-悬停中, RETURNING-返航中, LANDING-降落中", + allowableValues = {"IDLE", "SELF_CHECKING", "SELF_CHECK_FAILED", "TAKING_OFF", "TAKEOFF_FAILED", "FLYING", "POINTING", "HOVERING", "RETURNING", "LANDING"}, + example = "TAKING_OFF") + private DroneMissionStatusEnum missionStatus; +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCommandEnum.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCommandEnum.java new file mode 100644 index 0000000..1a221d8 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCommandEnum.java @@ -0,0 +1,81 @@ +package com.ruoyi.device.api.enums; + +/** + * 无人机飞控命令枚举 + * + * @author ruoyi + * @date 2026-02-04 + */ +public enum DroneCommandEnum { + + /** + * 前进 + */ + FORWARD("FORWARD", "前进"), + + /** + * 后退 + */ + BACKWARD("BACKWARD", "后退"), + + /** + * 左移 + */ + LEFT("LEFT", "左移"), + + /** + * 右移 + */ + RIGHT("RIGHT", "右移"), + + /** + * 左旋 + */ + ROTATE_LEFT("ROTATE_LEFT", "左旋"), + + /** + * 右旋 + */ + ROTATE_RIGHT("ROTATE_RIGHT", "右旋"), + + /** + * 上升 + */ + UP("UP", "上升"), + + /** + * 下降 + */ + DOWN("DOWN", "下降"), + + /** + * 返航 + */ + RETURN_HOME("RETURN_HOME", "返航"), + + /** + * 急停 + */ + EMERGENCY_STOP("EMERGENCY_STOP", "急停"); + + private final String code; + private final String description; + + DroneCommandEnum(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return code; + } +} diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCurrentStatusEnum.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCurrentStatusEnum.java new file mode 100644 index 0000000..c96a113 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneCurrentStatusEnum.java @@ -0,0 +1,61 @@ +package com.ruoyi.device.api.enums; + +/** + * 无人机当前状态枚举 + * + * @author ruoyi + * @date 2026-02-04 + */ +public enum DroneCurrentStatusEnum { + + /** + * 起飞失败 + */ + TAKEOFF_FAILED("TAKEOFF_FAILED", "起飞失败"), + + /** + * 飞行中 + */ + FLYING("FLYING", "飞行中"), + + /** + * 指点中 + */ + POINTING("POINTING", "指点中"), + + /** + * 悬停中 + */ + HOVERING("HOVERING", "悬停中"), + + /** + * 返航中 + */ + RETURNING("RETURNING", "返航中"), + + /** + * 降落中 + */ + LANDING("LANDING", "降落中"); + + private final String code; + private final String description; + + DroneCurrentStatusEnum(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return code; + } +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneMissionStatusEnum.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneMissionStatusEnum.java new file mode 100644 index 0000000..b13091e --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneMissionStatusEnum.java @@ -0,0 +1,81 @@ +package com.ruoyi.device.api.enums; + +/** + * 无人机任务状态枚举 + * + * @author ruoyi + * @date 2026-02-04 + */ +public enum DroneMissionStatusEnum { + + /** + * 空闲 + */ + IDLE("IDLE", "空闲"), + + /** + * 自检中 + */ + SELF_CHECKING("SELF_CHECKING", "自检中"), + + /** + * 自检失败 + */ + SELF_CHECK_FAILED("SELF_CHECK_FAILED", "自检失败"), + + /** + * 起飞中 + */ + TAKING_OFF("TAKING_OFF", "起飞中"), + + /** + * 起飞失败 + */ + TAKEOFF_FAILED("TAKEOFF_FAILED", "起飞失败"), + + /** + * 飞行中 + */ + FLYING("FLYING", "飞行中"), + + /** + * 指点中 + */ + POINTING("POINTING", "指点中"), + + /** + * 悬停中 + */ + HOVERING("HOVERING", "悬停中"), + + /** + * 返航中 + */ + RETURNING("RETURNING", "返航中"), + + /** + * 降落中 + */ + LANDING("LANDING", "降落中"); + + private final String code; + private final String description; + + DroneMissionStatusEnum(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return code; + } +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneSpeedEnum.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneSpeedEnum.java new file mode 100644 index 0000000..3d880c7 --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/enums/DroneSpeedEnum.java @@ -0,0 +1,46 @@ +package com.ruoyi.device.api.enums; + +/** + * 无人机速度调整枚举 + * + * @author ruoyi + * @date 2026-02-04 + */ +public enum DroneSpeedEnum { + + /** + * 快速 + */ + FAST("FAST", "快"), + + /** + * 默认 + */ + NORMAL("NORMAL", "默认"), + + /** + * 慢速 + */ + SLOW("SLOW", "慢"); + + private final String code; + private final String description; + + DroneSpeedEnum(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return code; + } +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/factory/RemoteAircraftFlyFallbackFactory.java b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/factory/RemoteAircraftFlyFallbackFactory.java new file mode 100644 index 0000000..30d4adc --- /dev/null +++ b/ruoyi-api/tuoheng-api-device/src/main/java/com/ruoyi/device/api/factory/RemoteAircraftFlyFallbackFactory.java @@ -0,0 +1,56 @@ +package com.ruoyi.device.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.device.api.RemoteAircraftFlyService; +import com.ruoyi.device.api.domain.DroneCurrentStatusVO; +import com.ruoyi.device.api.domain.DroneFlightControlRequest; +import com.ruoyi.device.api.domain.DroneRealtimeInfoVO; +import com.ruoyi.device.api.domain.DroneTakeoffResponseVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +/** + * 无人机飞控服务降级处理 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Component +public class RemoteAircraftFlyFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteAircraftFlyFallbackFactory.class); + + @Override + public RemoteAircraftFlyService create(Throwable throwable) + { + log.error("无人机飞控服务调用失败:{}", throwable.getMessage()); + return new RemoteAircraftFlyService() + { + @Override + public R flightControl(DroneFlightControlRequest request, String source) + { + return R.fail("无人机飞控命令执行失败:" + throwable.getMessage()); + } + + @Override + public R getRealtimeInfo(Long taskId, String source) + { + return R.fail("获取无人机实时信息失败:" + throwable.getMessage()); + } + + @Override + public R getCurrentStatus(Long dockId, String source) + { + return R.fail("查询无人机当前状态失败:" + throwable.getMessage()); + } + + @Override + public R takeoff(Long dockId, String source) + { + return R.fail("无人机起飞失败:" + throwable.getMessage()); + } + }; + } +} \ No newline at end of file