11 changed files with 402 additions and 0 deletions
-
76src/main/java/com/iflytop/gd/app/controller/TasksController.java
-
15src/main/java/com/iflytop/gd/app/mapper/TaskStepsMapper.java
-
23src/main/java/com/iflytop/gd/app/mapper/TasksMapper.java
-
10src/main/java/com/iflytop/gd/app/model/dto/StopTaskDTO.java
-
10src/main/java/com/iflytop/gd/app/model/dto/TaskDTO.java
-
30src/main/java/com/iflytop/gd/app/model/entity/TaskSteps.java
-
35src/main/java/com/iflytop/gd/app/model/entity/Tasks.java
-
35src/main/java/com/iflytop/gd/app/model/vo/TaskListVO.java
-
26src/main/java/com/iflytop/gd/app/service/TaskStepsService.java
-
119src/main/java/com/iflytop/gd/app/service/TasksService.java
-
23src/main/resources/sql/init.sql
@ -0,0 +1,76 @@ |
|||||
|
package com.iflytop.gd.app.controller; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
|
import com.iflytop.gd.app.model.dto.StopTaskDTO; |
||||
|
import com.iflytop.gd.app.model.dto.TaskDTO; |
||||
|
import com.iflytop.gd.app.model.entity.Tasks; |
||||
|
import com.iflytop.gd.app.model.vo.TaskListVO; |
||||
|
import com.iflytop.gd.app.service.TasksService; |
||||
|
import com.iflytop.gd.common.base.BasePageQuery; |
||||
|
import com.iflytop.gd.common.result.PageResult; |
||||
|
import com.iflytop.gd.common.result.Result; |
||||
|
import io.swagger.v3.oas.annotations.Operation; |
||||
|
import io.swagger.v3.oas.annotations.Parameter; |
||||
|
import io.swagger.v3.oas.annotations.tags.Tag; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
@Tag(name = "实验") |
||||
|
@RestController |
||||
|
@RequestMapping("/api/tasks") |
||||
|
@RequiredArgsConstructor |
||||
|
@Slf4j |
||||
|
public class TasksController { |
||||
|
private final TasksService tasksService; |
||||
|
|
||||
|
@Operation(summary = "实验列表") |
||||
|
@GetMapping("/list") |
||||
|
public PageResult<TaskListVO> getAllTasks(BasePageQuery pageQuery) { |
||||
|
IPage<TaskListVO> result = tasksService.getPage(pageQuery); |
||||
|
return PageResult.success(result); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "实验详情") |
||||
|
@GetMapping("/{id}") |
||||
|
public Result<TaskListVO> detail(@PathVariable Long id) { |
||||
|
return Result.success(tasksService.selectById(id)); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "获取正在进行的实验") |
||||
|
@GetMapping("/getIngTask") |
||||
|
public Result<Tasks> getIngTask() { |
||||
|
return Result.success(tasksService.getIngTask()); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "添加新实验") |
||||
|
@PostMapping("/") |
||||
|
public Result<Tasks> addTask(@RequestBody TaskDTO dto) { |
||||
|
if (tasksService.getIngTask() != null) { |
||||
|
return Result.failed("存在正在运行的实验,请先停止"); |
||||
|
} |
||||
|
return Result.success(tasksService.addTask(dto.getName())); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "更新实验") |
||||
|
@PutMapping("/") |
||||
|
public Result<Boolean> updateTask(@RequestBody Tasks task) { |
||||
|
|
||||
|
return Result.success(tasksService.updateById(task)); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "删除实验") |
||||
|
@DeleteMapping("/{ids}") |
||||
|
public Result<Integer> deleteTask(@Parameter(description = "实验ID,多个以英文逗号(,)分割") @PathVariable String ids) { |
||||
|
return Result.success(tasksService.removeByIds(ids)); |
||||
|
} |
||||
|
|
||||
|
@Operation(summary = "停止实验") |
||||
|
@PostMapping("/stop") |
||||
|
public Result<Integer> stopTask(@RequestBody StopTaskDTO dto) { |
||||
|
if(dto.getTaskId() != null) { |
||||
|
return Result.success(tasksService.stopTask(dto.getTaskId())); |
||||
|
} |
||||
|
return Result.failed("停止实验失败"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
package com.iflytop.gd.app.mapper; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
import com.iflytop.gd.app.model.entity.TaskSteps; |
||||
|
import org.apache.ibatis.annotations.Mapper; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 实验持久层接口 |
||||
|
*/ |
||||
|
@Mapper |
||||
|
public interface TaskStepsMapper extends BaseMapper<TaskSteps> { |
||||
|
List<TaskSteps> getTaskStepsByTaskId(Long taskId); |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package com.iflytop.gd.app.mapper; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||
|
import com.iflytop.gd.app.model.entity.Tasks; |
||||
|
import com.iflytop.gd.app.model.vo.TaskListVO; |
||||
|
import org.apache.ibatis.annotations.Mapper; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 实验持久层接口 |
||||
|
*/ |
||||
|
@Mapper |
||||
|
public interface TasksMapper extends BaseMapper<Tasks> { |
||||
|
Page<TaskListVO> selectPage(Page<TaskListVO> page); |
||||
|
|
||||
|
TaskListVO selectById(Long id); |
||||
|
|
||||
|
Integer removeByIds(List<Long> ids); |
||||
|
|
||||
|
int stopTask(Long taskId); |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
package com.iflytop.gd.app.model.dto; |
||||
|
|
||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
@Data |
||||
|
public class StopTaskDTO { |
||||
|
@Schema(description = "实验id") |
||||
|
private Long taskId; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
package com.iflytop.gd.app.model.dto; |
||||
|
|
||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
@Data |
||||
|
public class TaskDTO { |
||||
|
@Schema(description = "实验名称") |
||||
|
private String name; |
||||
|
} |
@ -0,0 +1,30 @@ |
|||||
|
package com.iflytop.gd.app.model.entity; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||
|
import jakarta.validation.constraints.NotBlank; |
||||
|
import lombok.Data; |
||||
|
import lombok.EqualsAndHashCode; |
||||
|
|
||||
|
@EqualsAndHashCode(callSuper = false) |
||||
|
@Schema(description = "实验步骤") |
||||
|
@TableName("task_steps") |
||||
|
@Data |
||||
|
public class TaskSteps { |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "id") |
||||
|
private Long id; |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "实验id") |
||||
|
private Long taskId; |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "步骤描述") |
||||
|
private String stepDescription; |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "创建时间") |
||||
|
private String createTime; |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
package com.iflytop.gd.app.model.entity; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||
|
import com.iflytop.gd.common.base.BaseEntity; |
||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||
|
import jakarta.validation.constraints.NotBlank; |
||||
|
import lombok.Data; |
||||
|
import lombok.EqualsAndHashCode; |
||||
|
|
||||
|
@EqualsAndHashCode(callSuper = true) |
||||
|
@Schema(description = "实验") |
||||
|
@TableName("tasks") |
||||
|
@Data |
||||
|
public class Tasks extends BaseEntity { |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "实验名称") |
||||
|
private String name; |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "开始时间") |
||||
|
private String startTime; |
||||
|
|
||||
|
@Schema(description = "创建人") |
||||
|
private Long createUser; |
||||
|
|
||||
|
@Schema(description = "结束时间") |
||||
|
private String endTime; |
||||
|
|
||||
|
@Schema(description = "状态 1 执行中 2 执行完毕") |
||||
|
private Integer status; |
||||
|
|
||||
|
@Schema(description = "是否删除 0 未删除 1 已删除") |
||||
|
private Integer isDeleted; |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
package com.iflytop.gd.app.model.vo; |
||||
|
|
||||
|
import com.iflytop.gd.app.model.entity.TaskSteps; |
||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||
|
import jakarta.validation.constraints.NotBlank; |
||||
|
import lombok.Data; |
||||
|
import lombok.EqualsAndHashCode; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
@EqualsAndHashCode(callSuper = false) |
||||
|
@Data |
||||
|
public class TaskListVO { |
||||
|
@Schema(description = "实验id") |
||||
|
private Long id; |
||||
|
|
||||
|
@Schema(description = "实验名称") |
||||
|
private String name; |
||||
|
|
||||
|
@NotBlank |
||||
|
@Schema(description = "开始时间") |
||||
|
private String startTime; |
||||
|
|
||||
|
@Schema(description = "创建人") |
||||
|
private Long createUser; |
||||
|
|
||||
|
@Schema(description = "结束时间") |
||||
|
private String endTime; |
||||
|
|
||||
|
@Schema(description = "状态 1 执行中 2 执行完毕") |
||||
|
private Integer status; |
||||
|
|
||||
|
@Schema(description = "实验步骤") |
||||
|
private List<TaskSteps> steps; |
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
package com.iflytop.gd.app.service; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
|
import com.iflytop.gd.app.mapper.TaskStepsMapper; |
||||
|
import com.iflytop.gd.app.model.entity.TaskSteps; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 实验业务实现类 |
||||
|
*/ |
||||
|
@Service |
||||
|
@RequiredArgsConstructor |
||||
|
public class TaskStepsService extends ServiceImpl<TaskStepsMapper, TaskSteps>{ |
||||
|
private final TaskStepsMapper taskStepsMapper; |
||||
|
|
||||
|
public List<TaskSteps> getTaskStepsByTaskId(Long taskId) { |
||||
|
return taskStepsMapper.getTaskStepsByTaskId(taskId); |
||||
|
} |
||||
|
|
||||
|
public int addTaskSteps(TaskSteps taskSteps) { |
||||
|
return this.baseMapper.insert(taskSteps); |
||||
|
} |
||||
|
} |
@ -0,0 +1,119 @@ |
|||||
|
package com.iflytop.gd.app.service; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
|
import com.iflytop.gd.app.mapper.TaskStepsMapper; |
||||
|
import com.iflytop.gd.app.mapper.TasksMapper; |
||||
|
import com.iflytop.gd.app.model.entity.TaskSteps; |
||||
|
import com.iflytop.gd.app.model.entity.Tasks; |
||||
|
import com.iflytop.gd.app.model.entity.User; |
||||
|
import com.iflytop.gd.app.model.vo.TaskListVO; |
||||
|
import com.iflytop.gd.common.base.BasePageQuery; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
/** |
||||
|
* 实验业务实现类 |
||||
|
*/ |
||||
|
@Service |
||||
|
@RequiredArgsConstructor |
||||
|
public class TasksService extends ServiceImpl<TasksMapper, Tasks>{ |
||||
|
|
||||
|
private final TasksMapper tasksMapper; |
||||
|
private final UserService userService; |
||||
|
private final TaskStepsMapper taskStepsMapper; |
||||
|
private final TaskStepsService taskStepsService; |
||||
|
|
||||
|
public IPage<TaskListVO> getPage(BasePageQuery pageQuery) { |
||||
|
// 构建分页对象 |
||||
|
Page<TaskListVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); |
||||
|
|
||||
|
|
||||
|
IPage<TaskListVO> tasksIPage = tasksMapper.selectPage(page); |
||||
|
|
||||
|
|
||||
|
List<Long> taskIds = tasksIPage.getRecords().stream() |
||||
|
.map(TaskListVO::getId) |
||||
|
.toList(); |
||||
|
|
||||
|
QueryWrapper<TaskSteps> queryWrapper = new QueryWrapper<>(); |
||||
|
queryWrapper.in("task_id", taskIds); |
||||
|
List<TaskSteps> list = taskStepsMapper.selectList(queryWrapper); |
||||
|
|
||||
|
|
||||
|
Map<Long, List<TaskSteps>> map = list.stream() |
||||
|
.collect(Collectors.groupingBy(TaskSteps::getTaskId)); |
||||
|
|
||||
|
|
||||
|
List<TaskListVO> taskList = tasksIPage.getRecords().stream().map(task -> { |
||||
|
TaskListVO taskListVO = new TaskListVO(); |
||||
|
taskListVO.setId(task.getId()); |
||||
|
taskListVO.setName(task.getName()); |
||||
|
taskListVO.setStatus(task.getStatus()); |
||||
|
taskListVO.setStartTime(task.getStartTime()); |
||||
|
taskListVO.setEndTime(task.getEndTime()); |
||||
|
taskListVO.setCreateUser(task.getCreateUser()); |
||||
|
|
||||
|
List<TaskSteps> steps = map.get(task.getId()); |
||||
|
taskListVO.setSteps(steps); |
||||
|
|
||||
|
return taskListVO; |
||||
|
}).collect(Collectors.toList()); |
||||
|
|
||||
|
|
||||
|
Page<TaskListVO> resultPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); |
||||
|
resultPage.setTotal(tasksIPage.getTotal()); |
||||
|
resultPage.setRecords(taskList); |
||||
|
|
||||
|
return resultPage; |
||||
|
} |
||||
|
|
||||
|
public TaskListVO selectById(Long id) { |
||||
|
TaskListVO taskListVO = tasksMapper.selectById(id); |
||||
|
List<TaskSteps> taskSteps = taskStepsMapper.selectList(new QueryWrapper<TaskSteps>().eq("task_id", id)); |
||||
|
taskListVO.setSteps(taskSteps); |
||||
|
return taskListVO; |
||||
|
} |
||||
|
|
||||
|
public Tasks addTask(String taskName) { |
||||
|
Tasks tasks = new Tasks(); |
||||
|
tasks.setName(taskName); |
||||
|
User user = userService.getCurrentUser(); |
||||
|
tasks.setCreateUser(user.getId()); |
||||
|
tasks.setStatus(1); |
||||
|
tasks.setIsDeleted(0); |
||||
|
tasksMapper.insert(tasks); |
||||
|
TaskSteps taskSteps = new TaskSteps(); |
||||
|
taskSteps.setTaskId(tasks.getId()); |
||||
|
taskSteps.setStepDescription("开始实验"); |
||||
|
taskStepsService.addTaskSteps(taskSteps); |
||||
|
return tasks; |
||||
|
} |
||||
|
|
||||
|
public Tasks getIngTask() { |
||||
|
return tasksMapper.selectOne(new QueryWrapper<Tasks>().eq("status", 1)); |
||||
|
} |
||||
|
|
||||
|
public int removeByIds(String ids) { |
||||
|
List<Long> idsArr = Arrays.stream(ids.split(",")) |
||||
|
.map(Long::parseLong) |
||||
|
.collect(Collectors.toList()); |
||||
|
return tasksMapper.removeByIds(idsArr); |
||||
|
} |
||||
|
|
||||
|
public int stopTask(Long taskId) { |
||||
|
TaskSteps taskSteps = new TaskSteps(); |
||||
|
taskSteps.setTaskId(taskId); |
||||
|
taskSteps.setStepDescription("结束实验"); |
||||
|
taskStepsService.addTaskSteps(taskSteps); |
||||
|
return tasksMapper.stopTask(taskId); |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue