diff --git a/ruoyi-api/tuoheng-api-task/pom.xml b/ruoyi-api/tuoheng-api-task/pom.xml index f5a6814..2cd78cc 100644 --- a/ruoyi-api/tuoheng-api-task/pom.xml +++ b/ruoyi-api/tuoheng-api-task/pom.xml @@ -22,6 +22,20 @@ com.ruoyi ruoyi-common-core + + + + org.projectlombok + lombok + provided + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + provided + diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskPlanService.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskPlanService.java new file mode 100644 index 0000000..c61d1ef --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskPlanService.java @@ -0,0 +1,81 @@ +package com.ruoyi.task.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.task.api.domain.TaskPlanDTO; +import com.ruoyi.task.api.domain.TaskPlanQueryDTO; +import com.ruoyi.task.api.factory.RemoteTaskPlanFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 任务计划服务 + * + * @author ruoyi + * @date 2026-03-06 + */ +@FeignClient(contextId = "remoteTaskPlanService", value = ServiceNameConstants.TASK_SERVICE, fallbackFactory = RemoteTaskPlanFallbackFactory.class) +public interface RemoteTaskPlanService { + /** + * 创建定时任务计划 + * + * @param taskPlanDTO 任务计划DTO + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/task/plan/timed") + R createTimedTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 创建周期任务计划 + * + * @param taskPlanDTO 任务计划DTO + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/task/plan/cycle") + R createCycleTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 根据ID获取任务计划 + * + * @param planId 计划ID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/task/plan/{planId}") + R getTaskPlanById(@PathVariable("planId") Long planId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 查询任务计划列表 + * + * @param queryDTO 查询条件 + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/task/plan/list") + R> getTaskPlanList(@RequestBody TaskPlanQueryDTO queryDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 更新任务计划 + * + * @param taskPlanDTO 任务计划DTO + * @param source 请求来源 + * @return 结果 + */ + @PutMapping("/task/plan") + R updateTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 删除任务计划 + * + * @param planId 计划ID + * @param source 请求来源 + * @return 结果 + */ + @DeleteMapping("/task/plan/{planId}") + R deleteTaskPlan(@PathVariable("planId") Long planId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskService.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskService.java index 3f994ba..63142dd 100644 --- a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskService.java +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/RemoteTaskService.java @@ -3,12 +3,15 @@ package com.ruoyi.task.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.task.api.domain.TaskDTO; +import com.ruoyi.task.api.domain.TaskQueryDTO; import com.ruoyi.task.api.domain.TaskTempVO; +import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.factory.RemoteTaskFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 任务服务 @@ -20,12 +23,95 @@ import org.springframework.web.bind.annotation.RequestHeader; public interface RemoteTaskService { /** - * 根据ID查询任务信息 + * 根据ID查询任务临时表信息 * - * @param id 任务ID + * @param id 任务临时表ID * @param source 请求来源 * @return 结果 */ @GetMapping("/task/temp/{id}") - R getTaskById(@PathVariable("id") String id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + R getTaskTempById(@PathVariable("id") String id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 创建无关联计划的任务 + * + * @param taskDTO 任务DTO + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/task") + R createTaskWithoutPlan(@RequestBody TaskDTO taskDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 根据ID获取任务 + * + * @param taskId 任务ID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/task/{taskId}") + R getTaskById(@PathVariable("taskId") Long taskId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 查询任务列表 + * + * @param queryDTO 查询条件 + * @param source 请求来源 + * @return 结果 + */ + @PostMapping("/task/list") + R> getTaskList(@RequestBody TaskQueryDTO queryDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 更新任务 + * + * @param taskDTO 任务DTO + * @param source 请求来源 + * @return 结果 + */ + @PutMapping("/task") + R updateTask(@RequestBody TaskDTO taskDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 删除任务 + * + * @param taskId 任务ID + * @param source 请求来源 + * @return 结果 + */ + @DeleteMapping("/task/{taskId}") + R deleteTask(@PathVariable("taskId") Long taskId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 根据无人机ID查询任务列表 + * + * @param uavId 无人机ID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/task/uav/{uavId}") + R> getTaskByUavId(@PathVariable("uavId") Long uavId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 根据无人机ID获取最新的一条任务 + * + * @param uavId 无人机ID + * @param source 请求来源 + * @return 结果 + */ + @GetMapping("/task/uav/current/{uavId}") + R getCurrentTaskByUavId(@PathVariable("uavId") Long uavId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + + + /** + * 修改执行状态 + * + * @param taskId 任务ID + * @param status 任务状态 + * @param source 请求来源 + * @return 结果 + */ + @PutMapping("/task/status/{taskId}") + R updateTaskStatus(@PathVariable("taskId") Long taskId, @RequestParam("status") StatusEnum status, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskDTO.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskDTO.java new file mode 100644 index 0000000..34ef9da --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskDTO.java @@ -0,0 +1,203 @@ +package com.ruoyi.task.api.domain; + +import com.ruoyi.task.api.enums.ExecuteTypeEnum; +import com.ruoyi.task.api.enums.StatusEnum; +import com.ruoyi.task.api.enums.TaskCategoryEnum; +import com.ruoyi.task.api.enums.TaskTypeEnum; + +import java.util.Date; + +/** + * 任务数据传输对象 + * + * @author ruoyi + * @date 2026-03-05 + */ +public class TaskDTO { + + /** 任务ID */ + private Long id; + + /** 计划ID(可为空,如一键起飞) */ + private Long planId; + + /** 任务名称 */ + private String taskName; + + /** 任务类别(如人工执飞) */ + private TaskCategoryEnum taskCategory; + + /** 任务类型(如一键起飞) */ + private TaskTypeEnum taskType; + + /** 执行类型(单次执行、连续执行) */ + private ExecuteTypeEnum executeType; + + /** 航线ID */ + private Long routeId; + + /** 无人机ID */ + private Long uavId; + + /** 状态 */ + private StatusEnum status; + + /** 开始时间 */ + private Date startTime; + + /** 结束时间 */ + private Date endTime; + + /** 实际开始时间 */ + private Date actualStartTime; + + /** 实际结束时间 */ + private Date actualEndTime; + + /** 描述 */ + private String description; + + /** 备注 */ + private String remark; + + // Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPlanId() { + return planId; + } + + public void setPlanId(Long planId) { + this.planId = planId; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public TaskCategoryEnum getTaskCategory() { + return taskCategory; + } + + public void setTaskCategory(TaskCategoryEnum taskCategory) { + this.taskCategory = taskCategory; + } + + public TaskTypeEnum getTaskType() { + return taskType; + } + + public void setTaskType(TaskTypeEnum taskType) { + this.taskType = taskType; + } + + public ExecuteTypeEnum getExecuteType() { + return executeType; + } + + public void setExecuteType(ExecuteTypeEnum executeType) { + this.executeType = executeType; + } + + public Long getRouteId() { + return routeId; + } + + public void setRouteId(Long routeId) { + this.routeId = routeId; + } + + public Long getUavId() { + return uavId; + } + + public void setUavId(Long uavId) { + this.uavId = uavId; + } + + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getActualStartTime() { + return actualStartTime; + } + + public void setActualStartTime(Date actualStartTime) { + this.actualStartTime = actualStartTime; + } + + public Date getActualEndTime() { + return actualEndTime; + } + + public void setActualEndTime(Date actualEndTime) { + this.actualEndTime = actualEndTime; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "TaskDTO{" + + "id=" + id + + ", planId=" + planId + + ", taskName='" + taskName + '\'' + + ", taskCategory=" + taskCategory + + ", taskType=" + taskType + + ", executeType=" + executeType + + ", routeId=" + routeId + + ", uavId=" + uavId + + ", status=" + status + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", actualStartTime=" + actualStartTime + + ", actualEndTime=" + actualEndTime + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanDTO.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanDTO.java new file mode 100644 index 0000000..6cb2ff5 --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanDTO.java @@ -0,0 +1,87 @@ +package com.ruoyi.task.api.domain; + +import com.ruoyi.task.api.enums.*; +import lombok.Data; + +import java.util.Date; + +/** + * 任务计划DTO + * + * @author ruoyi + * @date 2026-03-06 + */ +@Data +public class TaskPlanDTO { + + /** + * 任务计划ID + */ + private Long id; + + /** + * 计划名称 + */ + private String planName; + + /** + * 计划类型 + */ + private PlanTypeEnum planType; + + /** + * 执行类型 + */ + private ExecuteTypeEnum executeType; + + /** + * 周期类型 + */ + private CycleTypeEnum cycleType; + + /** + * 周期值 + */ + private String cycleValue; + + /** + * 开始时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; + + /** + * 执行时间 + */ + private Date executeTime; + + /** + * 航线ID + */ + private Long routeId; + + /** + * 无人机ID + */ + private Long uavId; + + /** + * 状态 + */ + private StatusEnum status; + + /** + * 描述 + */ + private String description; + + /** + * 持续时间(分钟) + */ + private Integer duration; + +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanQueryDTO.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanQueryDTO.java new file mode 100644 index 0000000..7b80646 --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskPlanQueryDTO.java @@ -0,0 +1,53 @@ +package com.ruoyi.task.api.domain; + +import com.ruoyi.task.api.enums.CycleTypeEnum; +import com.ruoyi.task.api.enums.PlanTypeEnum; +import lombok.Data; + +import java.util.Date; + +/** + * 任务计划查询DTO + * + * @author ruoyi + * @date 2026-03-06 + */ +@Data +public class TaskPlanQueryDTO { + + /** + * 任务计划ID + */ + private Long id; + + /** + * 计划类型 + */ + private PlanTypeEnum planType; + + /** + * 周期类型 + */ + private CycleTypeEnum cycleType; + + /** + * 航线ID + */ + private Long routeId; + + /** + * 无人机ID + */ + private Long uavId; + + /** + * 开始时间起始 + */ + private Date startDateStart; + + /** + * 开始时间结束 + */ + private Date startDateEnd; + +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskQueryDTO.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskQueryDTO.java new file mode 100644 index 0000000..304b318 --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/domain/TaskQueryDTO.java @@ -0,0 +1,53 @@ +package com.ruoyi.task.api.domain; + +import com.ruoyi.task.api.enums.CycleTypeEnum; +import com.ruoyi.task.api.enums.PlanTypeEnum; +import lombok.Data; + +import java.util.Date; + +/** + * 任务查询DTO + * + * @author ruoyi + * @date 2026-03-06 + */ +@Data +public class TaskQueryDTO { + + /** + * 任务ID + */ + private Long id; + + /** + * 计划类型 + */ + private PlanTypeEnum planType; + + /** + * 周期类型 + */ + private CycleTypeEnum cycleType; + + /** + * 航线ID + */ + private Long routeId; + + /** + * 无人机ID + */ + private Long uavId; + + /** + * 开始时间起始 + */ + private Date startDateStart; + + /** + * 开始时间结束 + */ + private Date startDateEnd; + +} \ No newline at end of file diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskFallbackFactory.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskFallbackFactory.java index ffa49b3..c1245d1 100644 --- a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskFallbackFactory.java +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskFallbackFactory.java @@ -2,12 +2,18 @@ package com.ruoyi.task.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.task.api.RemoteTaskService; +import com.ruoyi.task.api.domain.TaskDTO; +import com.ruoyi.task.api.domain.TaskQueryDTO; import com.ruoyi.task.api.domain.TaskTempVO; +import com.ruoyi.task.api.enums.StatusEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; +import java.util.Collections; +import java.util.List; + /** * 任务服务降级处理 * @@ -26,9 +32,51 @@ public class RemoteTaskFallbackFactory implements FallbackFactory getTaskById(String id, String source) + public R getTaskTempById(String id, String source) { - return R.fail("获取任务信息失败:" + throwable.getMessage()); + return R.fail("获取任务临时表信息失败:" + throwable.getMessage()); + } + + @Override + public R createTaskWithoutPlan(TaskDTO taskDTO, String source) { + return R.fail("创建任务失败"); + } + + @Override + public R getTaskById(Long taskId, String source) { + return R.fail("获取任务失败"); + } + + @Override + public R> getTaskList(TaskQueryDTO queryDTO, String source) { + return R.ok(Collections.emptyList()); + } + + @Override + public R updateTask(TaskDTO taskDTO, String source) { + return R.fail("更新任务失败"); + } + + @Override + public R deleteTask(Long taskId, String source) { + return R.fail("删除任务失败"); + } + + @Override + public R> getTaskByUavId(Long uavId, String source) { + return R.ok(Collections.emptyList()); + } + + @Override + public R getCurrentTaskByUavId(Long uavId, String source) { + return R.fail("获取最新任务失败"); + } + + + + @Override + public R updateTaskStatus(Long taskId, StatusEnum status, String source) { + return R.fail("修改执行状态失败"); } }; } diff --git a/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskPlanFallbackFactory.java b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskPlanFallbackFactory.java new file mode 100644 index 0000000..6d5c003 --- /dev/null +++ b/ruoyi-api/tuoheng-api-task/src/main/java/com/ruoyi/task/api/factory/RemoteTaskPlanFallbackFactory.java @@ -0,0 +1,61 @@ +package com.ruoyi.task.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.task.api.RemoteTaskPlanService; +import com.ruoyi.task.api.domain.TaskPlanDTO; +import com.ruoyi.task.api.domain.TaskPlanQueryDTO; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; + +/** + * 任务计划服务降级处理 + * + * @author ruoyi + * @date 2026-03-06 + */ +@Component +public class RemoteTaskPlanFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteTaskPlanFallbackFactory.class); + + @Override + public RemoteTaskPlanService create(Throwable throwable) { + log.error("任务计划服务调用失败: {}", throwable.getMessage()); + return new RemoteTaskPlanService() { + @Override + public R createTimedTaskPlan(TaskPlanDTO taskPlanDTO, String source) { + return R.fail("创建定时任务计划失败"); + } + + @Override + public R createCycleTaskPlan(TaskPlanDTO taskPlanDTO, String source) { + return R.fail("创建周期任务计划失败"); + } + + @Override + public R getTaskPlanById(Long planId, String source) { + return R.fail("获取任务计划失败"); + } + + @Override + public R> getTaskPlanList(TaskPlanQueryDTO queryDTO, String source) { + return R.ok(Collections.emptyList()); + } + + @Override + public R updateTaskPlan(TaskPlanDTO taskPlanDTO, String source) { + return R.fail("更新任务计划失败"); + } + + @Override + public R deleteTaskPlan(Long planId, String source) { + return R.fail("删除任务计划失败"); + } + }; + } +}