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("删除任务计划失败");
+ }
+ };
+ }
+}