From 0774662b4faad00239752bf5499022b98cfa4ea2 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Wed, 8 May 2024 12:10:57 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/generator/CodeGenerators.java | 10 ++ .../controller/ExecCommandLogController.java | 1 - .../controller/ExecJobLogController.java | 1 - .../controller/UploadTaskController.java | 37 +++++- .../asset/convert/UploadTaskFileConvert.java | 26 ++++ .../module/asset/dao/UploadTaskFileDAO.java | 17 +++ .../operator/HostConnectLogOperatorType.java | 3 +- .../operator/UploadTaskOperatorType.java | 13 +- .../asset/entity/domain/UploadTaskFileDO.java | 67 ++++++++++ .../request/upload/UploadTaskFileRequest.java | 9 +- .../upload/UploadTaskQueryRequest.java | 6 +- .../request/upload/UploadTaskRequest.java | 32 +++++ .../asset/entity/vo/UploadTaskFileVO.java | 55 ++++++++ .../module/asset/entity/vo/UploadTaskVO.java | 4 + .../asset/enums/UploadTaskFileStatusEnum.java | 46 +++++++ .../strategy/HostSshConfigStrategy.java | 2 +- .../terminal/handler/SftpListHandler.java | 1 - .../asset/service/UploadTaskFileService.java | 40 ++++++ .../asset/service/UploadTaskService.java | 44 +++++++ .../impl/UploadTaskFileServiceImpl.java | 59 +++++++++ .../service/impl/UploadTaskServiceImpl.java | 123 +++++++++++++++--- .../resources/mapper/UploadTaskFileMapper.xml | 28 ++++ 22 files changed, 591 insertions(+), 33 deletions(-) create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/UploadTaskFileConvert.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/UploadTaskFileDAO.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/UploadTaskFileDO.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskRequest.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskFileVO.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/UploadTaskFileStatusEnum.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskFileService.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskFileServiceImpl.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java index 6f0ca946..7a6eeac4 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java @@ -59,6 +59,16 @@ public class CodeGenerators { .labels("准备中", "上传中", "已完成", "已取消") .valueUseFields() .build(), + Template.create("upload_task_file", "上传任务文件", "upload") + .disableUnitTest() + .vue("exec", "batch-upload-file") + .enableRowSelection() + .dict("uploadTaskFileStatus", "status") + .comment("上传任务文件状态") + .fields("WAITING", "UPLOADING", "FINISHED", "CANCELED") + .labels("等待中", "上传中", "已完成", "已取消") + .valueUseFields() + .build(), }; // jdbc 配置 - 使用配置文件 File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml"); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java index 925b5162..1b82830e 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java @@ -10,7 +10,6 @@ import com.orion.ops.framework.log.core.enums.IgnoreLogMode; import com.orion.ops.framework.security.core.utils.SecurityUtils; import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.module.asset.define.operator.ExecCommandLogOperatorType; -import com.orion.ops.module.asset.define.operator.ExecCommandOperatorType; import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogTailRequest; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java index f2d14c63..23289c1c 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java @@ -8,7 +8,6 @@ import com.orion.ops.framework.common.validator.group.Page; import com.orion.ops.framework.log.core.annotation.IgnoreLog; import com.orion.ops.framework.log.core.enums.IgnoreLogMode; import com.orion.ops.framework.web.core.annotation.RestWrapper; -import com.orion.ops.module.asset.define.operator.ExecCommandLogOperatorType; import com.orion.ops.module.asset.define.operator.ExecJobLogOperatorType; import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/UploadTaskController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/UploadTaskController.java index 78d87d2d..3dd10a5f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/UploadTaskController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/UploadTaskController.java @@ -1,6 +1,7 @@ package com.orion.ops.module.asset.controller; import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.define.wrapper.HttpWrapper; import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog; import com.orion.ops.framework.common.validator.group.Page; import com.orion.ops.framework.log.core.annotation.IgnoreLog; @@ -9,6 +10,7 @@ import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.module.asset.define.operator.UploadTaskOperatorType; import com.orion.ops.module.asset.entity.request.upload.UploadTaskCreateRequest; import com.orion.ops.module.asset.entity.request.upload.UploadTaskQueryRequest; +import com.orion.ops.module.asset.entity.request.upload.UploadTaskRequest; import com.orion.ops.module.asset.entity.vo.UploadTaskCreateVO; import com.orion.ops.module.asset.entity.vo.UploadTaskVO; import com.orion.ops.module.asset.service.UploadTaskService; @@ -43,9 +45,6 @@ public class UploadTaskController { private UploadTaskService uploadTaskService; // TODO 字典颜色 菜单 操作日志 - // TODO start - // TODO cancel - // todo CLEAR @OperatorLog(UploadTaskOperatorType.UPLOAD) @PostMapping("/create") @@ -55,6 +54,23 @@ public class UploadTaskController { return uploadTaskService.createUploadTask(request); } + @PostMapping("/start") + @Operation(summary = "开始上传") + @PreAuthorize("@ss.hasPermission('asset:upload-task:upload')") + public HttpWrapper startUploadTask(@Validated @RequestBody UploadTaskRequest request) { + uploadTaskService.startUploadTask(request.getId()); + return HttpWrapper.ok(); + } + + @OperatorLog(UploadTaskOperatorType.CANCEL) + @PostMapping("/cancel") + @Operation(summary = "取消上传") + @PreAuthorize("@ss.hasPermission('asset:upload-task:upload')") + public HttpWrapper cancelUploadTask(@Validated @RequestBody UploadTaskRequest request) { + uploadTaskService.cancelUploadTask(request.getId()); + return HttpWrapper.ok(); + } + @IgnoreLog(IgnoreLogMode.RET) @GetMapping("/get") @Operation(summary = "查询上传任务") @@ -90,5 +106,20 @@ public class UploadTaskController { return uploadTaskService.deleteUploadTaskByIdList(idList); } + @PostMapping("/query-count") + @Operation(summary = "查询主机连接日志数量") + @PreAuthorize("@ss.hasPermission('asset:upload-task:management:clear')") + public Long getUploadTaskCount(@RequestBody UploadTaskQueryRequest request) { + return uploadTaskService.getUploadTaskCount(request); + } + + @OperatorLog(UploadTaskOperatorType.CLEAR) + @PostMapping("/clear") + @Operation(summary = "清空主机连接日志") + @PreAuthorize("@ss.hasPermission('asset:upload-task:management:clear')") + public Integer clearUploadTask(@RequestBody UploadTaskQueryRequest request) { + return uploadTaskService.clearUploadTask(request); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/UploadTaskFileConvert.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/UploadTaskFileConvert.java new file mode 100644 index 00000000..351d11c2 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/UploadTaskFileConvert.java @@ -0,0 +1,26 @@ +package com.orion.ops.module.asset.convert; + +import com.orion.ops.module.asset.entity.domain.UploadTaskFileDO; +import com.orion.ops.module.asset.entity.vo.UploadTaskFileVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 上传任务文件 内部对象转换器 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +@Mapper +public interface UploadTaskFileConvert { + + UploadTaskFileConvert MAPPER = Mappers.getMapper(UploadTaskFileConvert.class); + + UploadTaskFileVO to(UploadTaskFileDO domain); + + List to(List list); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/UploadTaskFileDAO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/UploadTaskFileDAO.java new file mode 100644 index 00000000..344cb15c --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/UploadTaskFileDAO.java @@ -0,0 +1,17 @@ +package com.orion.ops.module.asset.dao; + +import com.orion.ops.framework.mybatis.core.mapper.IMapper; +import com.orion.ops.module.asset.entity.domain.UploadTaskFileDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 上传任务文件 Mapper 接口 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +@Mapper +public interface UploadTaskFileDAO extends IMapper { + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java index e9b7f53e..8d87af72 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/HostConnectLogOperatorType.java @@ -4,7 +4,8 @@ import com.orion.ops.framework.biz.operator.log.core.annotation.Module; import com.orion.ops.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import com.orion.ops.framework.biz.operator.log.core.model.OperatorType; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.H; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.M; /** * 主机连接日志 操作日志类型 diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/UploadTaskOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/UploadTaskOperatorType.java index 6934d9e7..1b161e73 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/UploadTaskOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/UploadTaskOperatorType.java @@ -4,7 +4,8 @@ import com.orion.ops.framework.biz.operator.log.core.annotation.Module; import com.orion.ops.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import com.orion.ops.framework.biz.operator.log.core.model.OperatorType; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.H; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.M; /** * 上传任务 操作日志类型 @@ -18,13 +19,19 @@ public class UploadTaskOperatorType extends InitializingOperatorTypes { public static final String UPLOAD = "upload-task:upload"; + public static final String CANCEL = "upload-task:cancel"; + public static final String DELETE = "upload-task:delete"; + public static final String CLEAR = "upload-task:clear"; + @Override public OperatorType[] types() { return new OperatorType[]{ - new OperatorType(M, UPLOAD, "批量上传文件"), - new OperatorType(H, DELETE, "删除批量上传记录"), + new OperatorType(M, UPLOAD, "批量上传文件 ${count}个 (${name})"), + new OperatorType(M, CANCEL, "取消上传文件 ${name}"), + new OperatorType(H, DELETE, "删除上传记录 ${count}条"), + new OperatorType(H, CLEAR, "清理上传记录 ${count}条"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/UploadTaskFileDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/UploadTaskFileDO.java new file mode 100644 index 00000000..2ab6b4f2 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/UploadTaskFileDO.java @@ -0,0 +1,67 @@ +package com.orion.ops.module.asset.entity.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.orion.ops.framework.mybatis.core.domain.BaseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.util.Date; + +/** + * 上传任务文件 实体对象 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "upload_task_file", autoResultMap = true) +@Schema(name = "UploadTaskFileDO", description = "上传任务文件 实体对象") +public class UploadTaskFileDO extends BaseDO { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Schema(description = "用户id") + @TableField("task_id") + private Long taskId; + + @Schema(description = "主机id") + @TableField("host_id") + private Long hostId; + + @Schema(description = "文件id") + @TableField("file_id") + private String fileId; + + @Schema(description = "文件路径") + @TableField("file_path") + private String filePath; + + @Schema(description = "文件大小") + @TableField("file_size") + private Long fileSize; + + @Schema(description = "状态") + @TableField("status") + private String status; + + @Schema(description = "开始时间") + @TableField("start_time") + private Date startTime; + + @Schema(description = "结束时间") + @TableField("end_time") + private Date endTime; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskFileRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskFileRequest.java index cb4ff823..1e042034 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskFileRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskFileRequest.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.io.Serializable; /** @@ -30,7 +31,11 @@ public class UploadTaskFileRequest implements Serializable { private String fileId; @NotBlank - @Schema(description = "远程文件地址") - private String remotePath; + @Schema(description = "文件地址") + private String filePath; + + @NotNull + @Schema(description = "文件发小") + private Long fileSize; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskQueryRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskQueryRequest.java index a00aaf4e..0978c6fd 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskQueryRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskQueryRequest.java @@ -33,13 +33,13 @@ public class UploadTaskQueryRequest extends PageRequest { @Schema(description = "描述") private String description; + @Schema(description = "远程路径") + private String remotePath; + @Size(max = 16) @Schema(description = "状态") private String status; - @Schema(description = "额外信息") - private String extraInfo; - @Schema(description = "开始时间-区间") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date[] startTimeRange; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskRequest.java new file mode 100644 index 00000000..f6c3ebae --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/upload/UploadTaskRequest.java @@ -0,0 +1,32 @@ +package com.orion.ops.module.asset.entity.request.upload; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 上传任务 请求对象 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-7 22:15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "UploadTaskRequest", description = "上传任务 请求对象") +public class UploadTaskRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull + @Schema(description = "id") + private Long id; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskFileVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskFileVO.java new file mode 100644 index 00000000..ce39459e --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskFileVO.java @@ -0,0 +1,55 @@ +package com.orion.ops.module.asset.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 上传任务文件 视图响应对象 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "UploadTaskFileVO", description = "上传任务文件 视图响应对象") +public class UploadTaskFileVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + private Long id; + + @Schema(description = "用户id") + private Long taskId; + + @Schema(description = "主机id") + private Long hostId; + + @Schema(description = "文件id") + private String fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件大小") + private Long fileSize; + + @Schema(description = "状态") + private String status; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskVO.java index 0af85570..e4c83d96 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/UploadTaskVO.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * 上传任务 视图响应对象 @@ -55,4 +56,7 @@ public class UploadTaskVO implements Serializable { @Schema(description = "创建时间") private Date createTime; + @Schema(description = "上传文件") + private List files; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/UploadTaskFileStatusEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/UploadTaskFileStatusEnum.java new file mode 100644 index 00000000..8b63d344 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/UploadTaskFileStatusEnum.java @@ -0,0 +1,46 @@ +package com.orion.ops.module.asset.enums; + +/** + * 上传任务文件状态 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/5/7 22:21 + */ +public enum UploadTaskFileStatusEnum { + + /** + * 等待中 + */ + WAITING, + + /** + * 上传中 + */ + UPLOADING, + + /** + * 已完成 + */ + FINISHED, + + /** + * 已取消 + */ + CANCELED, + + ; + + public static UploadTaskFileStatusEnum of(String status) { + if (status == null) { + return null; + } + for (UploadTaskFileStatusEnum value : values()) { + if (value.name().equals(status)) { + return value; + } + } + return null; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java index 2fdd1533..737f7aa3 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java @@ -12,8 +12,8 @@ import com.orion.ops.framework.common.security.PasswordModifier; import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.module.asset.dao.HostIdentityDAO; import com.orion.ops.module.asset.dao.HostKeyDAO; -import com.orion.ops.module.asset.enums.HostSshOsTypeEnum; import com.orion.ops.module.asset.enums.HostSshAuthTypeEnum; +import com.orion.ops.module.asset.enums.HostSshOsTypeEnum; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; import org.springframework.stereotype.Component; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpListHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpListHandler.java index 35ba4830..35af89d7 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpListHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpListHandler.java @@ -1,7 +1,6 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; import com.alibaba.fastjson.JSON; -import com.orion.lang.utils.Strings; import com.orion.lang.utils.collect.Lists; import com.orion.ops.framework.common.enums.BooleanBit; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskFileService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskFileService.java new file mode 100644 index 00000000..13717545 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskFileService.java @@ -0,0 +1,40 @@ +package com.orion.ops.module.asset.service; + +import com.orion.ops.module.asset.entity.vo.UploadTaskFileVO; + +import java.util.List; + +/** + * 上传任务文件 服务类 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +public interface UploadTaskFileService { + + /** + * 查询上传任务文件 + * + * @param taskId taskId + * @return row + */ + List getFileByTaskId(Long taskId); + + /** + * 通过 taskId 删除 + * + * @param taskId taskId + * @return effect + */ + Integer deleteFileByTaskId(Long taskId); + + /** + * 通过 taskId 删除 + * + * @param taskIdList taskIdList + * @return effect + */ + Integer deleteFileByTaskIdList(List taskIdList); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskService.java index d4321d1d..d0049eb1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/UploadTaskService.java @@ -41,6 +41,22 @@ public interface UploadTaskService { */ DataGrid getUploadTaskPage(UploadTaskQueryRequest request); + /** + * 获取上传任务数量 + * + * @param request request + * @return count + */ + Long getUploadTaskCount(UploadTaskQueryRequest request); + + /** + * 清理上传任务 + * + * @param request request + * @return count + */ + Integer clearUploadTask(UploadTaskQueryRequest request); + /** * 删除上传任务 * @@ -57,4 +73,32 @@ public interface UploadTaskService { */ Integer deleteUploadTaskByIdList(List idList); + /** + * 开始上传 + * + * @param id id + */ + void startUploadTask(Long id); + + /** + * 取消上传 + * + * @param id id + */ + void cancelUploadTask(Long id); + + /** + * 删除上传交换区的文件 + * + * @param id id + */ + void clearUploadSwapFiles(Long id); + + /** + * 删除上传交换区的文件 + * + * @param idList idList + */ + void clearUploadSwapFiles(List idList); + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskFileServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskFileServiceImpl.java new file mode 100644 index 00000000..f98ce2be --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskFileServiceImpl.java @@ -0,0 +1,59 @@ +package com.orion.ops.module.asset.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.orion.ops.module.asset.convert.UploadTaskFileConvert; +import com.orion.ops.module.asset.dao.UploadTaskFileDAO; +import com.orion.ops.module.asset.entity.domain.UploadTaskFileDO; +import com.orion.ops.module.asset.entity.vo.UploadTaskFileVO; +import com.orion.ops.module.asset.service.UploadTaskFileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 上传任务文件 服务实现类 + * + * @author Jiahang Li + * @version 1.0.7 + * @since 2024-5-8 10:31 + */ +@Slf4j +@Service +public class UploadTaskFileServiceImpl implements UploadTaskFileService { + + @Resource + private UploadTaskFileDAO uploadTaskFileDAO; + + @Override + public List getFileByTaskId(Long taskId) { + // 查询 + return uploadTaskFileDAO.of() + .createWrapper() + .eq(UploadTaskFileDO::getTaskId, taskId) + .then() + .list(UploadTaskFileConvert.MAPPER::to); + } + + @Override + public Integer deleteFileByTaskId(Long taskId) { + log.info("UploadTaskFileService-deleteFileByTaskId id: {}", taskId); + LambdaQueryWrapper wrapper = uploadTaskFileDAO.wrapper() + .eq(UploadTaskFileDO::getTaskId, taskId); + int effect = uploadTaskFileDAO.delete(wrapper); + log.info("UploadTaskFileService-deleteFileByTaskId id: {}, effect: {}", taskId, effect); + return effect; + } + + @Override + public Integer deleteFileByTaskIdList(List taskIdList) { + log.info("UploadTaskFileService-deleteFileByTaskIdList idList: {}", taskIdList); + LambdaQueryWrapper wrapper = uploadTaskFileDAO.wrapper() + .in(UploadTaskFileDO::getTaskId, taskIdList); + int effect = uploadTaskFileDAO.delete(wrapper); + log.info("UploadTaskFileService-deleteFileByTaskIdList effect: {}", effect); + return effect; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskServiceImpl.java index be0618a8..68c49e4d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/UploadTaskServiceImpl.java @@ -5,7 +5,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.utils.Arrays1; import com.orion.lang.utils.Strings; +import com.orion.lang.utils.collect.Lists; +import com.orion.lang.utils.io.Files1; import com.orion.lang.utils.time.Dates; +import com.orion.ops.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.file.FileClient; import com.orion.ops.framework.common.security.LoginUser; @@ -15,22 +18,30 @@ import com.orion.ops.module.asset.convert.HostConvert; import com.orion.ops.module.asset.convert.UploadTaskConvert; import com.orion.ops.module.asset.dao.HostDAO; import com.orion.ops.module.asset.dao.UploadTaskDAO; +import com.orion.ops.module.asset.dao.UploadTaskFileDAO; import com.orion.ops.module.asset.entity.domain.UploadTaskDO; +import com.orion.ops.module.asset.entity.domain.UploadTaskFileDO; import com.orion.ops.module.asset.entity.dto.UploadTaskExtraDTO; import com.orion.ops.module.asset.entity.request.upload.UploadTaskCreateRequest; +import com.orion.ops.module.asset.entity.request.upload.UploadTaskFileRequest; import com.orion.ops.module.asset.entity.request.upload.UploadTaskQueryRequest; import com.orion.ops.module.asset.entity.vo.HostBaseVO; import com.orion.ops.module.asset.entity.vo.UploadTaskCreateVO; +import com.orion.ops.module.asset.entity.vo.UploadTaskFileVO; import com.orion.ops.module.asset.entity.vo.UploadTaskVO; import com.orion.ops.module.asset.enums.HostConfigTypeEnum; +import com.orion.ops.module.asset.enums.UploadTaskFileStatusEnum; import com.orion.ops.module.asset.enums.UploadTaskStatusEnum; import com.orion.ops.module.asset.service.AssetAuthorizedDataService; +import com.orion.ops.module.asset.service.UploadTaskFileService; import com.orion.ops.module.asset.service.UploadTaskService; import com.orion.ops.module.infra.api.FileUploadApi; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -55,6 +66,12 @@ public class UploadTaskServiceImpl implements UploadTaskService { @Resource private HostDAO hostDAO; + @Resource + private UploadTaskFileDAO uploadTaskFileDAO; + + @Resource + private UploadTaskFileService uploadTaskFileService; + @Resource private AssetAuthorizedDataService assetAuthorizedDataService; @@ -64,10 +81,12 @@ public class UploadTaskServiceImpl implements UploadTaskService { @Resource private FileUploadApi fileUploadApi; + @Transactional(rollbackFor = Exception.class) @Override public UploadTaskCreateVO createUploadTask(UploadTaskCreateRequest request) { LoginUser user = Valid.notNull(SecurityUtils.getLoginUser()); List hostIdList = request.getHostIdList(); + List files = request.getFiles(); log.info("UploadTaskService-createUploadTask request: {}", JSON.toJSONString(request)); // 检查主机是否有权限 this.checkHostPermission(hostIdList); @@ -87,12 +106,30 @@ public class UploadTaskServiceImpl implements UploadTaskService { .hosts(hosts) .build(); record.setExtraInfo(JSON.toJSONString(extra)); - // 插入 + // 插入任务表 int effect = uploadTaskDAO.insert(record); Long id = record.getId(); + // 插入任务文件表 + List uploadFiles = new ArrayList<>(); + for (Long hostId : hostIdList) { + files.stream() + .map(s -> UploadTaskFileDO.builder() + .taskId(id) + .hostId(hostId) + .fileId(s.getFileId()) + .filePath(s.getFilePath()) + .fileSize(s.getFileSize()) + .status(UploadTaskFileStatusEnum.WAITING.name()) + .build()) + .forEach(uploadFiles::add); + } + uploadTaskFileDAO.insertBatch(uploadFiles); // 设置 uploadToken String token = fileUploadApi.createUploadToken(user.getId(), Strings.format(SWAP_ENDPOINT, id)); log.info("UploadTaskService-createUploadTask id: {}, effect: {}", id, effect); + // 添加日志参数 + OperatorLogs.add(OperatorLogs.NAME, record.getDescription()); + OperatorLogs.add(OperatorLogs.COUNT, files.size()); return UploadTaskCreateVO.builder() .id(id) .token(token) @@ -101,11 +138,15 @@ public class UploadTaskServiceImpl implements UploadTaskService { @Override public UploadTaskVO getUploadTaskById(Long id) { - // 查询 + // 查询任务 UploadTaskDO record = uploadTaskDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); - // 转换 - return UploadTaskConvert.MAPPER.to(record); + // 查询任务文件 TODO PROGRESS + List files = uploadTaskFileService.getFileByTaskId(id); + // 返回 + UploadTaskVO task = UploadTaskConvert.MAPPER.to(record); + task.setFiles(files); + return task; } @Override @@ -119,23 +160,70 @@ public class UploadTaskServiceImpl implements UploadTaskService { } @Override - public Integer deleteUploadTaskById(Long id) { - log.info("UploadTaskService-deleteUploadTaskById id: {}", id); - // 检查数据是否存在 - UploadTaskDO record = uploadTaskDAO.selectById(id); - Valid.notNull(record, ErrorMessage.DATA_ABSENT); + public Long getUploadTaskCount(UploadTaskQueryRequest request) { + return uploadTaskDAO.selectCount(this.buildQueryWrapper(request)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer clearUploadTask(UploadTaskQueryRequest request) { + // 查询id + LambdaQueryWrapper wrapper = this.buildQueryWrapper(request) + .select(UploadTaskDO::getId); + List idList = uploadTaskDAO.of(wrapper) + .list(UploadTaskDO::getId); // 删除 - int effect = uploadTaskDAO.deleteById(id); - log.info("UploadTaskService-deleteUploadTaskById id: {}, effect: {}", id, effect); + return this.deleteUploadTaskByIdList(idList); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer deleteUploadTaskById(Long id) { + return this.deleteUploadTaskByIdList(Lists.singleton(id)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer deleteUploadTaskByIdList(List idList) { + // TODO 暂停 / 删除交换区文件 + log.info("UploadTaskService-deleteUploadTaskByIdList idList: {}", idList); + // 删除任务 + int effect = uploadTaskDAO.deleteBatchIds(idList); + // 删除任务文件 + uploadTaskFileService.deleteFileByTaskIdList(idList); + // 添加日志参数 + OperatorLogs.add(OperatorLogs.COUNT, effect); + log.info("UploadTaskService-deleteUploadTaskByIdList effect: {}", effect); return effect; } @Override - public Integer deleteUploadTaskByIdList(List idList) { - log.info("UploadTaskService-deleteUploadTaskByIdList idList: {}", idList); - int effect = uploadTaskDAO.deleteBatchIds(idList); - log.info("UploadTaskService-deleteUploadTaskByIdList effect: {}", effect); - return effect; + public void startUploadTask(Long id) { + + } + + @Override + public void cancelUploadTask(Long id) { + + } + + @Override + public void clearUploadSwapFiles(Long id) { + this.clearUploadSwapFiles(Lists.singleton(id)); + } + + @Override + public void clearUploadSwapFiles(List idList) { + // 查询记录 + List paths = idList.stream() + .map(s -> Strings.format(SWAP_ENDPOINT, s)) + .map(localFileClient::getReturnPath) + .map(localFileClient::getAbsolutePath) + .collect(Collectors.toList()); + // TODO test + paths.forEach(System.out::println); + // 删除文件 + paths.forEach(Files1::delete); } /** @@ -148,7 +236,8 @@ public class UploadTaskServiceImpl implements UploadTaskService { return uploadTaskDAO.wrapper() .eq(UploadTaskDO::getId, request.getId()) .eq(UploadTaskDO::getUserId, request.getUserId()) - .eq(UploadTaskDO::getDescription, request.getDescription()) + .in(UploadTaskDO::getDescription, request.getDescription()) + .eq(UploadTaskDO::getRemotePath, request.getRemotePath()) .eq(UploadTaskDO::getStatus, request.getStatus()) .ge(UploadTaskDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 0)) .le(UploadTaskDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 1)) diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml new file mode 100644 index 00000000..1d98dd1c --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, task_id, host_id, file_id, file_path, file_size, status, start_time, end_time, create_time, update_time, creator, updater, deleted + + +