Compare commits

...

58 Commits
test ... main

Author SHA1 Message Date
孙小云 711e19f527 修改代码 2026-03-14 10:49:47 +08:00
孙小云 df6487f4fa 添加参数 2026-03-14 10:41:13 +08:00
孙小云 6950053351 添加日志 2026-03-14 10:19:04 +08:00
孙小云 8a503fd3fc 添加字段 2026-03-13 16:17:41 +08:00
孙小云 7945374ad8 添加字段 2026-03-13 15:56:00 +08:00
孙小云 f809ac73c6 xx 2026-03-13 15:15:15 +08:00
孙小云 060d24d16e 修改返回的数据 2026-03-13 14:12:09 +08:00
孙小云 c7d6d1015e 修改字段名字 2026-03-13 11:54:09 +08:00
孙小云 f500380ab2 修改数据过滤方式 2026-03-13 11:44:39 +08:00
孙小云 f31d3fe736 添加接口 2026-03-13 10:52:55 +08:00
孙小云 d830046c00 修改参数 2026-03-13 10:28:13 +08:00
孙小云 0bafff1d97 修改状态为列表 2026-03-13 09:16:36 +08:00
孙小云 757b7fe761 修改参数 2026-03-12 18:54:42 +08:00
孙小云 840ed110c0 修改枚举 2026-03-12 18:46:24 +08:00
孙小云 8f7712ecb0 修改日 2026-03-12 14:12:11 +08:00
孙小云 81428acddc x 2026-03-10 16:19:28 +08:00
孙小云 a6f062d57e 添加日志 2026-03-10 16:16:17 +08:00
孙小云 6c5e1a677c 修改逻辑 2026-03-10 15:25:41 +08:00
孙小云 3d079b331a 修改状态获取 2026-03-10 10:56:19 +08:00
孙小云 2af108bf3d 修改接口 2026-03-09 17:20:57 +08:00
孙小云 35fdc4ada3 添加接口 2026-03-09 16:36:47 +08:00
孙小云 69c9c37b7e Task Service 2026-03-09 15:35:51 +08:00
孙小云 177e096b8e 修改代码实现 2026-03-09 15:20:56 +08:00
孙小云 7e4994f058 修改接口 2026-03-09 14:50:47 +08:00
孙小云 68d7678a1f 添加参数默认值 2026-03-09 13:30:52 +08:00
孙小云 c64722c910 修改接口定义 2026-03-09 11:34:11 +08:00
孙小云 94f46396ee 删除无用mapper 2026-03-09 10:51:03 +08:00
孙小云 8f4f974c88 修改类名冲突 2026-03-09 10:27:41 +08:00
孙小云 d30aa1c8c9 修改类名冲突 2026-03-09 10:16:00 +08:00
孙小云 b71daf4818 xx 2026-03-09 09:58:40 +08:00
孙小云 773bec2374 修改字段类型 2026-03-09 09:51:54 +08:00
孙小云 a3d7168699 修改 2026-03-09 09:30:28 +08:00
孙小云 d67952804c 修改出入参对象 2026-03-09 09:12:03 +08:00
孙小云 3bc760cfb2 添加航线地址 2026-03-07 10:38:28 +08:00
孙小云 2854ca20b1 添加controller层 2026-03-06 14:34:29 +08:00
孙小云 e080c719d5 修改接口 2026-03-06 13:56:26 +08:00
孙小云 1398da7559 修改接口 2026-03-06 13:54:58 +08:00
孙小云 8a33db76a3 添加字段 2026-03-06 13:46:59 +08:00
孙小云 c59ca56d97 添加字段 2026-03-06 13:41:24 +08:00
孙小云 7969b8debd 修改时间 2026-03-06 13:17:52 +08:00
孙小云 a3aa635f59 修改时间 2026-03-06 13:13:08 +08:00
孙小云 db3233b4d8 xx 2026-03-06 11:43:45 +08:00
孙小云 eaea5f0c82 task 2026-03-06 11:29:41 +08:00
孙小云 43bedc1243 xx 2026-03-06 11:25:26 +08:00
孙小云 1610ef8ed4 xx 2026-03-06 10:52:23 +08:00
孙小云 589302a37d 修改更新接口 2026-03-06 10:41:39 +08:00
孙小云 d8d36480d8 修改过滤接口 2026-03-06 10:38:28 +08:00
孙小云 c500939a90 修改参数枚举 2026-03-06 10:28:00 +08:00
孙小云 3bce0390c0 修改删除接口 2026-03-06 10:20:25 +08:00
孙小云 37a8d34467 修改task 2026-03-06 10:02:56 +08:00
孙小云 072801ad80 xx 2026-03-06 09:48:47 +08:00
孙小云 aa7f11a461 修改接口 2026-03-06 09:40:07 +08:00
孙小云 62c22cbb41 修改代码 2026-03-06 09:19:18 +08:00
孙小云 4830fb9080 添加service层代码结构 2026-03-05 17:15:01 +08:00
孙小云 09a529b3c2 添加service层代码结构 2026-03-05 17:14:10 +08:00
孙小云 25e26b1b9f 添加领域层接口 2026-03-05 16:53:39 +08:00
孙小云 dbafd98b14 添加任务数据库设计 2026-03-05 16:14:52 +08:00
孙小云 0bfe9843a5 xx 2026-01-26 17:06:48 +08:00
44 changed files with 5180 additions and 0 deletions

23
pom.xml
View File

@ -71,12 +71,30 @@
<artifactId>ruoyi-common-swagger</artifactId> <artifactId>ruoyi-common-swagger</artifactId>
</dependency> </dependency>
<!-- RuoYi Common Core -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<!-- Tuoheng TASK API --> <!-- Tuoheng TASK API -->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>tuoheng-api-task</artifactId> <artifactId>tuoheng-api-task</artifactId>
</dependency> </dependency>
<!-- Tuoheng AIRLINE API -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>tuoheng-api-airline</artifactId>
</dependency>
<!-- Tuoheng DEVICE API -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>tuoheng-api-device</artifactId>
</dependency>
<!-- Flyway Database Migration --> <!-- Flyway Database Migration -->
<dependency> <dependency>
<groupId>org.flywaydb</groupId> <groupId>org.flywaydb</groupId>
@ -88,6 +106,11 @@
<groupId>org.flywaydb</groupId> <groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId> <artifactId>flyway-mysql</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>

2
reademe.md Normal file
View File

@ -0,0 +1,2 @@
dIdd

View File

@ -0,0 +1,135 @@
package com.ruoyi.task.controller;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.task.api.domain.TaskStatByMonthVO;
import com.ruoyi.task.api.domain.TaskStatQueryVO;
import com.ruoyi.task.api.domain.TaskVO;
import com.ruoyi.task.api.enums.TaskCategoryEnum;
import com.ruoyi.task.api.enums.TaskTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.service.api.ITaskService;
import com.ruoyi.task.controller.convert.TaskControllerConvert;
import com.ruoyi.task.controller.convert.TaskStatControllerConvert;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 任务Controller
*
* @author ruoyi
* @date 2026-01-17
*/
@RestController
@RequestMapping("/task")
@Slf4j
public class TaskController extends BaseController
{
@Autowired
private ITaskService taskService;
/**
* 创建普通-立即任务
*/
@PostMapping
public R<Long> createTaskWithoutPlan(@RequestBody TaskVO taskVO)
{
taskVO.setTaskType(TaskTypeEnum.IMMEDIATELY);
taskVO.setTaskCategory(TaskCategoryEnum.NORMAL);
log.info("createTaskWithoutPlan {}", JSON.toJSONString(taskVO));
Long taskId = taskService.createTaskWithoutPlan(TaskControllerConvert.to(taskVO));
return R.ok(taskId);
}
/**
* 获取任务详细信息
*/
@GetMapping(value = "/{taskId}")
public R<TaskVO> getTaskById(@PathVariable("taskId") Long taskId)
{
return R.ok(TaskControllerConvert.from(taskService.getTaskById(taskId)));
}
// /**
// * 复杂条件查询任务列表
// */
// @PostMapping("/list")
// public R<List<com.ruoyi.task.api.domain.TaskDTO>> list(@RequestBody TaskQueryDTO queryDTO)
// {
// return R.ok(TaskControllerConvert.fromList(taskService.getTaskList(queryDTO)));
// }
/**
* 更新任务
*/
@PutMapping
public R<Boolean> updateTask(@RequestBody TaskVO taskVO)
{
log.info("updateTask {}", JSON.toJSONString(taskVO));
boolean result = taskService.updateTask(TaskControllerConvert.to(taskVO));
return R.ok(result);
}
/**
* 删除任务
*/
@DeleteMapping("/{taskId}")
public R<Boolean> deleteTask(@PathVariable("taskId") Long taskId)
{
log.info("deleteTask {}", taskId);
boolean result = taskService.deleteTask(taskId);
return R.ok(result);
}
/**
* 根据无人机ID查询任务列表
*/
@GetMapping("/uav/{uavId}")
public R<List<TaskVO>> getTaskByUavId(@PathVariable("uavId") String uavId)
{
return R.ok(TaskControllerConvert.fromList(taskService.getTaskByUavId(uavId)));
}
/**
* 根据无人机ID获取最新的一条任务
*/
@GetMapping("/uav/current/{uavId}")
public R<TaskVO> getCurrentTaskByUavId(@PathVariable("uavId") String uavId)
{
return R.ok(TaskControllerConvert.from(taskService.getCurrentTaskByUavId(uavId)));
}
/**
* 修改执行状态
*/
@PutMapping("/status/{taskId}")
public R<Boolean> updateTaskStatus(@PathVariable("taskId") Long taskId, @RequestParam("status") StatusEnum status)
{
boolean result = taskService.updateTaskStatus(taskId, status);
return R.ok(result);
}
/**
* 按年统计任务
*/
@PostMapping("/stat/year")
public R<com.ruoyi.task.api.domain.TaskStatByYearDTO> getTaskStatByYear(@RequestBody TaskStatQueryVO queryDTO)
{
return R.ok(TaskStatControllerConvert.fromYear(taskService.getTaskStatByYear(TaskStatControllerConvert.toQuery(queryDTO))));
}
/**
* 按年月统计任务
*/
@PostMapping("/stat/month")
public R<TaskStatByMonthVO> getTaskStatByMonth(@RequestBody TaskStatQueryVO queryDTO)
{
return R.ok(TaskStatControllerConvert.fromMonth(taskService.getTaskStatByMonth(TaskStatControllerConvert.toQuery(queryDTO))));
}
}

View File

@ -0,0 +1,122 @@
package com.ruoyi.task.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.task.api.domain.TaskPlanDTO;
import com.ruoyi.task.api.domain.TaskPlanQueryDTO;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.service.api.ITaskPlanService;
import com.ruoyi.task.controller.convert.TaskPlanControllerConvert;
import com.ruoyi.task.controller.convert.TaskPlanQueryControllerConvert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 任务计划Controller
*
* @author ruoyi
* @date 2026-01-17
*/
@RestController
@RequestMapping("/task/plan")
public class TaskPlanController extends BaseController
{
@Autowired
private ITaskPlanService taskPlanService;
private void setDefaultPlan(TaskPlanDTO plan) {
if(Objects.isNull(plan)) {
return;
}
if(Objects.isNull(plan.getExecuteType())) {
plan.setExecuteType(ExecuteTypeEnum.ONCE);
}
if(Objects.isNull(plan.getStatus())) {
plan.setStatus(StatusEnum.PENDING);
}
}
/**
* 创建定时任务计划
*/
@PostMapping("/timed")
public R<Long> createNormalTimedTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO)
{
taskPlanDTO.setPlanType(PlanTypeEnum.TIMED);
setDefaultPlan(taskPlanDTO);
Long planId = taskPlanService.createNormalTimedTaskPlan(TaskPlanControllerConvert.to(taskPlanDTO),true);
return R.ok(planId);
}
/**
* 创建周期任务计划
*/
@PostMapping("/cycle")
public R<Long> createCycleTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO)
{
taskPlanDTO.setPlanType(PlanTypeEnum.CYCLE);
setDefaultPlan(taskPlanDTO);
Long planId = taskPlanService.createCycleTaskPlan(TaskPlanControllerConvert.to(taskPlanDTO),true);
return R.ok(planId);
}
/**
* 获取任务计划详细信息
*/
@GetMapping(value = "/{planId}")
public R<TaskPlanDTO> getTaskPlanById(@PathVariable("planId") Long planId)
{
return R.ok(TaskPlanControllerConvert.from(taskPlanService.getTaskPlanById(planId)));
}
/**
* 复杂条件查询任务计划列表
*/
@PostMapping("/list")
public R<List<TaskPlanDTO>> list(@RequestBody TaskPlanQueryDTO queryDTO)
{
return R.ok(TaskPlanControllerConvert.fromList(taskPlanService.getTaskPlanList(TaskPlanQueryControllerConvert.to(queryDTO))));
}
/**
* 更新任务计划
*/
@PutMapping
public R<Boolean> updateTaskPlan(@RequestBody TaskPlanDTO taskPlanDTO)
{
taskPlanService.updateTaskPlan(TaskPlanControllerConvert.to(taskPlanDTO));
// taskPlanService.deleteTaskPlan(taskPlanDTO.getId());
// if(!Objects.isNull(taskPlanDTO.getPlanType())) {
// if(Objects.equals(taskPlanDTO.getPlanType(), PlanTypeEnum.TIMED)){
// taskPlanDTO.setPlanType(PlanTypeEnum.TIMED);
// setDefaultPlan(taskPlanDTO);
// taskPlanService.createTimedTaskPlan(TaskPlanControllerConvert.to(taskPlanDTO));
// return R.ok(true);
// }else if (Objects.equals(taskPlanDTO.getPlanType(), PlanTypeEnum.CYCLE)){
// taskPlanDTO.setPlanType(PlanTypeEnum.CYCLE);
// setDefaultPlan(taskPlanDTO);
// taskPlanService.createCycleTaskPlan(TaskPlanControllerConvert.to(taskPlanDTO));
// return R.ok(true);
// }
// }
return R.ok(true);
}
/**
* 删除任务计划
*/
@DeleteMapping("/{planId}")
public R<Boolean> deleteTaskPlan(@PathVariable("planId") Long planId)
{
boolean result = taskPlanService.deleteTaskPlan(planId);
return R.ok(result);
}
}

View File

@ -0,0 +1,49 @@
package com.ruoyi.task.controller.convert;
import com.ruoyi.common.core.utils.BaseConvert;
import com.ruoyi.task.api.domain.TaskVO;
import java.util.List;
/**
* 任务Controller转换器
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskControllerConvert extends BaseConvert<com.ruoyi.task.service.dto.TaskDTO, TaskVO> {
private static final TaskControllerConvert INSTANCE = new TaskControllerConvert();
private TaskControllerConvert() {
super(com.ruoyi.task.service.dto.TaskDTO.class, TaskVO.class);
}
/**
* 服务DTO API DTO
*/
public static TaskVO from(com.ruoyi.task.service.dto.TaskDTO dto) {
return INSTANCE.innerFrom(dto);
}
/**
* API DTO 服务DTO
*/
public static com.ruoyi.task.service.dto.TaskDTO to(TaskVO apiDTO) {
return INSTANCE.innerTo(apiDTO);
}
/**
* 服务DTO List API DTO List
*/
public static List<TaskVO> fromList(List<com.ruoyi.task.service.dto.TaskDTO> dtoList) {
return INSTANCE.innerFromList(dtoList);
}
/**
* API DTO List 服务DTO List
*/
public static List<com.ruoyi.task.service.dto.TaskDTO> toList(List<TaskVO> apiDTOList) {
return INSTANCE.innerToList(apiDTOList);
}
}

View File

@ -0,0 +1,48 @@
package com.ruoyi.task.controller.convert;
import com.ruoyi.common.core.utils.BaseConvert;
import java.util.List;
/**
* 任务计划Controller转换器
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskPlanControllerConvert extends BaseConvert<com.ruoyi.task.service.dto.TaskPlanDTO, com.ruoyi.task.api.domain.TaskPlanDTO> {
private static final TaskPlanControllerConvert INSTANCE = new TaskPlanControllerConvert();
private TaskPlanControllerConvert() {
super(com.ruoyi.task.service.dto.TaskPlanDTO.class, com.ruoyi.task.api.domain.TaskPlanDTO.class);
}
/**
* 服务DTO API DTO
*/
public static com.ruoyi.task.api.domain.TaskPlanDTO from(com.ruoyi.task.service.dto.TaskPlanDTO dto) {
return INSTANCE.innerFrom(dto);
}
/**
* API DTO 服务DTO
*/
public static com.ruoyi.task.service.dto.TaskPlanDTO to(com.ruoyi.task.api.domain.TaskPlanDTO apiDTO) {
return INSTANCE.innerTo(apiDTO);
}
/**
* 服务DTO List API DTO List
*/
public static List<com.ruoyi.task.api.domain.TaskPlanDTO> fromList(List<com.ruoyi.task.service.dto.TaskPlanDTO> dtoList) {
return INSTANCE.innerFromList(dtoList);
}
/**
* API DTO List 服务DTO List
*/
public static List<com.ruoyi.task.service.dto.TaskPlanDTO> toList(List<com.ruoyi.task.api.domain.TaskPlanDTO> apiDTOList) {
return INSTANCE.innerToList(apiDTOList);
}
}

View File

@ -0,0 +1,32 @@
package com.ruoyi.task.controller.convert;
import com.ruoyi.common.core.utils.BaseConvert;
/**
* 任务计划查询Controller转换器
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskPlanQueryControllerConvert extends BaseConvert<com.ruoyi.task.service.dto.TaskPlanQueryDTO, com.ruoyi.task.api.domain.TaskPlanQueryDTO> {
private static final TaskPlanQueryControllerConvert INSTANCE = new TaskPlanQueryControllerConvert();
private TaskPlanQueryControllerConvert() {
super(com.ruoyi.task.service.dto.TaskPlanQueryDTO.class, com.ruoyi.task.api.domain.TaskPlanQueryDTO.class);
}
/**
* 服务DTO API DTO
*/
public static com.ruoyi.task.api.domain.TaskPlanQueryDTO from(com.ruoyi.task.service.dto.TaskPlanQueryDTO dto) {
return INSTANCE.innerFrom(dto);
}
/**
* API DTO 服务DTO
*/
public static com.ruoyi.task.service.dto.TaskPlanQueryDTO to(com.ruoyi.task.api.domain.TaskPlanQueryDTO apiDTO) {
return INSTANCE.innerTo(apiDTO);
}
}

View File

@ -0,0 +1,97 @@
package com.ruoyi.task.controller.convert;
import com.ruoyi.task.api.domain.TaskStatByMonthVO;
import com.ruoyi.task.api.domain.TaskStatQueryVO;
import com.ruoyi.task.api.domain.TaskStatItemVO;
import com.ruoyi.task.service.dto.TaskStatItemServiceDTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 任务统计Controller转换器
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskStatControllerConvert {
/**
* API 查询DTO 服务查询DTO
*/
public static com.ruoyi.task.service.dto.TaskStatQueryServiceDTO toQuery(TaskStatQueryVO apiDTO) {
if (apiDTO == null) return null;
com.ruoyi.task.service.dto.TaskStatQueryServiceDTO dto = new com.ruoyi.task.service.dto.TaskStatQueryServiceDTO();
dto.setYear(apiDTO.getYear());
dto.setMonth(apiDTO.getMonth());
dto.setStartDate(apiDTO.getStartTime());
dto.setEndDate(apiDTO.getEndTime());
dto.setTaskCategory(apiDTO.getTaskCategory());
dto.setTaskType(apiDTO.getTaskType());
dto.setStatusList(apiDTO.getStatusList());
dto.setRouteIdList(apiDTO.getRouteIdList());
dto.setUavIdList(apiDTO.getUavIdList());
return dto;
}
/**
* 服务按年统计DTO API 按年统计DTO
*/
public static com.ruoyi.task.api.domain.TaskStatByYearDTO fromYear(com.ruoyi.task.service.dto.TaskStatByYearServiceDTO dto) {
if (dto == null) return null;
com.ruoyi.task.api.domain.TaskStatByYearDTO apiDTO = new com.ruoyi.task.api.domain.TaskStatByYearDTO();
apiDTO.setTotal(dto.getTotal());
apiDTO.setMonths(dto.getMonths());
return apiDTO;
}
/**
* 服务按月统计DTO API 按月统计DTO
*/
public static TaskStatByMonthVO fromMonth(com.ruoyi.task.service.dto.TaskStatByMonthServiceDTO dto) {
if (dto == null) return null;
TaskStatByMonthVO apiDTO = new TaskStatByMonthVO();
apiDTO.setTotal(dto.getTotal());
if (dto.getDays() != null) {
Map<Integer, List<TaskStatItemVO>> apiDays = new HashMap<>();
for (Map.Entry<Integer, List<TaskStatItemServiceDTO>> entry : dto.getDays().entrySet()) {
List<TaskStatItemVO> apiItems = new ArrayList<>();
for (TaskStatItemServiceDTO item : entry.getValue()) {
apiItems.add(fromItem(item));
}
apiDays.put(entry.getKey(), apiItems);
}
apiDTO.setDays(apiDays);
}
return apiDTO;
}
private static TaskStatItemVO fromItem(TaskStatItemServiceDTO dto) {
if (dto == null) return null;
TaskStatItemVO apiDTO = new TaskStatItemVO();
apiDTO.setTaskId(dto.getTaskId());
apiDTO.setPlanId(dto.getPlanId());
apiDTO.setTaskName(dto.getTaskName());
apiDTO.setPlanName(dto.getPlanName());
apiDTO.setRouteName(dto.getRouteName());
apiDTO.setAirVendor(dto.getAirVendor());
apiDTO.setAirType(dto.getAirType());
apiDTO.setPlanStartDate(dto.getPlanStartDate());
apiDTO.setPlanEndDate(dto.getPlanEndDate());
apiDTO.setStartTime(dto.getStartTime());
apiDTO.setEndTime(dto.getEndTime());
apiDTO.setActualStartTime(dto.getActualStartTime());
apiDTO.setActualEndTime(dto.getActualEndTime());
apiDTO.setStatus(dto.getStatus());
apiDTO.setTaskType(dto.getTaskType());
apiDTO.setTaskCategory(dto.getTaskCategory());
apiDTO.setAirlineType(dto.getAirlineType());
apiDTO.setTaskCreateTime(dto.getTaskCreateTime());
apiDTO.setTaskCreateBy(dto.getTaskCreateBy());
return apiDTO;
}
}

View File

@ -0,0 +1,70 @@
package com.ruoyi.task.domain.api;
import com.ruoyi.task.domain.model.Task;
import java.util.List;
/**
* 任务领域接口
*
* @author ruoyi
* @date 2026-03-05
*/
public interface ITaskDomain {
/**
* 创建无关联计划的飞行任务
*
* @param task 任务领域模型
* @return 创建后的任务
*/
Task createTask(Task task);
/**
* 更新任务
*
* @param task 任务领域模型
* @return 更新后的任务
*/
Task updateTask(Task task);
/**
* 删除任务
*
* @param taskId 任务ID
* @return 是否删除成功
*/
boolean deleteTask(Long taskId);
/**
* 根据ID获取任务
*
* @param taskId 任务ID
* @return 任务领域模型
*/
Task getTaskById(Long taskId);
/**
* 根据条件查询任务列表
*
* @param task 查询条件
* @return 任务列表
*/
List<Task> getTaskList(Task task);
/**
* 根据计划ID获取任务
*
* @param planId 计划ID
* @return 任务列表
*/
List<Task> getTaskByPlanId(Long planId);
/**
* 查询指定无人机 actualStartTime 离现在最近的任务
*
* @param uavId 无人机ID
* @return 任务领域模型
*/
Task getCurrentTaskByUavId(String uavId);
}

View File

@ -0,0 +1,79 @@
package com.ruoyi.task.domain.api;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.mapper.entity.TaskPlanEntity;
import java.util.List;
/**
* 任务计划领域接口
*
* @author ruoyi
* @date 2026-03-05
*/
public interface ITaskPlanDomain {
/**
* 创建定时任务计划
*
* @param taskPlan 任务计划领域模型
* @return 创建后的任务计划
*/
TaskPlan createTimedTaskPlan(TaskPlan taskPlan);
/**
* 创建周期任务计划
*
* @param taskPlan 任务计划领域模型
* @return 创建后的任务计划
*/
TaskPlan createCycleTaskPlan(TaskPlan taskPlan);
/**
* 更新任务计划
*
* @param taskPlan 任务计划领域模型
* @return 更新后的任务计划
*/
TaskPlan updateTaskPlan(TaskPlan taskPlan);
/**
* 删除任务计划
*
* @param planId 计划ID
* @return 是否删除成功
*/
boolean deleteTaskPlan(Long planId);
/**
* 根据ID获取任务计划
*
* @param planId 计划ID
* @return 任务计划领域模型
*/
TaskPlan getTaskPlanById(Long planId);
/**
* 根据条件查询任务计划列表
*
* @param taskPlan 查询条件
* @return 任务计划列表
*/
List<TaskPlan> getTaskPlanList(TaskPlan taskPlan);
/**
* 根据计划类型获取任务计划
*
* @param planType 计划类型
* @return 任务计划列表
*/
List<TaskPlan> getTaskPlanByType(String planType);
/**
* 根据状态获取任务计划
*
* @param status 状态
* @return 任务计划列表
*/
List<TaskPlan> getTaskPlanByStatus(String status);
}

View File

@ -0,0 +1,89 @@
package com.ruoyi.task.domain.convert;
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 com.ruoyi.task.domain.model.Task;
import com.ruoyi.task.mapper.entity.TaskInfoEntity;
/**
* 任务转换类
*
* @author ruoyi
* @date 2026-03-05
*/
public class TaskConvert {
/**
* 将实体转换为领域模型
*
* @param entity 任务实体
* @return 任务领域模型
*/
public static Task toModel(TaskInfoEntity entity) {
if (entity == null) {
return null;
}
Task model = new Task();
model.setId(entity.getId());
model.setPlanId(entity.getPlanId());
model.setTaskName(entity.getTaskName());
model.setTaskCategory(TaskCategoryEnum.getByCode(entity.getTaskCategory()));
model.setTaskType(TaskTypeEnum.getByCode(entity.getTaskType()));
model.setExecuteType(ExecuteTypeEnum.getByCode(entity.getExecuteType()));
model.setRouteId(entity.getRouteId());
model.setUavId(entity.getUavId());
model.setStatus(StatusEnum.getByCode(entity.getStatus()));
model.setStartTime(entity.getStartTime());
model.setEndTime(entity.getEndTime());
model.setActualStartTime(entity.getActualStartTime());
model.setActualEndTime(entity.getActualEndTime());
model.setDescription(entity.getDescription());
model.setCreateBy(entity.getCreateBy());
model.setCreateTime(entity.getCreateTime());
model.setUpdateBy(entity.getUpdateBy());
model.setUpdateTime(entity.getUpdateTime());
model.setRemark(entity.getRemark());
model.setRouteUrl(entity.getRouteUrl());
return model;
}
/**
* 将领域模型转换为实体
*
* @param model 任务领域模型
* @return 任务实体
*/
public static TaskInfoEntity toEntity(Task model) {
if (model == null) {
return null;
}
TaskInfoEntity entity = new TaskInfoEntity();
entity.setId(model.getId());
entity.setPlanId(model.getPlanId());
entity.setTaskName(model.getTaskName());
entity.setTaskCategory(model.getTaskCategory() != null ? model.getTaskCategory().getCode() : null);
entity.setTaskType(model.getTaskType() != null ? model.getTaskType().getCode() : null);
entity.setExecuteType(model.getExecuteType() != null ? model.getExecuteType().getCode() : null);
entity.setRouteId(model.getRouteId());
entity.setUavId(model.getUavId());
entity.setStatus(model.getStatus() != null ? model.getStatus().getCode() : null);
entity.setStartTime(model.getStartTime());
entity.setEndTime(model.getEndTime());
entity.setActualStartTime(model.getActualStartTime());
entity.setActualEndTime(model.getActualEndTime());
entity.setDescription(model.getDescription());
entity.setCreateBy(model.getCreateBy());
entity.setCreateTime(model.getCreateTime());
entity.setUpdateBy(model.getUpdateBy());
entity.setUpdateTime(model.getUpdateTime());
entity.setRemark(model.getRemark());
entity.setRouteUrl(model.getRouteUrl());
return entity;
}
}

View File

@ -0,0 +1,89 @@
package com.ruoyi.task.domain.convert;
import com.ruoyi.task.api.enums.CycleTypeEnum;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.mapper.entity.TaskPlanEntity;
/**
* 任务计划转换类
*
* @author ruoyi
* @date 2026-03-05
*/
public class TaskPlanConvert {
/**
* 将实体转换为领域模型
*
* @param entity 任务计划实体
* @return 任务计划领域模型
*/
public static TaskPlan toModel(TaskPlanEntity entity) {
if (entity == null) {
return null;
}
TaskPlan model = new TaskPlan();
model.setId(entity.getId());
model.setPlanName(entity.getPlanName());
model.setPlanType(PlanTypeEnum.getByCode(entity.getPlanType()));
model.setExecuteType(ExecuteTypeEnum.getByCode(entity.getExecuteType()));
model.setCycleType(CycleTypeEnum.getByCode(entity.getCycleType()));
model.setCycleValue(entity.getCycleValue());
model.setStartDate(entity.getStartDate());
model.setEndDate(entity.getEndDate());
model.setExecuteTime(entity.getExecuteTime());
model.setDuration(entity.getDuration());
model.setRouteId(entity.getRouteId());
model.setUavId(entity.getUavId());
model.setStatus(StatusEnum.getByCode(entity.getStatus()));
model.setDescription(entity.getDescription());
model.setCreateBy(entity.getCreateBy());
model.setCreateTime(entity.getCreateTime());
model.setUpdateBy(entity.getUpdateBy());
model.setUpdateTime(entity.getUpdateTime());
model.setRemark(entity.getRemark());
model.setRouteUrl(entity.getRouteUrl());
return model;
}
/**
* 将领域模型转换为实体
*
* @param model 任务计划领域模型
* @return 任务计划实体
*/
public static TaskPlanEntity toEntity(TaskPlan model) {
if (model == null) {
return null;
}
TaskPlanEntity entity = new TaskPlanEntity();
entity.setId(model.getId());
entity.setPlanName(model.getPlanName());
entity.setPlanType(model.getPlanType() != null ? model.getPlanType().getCode() : null);
entity.setExecuteType(model.getExecuteType() != null ? model.getExecuteType().getCode() : null);
entity.setCycleType(model.getCycleType() != null ? model.getCycleType().getCode() : null);
entity.setCycleValue(model.getCycleValue());
entity.setStartDate(model.getStartDate());
entity.setEndDate(model.getEndDate());
entity.setExecuteTime(model.getExecuteTime());
entity.setDuration(model.getDuration());
entity.setRouteId(model.getRouteId());
entity.setUavId(model.getUavId());
entity.setStatus(model.getStatus() != null ? model.getStatus().getCode() : null);
entity.setDescription(model.getDescription());
entity.setCreateBy(model.getCreateBy());
entity.setCreateTime(model.getCreateTime());
entity.setUpdateBy(model.getUpdateBy());
entity.setUpdateTime(model.getUpdateTime());
entity.setRemark(model.getRemark());
entity.setRouteUrl(model.getRouteUrl());
return entity;
}
}

View File

@ -0,0 +1,95 @@
package com.ruoyi.task.domain.impl;
import com.ruoyi.task.domain.api.ITaskDomain;
import com.ruoyi.task.domain.convert.TaskConvert;
import com.ruoyi.task.domain.model.Task;
import com.ruoyi.task.mapper.TaskInfoMapper;
import com.ruoyi.task.mapper.entity.TaskInfoEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* 任务领域实现类
*
* @author ruoyi
* @date 2026-03-05
*/
@Component
public class TaskDomainImpl implements ITaskDomain {
@Autowired
private TaskInfoMapper taskInfoMapper;
@Override
public Task createTask(Task task) {
// 确保planId为null表示无关联计划
// 转换为实体
TaskInfoEntity entity = TaskConvert.toEntity(task);
// 插入数据库
taskInfoMapper.insertTaskInfo(entity);
// 转换回领域模型并返回
return TaskConvert.toModel(entity);
}
@Override
public Task updateTask(Task task) {
// 转换为实体
TaskInfoEntity entity = TaskConvert.toEntity(task);
// 更新数据库
taskInfoMapper.updateTaskInfo(entity);
// 查询更新后的实体
TaskInfoEntity updatedEntity = taskInfoMapper.selectTaskInfoById(task.getId());
// 转换回领域模型并返回
return TaskConvert.toModel(updatedEntity);
}
@Override
public boolean deleteTask(Long taskId) {
// 删除数据库记录
int result = taskInfoMapper.deleteTaskInfoById(taskId);
// 返回删除结果
return result > 0;
}
@Override
public Task getTaskById(Long taskId) {
// 查询数据库
TaskInfoEntity entity = taskInfoMapper.selectTaskInfoById(taskId);
// 转换为领域模型并返回
return TaskConvert.toModel(entity);
}
@Override
public List<Task> getTaskList(Task task) {
// 转换为实体作为查询条件
TaskInfoEntity entity = TaskConvert.toEntity(task);
// 查询数据库
List<TaskInfoEntity> entityList = taskInfoMapper.selectTaskInfoList(entity);
// 转换为领域模型列表并返回
return entityList.stream()
.map(TaskConvert::toModel)
.collect(Collectors.toList());
}
@Override
public List<Task> getTaskByPlanId(Long planId) {
// 创建查询条件
TaskInfoEntity entity = new TaskInfoEntity();
entity.setPlanId(planId);
// 查询数据库
List<TaskInfoEntity> entityList = taskInfoMapper.selectTaskInfoList(entity);
// 转换为领域模型列表并返回
return entityList.stream()
.map(TaskConvert::toModel)
.collect(Collectors.toList());
}
@Override
public Task getCurrentTaskByUavId(String uavId) {
TaskInfoEntity entity = taskInfoMapper.selectCurrentTaskByUavId(uavId);
return TaskConvert.toModel(entity);
}
}

View File

@ -0,0 +1,121 @@
package com.ruoyi.task.domain.impl;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.domain.api.ITaskPlanDomain;
import com.ruoyi.task.domain.convert.TaskPlanConvert;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.mapper.TaskPlanMapper;
import com.ruoyi.task.mapper.entity.TaskPlanEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 任务计划领域实现类
*
* @author ruoyi
* @date 2026-03-05
*/
@Component
public class TaskPlanDomainImpl implements ITaskPlanDomain {
@Autowired
private TaskPlanMapper taskPlanMapper;
@Override
public TaskPlan createTimedTaskPlan(TaskPlan taskPlan) {
// 设置计划类型为定时任务计划
taskPlan.setPlanType(PlanTypeEnum.TIMED);
// 转换为实体
TaskPlanEntity entity = TaskPlanConvert.toEntity(taskPlan);
// 插入数据库
taskPlanMapper.insertTaskPlan(entity);
// 转换回领域模型并返回
return TaskPlanConvert.toModel(entity);
}
@Override
public TaskPlan createCycleTaskPlan(TaskPlan taskPlan) {
// 设置计划类型为周期任务计划
taskPlan.setPlanType(PlanTypeEnum.CYCLE);
// 转换为实体
TaskPlanEntity entity = TaskPlanConvert.toEntity(taskPlan);
// 插入数据库
taskPlanMapper.insertTaskPlan(entity);
// 转换回领域模型并返回
return TaskPlanConvert.toModel(entity);
}
@Override
public TaskPlan updateTaskPlan(TaskPlan taskPlan) {
// 转换为实体
TaskPlanEntity entity = TaskPlanConvert.toEntity(taskPlan);
// 更新数据库
taskPlanMapper.updateTaskPlan(entity);
// 查询更新后的实体
TaskPlanEntity updatedEntity = taskPlanMapper.selectTaskPlanById(taskPlan.getId());
// 转换回领域模型并返回
return TaskPlanConvert.toModel(updatedEntity);
}
@Override
public boolean deleteTaskPlan(Long planId) {
// 删除数据库记录
int result = taskPlanMapper.deleteTaskPlanById(planId);
// 返回删除结果
return result > 0;
}
@Override
public TaskPlan getTaskPlanById(Long planId) {
// 查询数据库
TaskPlanEntity entity = taskPlanMapper.selectTaskPlanById(planId);
// 转换为领域模型并返回
return TaskPlanConvert.toModel(entity);
}
@Override
public List<TaskPlan> getTaskPlanList(TaskPlan taskPlan) {
// 转换为实体作为查询条件
TaskPlanEntity entity = TaskPlanConvert.toEntity(taskPlan);
// 查询数据库
List<TaskPlanEntity> entityList = taskPlanMapper.selectTaskPlanList(entity);
// 转换为领域模型列表并返回
return entityList.stream()
.map(TaskPlanConvert::toModel)
.collect(Collectors.toList());
}
@Override
public List<TaskPlan> getTaskPlanByType(String planType) {
// 创建查询条件
TaskPlanEntity entity = new TaskPlanEntity();
entity.setPlanType(planType);
// 查询数据库
List<TaskPlanEntity> entityList = taskPlanMapper.selectTaskPlanList(entity);
// 转换为领域模型列表并返回
return entityList.stream()
.map(TaskPlanConvert::toModel)
.collect(Collectors.toList());
}
@Override
public List<TaskPlan> getTaskPlanByStatus(String status) {
// 创建查询条件
TaskPlanEntity entity = new TaskPlanEntity();
entity.setStatus(status);
// 查询数据库
List<TaskPlanEntity> entityList = taskPlanMapper.selectTaskPlanList(entity);
// 转换为领域模型列表并返回
return entityList.stream()
.map(TaskPlanConvert::toModel)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,272 @@
package com.ruoyi.task.domain.model;
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 Task {
/** 任务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 String uavId;
/** 状态 */
private StatusEnum status;
/**
* 错误是否恢复
*/
private Boolean recovery ;
/** 开始时间 */
private Date startTime;
/** 结束时间 */
private Date endTime;
/** 实际开始时间 */
private Date actualStartTime;
/** 实际结束时间 */
private Date actualEndTime;
/** 描述 */
private String description;
/** 创建者 */
private String createBy;
/** 创建时间 */
private Date createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
private Date updateTime;
/** 备注 */
private String remark;
/** 航线文件URL */
private String routeUrl;
// 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 String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
public Boolean getRecovery() {
return recovery;
}
public void setRecovery(Boolean recovery) {
this.recovery = recovery;
}
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 getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@Override
public String toString() {
return "Task{" +
"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 + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,274 @@
package com.ruoyi.task.domain.model;
import com.ruoyi.task.api.enums.CycleTypeEnum;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import java.util.Date;
/**
* 任务计划领域模型
*
* @author ruoyi
* @date 2026-03-05
*/
public class TaskPlan {
/** 计划ID */
private Long id;
/** 计划名称 */
private String planName;
/** 计划类型(定时任务计划、周期任务计划) */
private PlanTypeEnum planType;
/** 执行类型(单次执行、连续执行) */
private ExecuteTypeEnum executeType;
/** 周期类型(日周期、周周期、月周期) */
private CycleTypeEnum cycleType;
/** 周期值周周期1-7多选如"1,3,5"月周期1-31多选如"1,15,30" */
private String cycleValue;
/** 开始日期 */
private Date startDate;
/** 结束日期 */
private Date endDate;
/** 执行时间 */
/**
* 对于周期任务
* - 数据格式 Date 类型包含完整的日期和时间信息
* - 使用逻辑
* - executeTime 中提取时分秒部分
* - 将这些时分秒应用到当前周期任务的日期上
* - 生成一个新的 Date 对象作为任务的开始时间
* - 示例
* - 如果 executeTime 设置为 "2026-03-06 14:30:00"
* - 当生成 2026-03-10 的周期任务时任务开始时间会是 "2026-03-10 14:30:00"
* - 当生成 2026-03-15 的周期任务时任务开始时间会是 "2026-03-15 14:30:00"
*
* 对于定时任务
* executeTime 就是执行时间
/** 执行时间(仅在定义任务时有效) */
private Date executeTime;
/** 执行时长 秒 */
private Integer duration;
/** 航线ID */
private Long routeId;
/** 无人机ID */
private String uavId;
/** 状态 */
private StatusEnum status;
/** 描述 */
private String description;
/** 创建者 */
private String createBy;
/** 创建时间 */
private Date createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
private Date updateTime;
/** 备注 */
private String remark;
/** 航线文件URL */
private String routeUrl;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlanName() {
return planName;
}
public void setPlanName(String planName) {
this.planName = planName;
}
public PlanTypeEnum getPlanType() {
return planType;
}
public void setPlanType(PlanTypeEnum planType) {
this.planType = planType;
}
public ExecuteTypeEnum getExecuteType() {
return executeType;
}
public void setExecuteType(ExecuteTypeEnum executeType) {
this.executeType = executeType;
}
public CycleTypeEnum getCycleType() {
return cycleType;
}
public void setCycleType(CycleTypeEnum cycleType) {
this.cycleType = cycleType;
}
public String getCycleValue() {
return cycleValue;
}
public void setCycleValue(String cycleValue) {
this.cycleValue = cycleValue;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Date getExecuteTime() {
return executeTime;
}
public void setExecuteTime(Date executeTime) {
this.executeTime = executeTime;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Long getRouteId() {
return routeId;
}
public void setRouteId(Long routeId) {
this.routeId = routeId;
}
public String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@Override
public String toString() {
return "TaskPlan{" +
"id=" + id +
", planName='" + planName + '\'' +
", planType=" + planType +
", executeType=" + executeType +
", cycleType=" + cycleType +
", cycleValue='" + cycleValue + '\'' +
", startDate=" + startDate +
", endDate=" + endDate +
", executeTime=" + executeTime +
", duration=" + duration +
", routeId=" + routeId +
", uavId=" + uavId +
", status=" + status +
", description='" + description + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,68 @@
package com.ruoyi.task.mapper;
import com.ruoyi.task.mapper.entity.TaskInfoEntity;
import java.util.List;
/**
* 任务信息表Mapper接口
*
* @author ruoyi
* @date 2026-03-05
*/
public interface TaskInfoMapper {
/**
* 根据任务主键查询任务信息
*
* @param id 任务主键
* @return 任务信息
*/
TaskInfoEntity selectTaskInfoById(Long id);
/**
* 查询任务信息列表
*
* @param taskInfo 任务信息
* @return 任务信息集合
*/
List<TaskInfoEntity> selectTaskInfoList(TaskInfoEntity taskInfo);
/**
* 新增任务信息
*
* @param taskInfo 任务信息
* @return 影响行数
*/
int insertTaskInfo(TaskInfoEntity taskInfo);
/**
* 修改任务信息
*
* @param taskInfo 任务信息
* @return 影响行数
*/
int updateTaskInfo(TaskInfoEntity taskInfo);
/**
* 删除任务信息
*
* @param id 任务主键
* @return 影响行数
*/
int deleteTaskInfoById(Long id);
/**
* 批量删除任务信息
*
* @param ids 需要删除的任务主键集合
* @return 影响行数
*/
int deleteTaskInfoByIds(Long[] ids);
/**
* 查询指定无人机 actualStartTime 离现在最近的任务
*
* @param uavId 无人机ID
* @return 任务信息
*/
TaskInfoEntity selectCurrentTaskByUavId(String uavId);
}

View File

@ -0,0 +1,60 @@
package com.ruoyi.task.mapper;
import com.ruoyi.task.mapper.entity.TaskPlanEntity;
import java.util.List;
/**
* 任务计划表Mapper接口
*
* @author ruoyi
* @date 2026-03-05
*/
public interface TaskPlanMapper {
/**
* 根据计划主键查询任务计划
*
* @param id 计划主键
* @return 任务计划信息
*/
TaskPlanEntity selectTaskPlanById(Long id);
/**
* 查询任务计划列表
*
* @param taskPlan 任务计划信息
* @return 任务计划集合
*/
List<TaskPlanEntity> selectTaskPlanList(TaskPlanEntity taskPlan);
/**
* 新增任务计划
*
* @param taskPlan 任务计划信息
* @return 影响行数
*/
int insertTaskPlan(TaskPlanEntity taskPlan);
/**
* 修改任务计划
*
* @param taskPlan 任务计划信息
* @return 影响行数
*/
int updateTaskPlan(TaskPlanEntity taskPlan);
/**
* 删除任务计划
*
* @param id 计划主键
* @return 影响行数
*/
int deleteTaskPlanById(Long id);
/**
* 批量删除任务计划
*
* @param ids 需要删除的计划主键集合
* @return 影响行数
*/
int deleteTaskPlanByIds(Long[] ids);
}

View File

@ -0,0 +1,213 @@
package com.ruoyi.task.mapper.entity;
import com.ruoyi.common.core.web.domain.BaseEntity;
import java.util.Date;
/**
* 任务信息表实体对象 task_info
* Mapper 层实体对应数据库表
*
* @author ruoyi
* @date 2026-03-05
*/
public class TaskInfoEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 任务主键 */
private Long id;
/** 任务名称 */
private String taskName;
/** 任务类别 */
private String taskCategory;
/** 任务类型 */
private String taskType;
/** 计划ID */
private Long planId;
/** 航线ID */
private Long routeId;
/** 无人机ID */
private String uavId;
/** 执行类型 */
private String executeType;
/** 状态 */
private String status;
/** 错误是否恢复 */
private Boolean recovery;
/** 开始时间 */
private Date startTime;
/** 结束时间 */
private Date endTime;
/** 实际开始时间 */
private Date actualStartTime;
/** 实际结束时间 */
private Date actualEndTime;
/** 描述 */
private String description;
/** 航线文件URL */
private String routeUrl;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskCategory() {
return taskCategory;
}
public void setTaskCategory(String taskCategory) {
this.taskCategory = taskCategory;
}
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public Long getPlanId() {
return planId;
}
public void setPlanId(Long planId) {
this.planId = planId;
}
public Long getRouteId() {
return routeId;
}
public void setRouteId(Long routeId) {
this.routeId = routeId;
}
public String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public String getExecuteType() {
return executeType;
}
public void setExecuteType(String executeType) {
this.executeType = executeType;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Boolean getRecovery() {
return recovery;
}
public void setRecovery(Boolean recovery) {
this.recovery = recovery;
}
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 getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@Override
public String toString() {
return "TaskInfoEntity{" +
"id=" + id +
", taskName='" + taskName + '\'' +
", taskCategory='" + taskCategory + '\'' +
", taskType='" + taskType + '\'' +
", planId=" + planId +
", routeId=" + routeId +
", uavId=" + uavId +
", executeType='" + executeType + '\'' +
", status='" + status + '\'' +
", startTime=" + startTime +
", endTime=" + endTime +
", actualStartTime=" + actualStartTime +
", actualEndTime=" + actualEndTime +
", description='" + description + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,202 @@
package com.ruoyi.task.mapper.entity;
import com.ruoyi.common.core.web.domain.BaseEntity;
import java.util.Date;
/**
* 任务计划表实体对象 task_plan
* Mapper 层实体对应数据库表
*
* @author ruoyi
* @date 2026-03-05
*/
public class TaskPlanEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 计划主键 */
private Long id;
/** 计划名称 */
private String planName;
/** 计划类型 */
private String planType;
/** 周期类型 */
private String cycleType;
/** 周期值 */
private String cycleValue;
/** 执行类型 */
private String executeType;
/** 执行时间 */
private Date executeTime;
/** 执行时长 秒 */
private Integer duration;
/** 开始日期 */
private Date startDate;
/** 结束日期 */
private Date endDate;
/** 航线ID */
private Long routeId;
/** 无人机ID */
private String uavId;
/** 状态 */
private String status;
/** 描述 */
private String description;
/** 航线文件URL */
private String routeUrl;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlanName() {
return planName;
}
public void setPlanName(String planName) {
this.planName = planName;
}
public String getPlanType() {
return planType;
}
public void setPlanType(String planType) {
this.planType = planType;
}
public String getCycleType() {
return cycleType;
}
public void setCycleType(String cycleType) {
this.cycleType = cycleType;
}
public String getCycleValue() {
return cycleValue;
}
public void setCycleValue(String cycleValue) {
this.cycleValue = cycleValue;
}
public String getExecuteType() {
return executeType;
}
public void setExecuteType(String executeType) {
this.executeType = executeType;
}
public Date getExecuteTime() {
return executeTime;
}
public void setExecuteTime(Date executeTime) {
this.executeTime = executeTime;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Long getRouteId() {
return routeId;
}
public void setRouteId(Long routeId) {
this.routeId = routeId;
}
public String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@Override
public String toString() {
return "TaskPlanEntity{" +
"id=" + id +
", planName='" + planName + '\'' +
", planType='" + planType + '\'' +
", cycleType='" + cycleType + '\'' +
", cycleValue='" + cycleValue + '\'' +
", executeType='" + executeType + '\'' +
", executeTime=" + executeTime +
", duration=" + duration +
", startDate=" + startDate +
", endDate=" + endDate +
", routeId=" + routeId +
", uavId=" + uavId +
", status='" + status + '\'' +
", description='" + description + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,51 @@
package com.ruoyi.task.service.api;
import com.ruoyi.task.service.dto.TaskPlanDTO;
import com.ruoyi.task.service.dto.TaskPlanQueryDTO;
import java.util.List;
public interface ITaskPlanService {
/**
* 创建定时任务计划
* @param taskPlanDTO 任务计划DTO
* @return 任务计划ID
*/
Long createNormalTimedTaskPlan(TaskPlanDTO taskPlanDTO, boolean create);
/**
* 创建周期任务计划
* @param taskPlanDTO 任务计划DTO
* @return 任务计划ID
*/
Long createCycleTaskPlan(TaskPlanDTO taskPlanDTO,boolean create);
/**
* 根据ID获取任务计划
* @param planId 任务计划ID
* @return 任务计划DTO
*/
TaskPlanDTO getTaskPlanById(Long planId);
/**
* 复杂条件查询任务计划列表
* @param queryDTO 查询条件DTO
* @return 任务计划列表
*/
List<TaskPlanDTO> getTaskPlanList(TaskPlanQueryDTO queryDTO);
/**
* 更新任务计划
* @param taskPlanDTO 任务计划DTO
* @return 是否成功
*/
boolean updateTaskPlan(TaskPlanDTO taskPlanDTO);
/**
* 删除任务计划
* @param planId 任务计划ID
* @return 是否成功
*/
boolean deleteTaskPlan(Long planId);
}

View File

@ -0,0 +1,98 @@
package com.ruoyi.task.service.api;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.service.dto.TaskDTO;
import com.ruoyi.task.service.dto.TaskQueryDTO;
import com.ruoyi.task.service.dto.TaskStatQueryServiceDTO;
import com.ruoyi.task.service.dto.TaskStatByYearServiceDTO;
import com.ruoyi.task.service.dto.TaskStatByMonthServiceDTO;
import java.util.List;
public interface ITaskService {
/**
* 创建无关联计划的任务
* @param taskDTO 任务DTO
* @return 任务ID
*/
Long createTaskWithoutPlan(TaskDTO taskDTO);
/**
* 根据ID获取任务
* @param taskId 任务ID
* @return 任务DTO
*/
TaskDTO getTaskById(Long taskId);
/**
* 复杂条件查询任务列表
* @param queryDTO 查询条件DTO
* @return 任务列表
*/
List<TaskDTO> getTaskList(TaskQueryDTO queryDTO);
/**
* 更新任务
* @param taskDTO 任务DTO
* @return 是否成功
*/
boolean updateTask(TaskDTO taskDTO);
/**
* 删除任务
* @param taskId 任务ID
* @return 是否成功
*/
boolean deleteTask(Long taskId);
/**
* 根据无人机ID查询任务列表
* @param uavId 无人机ID
* @return 任务列表
*/
List<TaskDTO> getTaskByUavId(String uavId);
/**
* 根据无人机ID获取最新的一条任务
* @param uavId 无人机ID
* @return 任务DTO
*/
TaskDTO getCurrentTaskByUavId(String uavId);
// /**
// * 修改实际开始执行时间
// * @param taskId 任务ID
// * @return 是否成功
// */
// boolean updateActualStartTime(Long taskId);
//
// /**
// * 修改实际执行结束时间
// * @param taskId 任务ID
// * @return 是否成功
// */
// boolean updateActualEndTime(Long taskId);
/**
* 修改执行状态
* @param taskId 任务ID
* @param status 任务状态
* @return 是否成功
*/
boolean updateTaskStatus(Long taskId, StatusEnum status);
/**
* 按年统计任务
* @param queryDTO 查询条件
* @return 按年统计结果
*/
TaskStatByYearServiceDTO getTaskStatByYear(TaskStatQueryServiceDTO queryDTO);
/**
* 按年月统计任务
* @param queryDTO 查询条件
* @return 按年月统计结果
*/
TaskStatByMonthServiceDTO getTaskStatByMonth(TaskStatQueryServiceDTO queryDTO);
}

View File

@ -0,0 +1,77 @@
package com.ruoyi.task.service.convert;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.domain.model.Task;
import com.ruoyi.task.service.dto.TaskDTO;
import java.util.List;
import java.util.stream.Collectors;
public class TaskDTOConvert {
public static TaskDTO toDTO(Task task) {
if (task == null) {
return null;
}
TaskDTO dto = new TaskDTO();
dto.setId(task.getId());
dto.setPlanId(task.getPlanId());
dto.setTaskName(task.getTaskName());
dto.setTaskCategory(task.getTaskCategory());
dto.setTaskType(task.getTaskType());
dto.setExecuteType(task.getExecuteType());
dto.setRouteId(task.getRouteId());
dto.setUavId(task.getUavId());
dto.setStatus(task.getStatus());
dto.setStartTime(task.getStartTime());
dto.setEndTime(task.getEndTime());
dto.setActualStartTime(task.getActualStartTime());
dto.setActualEndTime(task.getActualEndTime());
dto.setDescription(task.getDescription());
dto.setRemark(task.getRemark());
dto.setRouteUrl(task.getRouteUrl());
dto.setRecovery(task.getRecovery());
return dto;
}
public static Task toDomain(TaskDTO dto) {
if (dto == null) {
return null;
}
Task task = new Task();
task.setId(dto.getId());
task.setPlanId(dto.getPlanId());
task.setTaskName(dto.getTaskName());
task.setTaskCategory(dto.getTaskCategory());
task.setTaskType(dto.getTaskType());
task.setExecuteType(dto.getExecuteType());
task.setRouteId(dto.getRouteId());
task.setUavId(dto.getUavId());
task.setStatus(dto.getStatus());
task.setStartTime(dto.getStartTime());
task.setEndTime(dto.getEndTime());
task.setActualStartTime(dto.getActualStartTime());
task.setActualEndTime(dto.getActualEndTime());
task.setDescription(dto.getDescription());
task.setRemark(dto.getRemark());
task.setRouteUrl(dto.getRouteUrl());
return task;
}
public static List<TaskDTO> toDTOList(List<Task> tasks) {
return tasks.stream()
.map(TaskDTOConvert::toDTO)
.collect(Collectors.toList());
}
public static List<Task> toDomainList(List<TaskDTO> dtos) {
return dtos.stream()
.map(TaskDTOConvert::toDomain)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,78 @@
package com.ruoyi.task.service.convert;
import com.ruoyi.task.api.enums.CycleTypeEnum;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.service.dto.TaskPlanDTO;
import java.util.List;
import java.util.stream.Collectors;
public class TaskPlanDTOConvert {
public static TaskPlanDTO toDTO(TaskPlan taskPlan) {
if (taskPlan == null) {
return null;
}
TaskPlanDTO dto = new TaskPlanDTO();
dto.setId(taskPlan.getId());
dto.setPlanName(taskPlan.getPlanName());
dto.setPlanType(taskPlan.getPlanType());
dto.setExecuteType(taskPlan.getExecuteType());
dto.setCycleType(taskPlan.getCycleType());
dto.setCycleValue(taskPlan.getCycleValue());
dto.setStartDate(taskPlan.getStartDate());
dto.setEndDate(taskPlan.getEndDate());
dto.setExecuteTime(taskPlan.getExecuteTime());
dto.setDuration(taskPlan.getDuration());
dto.setRouteId(taskPlan.getRouteId());
dto.setUavId(taskPlan.getUavId());
dto.setStatus(taskPlan.getStatus());
dto.setDescription(taskPlan.getDescription());
dto.setRemark(taskPlan.getRemark());
dto.setRouteUrl(taskPlan.getRouteUrl());
return dto;
}
public static TaskPlan toDomain(TaskPlanDTO dto) {
if (dto == null) {
return null;
}
TaskPlan taskPlan = new TaskPlan();
taskPlan.setId(dto.getId());
taskPlan.setPlanName(dto.getPlanName());
taskPlan.setPlanType(dto.getPlanType());
taskPlan.setExecuteType(dto.getExecuteType());
taskPlan.setCycleType(dto.getCycleType());
taskPlan.setCycleValue(dto.getCycleValue());
taskPlan.setStartDate(dto.getStartDate());
taskPlan.setEndDate(dto.getEndDate());
taskPlan.setExecuteTime(dto.getExecuteTime());
taskPlan.setDuration(dto.getDuration());
taskPlan.setRouteId(dto.getRouteId());
taskPlan.setUavId(dto.getUavId());
taskPlan.setStatus(dto.getStatus());
taskPlan.setDescription(dto.getDescription());
taskPlan.setRemark(dto.getRemark());
taskPlan.setRouteUrl(dto.getRouteUrl());
return taskPlan;
}
public static List<TaskPlanDTO> toDTOList(List<TaskPlan> taskPlans) {
return taskPlans.stream()
.map(TaskPlanDTOConvert::toDTO)
.collect(Collectors.toList());
}
public static List<TaskPlan> toDomainList(List<TaskPlanDTO> dtos) {
return dtos.stream()
.map(TaskPlanDTOConvert::toDomain)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,228 @@
package com.ruoyi.task.service.dto;
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 org.apache.ibatis.type.Alias;
import java.util.Date;
/**
* 任务数据传输对象
*
* @author ruoyi
* @date 2026-03-05
*/
@Alias("TaskServiceDTO")
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 String uavId;
/** 状态 */
private StatusEnum status;
/** 错误是否恢复 */
private Boolean recovery;
/** 开始时间 */
private Date startTime;
/** 结束时间 */
private Date endTime;
/** 实际开始时间 */
private Date actualStartTime;
/** 实际结束时间 */
private Date actualEndTime;
/** 描述 */
private String description;
/** 备注 */
private String remark;
/** 航线文件URL */
private String routeUrl;
// 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 String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
public Boolean getRecovery() {
return recovery;
}
public void setRecovery(Boolean recovery) {
this.recovery = recovery;
}
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;
}
public String getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@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 + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,219 @@
package com.ruoyi.task.service.dto;
import com.ruoyi.task.api.enums.CycleTypeEnum;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import org.apache.ibatis.type.Alias;
import java.util.Date;
/**
* 任务计划数据传输对象
*
* @author ruoyi
* @date 2026-03-05
*/
@Alias("TaskPlanServiceDTO")
public class TaskPlanDTO {
/** 计划ID */
private Long id;
/** 计划名称 */
private String planName;
/** 计划类型(定时任务计划、周期任务计划) */
private PlanTypeEnum planType;
/** 执行类型(单次执行、连续执行) */
private ExecuteTypeEnum executeType;
/** 周期类型(日周期、周周期、月周期) */
private CycleTypeEnum cycleType;
/** 周期值周周期1-7多选如"1,3,5"月周期1-31多选如"1,15,30" */
private String cycleValue;
/** 开始日期 */
private Date startDate;
/** 结束日期 */
private Date endDate;
/** 执行时间(仅在定义任务时有效) */
private Date executeTime;
/**
* 执行时长
*/
private Integer duration;
/** 航线ID */
private Long routeId;
/** 无人机ID */
private String uavId;
/** 状态 */
private StatusEnum status;
/** 描述 */
private String description;
/** 备注 */
private String remark;
/** 航线文件URL */
private String routeUrl;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlanName() {
return planName;
}
public void setPlanName(String planName) {
this.planName = planName;
}
public PlanTypeEnum getPlanType() {
return planType;
}
public void setPlanType(PlanTypeEnum planType) {
this.planType = planType;
}
public ExecuteTypeEnum getExecuteType() {
return executeType;
}
public void setExecuteType(ExecuteTypeEnum executeType) {
this.executeType = executeType;
}
public CycleTypeEnum getCycleType() {
return cycleType;
}
public void setCycleType(CycleTypeEnum cycleType) {
this.cycleType = cycleType;
}
public String getCycleValue() {
return cycleValue;
}
public void setCycleValue(String cycleValue) {
this.cycleValue = cycleValue;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Date getExecuteTime() {
return executeTime;
}
public void setExecuteTime(Date executeTime) {
this.executeTime = executeTime;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Long getRouteId() {
return routeId;
}
public void setRouteId(Long routeId) {
this.routeId = routeId;
}
public String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
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;
}
public String getRouteUrl() {
return routeUrl;
}
public void setRouteUrl(String routeUrl) {
this.routeUrl = routeUrl;
}
@Override
public String toString() {
return "TaskPlanDTO{" +
"id=" + id +
", planName='" + planName + '\'' +
", planType=" + planType +
", executeType=" + executeType +
", cycleType=" + cycleType +
", cycleValue='" + cycleValue + '\'' +
", startDate=" + startDate +
", endDate=" + endDate +
", executeTime=" + executeTime +
", duration=" + duration +
", routeId=" + routeId +
", uavId=" + uavId +
", status=" + status +
", description='" + description + '\'' +
", routeUrl='" + routeUrl + '\'' +
'}';
}
}

View File

@ -0,0 +1,214 @@
package com.ruoyi.task.service.dto;
import com.ruoyi.task.api.enums.*;
import org.apache.ibatis.type.Alias;
import java.util.Date;
/**
* 任务计划查询条件数据传输对象
*
* @author ruoyi
* @date 2026-03-05
*/
@Alias("TaskPlanQueryServiceDTO")
public class TaskPlanQueryDTO {
/** 计划ID */
private Long id;
/** 计划名称 */
private String planName;
/** 计划类型(定时任务计划、周期任务计划) */
private PlanTypeEnum planType;
/** 执行类型(单次执行、连续执行) */
private ExecuteTypeEnum executeType;
/** 周期类型(日周期、周周期、月周期) */
private CycleTypeEnum cycleType;
/** 开始日期(开始范围) */
private Date startDateStart;
/** 开始日期(结束范围) */
private Date startDateEnd;
/** 结束日期(开始范围) */
private Date endDateStart;
/** 结束日期(结束范围) */
private Date endDateEnd;
/** 航线ID */
private Long routeId;
/** 无人机ID */
private String uavId;
/** 状态0待执行 1执行中 2已完成 3已取消 */
private StatusEnum status;
/** 任务类别 */
private TaskCategoryEnum taskCategory;
/** 任务类型 */
private TaskTypeEnum taskType;
/** 机场代码 */
private String airportCode;
/** 航线名称 */
private String routeName;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlanName() {
return planName;
}
public void setPlanName(String planName) {
this.planName = planName;
}
public PlanTypeEnum getPlanType() {
return planType;
}
public void setPlanType(PlanTypeEnum planType) {
this.planType = planType;
}
public ExecuteTypeEnum getExecuteType() {
return executeType;
}
public void setExecuteType(ExecuteTypeEnum executeType) {
this.executeType = executeType;
}
public CycleTypeEnum getCycleType() {
return cycleType;
}
public void setCycleType(CycleTypeEnum cycleType) {
this.cycleType = cycleType;
}
public Date getStartDateStart() {
return startDateStart;
}
public void setStartDateStart(Date startDateStart) {
this.startDateStart = startDateStart;
}
public Date getStartDateEnd() {
return startDateEnd;
}
public void setStartDateEnd(Date startDateEnd) {
this.startDateEnd = startDateEnd;
}
public Date getEndDateStart() {
return endDateStart;
}
public void setEndDateStart(Date endDateStart) {
this.endDateStart = endDateStart;
}
public Date getEndDateEnd() {
return endDateEnd;
}
public void setEndDateEnd(Date endDateEnd) {
this.endDateEnd = endDateEnd;
}
public Long getRouteId() {
return routeId;
}
public void setRouteId(Long routeId) {
this.routeId = routeId;
}
public String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
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 String getAirportCode() {
return airportCode;
}
public void setAirportCode(String airportCode) {
this.airportCode = airportCode;
}
public String getRouteName() {
return routeName;
}
public void setRouteName(String routeName) {
this.routeName = routeName;
}
@Override
public String toString() {
return "TaskPlanQueryDTO{" +
"id=" + id +
", planName='" + planName + '\'' +
", planType=" + planType +
", executeType=" + executeType +
", cycleType=" + cycleType +
", startDateStart=" + startDateStart +
", startDateEnd=" + startDateEnd +
", endDateStart=" + endDateStart +
", endDateEnd=" + endDateEnd +
", routeId=" + routeId +
", uavId=" + uavId +
", status=" + status +
", taskCategory=" + taskCategory +
", taskType=" + taskType +
", airportCode='" + airportCode + '\'' +
", routeName='" + routeName + '\'' +
'}';
}
}

View File

@ -0,0 +1,202 @@
package com.ruoyi.task.service.dto;
import com.ruoyi.task.api.enums.*;
import org.apache.ibatis.type.Alias;
import java.util.Date;
/**
* 任务查询条件数据传输对象
*
* @author ruoyi
* @date 2026-03-05
*/
@Alias("TaskQueryServiceDTO")
public class TaskQueryDTO {
/** 任务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 String uavId;
/** 状态0待执行 1执行中 2已完成 3已取消 */
private StatusEnum status;
/** 开始时间(开始范围) */
private Date startTimeStart;
/** 开始时间(结束范围) */
private Date startTimeEnd;
/** 结束时间(开始范围) */
private Date endTimeStart;
/** 结束时间(结束范围) */
private Date endTimeEnd;
/** 机场代码 */
private String airportCode;
/** 航线名称 */
private String routeName;
// 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 String getUavId() {
return uavId;
}
public void setUavId(String uavId) {
this.uavId = uavId;
}
public StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
public Date getStartTimeStart() {
return startTimeStart;
}
public void setStartTimeStart(Date startTimeStart) {
this.startTimeStart = startTimeStart;
}
public Date getStartTimeEnd() {
return startTimeEnd;
}
public void setStartTimeEnd(Date startTimeEnd) {
this.startTimeEnd = startTimeEnd;
}
public Date getEndTimeStart() {
return endTimeStart;
}
public void setEndTimeStart(Date endTimeStart) {
this.endTimeStart = endTimeStart;
}
public Date getEndTimeEnd() {
return endTimeEnd;
}
public void setEndTimeEnd(Date endTimeEnd) {
this.endTimeEnd = endTimeEnd;
}
public String getAirportCode() {
return airportCode;
}
public void setAirportCode(String airportCode) {
this.airportCode = airportCode;
}
public String getRouteName() {
return routeName;
}
public void setRouteName(String routeName) {
this.routeName = routeName;
}
@Override
public String toString() {
return "TaskQueryDTO{" +
"id=" + id +
", planId=" + planId +
", taskName='" + taskName + '\'' +
", taskCategory=" + taskCategory +
", taskType=" + taskType +
", executeType=" + executeType +
", routeId=" + routeId +
", uavId=" + uavId +
", status=" + status +
", startTimeStart=" + startTimeStart +
", startTimeEnd=" + startTimeEnd +
", endTimeStart=" + endTimeStart +
", endTimeEnd=" + endTimeEnd +
", airportCode='" + airportCode + '\'' +
", routeName='" + routeName + '\'' +
'}';
}
}

View File

@ -0,0 +1,35 @@
package com.ruoyi.task.service.dto;
import java.util.List;
import java.util.Map;
/**
* 按年月统计任务DTO
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskStatByMonthServiceDTO {
/** 总数 */
private Integer total;
/** 每日任务列表 key:日期(1-31) value:任务列表 */
private Map<Integer, List<TaskStatItemServiceDTO>> days;
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Map<Integer, List<TaskStatItemServiceDTO>> getDays() {
return days;
}
public void setDays(Map<Integer, List<TaskStatItemServiceDTO>> days) {
this.days = days;
}
}

View File

@ -0,0 +1,34 @@
package com.ruoyi.task.service.dto;
import java.util.Map;
/**
* 按年统计任务DTO
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskStatByYearServiceDTO {
/** 总数 */
private Integer total;
/** 每月统计 key:月份(1-12) value:任务数量 */
private Map<Integer, Integer> months;
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Map<Integer, Integer> getMonths() {
return months;
}
public void setMonths(Map<Integer, Integer> months) {
this.months = months;
}
}

View File

@ -0,0 +1,208 @@
package com.ruoyi.task.service.dto;
import com.ruoyi.task.api.enums.CycleTypeEnum;
import com.ruoyi.task.api.enums.PlanTypeEnum;
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;
/**
* 任务统计项DTO
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskStatItemServiceDTO {
private Long taskId;
private Long planId;
private String taskName;
private String planName;
private PlanTypeEnum planType;
private CycleTypeEnum cycleType;
private Date planStartDate;
private Date planEndDate;
private String routeName;
private String airVendor;
private String airType;
public String getAirType() {
return airType;
}
public void setAirType(String airType) {
this.airType = airType;
}
private Date startTime;
private Date endTime;
private Date actualStartTime;
private Date actualEndTime;
private StatusEnum status;
private TaskTypeEnum taskType;
private TaskCategoryEnum taskCategory;
private String airlineType;
private Date taskCreateTime;
private String taskCreateBy;
public Long getTaskId() {
return taskId;
}
public void setTaskId(Long taskId) {
this.taskId = taskId;
}
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 String getPlanName() {
return planName;
}
public void setPlanName(String planName) {
this.planName = planName;
}
public PlanTypeEnum getPlanType() {
return planType;
}
public void setPlanType(PlanTypeEnum planType) {
this.planType = planType;
}
public CycleTypeEnum getCycleType() {
return cycleType;
}
public void setCycleType(CycleTypeEnum cycleType) {
this.cycleType = cycleType;
}
public Date getPlanStartDate() {
return planStartDate;
}
public void setPlanStartDate(Date planStartDate) {
this.planStartDate = planStartDate;
}
public Date getPlanEndDate() {
return planEndDate;
}
public void setPlanEndDate(Date planEndDate) {
this.planEndDate = planEndDate;
}
public String getRouteName() {
return routeName;
}
public void setRouteName(String routeName) {
this.routeName = routeName;
}
public String getAirVendor() {
return airVendor;
}
public void setAirVendor(String airVendor) {
this.airVendor = airVendor;
}
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 StatusEnum getStatus() {
return status;
}
public void setStatus(StatusEnum status) {
this.status = status;
}
public TaskTypeEnum getTaskType() {
return taskType;
}
public void setTaskType(TaskTypeEnum taskType) {
this.taskType = taskType;
}
public TaskCategoryEnum getTaskCategory() {
return taskCategory;
}
public void setTaskCategory(TaskCategoryEnum taskCategory) {
this.taskCategory = taskCategory;
}
public String getAirlineType() {
return airlineType;
}
public void setAirlineType(String airlineType) {
this.airlineType = airlineType;
}
public Date getTaskCreateTime() {
return taskCreateTime;
}
public void setTaskCreateTime(Date taskCreateTime) {
this.taskCreateTime = taskCreateTime;
}
public String getTaskCreateBy() {
return taskCreateBy;
}
public void setTaskCreateBy(String taskCreateBy) {
this.taskCreateBy = taskCreateBy;
}
}

View File

@ -0,0 +1,116 @@
package com.ruoyi.task.service.dto;
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;
import java.util.List;
/**
* 任务统计查询DTO
*
* @author ruoyi
* @date 2026-03-09
*/
public class TaskStatQueryServiceDTO {
/** 年份 */
private Integer year;
/** 月份 */
private Integer month;
/** 开始日期 */
private Date startDate;
/** 结束日期 */
private Date endDate;
/** 任务类别 */
private TaskCategoryEnum taskCategory;
/** 任务类型 */
private TaskTypeEnum taskType;
/** 状态列表 */
private List<StatusEnum> statusList;
/** 航线ID列表 */
private List<Long> routeIdList;
/** 无人机ID列表 */
private List<String> uavIdList;
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getMonth() {
return month;
}
public void setMonth(Integer month) {
this.month = month;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
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 List<StatusEnum> getStatusList() {
return statusList;
}
public void setStatusList(List<StatusEnum> statusList) {
this.statusList = statusList;
}
public List<Long> getRouteIdList() {
return routeIdList;
}
public void setRouteIdList(List<Long> routeIdList) {
this.routeIdList = routeIdList;
}
public List<String> getUavIdList() {
return uavIdList;
}
public void setUavIdList(List<String> uavIdList) {
this.uavIdList = uavIdList;
}
}

View File

@ -0,0 +1,355 @@
package com.ruoyi.task.service.impl;
import com.ruoyi.task.api.enums.*;
import com.ruoyi.task.domain.api.ITaskDomain;
import com.ruoyi.task.domain.api.ITaskPlanDomain;
import com.ruoyi.task.domain.model.Task;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.service.api.ITaskPlanService;
import com.ruoyi.task.service.convert.TaskPlanDTOConvert;
import com.ruoyi.task.service.dto.TaskPlanDTO;
import com.ruoyi.task.service.dto.TaskPlanQueryDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
@Service
public class TaskPlanServiceImpl implements ITaskPlanService {
@Autowired
private ITaskPlanDomain taskPlanDomain;
@Autowired
private ITaskDomain taskDomain;
@Override
public Long createNormalTimedTaskPlan(TaskPlanDTO taskPlanDTO, boolean create) {
TaskPlan taskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
// 校验PlanTypeEnum
if (taskPlan.getPlanType() != null && taskPlan.getPlanType() == PlanTypeEnum.CYCLE) {
throw new IllegalArgumentException("定时任务计划不能设置为周期类型");
}
// 设置结束时间开始时间 + 执行时长
if (taskPlan.getExecuteTime() != null && taskPlan.getDuration() != null) {
taskPlan.setStartDate(taskPlan.getExecuteTime());
taskPlan.setEndDate(taskPlan.getExecuteTime());
}
if(create){
TaskPlan result = taskPlanDomain.createTimedTaskPlan(taskPlan);
// 创建对应的任务记录
createNormalTaskFromPlan(result);
return result.getId();
}else {
taskPlanDomain.updateTaskPlan(taskPlan);
createNormalTaskFromPlan(taskPlan);
return taskPlan.getId();
}
}
@Override
public Long createCycleTaskPlan(TaskPlanDTO taskPlanDTO,boolean create) {
TaskPlan taskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
// 校验PlanTypeEnum
if (taskPlan.getPlanType() != null && taskPlan.getPlanType() == PlanTypeEnum.TIMED) {
throw new IllegalArgumentException("周期任务计划不能设置为定时类型");
}
// 如果PlanTypeEnum为空设置为周期类型
if (taskPlan.getPlanType() == null) {
taskPlan.setPlanType(PlanTypeEnum.CYCLE);
}
if(create){
TaskPlan result = taskPlanDomain.createCycleTaskPlan(taskPlan);
// 创建对应的任务记录
createNormalTaskFromPlan(result);
return result.getId();
}else {
taskPlanDomain.updateTaskPlan(taskPlan);
createNormalTaskFromPlan(taskPlan);
return taskPlan.getId();
}
}
/**
* 根据任务计划创建任务记录
*/
private void createNormalTaskFromPlan(TaskPlan taskPlan) {
// 检查是否为周期任务计划
if (taskPlan.getPlanType() == PlanTypeEnum.CYCLE) {
// 生成周期任务记录
generateNormalCycleTasks(taskPlan);
} else {
// 生成单次任务记录
generateNormalPlanTask(taskPlan);
}
}
/**
* 生成单次任务记录
*/
private void generateNormalPlanTask(TaskPlan taskPlan) {
Task task = new Task();
task.setTaskName(taskPlan.getPlanName() + "_任务");
task.setPlanId(taskPlan.getId());
task.setTaskCategory(TaskCategoryEnum.NORMAL);
if(Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.TIMED)){
task.setTaskType(TaskTypeEnum.TIMED);
}
if (Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.CYCLE)) {
task.setTaskType(TaskTypeEnum.CYCLE);
}
if (Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.IMMEDIATELY)) {
task.setTaskType(TaskTypeEnum.IMMEDIATELY);
}
task.setExecuteType(taskPlan.getExecuteType());
task.setRouteId(taskPlan.getRouteId());
task.setUavId(taskPlan.getUavId());
task.setStartTime(taskPlan.getExecuteTime());
// 设置结束时间开始时间 + 执行时长
if (taskPlan.getExecuteTime() != null && taskPlan.getDuration() != null) {
java.util.Calendar endTaskCalendar = java.util.Calendar.getInstance();
endTaskCalendar.setTime(taskPlan.getExecuteTime());
endTaskCalendar.add(java.util.Calendar.SECOND, taskPlan.getDuration());
task.setEndTime(endTaskCalendar.getTime());
}
task.setStatus(StatusEnum.PENDING); // 待执行
task.setDescription("由任务计划自动创建");
// 创建任务
taskDomain.createTask(task);
}
/**
* 生成周期任务记录
*/
private void generateNormalCycleTasks(TaskPlan taskPlan) {
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.setTime(taskPlan.getStartDate());
java.util.Calendar endCalendar = java.util.Calendar.getInstance();
endCalendar.setTime(taskPlan.getEndDate());
if (taskPlan.getCycleType() == CycleTypeEnum.DAILY) {
// 日周期cycleValue 表示每几天执行一次
int dayInterval = 1;
if (taskPlan.getCycleValue() != null && !taskPlan.getCycleValue().isEmpty()) {
try {
dayInterval = Integer.parseInt(taskPlan.getCycleValue().trim());
if (dayInterval < 1) dayInterval = 1;
} catch (NumberFormatException e) {
dayInterval = 1;
}
}
while (!calendar.after(endCalendar)) {
createNormalTaskForDate(taskPlan, calendar);
calendar.add(java.util.Calendar.DAY_OF_YEAR, dayInterval);
}
} else {
// 周周期和月周期解析 cycleValue 为集合
java.util.Set<Integer> cycleValues = new java.util.HashSet<>();
if (taskPlan.getCycleValue() != null && !taskPlan.getCycleValue().isEmpty()) {
String[] values = taskPlan.getCycleValue().split(",");
for (String value : values) {
try {
cycleValues.add(Integer.parseInt(value.trim()));
} catch (NumberFormatException e) {
// 忽略无效值
}
}
}
while (!calendar.after(endCalendar)) {
boolean shouldCreateTask = false;
if (taskPlan.getCycleType() == CycleTypeEnum.WEEKLY) {
int dayOfWeek = calendar.get(java.util.Calendar.DAY_OF_WEEK);
shouldCreateTask = cycleValues.contains(dayOfWeek);
} else if (taskPlan.getCycleType() == CycleTypeEnum.MONTHLY) {
int dayOfMonth = calendar.get(java.util.Calendar.DAY_OF_MONTH);
shouldCreateTask = cycleValues.contains(dayOfMonth);
}
if (shouldCreateTask) {
createNormalTaskForDate(taskPlan, calendar);
}
calendar.add(java.util.Calendar.DAY_OF_YEAR, 1);
}
}
}
private void createNormalTaskForDate(TaskPlan taskPlan, java.util.Calendar calendar) {
Task task = new Task();
task.setTaskName(taskPlan.getPlanName() + "_任务_" + formatDate(calendar.getTime()));
task.setPlanId(taskPlan.getId());
task.setTaskCategory(TaskCategoryEnum.NORMAL);
if(Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.TIMED)){
task.setTaskType(TaskTypeEnum.TIMED);
}
if(Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.CYCLE)){
task.setTaskType(TaskTypeEnum.CYCLE);
}
if(Objects.equals(taskPlan.getPlanType(), PlanTypeEnum.IMMEDIATELY)){
task.setTaskType(TaskTypeEnum.IMMEDIATELY);
}
task.setExecuteType(taskPlan.getExecuteType());
task.setRouteId(taskPlan.getRouteId());
task.setUavId(taskPlan.getUavId());
if (taskPlan.getExecuteTime() != null) {
java.util.Calendar taskCalendar = java.util.Calendar.getInstance();
taskCalendar.setTime(calendar.getTime());
java.util.Calendar executeTimeCalendar = java.util.Calendar.getInstance();
executeTimeCalendar.setTime(taskPlan.getExecuteTime());
taskCalendar.set(java.util.Calendar.HOUR_OF_DAY, executeTimeCalendar.get(java.util.Calendar.HOUR_OF_DAY));
taskCalendar.set(java.util.Calendar.MINUTE, executeTimeCalendar.get(java.util.Calendar.MINUTE));
taskCalendar.set(java.util.Calendar.SECOND, executeTimeCalendar.get(java.util.Calendar.SECOND));
task.setStartTime(taskCalendar.getTime());
java.util.Calendar endTaskCalendar = (java.util.Calendar) taskCalendar.clone();
if (taskPlan.getDuration() != null) {
endTaskCalendar.add(java.util.Calendar.SECOND, taskPlan.getDuration());
} else {
endTaskCalendar.add(java.util.Calendar.SECOND, 3600);
}
task.setEndTime(endTaskCalendar.getTime());
} else {
task.setStartTime(calendar.getTime());
task.setEndTime(calendar.getTime());
}
task.setStatus(StatusEnum.PENDING);
task.setDescription("由任务计划自动创建");
taskDomain.createTask(task);
}
/**
* 格式化日期为字符串
*/
private String formatDate(java.util.Date date) {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
return sdf.format(date);
}
@Override
public TaskPlanDTO getTaskPlanById(Long planId) {
TaskPlan taskPlan = taskPlanDomain.getTaskPlanById(planId);
return TaskPlanDTOConvert.toDTO(taskPlan);
}
@Override
public List<TaskPlanDTO> getTaskPlanList(TaskPlanQueryDTO queryDTO) {
// 如果传递了id功能就等同于getTaskPlanById
if (queryDTO.getId() != null) {
TaskPlanDTO taskPlanDTO = getTaskPlanById(queryDTO.getId());
return taskPlanDTO != null ? java.util.Collections.singletonList(taskPlanDTO) : java.util.Collections.emptyList();
}
// 创建TaskPlan对象作为查询条件
TaskPlan taskPlan = new TaskPlan();
taskPlan.setRouteId(queryDTO.getRouteId());
taskPlan.setUavId(queryDTO.getUavId());
taskPlan.setStatus(queryDTO.getStatus());
taskPlan.setPlanType(queryDTO.getPlanType());
taskPlan.setCycleType(queryDTO.getCycleType());
// 这里需要注意TaskPlan类中没有airportCode和routeName字段
// 这些字段可能需要通过关联查询来实现过滤
// 但目前我们先按照现有的结构实现基本过滤
List<TaskPlan> taskPlans = taskPlanDomain.getTaskPlanList(taskPlan);
// 过滤时间范围只有当startDateStart和startDateEnd都传时才使用
if (queryDTO.getStartDateStart() != null && queryDTO.getStartDateEnd() != null) {
java.util.Date startDateStart = queryDTO.getStartDateStart();
java.util.Date startDateEnd = queryDTO.getStartDateEnd();
taskPlans = taskPlans.stream()
.filter(plan -> {
java.util.Date planStartDate = plan.getStartDate();
return planStartDate != null &&
!planStartDate.before(startDateStart) &&
!planStartDate.after(startDateEnd);
})
.collect(java.util.stream.Collectors.toList());
}
return TaskPlanDTOConvert.toDTOList(taskPlans);
}
@Override
public boolean updateTaskPlan(TaskPlanDTO taskPlanDTO) {
// 先查询原始数据
TaskPlan existingTaskPlan = taskPlanDomain.getTaskPlanById(taskPlanDTO.getId());
if (existingTaskPlan == null) {
throw new IllegalArgumentException("任务计划不存在");
}
// 将传入的非空字段覆盖到原始数据
TaskPlan updateTaskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
if (updateTaskPlan.getPlanName() != null) existingTaskPlan.setPlanName(updateTaskPlan.getPlanName());
if (updateTaskPlan.getPlanType() != null) existingTaskPlan.setPlanType(updateTaskPlan.getPlanType());
if (updateTaskPlan.getCycleType() != null) existingTaskPlan.setCycleType(updateTaskPlan.getCycleType());
if (updateTaskPlan.getCycleValue() != null) existingTaskPlan.setCycleValue(updateTaskPlan.getCycleValue());
if (updateTaskPlan.getExecuteType() != null) existingTaskPlan.setExecuteType(updateTaskPlan.getExecuteType());
if (updateTaskPlan.getExecuteTime() != null) existingTaskPlan.setExecuteTime(updateTaskPlan.getExecuteTime());
if (updateTaskPlan.getDuration() != null) existingTaskPlan.setDuration(updateTaskPlan.getDuration());
if (updateTaskPlan.getStartDate() != null) existingTaskPlan.setStartDate(updateTaskPlan.getStartDate());
if (updateTaskPlan.getEndDate() != null) existingTaskPlan.setEndDate(updateTaskPlan.getEndDate());
if (updateTaskPlan.getRouteId() != null) existingTaskPlan.setRouteId(updateTaskPlan.getRouteId());
if (updateTaskPlan.getUavId() != null) existingTaskPlan.setUavId(updateTaskPlan.getUavId());
if (updateTaskPlan.getStatus() != null) existingTaskPlan.setStatus(updateTaskPlan.getStatus());
if (updateTaskPlan.getDescription() != null) existingTaskPlan.setDescription(updateTaskPlan.getDescription());
if (updateTaskPlan.getRouteUrl() != null) existingTaskPlan.setRouteUrl(updateTaskPlan.getRouteUrl());
if (updateTaskPlan.getRemark() != null) existingTaskPlan.setRemark(updateTaskPlan.getRemark());
TaskPlan result = taskPlanDomain.updateTaskPlan(existingTaskPlan);
if (result != null) {
// 先删除该计划下的所有未执行任务
List<Task> tasks = taskDomain.getTaskByPlanId(result.getId());
for (Task task : tasks) {
if (task.getStatus() == StatusEnum.PENDING) {
taskDomain.deleteTask(task.getId());
}
}
}
createNormalTaskFromPlan(existingTaskPlan);
return result != null;
}
@Override
public boolean deleteTaskPlan(Long planId) {
// 先获取该计划下的所有任务
List<Task> tasks = taskDomain.getTaskByPlanId(planId);
// 删除所有状态为待执行的任务
for (Task task : tasks) {
if (task.getStatus() == StatusEnum.PENDING) {
taskDomain.deleteTask(task.getId());
}
}
// 最后删除任务计划
return taskPlanDomain.deleteTaskPlan(planId);
}
}

View File

@ -0,0 +1,348 @@
package com.ruoyi.task.service.impl;
import com.ruoyi.airline.api.RemoteAirlineService;
import com.ruoyi.airline.api.domain.AirlineFileVO;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.device.api.RemoteAircraftService;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.domain.api.ITaskDomain;
import com.ruoyi.task.domain.api.ITaskPlanDomain;
import com.ruoyi.task.domain.model.Task;
import com.ruoyi.task.domain.model.TaskPlan;
import com.ruoyi.task.service.api.ITaskService;
import com.ruoyi.task.service.convert.TaskDTOConvert;
import com.ruoyi.task.service.dto.TaskDTO;
import com.ruoyi.task.service.dto.TaskQueryDTO;
import com.ruoyi.task.service.dto.TaskStatQueryServiceDTO;
import com.ruoyi.task.service.dto.TaskStatByYearServiceDTO;
import com.ruoyi.task.service.dto.TaskStatByMonthServiceDTO;
import com.ruoyi.task.service.dto.TaskStatItemServiceDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class TaskServiceImpl implements ITaskService {
@Autowired
private ITaskDomain taskDomain;
@Autowired
private ITaskPlanDomain taskPlanDomain;
@Autowired
private RemoteAirlineService remoteAirlineService;
@Autowired
private RemoteAircraftService remoteAircraftService;
@Override
public Long createTaskWithoutPlan(TaskDTO taskDTO) {
Task task = TaskDTOConvert.toDomain(taskDTO);
task.setPlanId(null);
task.setStatus(StatusEnum.PENDING);
Task result = taskDomain.createTask(task);
return result != null ? result.getId() : null;
}
@Override
public TaskDTO getTaskById(Long taskId) {
Task task = taskDomain.getTaskById(taskId);
return TaskDTOConvert.toDTO(task);
}
@Override
public List<TaskDTO> getTaskList(TaskQueryDTO queryDTO) {
// 如果传递了id功能就等同于用ID去获取值
if (queryDTO.getId() != null) {
TaskDTO taskDTO = getTaskById(queryDTO.getId());
return taskDTO != null ? java.util.Collections.singletonList(taskDTO) : java.util.Collections.emptyList();
}
// 创建Task对象作为查询条件
Task task = new Task();
task.setRouteId(queryDTO.getRouteId());
task.setUavId(queryDTO.getUavId());
task.setStatus(queryDTO.getStatus());
task.setTaskCategory(queryDTO.getTaskCategory());
task.setTaskType(queryDTO.getTaskType());
task.setExecuteType(queryDTO.getExecuteType());
// 这里需要注意Task类中没有airportCodePlanTypeEnum和CycleTypeEnum字段
// 这些字段可能需要通过关联查询来实现过滤
// 但目前我们先按照现有的结构实现基本过滤
List<Task> tasks = taskDomain.getTaskList(task);
// 过滤时间范围只有当startTimeStart和startTimeEnd都传时才使用
if (queryDTO.getStartTimeStart() != null && queryDTO.getStartTimeEnd() != null) {
java.util.Date startTimeStart = queryDTO.getStartTimeStart();
java.util.Date startTimeEnd = queryDTO.getStartTimeEnd();
tasks = tasks.stream()
.filter(t -> {
java.util.Date taskStartTime = t.getStartTime();
return taskStartTime != null &&
!taskStartTime.before(startTimeStart) &&
!taskStartTime.after(startTimeEnd);
})
.collect(java.util.stream.Collectors.toList());
}
return TaskDTOConvert.toDTOList(tasks);
}
@Override
public boolean updateTask(TaskDTO taskDTO) {
Task task = TaskDTOConvert.toDomain(taskDTO);
Task result = taskDomain.updateTask(task);
return result != null;
}
@Override
public boolean deleteTask(Long taskId) {
return taskDomain.deleteTask(taskId);
}
@Override
public List<TaskDTO> getTaskByUavId(String uavId) {
// 创建Task对象作为查询条件
Task task = new Task();
task.setUavId(uavId);
List<Task> tasks = taskDomain.getTaskList(task);
return TaskDTOConvert.toDTOList(tasks);
}
@Override
public TaskDTO getCurrentTaskByUavId(String uavId) {
Task task = taskDomain.getCurrentTaskByUavId(uavId);
return TaskDTOConvert.toDTO(task);
}
//
// @Override
// public boolean updateActualStartTime(Long taskId) {
// Task task = taskDomain.getTaskById(taskId);
// if (task != null) {
// task.setActualStartTime(new java.util.Date());
// Task result = taskDomain.updateTask(task);
// return result != null;
// }
// return false;
// }
//
// @Override
// public boolean updateActualEndTime(Long taskId) {
// Task task = taskDomain.getTaskById(taskId);
// if (task != null) {
// task.setActualEndTime(new java.util.Date());
// Task result = taskDomain.updateTask(task);
// return result != null;
// }
// return false;
// }
@Override
public boolean updateTaskStatus(Long taskId, StatusEnum status) {
Task task = taskDomain.getTaskById(taskId);
if (task != null) {
task.setStatus(status);
// 如果状态变为自检中
if (status == StatusEnum.CHECKING) {
task.setActualStartTime(new java.util.Date());
if(Objects.isNull(task.getStartTime())){
task.setStartTime(new java.util.Date());
}
//没有配置开始时间,可以理解为是立马执行
} else if(status == StatusEnum.PENDING) {
if(Objects.isNull(task.getStartTime())){
task.setStartTime(new java.util.Date());
}
//已完成 失败 取消 的时候, 配置结束时间
} else if(status != StatusEnum.RUNNING) {
task.setActualEndTime(new java.util.Date());
if(Objects.isNull(task.getEndTime())){
task.setEndTime(new java.util.Date());
}
}
Task result = taskDomain.updateTask(task);
return result != null;
}
return false;
}
@Override
public TaskStatByYearServiceDTO getTaskStatByYear(TaskStatQueryServiceDTO queryDTO) {
Task task = new Task();
task.setTaskCategory(queryDTO.getTaskCategory());
task.setTaskType(queryDTO.getTaskType());
List<Task> tasks = taskDomain.getTaskList(task);
Calendar calendar = Calendar.getInstance();
Map<Integer, Integer> months = new HashMap<>();
int total = 0;
for (Task t : tasks) {
if (t.getStartTime() != null) {
// 如果指定了状态列表则过滤状态
if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty()
&& !queryDTO.getStatusList().contains(t.getStatus())) {
continue;
}
// 如果指定了航线ID列表则过滤航线
if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty()
&& !queryDTO.getRouteIdList().contains(t.getRouteId())) {
continue;
}
// 如果指定了无人机ID列表则过滤无人机
if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty()
&& !queryDTO.getUavIdList().contains(t.getUavId())) {
continue;
}
// 如果指定了日期范围则使用日期范围过滤否则使用年份过滤
if (queryDTO.getStartDate() != null && queryDTO.getEndDate() != null) {
if (t.getStartTime().before(queryDTO.getStartDate()) || t.getStartTime().after(queryDTO.getEndDate())) {
continue;
}
} else if (queryDTO.getYear() != null) {
calendar.setTime(t.getStartTime());
int year = calendar.get(Calendar.YEAR);
if (year != queryDTO.getYear()) {
continue;
}
}
calendar.setTime(t.getStartTime());
int month = calendar.get(Calendar.MONTH) + 1;
months.put(month, months.getOrDefault(month, 0) + 1);
total++;
}
}
TaskStatByYearServiceDTO result = new TaskStatByYearServiceDTO();
result.setTotal(total);
result.setMonths(months);
return result;
}
@Override
public TaskStatByMonthServiceDTO getTaskStatByMonth(TaskStatQueryServiceDTO queryDTO) {
Task task = new Task();
task.setTaskCategory(queryDTO.getTaskCategory());
task.setTaskType(queryDTO.getTaskType());
List<Task> tasks = taskDomain.getTaskList(task);
Calendar calendar = Calendar.getInstance();
Map<Integer, List<TaskStatItemServiceDTO>> days = new HashMap<>();
int total = 0;
for (Task t : tasks) {
if (t.getStartTime() != null) {
// 如果指定了状态列表则过滤状态
if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty()
&& !queryDTO.getStatusList().contains(t.getStatus())) {
continue;
}
// 如果指定了航线ID列表则过滤航线
if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty()
&& !queryDTO.getRouteIdList().contains(t.getRouteId())) {
continue;
}
// 如果指定了无人机ID列表则过滤无人机
if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty()
&& !queryDTO.getUavIdList().contains(t.getUavId())) {
continue;
}
calendar.setTime(t.getStartTime());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
// 如果指定了日期范围则使用日期范围过滤否则使用年月过滤
boolean matchDate = false;
if (queryDTO.getStartDate() != null && queryDTO.getEndDate() != null) {
if (!t.getStartTime().before(queryDTO.getStartDate()) && !t.getStartTime().after(queryDTO.getEndDate())) {
matchDate = true;
}
} else if (queryDTO.getYear() != null && queryDTO.getMonth() != null) {
if (year == queryDTO.getYear() && month == queryDTO.getMonth()) {
matchDate = true;
}
}
if (matchDate) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
TaskStatItemServiceDTO item = new TaskStatItemServiceDTO();
item.setTaskId(t.getId());
item.setPlanId(t.getPlanId());
item.setTaskName(t.getTaskName());
item.setTaskType(t.getTaskType());
item.setTaskCategory(t.getTaskCategory());
item.setStartTime(t.getStartTime());
item.setEndTime(t.getEndTime());
item.setActualStartTime(t.getActualStartTime());
item.setActualEndTime(t.getActualEndTime());
item.setStatus(t.getStatus());
item.setTaskCreateTime(t.getCreateTime());
item.setTaskCreateBy(t.getCreateBy());
if (t.getPlanId() != null) {
TaskPlan plan = taskPlanDomain.getTaskPlanById(t.getPlanId());
if (plan != null) {
item.setPlanName(plan.getPlanName());
item.setPlanType(plan.getPlanType());
item.setCycleType(plan.getCycleType());
item.setPlanStartDate(plan.getStartDate());
item.setPlanEndDate(plan.getEndDate());
}
}
// 查询航线名称
if (t.getRouteId() != null && t.getRouteId()>0L) {
try {
R<AirlineFileVO> airlineResult = remoteAirlineService.getFileById(t.getRouteId(), SecurityConstants.INNER);
if (airlineResult != null && airlineResult.getData() != null) {
item.setRouteName(airlineResult.getData().getName());
item.setAirVendor(airlineResult.getData().getAirVendor());
item.setAirType(airlineResult.getData().getAirType());
item.setAirlineType(airlineResult.getData().getType());
}
} catch (Exception e) {
// 忽略远程调用异常
}
}
// // 查询无人机型号
// if (t.getUavId() != null) {
// try {
// Long aircraftId = Long.parseLong(t.getUavId());
// R<AircraftDetailVO> aircraftResult = remoteAircraftService.getAircraftDetail(aircraftId, SecurityConstants.INNER);
// if (aircraftResult != null && aircraftResult.getData() != null) {
// item.setAircraftModel(aircraftResult.getData().getAircraftModel());
// }
// } catch (Exception e) {
// // 忽略远程调用异常或类型转换异常
// }
// }
days.computeIfAbsent(day, k -> new ArrayList<>()).add(item);
total++;
}
}
}
TaskStatByMonthServiceDTO result = new TaskStatByMonthServiceDTO();
result.setTotal(total);
result.setDays(days);
return result;
}
}

View File

@ -0,0 +1,123 @@
-- ----------------------------
-- 任务计划表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_plan (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '计划ID',
plan_name VARCHAR(100) NOT NULL COMMENT '计划名称',
plan_type VARCHAR(50) NOT NULL COMMENT '计划类型(定时任务计划、周期任务计划)',
execute_type VARCHAR(50) NOT NULL COMMENT '执行类型(单次执行、连续执行)',
cycle_type VARCHAR(50) DEFAULT '' COMMENT '周期类型(日周期、周周期、月周期)',
cycle_value VARCHAR(100) DEFAULT '' COMMENT '周期值周周期1-7多选如"1,3,5"月周期1-31多选如"1,15,30"',
start_date DATETIME COMMENT '开始日期',
end_date DATETIME COMMENT '结束日期',
execute_time DATETIME COMMENT '执行时间(仅在定义任务时有效)',
route_id BIGINT(20) DEFAULT NULL COMMENT '航线ID',
uav_id BIGINT(20) DEFAULT NULL COMMENT '无人机ID',
status CHAR(1) DEFAULT '0' COMMENT '计划状态0待执行 1执行中 2已完成 3已取消',
description VARCHAR(500) DEFAULT NULL COMMENT '描述',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=100 COMMENT='任务计划表';
-- ----------------------------
-- 任务表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_info (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID',
plan_id BIGINT(20) DEFAULT NULL COMMENT '计划ID可为空如一键起飞',
task_name VARCHAR(100) NOT NULL COMMENT '任务名称',
task_category VARCHAR(50) NOT NULL COMMENT '任务类别(如人工执飞)',
task_type VARCHAR(50) NOT NULL COMMENT '任务类型(如一键起飞)',
execute_type VARCHAR(50) NOT NULL COMMENT '执行类型(单次执行、连续执行)',
route_id BIGINT(20) DEFAULT NULL COMMENT '航线ID',
uav_id BIGINT(20) DEFAULT NULL COMMENT '无人机ID',
status CHAR(1) DEFAULT '0' COMMENT '任务状态0待执行 1执行中 2已完成 3已取消',
start_time DATETIME COMMENT '开始时间',
end_time DATETIME COMMENT '结束时间',
description VARCHAR(500) DEFAULT NULL COMMENT '描述',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id),
KEY idx_task_info_plan_id (plan_id)
) ENGINE=InnoDB AUTO_INCREMENT=100 COMMENT='任务表';
-- ----------------------------
-- 任务统计表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_stat (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '统计ID',
airport_code VARCHAR(50) DEFAULT '' COMMENT '机场代码',
route_name VARCHAR(100) DEFAULT '' COMMENT '航线名称',
task_category VARCHAR(50) NOT NULL COMMENT '任务类别(如人工执飞)',
task_type VARCHAR(50) NOT NULL COMMENT '任务类型(如一键起飞)',
task_status CHAR(1) DEFAULT '0' COMMENT '任务状态0待执行 1执行中 2已完成 3已取消',
year INT(4) COMMENT '年份',
month INT(2) COMMENT '月份',
day INT(2) COMMENT '日期',
task_count INT(11) DEFAULT 0 COMMENT '任务数量',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id),
KEY idx_task_stat_year (year),
KEY idx_task_stat_month (month),
KEY idx_task_stat_day (day),
KEY idx_task_stat_task_category (task_category),
KEY idx_task_stat_task_type (task_type),
KEY idx_task_stat_task_status (task_status)
) ENGINE=InnoDB AUTO_INCREMENT=100 COMMENT='任务统计表';
-- ----------------------------
-- 计划与航线关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS plan_airline (
plan_id BIGINT(20) NOT NULL COMMENT '计划ID',
airline_id BIGINT(20) NOT NULL COMMENT '航线ID',
PRIMARY KEY (plan_id, airline_id)
) ENGINE=InnoDB COMMENT='计划与航线关联表';
-- ----------------------------
-- 计划与无人机关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS plan_uav (
plan_id BIGINT(20) NOT NULL COMMENT '计划ID',
uav_id BIGINT(20) NOT NULL COMMENT '无人机ID',
PRIMARY KEY (plan_id, uav_id)
) ENGINE=InnoDB COMMENT='计划与无人机关联表';
-- ----------------------------
-- 任务与航线关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_airline (
task_id BIGINT(20) NOT NULL COMMENT '任务ID',
airline_id BIGINT(20) NOT NULL COMMENT '航线ID',
PRIMARY KEY (task_id, airline_id)
) ENGINE=InnoDB COMMENT='任务与航线关联表';
-- ----------------------------
-- 任务与无人机关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_uav (
task_id BIGINT(20) NOT NULL COMMENT '任务ID',
uav_id BIGINT(20) NOT NULL COMMENT '无人机ID',
PRIMARY KEY (task_id, uav_id)
) ENGINE=InnoDB COMMENT='任务与无人机关联表';
-- ----------------------------
-- 任务与用户关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS task_user (
task_id BIGINT(20) NOT NULL COMMENT '任务ID',
user_id BIGINT(20) NOT NULL COMMENT '用户ID',
role_type VARCHAR(50) DEFAULT '' COMMENT '角色类型(负责人、参与者等)',
PRIMARY KEY (task_id, user_id)
) ENGINE=InnoDB COMMENT='任务与用户关联表';

View File

@ -0,0 +1,5 @@
-- ----------------------------
-- 添加任务计划执行时长字段
-- ----------------------------
ALTER TABLE task_plan
ADD COLUMN duration INT(11) DEFAULT NULL COMMENT '执行时长(秒)' AFTER execute_time;

View File

@ -0,0 +1,6 @@
-- ----------------------------
-- 添加任务实际执行时间和实际结束时间字段
-- ----------------------------
ALTER TABLE task_info
ADD COLUMN actual_start_time DATETIME DEFAULT NULL COMMENT '实际开始时间' AFTER start_time,
ADD COLUMN actual_end_time DATETIME DEFAULT NULL COMMENT '实际结束时间' AFTER end_time;

View File

@ -0,0 +1,5 @@
-- 添加 route_url 字段到 task_info 表
ALTER TABLE task_info ADD COLUMN route_url VARCHAR(255) COMMENT '航线文件URL';
-- 添加 route_url 字段到 task_plan 表
ALTER TABLE task_plan ADD COLUMN route_url VARCHAR(255) COMMENT '航线文件URL';

View File

@ -0,0 +1,5 @@
-- 修改 task_plan 表的 uav_id 字段类型为 VARCHAR(255)
ALTER TABLE task_plan MODIFY COLUMN uav_id VARCHAR(255) COMMENT '无人机ID';
-- 修改 task_info 表的 uav_id 字段类型为 VARCHAR(255)
ALTER TABLE task_info MODIFY COLUMN uav_id VARCHAR(255) COMMENT '无人机ID';

View File

@ -0,0 +1,8 @@
-- 修改 task_plan 表的 status 字段类型为 VARCHAR(20)
ALTER TABLE task_plan MODIFY COLUMN status VARCHAR(20) COMMENT '计划状态';
-- 修改 task_info 表的 status 字段类型为 VARCHAR(20)
ALTER TABLE task_info MODIFY COLUMN status VARCHAR(20) COMMENT '任务状态';
-- 修改 task_stat 表的 task_status 字段类型为 VARCHAR(20)
ALTER TABLE task_stat MODIFY COLUMN task_status VARCHAR(20) COMMENT '任务状态';

View File

@ -0,0 +1,2 @@
-- 为任务表添加 recovery 字段
ALTER TABLE task_info ADD COLUMN recovery BOOLEAN DEFAULT FALSE COMMENT '错误是否恢复';

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.task.mapper.TaskInfoMapper">
<resultMap type="com.ruoyi.task.mapper.entity.TaskInfoEntity" id="TaskInfoResult">
<result property="id" column="id" />
<result property="taskName" column="task_name" />
<result property="taskCategory" column="task_category" />
<result property="taskType" column="task_type" />
<result property="planId" column="plan_id" />
<result property="routeId" column="route_id" />
<result property="uavId" column="uav_id" />
<result property="executeType" column="execute_type" />
<result property="status" column="status" />
<result property="startTime" column="start_time" />
<result property="endTime" column="end_time" />
<result property="actualStartTime" column="actual_start_time" />
<result property="actualEndTime" column="actual_end_time" />
<result property="description" column="description" />
<result property="routeUrl" column="route_url" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectTaskInfoVo">
select id, task_name, task_category, task_type, plan_id, route_id,
uav_id, execute_type, status, start_time, end_time, actual_start_time, actual_end_time, description, route_url,
create_by, create_time, update_by, update_time, remark
from task_info
</sql>
<select id="selectTaskInfoById" parameterType="Long" resultMap="TaskInfoResult">
<include refid="selectTaskInfoVo"/>
where id = #{id}
</select>
<select id="selectTaskInfoList" parameterType="com.ruoyi.task.mapper.entity.TaskInfoEntity" resultMap="TaskInfoResult">
<include refid="selectTaskInfoVo"/>
<where>
<if test="taskName != null and taskName != ''">
and task_name like concat('%', #{taskName}, '%')
</if>
<if test="taskCategory != null and taskCategory != ''">
and task_category = #{taskCategory}
</if>
<if test="taskType != null and taskType != ''">
and task_type = #{taskType}
</if>
<if test="planId != null">
and plan_id = #{planId}
</if>
<if test="routeId != null">
and route_id = #{routeId}
</if>
<if test="uavId != null">
and uav_id = #{uavId}
</if>
<if test="executeType != null and executeType != ''">
and execute_type = #{executeType}
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
</where>
</select>
<insert id="insertTaskInfo" parameterType="com.ruoyi.task.mapper.entity.TaskInfoEntity" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into task_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="taskName != null and taskName != ''">task_name,</if>
<if test="taskCategory != null and taskCategory != ''">task_category,</if>
<if test="taskType != null and taskType != ''">task_type,</if>
<if test="planId != null">plan_id,</if>
<if test="routeId != null">route_id,</if>
<if test="uavId != null">uav_id,</if>
<if test="executeType != null and executeType != ''">execute_type,</if>
<if test="status != null and status != ''">status,</if>
<if test="startTime != null">start_time,</if>
<if test="endTime != null">end_time,</if>
<if test="actualStartTime != null">actual_start_time,</if>
<if test="actualEndTime != null">actual_end_time,</if>
<if test="description != null and description != ''">description,</if>
<if test="routeUrl != null and routeUrl != ''">route_url,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="remark != null and remark != ''">remark,</if>
create_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="taskName != null and taskName != ''">#{taskName},</if>
<if test="taskCategory != null and taskCategory != ''">#{taskCategory},</if>
<if test="taskType != null and taskType != ''">#{taskType},</if>
<if test="planId != null">#{planId},</if>
<if test="routeId != null">#{routeId},</if>
<if test="uavId != null">#{uavId},</if>
<if test="executeType != null and executeType != ''">#{executeType},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="startTime != null">#{startTime},</if>
<if test="endTime != null">#{endTime},</if>
<if test="actualStartTime != null">#{actualStartTime},</if>
<if test="actualEndTime != null">#{actualEndTime},</if>
<if test="description != null and description != ''">#{description},</if>
<if test="routeUrl != null and routeUrl != ''">#{routeUrl},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="remark != null and remark != ''">#{remark},</if>
now()
</trim>
</insert>
<update id="updateTaskInfo" parameterType="com.ruoyi.task.mapper.entity.TaskInfoEntity">
update task_info
<trim prefix="SET" suffixOverrides=",">
<if test="taskName != null and taskName != ''">task_name = #{taskName},</if>
<if test="taskCategory != null and taskCategory != ''">task_category = #{taskCategory},</if>
<if test="taskType != null and taskType != ''">task_type = #{taskType},</if>
<if test="planId != null">plan_id = #{planId},</if>
<if test="routeId != null">route_id = #{routeId},</if>
<if test="uavId != null">uav_id = #{uavId},</if>
<if test="executeType != null and executeType != ''">execute_type = #{executeType},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="startTime != null">start_time = #{startTime},</if>
<if test="endTime != null">end_time = #{endTime},</if>
<if test="actualStartTime != null">actual_start_time = #{actualStartTime},</if>
<if test="actualEndTime != null">actual_end_time = #{actualEndTime},</if>
<if test="description != null and description != ''">description = #{description},</if>
<if test="routeUrl != null and routeUrl != ''">route_url = #{routeUrl},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="remark != null">remark = #{remark},</if>
update_time = now()
</trim>
where id = #{id}
</update>
<delete id="deleteTaskInfoById" parameterType="Long">
delete from task_info where id = #{id}
</delete>
<delete id="deleteTaskInfoByIds" parameterType="Long">
delete from task_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="selectCurrentTaskByUavId" parameterType="String" resultMap="TaskInfoResult">
<include refid="selectTaskInfoVo"/>
where uav_id = #{uavId}
and actual_start_time is not null
order by abs(timestampdiff(second, actual_start_time, now()))
limit 1
</select>
</mapper>

View File

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.task.mapper.TaskPlanMapper">
<resultMap type="com.ruoyi.task.mapper.entity.TaskPlanEntity" id="TaskPlanResult">
<result property="id" column="id" />
<result property="planName" column="plan_name" />
<result property="planType" column="plan_type" />
<result property="cycleType" column="cycle_type" />
<result property="cycleValue" column="cycle_value" />
<result property="executeType" column="execute_type" />
<result property="executeTime" column="execute_time" />
<result property="duration" column="duration" />
<result property="startDate" column="start_date" />
<result property="endDate" column="end_date" />
<result property="routeId" column="route_id" />
<result property="uavId" column="uav_id" />
<result property="status" column="status" />
<result property="description" column="description" />
<result property="routeUrl" column="route_url" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectTaskPlanVo">
select id, plan_name, plan_type, cycle_type, cycle_value, execute_type,
execute_time, duration, start_date, end_date, route_id, uav_id, status,
description, route_url, create_by, create_time, update_by, update_time, remark
from task_plan
</sql>
<select id="selectTaskPlanById" parameterType="Long" resultMap="TaskPlanResult">
<include refid="selectTaskPlanVo"/>
where id = #{id}
</select>
<select id="selectTaskPlanList" parameterType="com.ruoyi.task.mapper.entity.TaskPlanEntity" resultMap="TaskPlanResult">
<include refid="selectTaskPlanVo"/>
<where>
<if test="planName != null and planName != ''">
and plan_name like concat('%', #{planName}, '%')
</if>
<if test="planType != null and planType != ''">
and plan_type = #{planType}
</if>
<if test="cycleType != null and cycleType != ''">
and cycle_type = #{cycleType}
</if>
<if test="executeType != null and executeType != ''">
and execute_type = #{executeType}
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="routeId != null">
and route_id = #{routeId}
</if>
<if test="uavId != null">
and uav_id = #{uavId}
</if>
</where>
</select>
<insert id="insertTaskPlan" parameterType="com.ruoyi.task.mapper.entity.TaskPlanEntity" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into task_plan
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="planName != null and planName != ''">plan_name,</if>
<if test="planType != null and planType != ''">plan_type,</if>
<if test="cycleType != null and cycleType != ''">cycle_type,</if>
<if test="cycleValue != null and cycleValue != ''">cycle_value,</if>
<if test="executeType != null and executeType != ''">execute_type,</if>
<if test="executeTime != null">execute_time,</if>
<if test="duration != null">duration,</if>
<if test="startDate != null">start_date,</if>
<if test="endDate != null">end_date,</if>
<if test="routeId != null">route_id,</if>
<if test="uavId != null">uav_id,</if>
<if test="status != null and status != ''">status,</if>
<if test="description != null and description != ''">description,</if>
<if test="routeUrl != null and routeUrl != ''">route_url,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="remark != null and remark != ''">remark,</if>
create_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="planName != null and planName != ''">#{planName},</if>
<if test="planType != null and planType != ''">#{planType},</if>
<if test="cycleType != null and cycleType != ''">#{cycleType},</if>
<if test="cycleValue != null and cycleValue != ''">#{cycleValue},</if>
<if test="executeType != null and executeType != ''">#{executeType},</if>
<if test="executeTime != null">#{executeTime},</if>
<if test="duration != null">#{duration},</if>
<if test="startDate != null">#{startDate},</if>
<if test="endDate != null">#{endDate},</if>
<if test="routeId != null">#{routeId},</if>
<if test="uavId != null">#{uavId},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="description != null and description != ''">#{description},</if>
<if test="routeUrl != null and routeUrl != ''">#{routeUrl},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="remark != null and remark != ''">#{remark},</if>
now()
</trim>
</insert>
<update id="updateTaskPlan" parameterType="com.ruoyi.task.mapper.entity.TaskPlanEntity">
update task_plan
<trim prefix="SET" suffixOverrides=",">
<if test="planName != null and planName != ''">plan_name = #{planName},</if>
<if test="planType != null and planType != ''">plan_type = #{planType},</if>
<if test="cycleType != null and cycleType != ''">cycle_type = #{cycleType},</if>
<if test="cycleValue != null and cycleValue != ''">cycle_value = #{cycleValue},</if>
<if test="executeType != null and executeType != ''">execute_type = #{executeType},</if>
<if test="executeTime != null">execute_time = #{executeTime},</if>
<if test="duration != null">duration = #{duration},</if>
<if test="startDate != null">start_date = #{startDate},</if>
<if test="endDate != null">end_date = #{endDate},</if>
<if test="routeId != null">route_id = #{routeId},</if>
<if test="uavId != null">uav_id = #{uavId},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="description != null and description != ''">description = #{description},</if>
<if test="routeUrl != null and routeUrl != ''">route_url = #{routeUrl},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="remark != null">remark = #{remark},</if>
update_time = now()
</trim>
where id = #{id}
</update>
<delete id="deleteTaskPlanById" parameterType="Long">
delete from task_plan where id = #{id}
</delete>
<delete id="deleteTaskPlanByIds" parameterType="Long">
delete from task_plan where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,320 @@
{
"info": {
"_postman_id": "task-api-collection",
"name": "任务管理API",
"description": "任务管理相关接口的Postman集合",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "任务计划管理",
"item": [
{
"name": "创建定时任务计划",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"planName\": \"定时任务计划测试\",\n \"planType\": \"TIMED\",\n \"executeType\": \"SINGLE\",\n \"executeTime\": \"2026-03-10T10:00:00\",\n \"duration\": 3600,\n \"routeId\": 1,\n \"uavId\": \"UAV001\",\n \"description\": \"测试定时任务计划\",\n \"routeUrl\": \"http://example.com/route.json\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task/plan/timed",
"host": ["{{baseUrl}}"],
"path": ["task", "plan", "timed"]
}
},
"response": []
},
{
"name": "创建周期任务计划",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"planName\": \"周期任务计划测试\",\n \"planType\": \"CYCLE\",\n \"executeType\": \"SINGLE\",\n \"cycleType\": \"DAILY\",\n \"cycleValue\": \"1,3,5\",\n \"startDate\": \"2026-03-10\",\n \"endDate\": \"2026-03-31\",\n \"executeTime\": \"10:00:00\",\n \"duration\": 3600,\n \"routeId\": 1,\n \"uavId\": \"UAV001\",\n \"description\": \"测试周期任务计划\",\n \"routeUrl\": \"http://example.com/route.json\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task/plan/cycle",
"host": ["{{baseUrl}}"],
"path": ["task", "plan", "cycle"]
}
},
"response": []
},
{
"name": "获取任务计划详细信息",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/plan/{planId}",
"host": ["{{baseUrl}}"],
"path": ["task", "plan", "{planId}"],
"variable": [
{
"key": "planId",
"value": "1"
}
]
}
},
"response": []
},
{
"name": "复杂条件查询任务计划列表",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"routeId\": 1,\n \"uavId\": \"UAV001\",\n \"planType\": \"TIMED\",\n \"startDateStart\": \"2026-03-01\",\n \"startDateEnd\": \"2026-03-31\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task/plan/list",
"host": ["{{baseUrl}}"],
"path": ["task", "plan", "list"]
}
},
"response": []
},
{
"name": "更新任务计划",
"request": {
"method": "PUT",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"id\": 1,\n \"planName\": \"更新后的任务计划\",\n \"executeTime\": \"2026-03-10T11:00:00\",\n \"duration\": 7200\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task/plan",
"host": ["{{baseUrl}}"],
"path": ["task", "plan"]
}
},
"response": []
},
{
"name": "删除任务计划",
"request": {
"method": "DELETE",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/plan/{planId}",
"host": ["{{baseUrl}}"],
"path": ["task", "plan", "{planId}"],
"variable": [
{
"key": "planId",
"value": "1"
}
]
}
},
"response": []
}
]
},
{
"name": "任务管理",
"item": [
{
"name": "创建无关联计划的任务",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"taskName\": \"测试任务\",\n \"taskCategory\": \"MANUAL\",\n \"taskType\": \"ONE_CLICK_TAKEOFF\",\n \"executeType\": \"SINGLE\",\n \"routeId\": 1,\n \"uavId\": \"UAV001\",\n \"startTime\": \"2026-03-10T10:00:00\",\n \"endTime\": \"2026-03-10T11:00:00\",\n \"description\": \"测试任务\",\n \"routeUrl\": \"http://example.com/route.json\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task",
"host": ["{{baseUrl}}"],
"path": ["task"]
}
},
"response": []
},
{
"name": "获取任务详细信息",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/{taskId}",
"host": ["{{baseUrl}}"],
"path": ["task", "{taskId}"],
"variable": [
{
"key": "taskId",
"value": "1"
}
]
}
},
"response": []
},
{
"name": "复杂条件查询任务列表",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"routeId\": 1,\n \"uavId\": \"UAV001\",\n \"status\": \"PENDING\",\n \"startTimeStart\": \"2026-03-01\",\n \"startTimeEnd\": \"2026-03-31\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task/list",
"host": ["{{baseUrl}}"],
"path": ["task", "list"]
}
},
"response": []
},
{
"name": "更新任务",
"request": {
"method": "PUT",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"id\": 1,\n \"taskName\": \"更新后的测试任务\",\n \"startTime\": \"2026-03-10T10:30:00\",\n \"endTime\": \"2026-03-10T11:30:00\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseUrl}}/task",
"host": ["{{baseUrl}}"],
"path": ["task"]
}
},
"response": []
},
{
"name": "删除任务",
"request": {
"method": "DELETE",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/{taskId}",
"host": ["{{baseUrl}}"],
"path": ["task", "{taskId}"],
"variable": [
{
"key": "taskId",
"value": "1"
}
]
}
},
"response": []
},
{
"name": "根据无人机ID查询任务列表",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/uav/{uavId}",
"host": ["{{baseUrl}}"],
"path": ["task", "uav", "{uavId}"],
"variable": [
{
"key": "uavId",
"value": "UAV001"
}
]
}
},
"response": []
},
{
"name": "根据无人机ID获取最新的一条任务",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/uav/current/{uavId}",
"host": ["{{baseUrl}}"],
"path": ["task", "uav", "current", "{uavId}"],
"variable": [
{
"key": "uavId",
"value": "UAV001"
}
]
}
},
"response": []
},
{
"name": "修改执行状态",
"request": {
"method": "PUT",
"header": [],
"url": {
"raw": "{{baseUrl}}/task/status/{taskId}?status=RUNNING",
"host": ["{{baseUrl}}"],
"path": ["task", "status", "{taskId}"],
"query": [
{
"key": "status",
"value": "RUNNING"
}
],
"variable": [
{
"key": "taskId",
"value": "1"
}
]
}
},
"response": []
}
]
}
],
"variable": [
{
"key": "baseUrl",
"value": "http://localhost:9215",
"type": "string"
}
]
}