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 a0ca3570..927b2d58 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 @@ -44,18 +44,18 @@ public class CodeGenerators { // .color("blue", "gray", "red", "green", "white") // .valueUseFields() // .build(), - Template.create("exec_job", "计划任务", "exec") + Template.create("exec_job", "计划执行", "exec") .disableUnitTest() .vue("exec", "exec-job") .enableDrawerForm() .dict("execJobStatus", "status") - .comment("计划任务状态") + .comment("计划执行状态") .field("execJobStatus") .fields("DISABLED", "ENABLED") .labels("禁用", "启用") .values(0, 1) .build(), - Template.create("exec_job_host", "计划任务主机", "exec") + Template.create("exec_job_host", "计划执行主机", "exec") .disableUnitTest() .vue("exec", "exec-job-host") .build(), diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-types-const.ts.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-types-const.ts.vm index ab8d847b..803ab6cb 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-types-const.ts.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-types-const.ts.vm @@ -1,8 +1,6 @@ #if($dictMap.entrySet().size() > 0) #foreach($enumEntity in $dictMap.entrySet()) -/** - * $enumEntity.value.comment - */ +// $enumEntity.value.comment // FIXME 检查这里的类型 export const $enumEntity.value.field = { #set($count = $enumEntity.value.fields.size() - 1) @@ -10,7 +8,7 @@ export const $enumEntity.value.field = { // $enumEntity.value.labels.get($index) $enumEntity.value.fields.get($index): '$enumEntity.value.values.get($index)', #end -} +}; #end #foreach($enumEntity in $dictMap.entrySet()) diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java index 3eabaf58..47dbb80e 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java @@ -92,7 +92,7 @@ public class ExecJobController { @OperatorLog(ExecJobOperatorType.TRIGGER) @PostMapping("/trigger") - @Operation(summary = "手动触发计划任务") + @Operation(summary = "手动触发计划执行任务") @PreAuthorize("@ss.hasPermission('asset:exec-job:trigger')") public HttpWrapper triggerExecJob(@Validated @RequestBody ExecJobTriggerRequest request) { execJobService.manualTriggerExecJob(request.getId()); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http index 3b62f862..1f8b6353 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http @@ -1,9 +1,9 @@ -### 查询计划任务日志 +### 查询计划执行任务日志 GET {{baseUrl}}/asset/exec-job-log/get?id=1 Authorization: {{token}} -### 分页查询计划任务日志 +### 分页查询计划执行任务日志 POST {{baseUrl}}/asset/exec-job-log/query Content-Type: application/json Authorization: {{token}} @@ -20,12 +20,12 @@ Authorization: {{token}} } -### 删除计划任务日志 +### 删除计划执行任务日志 DELETE {{baseUrl}}/asset/exec-job-log/delete?id=1 Authorization: {{token}} -### 批量删除计划任务日志 +### 批量删除计划执行任务日志 DELETE {{baseUrl}}/asset/exec-job-log/batch-delete?idList=1,2,3 Authorization: {{token}} 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 e4ebb09d..9ec7e317 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 @@ -28,13 +28,13 @@ import javax.servlet.http.HttpServletResponse; import java.util.List; /** - * 计划任务日志 api + * 计划执行任务日志 api * * @author Jiahang Li * @version 1.0.1 * @since 2024-3-11 11:31 */ -@Tag(name = "asset - 计划任务日志服务") +@Tag(name = "asset - 计划执行任务日志服务") @Slf4j @Validated @RestWrapper @@ -53,7 +53,7 @@ public class ExecJobLogController { @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/query") - @Operation(summary = "分页查询计划任务日志") + @Operation(summary = "分页查询计划执行任务日志") @PreAuthorize("@ss.hasPermission('asset:exec-job-log:query')") public DataGrid getExecJobLogPage(@Validated(Page.class) @RequestBody ExecLogQueryRequest request) { request.setSource(SOURCE); @@ -62,7 +62,7 @@ public class ExecJobLogController { @IgnoreLog(IgnoreLogMode.RET) @GetMapping("/get") - @Operation(summary = "查询计划任务日志") + @Operation(summary = "查询计划执行任务日志") @PreAuthorize("@ss.hasPermission('asset:exec-job-log:query')") public ExecLogVO getExecJobLog(@RequestParam("id") Long id) { return execLogService.getExecLog(id, SOURCE); @@ -87,7 +87,7 @@ public class ExecJobLogController { @OperatorLog(ExecJobLogOperatorType.DELETE) @DeleteMapping("/delete") - @Operation(summary = "删除计划任务日志") + @Operation(summary = "删除计划执行任务日志") @Parameter(name = "id", description = "id", required = true) @PreAuthorize("@ss.hasPermission('asset:exec-job-log:delete')") public Integer deleteExecJobLog(@RequestParam("id") Long id) { @@ -96,7 +96,7 @@ public class ExecJobLogController { @OperatorLog(ExecJobLogOperatorType.DELETE) @DeleteMapping("/batch-delete") - @Operation(summary = "删除计划任务日志") + @Operation(summary = "删除计划执行任务日志") @Parameter(name = "idList", description = "idList", required = true) @PreAuthorize("@ss.hasPermission('asset:exec-job-log:delete')") public Integer batchDeleteExecJobLog(@RequestParam("idList") List idList) { @@ -113,7 +113,7 @@ public class ExecJobLogController { } @PostMapping("/query-count") - @Operation(summary = "查询计划任务日志数量") + @Operation(summary = "查询计划执行任务日志数量") @PreAuthorize("@ss.hasPermission('asset:exec-job-log:management:clear')") public Long getExecJobLogCount(@RequestBody ExecLogQueryRequest request) { request.setSource(SOURCE); @@ -122,7 +122,7 @@ public class ExecJobLogController { @OperatorLog(ExecJobLogOperatorType.CLEAR) @PostMapping("/clear") - @Operation(summary = "清空计划任务日志") + @Operation(summary = "清空计划执行任务日志") @PreAuthorize("@ss.hasPermission('asset:exec-job-log:management:clear')") public Integer clearExecJobLog(@RequestBody ExecLogQueryRequest request) { request.setSource(SOURCE); @@ -130,7 +130,7 @@ public class ExecJobLogController { } @PostMapping("/tail") - @Operation(summary = "查看计划任务日志") + @Operation(summary = "查看计划执行任务日志") @PreAuthorize("@ss.hasAnyPermission('asset:exec-job-log:query', 'asset:exec-job:exec')") public String getExecJobLogTailToken(@Validated @RequestBody ExecLogTailRequest request) { request.setSource(SOURCE); @@ -139,7 +139,7 @@ public class ExecJobLogController { @OperatorLog(ExecJobLogOperatorType.DOWNLOAD) @GetMapping("/download") - @Operation(summary = "下载计划任务日志") + @Operation(summary = "下载计划执行任务日志") @PreAuthorize("@ss.hasAnyPermission('asset:exec-job-log:query', 'asset:exec-job:exec')") public void downloadExecJobLogFile(@RequestParam("id") Long id, HttpServletResponse response) { execLogService.downloadLogFile(id, SOURCE, response); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/HostConvert.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/HostConvert.java index 0cc3f84f..6d786e19 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/HostConvert.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/HostConvert.java @@ -9,6 +9,8 @@ import com.orion.ops.module.asset.entity.vo.HostVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.List; + /** * 主机 内部对象转换器 * @@ -33,4 +35,6 @@ public interface HostConvert { HostCacheDTO toCache(HostDO domain); + List toList(List domain); + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java index 159cf5e5..2a690ff4 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java @@ -29,7 +29,7 @@ public class ExecCommandLogOperatorType extends InitializingOperatorTypes { public OperatorType[] types() { return new OperatorType[]{ new OperatorType(H, DELETE, "删除批量执行日志 ${count} 条"), - new OperatorType(H, DELETE_HOST, "删除批量主机执行日志 ${logId} ${hostName}"), + new OperatorType(H, DELETE_HOST, "删除批量执行主机日志 ${logId} ${hostName}"), new OperatorType(H, CLEAR, "清理批量执行日志 ${count} 条"), new OperatorType(L, DOWNLOAD, "下载主机执行日志 ${logId} ${hostName}"), }; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java index 3cb65a0b..b4d13330 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java @@ -8,7 +8,7 @@ import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLe import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.L; /** - * 计划任务日志 操作记录类型 + * 计划执行日志 操作记录类型 * * @author Jiahang Li * @version 1.0.1 @@ -28,9 +28,9 @@ public class ExecJobLogOperatorType extends InitializingOperatorTypes { @Override public OperatorType[] types() { return new OperatorType[]{ - new OperatorType(H, DELETE, "删除计划任务日志 ${count} 条"), - new OperatorType(H, DELETE_HOST, "删除批量主机执行日志 ${logId} ${hostName}"), - new OperatorType(H, CLEAR, "清理计划任务日志 ${count} 条"), + new OperatorType(H, DELETE, "删除计划执行日志 ${count} 条"), + new OperatorType(H, DELETE_HOST, "删除计划执行主机日志 ${logId} ${hostName}"), + new OperatorType(H, CLEAR, "清理计划执行日志 ${count} 条"), new OperatorType(L, DOWNLOAD, "下载主机执行日志 ${logId} ${hostName}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobOperatorType.java index 2f2458a0..013771dd 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobOperatorType.java @@ -29,11 +29,11 @@ public class ExecJobOperatorType extends InitializingOperatorTypes { @Override public OperatorType[] types() { return new OperatorType[]{ - new OperatorType(L, CREATE, "创建计划任务 ${name}"), - new OperatorType(M, UPDATE, "更新计划任务 ${before}"), - new OperatorType(M, UPDATE_STATUS, "${statusName}计划任务 ${name}"), - new OperatorType(M, TRIGGER, "手动触发计划任务 ${name}"), - new OperatorType(H, DELETE, "删除计划任务 ${name}"), + new OperatorType(L, CREATE, "创建计划执行任务 ${name}"), + new OperatorType(M, UPDATE, "更新计划执行任务 ${before}"), + new OperatorType(M, UPDATE_STATUS, "${statusName}计划执行任务 ${name}"), + new OperatorType(M, TRIGGER, "手动触发计划执行任务 ${name}"), + new OperatorType(H, DELETE, "删除计划执行任务 ${name}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java index 660a5104..9ee0def1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecJobDO.java @@ -54,7 +54,7 @@ public class ExecJobDO extends BaseDO { @TableField("parameter_schema") private String parameterSchema; - @Schema(description = "启用状态 0禁用 1启用") + @Schema(description = "任务状态") @TableField("status") private Integer status; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobQueryRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobQueryRequest.java index 428d72a7..5bec8daf 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobQueryRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobQueryRequest.java @@ -31,7 +31,7 @@ public class ExecJobQueryRequest extends PageRequest { @Schema(description = "执行命令") private String command; - @Schema(description = "启用状态 0禁用 1启用") + @Schema(description = "任务状态") private Integer status; @Schema(description = "是否查询最近执行任务") diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateStatusRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateStatusRequest.java index f220815c..12e550b0 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateStatusRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecJobUpdateStatusRequest.java @@ -30,7 +30,7 @@ public class ExecJobUpdateStatusRequest implements Serializable { private Long id; @NotNull - @Schema(description = "启用状态 0禁用 1启用") + @Schema(description = "任务状态") private Integer status; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java index 52e15292..789ecbee 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecJobVO.java @@ -44,17 +44,17 @@ public class ExecJobVO implements Serializable { @Schema(description = "命令参数") private String parameterSchema; - @Schema(description = "启用状态 0禁用 1启用") + @Schema(description = "任务状态") private Integer status; @Schema(description = "最近执行id") private Long recentLogId; @Schema(description = "最近执行状态") - private String recentExecStatus; + private String recentLogStatus; @Schema(description = "最近执行时间") - private Date recentExecTime; + private Date recentLogTime; @Schema(description = "创建时间") private Date createTime; @@ -65,4 +65,7 @@ public class ExecJobVO implements Serializable { @Schema(description = "执行主机") private List hostIdList; + @Schema(description = "执行主机") + private List hostList; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ExecSourceEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ExecSourceEnum.java index 8d07f95b..e5f8ffa6 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ExecSourceEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/ExecSourceEnum.java @@ -15,7 +15,7 @@ public enum ExecSourceEnum { BATCH, /** - * 计划任务 + * 计划执行 */ JOB, diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java index c4d0e00c..8328cae9 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java @@ -221,7 +221,6 @@ public class ExecCommandServiceImpl implements ExecCommandService { // 添加内置参数 params.put("userId", request.getUserId()); params.put("username", request.getUsername()); - params.put("source", request.getSource()); params.put("sourceId", request.getSourceId()); params.put("seq", request.getExecSeq()); params.put("execId", execId); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java index 41eb3f60..cb417897 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java @@ -12,10 +12,13 @@ import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.job.core.utils.QuartzUtils; import com.orion.ops.framework.security.core.utils.SecurityUtils; import com.orion.ops.module.asset.convert.ExecJobConvert; +import com.orion.ops.module.asset.convert.HostConvert; import com.orion.ops.module.asset.dao.ExecJobDAO; import com.orion.ops.module.asset.dao.ExecLogDAO; +import com.orion.ops.module.asset.dao.HostDAO; import com.orion.ops.module.asset.entity.domain.ExecJobDO; import com.orion.ops.module.asset.entity.domain.ExecLogDO; +import com.orion.ops.module.asset.entity.domain.HostDO; import com.orion.ops.module.asset.entity.request.exec.*; import com.orion.ops.module.asset.entity.vo.ExecJobVO; import com.orion.ops.module.asset.entity.vo.ExecLogVO; @@ -24,9 +27,9 @@ import com.orion.ops.module.asset.enums.ExecSourceEnum; import com.orion.ops.module.asset.enums.HostConfigTypeEnum; import com.orion.ops.module.asset.handler.host.exec.job.ExecCommandJob; import com.orion.ops.module.asset.service.AssetAuthorizedDataService; +import com.orion.ops.module.asset.service.ExecCommandService; import com.orion.ops.module.asset.service.ExecJobHostService; import com.orion.ops.module.asset.service.ExecJobService; -import com.orion.ops.module.asset.service.ExecCommandService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,6 +61,9 @@ public class ExecJobServiceImpl implements ExecJobService { @Resource private ExecLogDAO execLogDAO; + @Resource + private HostDAO hostDAO; + @Resource private ExecJobHostService execJobHostService; @@ -80,7 +86,7 @@ public class ExecJobServiceImpl implements ExecJobService { // 查询主机是否有权限 this.checkHostPermission(request.getHostIdList()); // 插入任务 - record.setStatus(ExecJobStatusEnum.ENABLED.getStatus()); + record.setStatus(ExecJobStatusEnum.DISABLED.getStatus()); int effect = execJobDAO.insert(record); Long id = record.getId(); // 设置任务主机 @@ -152,6 +158,9 @@ public class ExecJobServiceImpl implements ExecJobService { // 查询任务主机 List hostIdList = execJobHostService.getHostIdByJobId(id); vo.setHostIdList(hostIdList); + // 查询主机列表 + List hostList = hostDAO.selectBatchIds(hostIdList); + vo.setHostList(HostConvert.MAPPER.toList(hostList)); return vo; } @@ -175,6 +184,7 @@ public class ExecJobServiceImpl implements ExecJobService { List logList = execLogDAO.selectBatchIds(logIdList); Map logMap = logList.stream() .collect(Collectors.toMap(ExecLogDO::getId, Function.identity())); + // 设置任务状态 dataGrid.forEach(s -> { Long logId = s.getRecentLogId(); if (logId == null) { @@ -184,8 +194,8 @@ public class ExecJobServiceImpl implements ExecJobService { if (execLog == null) { return; } - s.setRecentExecTime(execLog.getStartTime()); - s.setRecentExecStatus(execLog.getStatus()); + s.setRecentLogTime(execLog.getStartTime()); + s.setRecentLogStatus(execLog.getStatus()); }); } return dataGrid; @@ -305,8 +315,8 @@ public class ExecJobServiceImpl implements ExecJobService { private LambdaQueryWrapper buildQueryWrapper(ExecJobQueryRequest request) { return execJobDAO.wrapper() .eq(ExecJobDO::getId, request.getId()) - .eq(ExecJobDO::getName, request.getName()) - .eq(ExecJobDO::getCommand, request.getCommand()) + .like(ExecJobDO::getName, request.getName()) + .like(ExecJobDO::getCommand, request.getCommand()) .eq(ExecJobDO::getStatus, request.getStatus()) .orderByDesc(ExecJobDO::getId); } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/ExpressionController.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/ExpressionController.java index 947d3820..5bc506d7 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/ExpressionController.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/ExpressionController.java @@ -11,8 +11,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -37,9 +36,9 @@ import java.util.stream.Collectors; public class ExpressionController { @PermitAll - @PostMapping("/cron-next") + @GetMapping("/cron-next") @Operation(summary = "获取 cron 下次执行时间") - public CronNextVO getCronNextTime(@Validated @RequestBody CronNextRequest request) { + public CronNextVO getCronNextTime(@Validated CronNextRequest request) { CronNextVO next = new CronNextVO(); try { Cron cron = Cron.of(request.getExpression()); diff --git a/orion-ops-ui/src/api/exec/exec-command-log.ts b/orion-ops-ui/src/api/exec/exec-command-log.ts index e659574c..21ee1808 100644 --- a/orion-ops-ui/src/api/exec/exec-command-log.ts +++ b/orion-ops-ui/src/api/exec/exec-command-log.ts @@ -4,7 +4,7 @@ import axios from 'axios'; import qs from 'query-string'; /** - * 执行记录查询请求 + * 批量执行日志查询请求 */ export interface ExecCommandLogQueryRequest extends Pagination { id?: number; @@ -16,7 +16,7 @@ export interface ExecCommandLogQueryRequest extends Pagination { } /** - * 执行记录查询响应 + * 批量执行日志查询响应 */ export interface ExecCommandLogQueryResponse extends TableData, ExecCommandLogQueryExtraResponse { id: number; @@ -34,14 +34,14 @@ export interface ExecCommandLogQueryResponse extends TableData, ExecCommandLogQu } /** - * 执行记录查询响应 拓展 + * 批量执行日志查询响应 拓展 */ export interface ExecCommandLogQueryExtraResponse { hosts: Array; } /** - * 主机执行记录查询响应 + * 主机批量执行日志查询响应 */ export interface ExecCommandHostLogQueryResponse extends TableData { id: number; @@ -59,7 +59,7 @@ export interface ExecCommandHostLogQueryResponse extends TableData { } /** - * 执行状态查询响应 + * 批量执行状态查询响应 */ export interface ExecCommandLogStatusResponse { logList: Array; @@ -67,7 +67,7 @@ export interface ExecCommandLogStatusResponse { } /** - * 中断命令请求 + * 批量执行日志 tail 请求 */ export interface ExecCommandLogTailRequest { execId?: number; @@ -75,21 +75,21 @@ export interface ExecCommandLogTailRequest { } /** - * 分页查询执行记录 + * 分页查询批量执行日志 */ export function getExecCommandLogPage(request: ExecCommandLogQueryRequest) { return axios.post>('/asset/exec-command-log/query', request); } /** - * 查询执行记录 + * 查询批量执行日志 */ export function getExecCommandLog(id: number) { return axios.get('/asset/exec-command-log/get', { params: { id } }); } /** - * 查询主机执行记录 + * 查询主机批量执行日志 */ export function getExecCommandHostLogList(logId: number) { return axios.get>('/asset/exec-command-log/host-list', { params: { logId } }); @@ -108,21 +108,21 @@ export function getExecCommandLogStatus(idList: Array) { } /** - * 查询历史执行记录 + * 查询历史批量执行日志 */ export function getExecCommandLogHistory(limit: number) { return axios.get>('/asset/exec-command-log/history', { params: { page: 1, limit } }); } /** - * 删除执行记录 + * 删除批量执行日志 */ export function deleteExecCommandLog(id: number) { return axios.delete('/asset/exec-command-log/delete', { params: { id } }); } /** - * 批量删除执行记录 + * 批量删除批量执行日志 */ export function batchDeleteExecCommandLog(idList: Array) { return axios.delete('/asset/exec-command-log/batch-delete', { @@ -134,35 +134,35 @@ export function batchDeleteExecCommandLog(idList: Array) { } /** - * 删除主机执行记录 + * 删除主机批量执行日志 */ export function deleteExecCommandHostLog(id: number) { return axios.delete('/asset/exec-command-log/delete-host', { params: { id } }); } /** - * 查询操作日志数量 + * 查询批量执行日志数量 */ export function getExecCommandLogCount(request: ExecCommandLogQueryRequest) { return axios.post('/asset/exec-command-log/query-count', request); } /** - * 清空操作日志 + * 清空批量执行日志 */ export function clearExecCommandLog(request: ExecCommandLogQueryRequest) { return axios.post('/asset/exec-command-log/clear', request); } /** - * 查看执行日志 + * 查看批量执行日志 */ export function getExecCommandLogTailToken(request: ExecCommandLogTailRequest) { return axios.post('/asset/exec-command-log/tail', request); } /** - * 下载执行日志文件 + * 下载批量执行日志文件 */ export function downloadExecCommandLogFile(id: number) { return axios.get('/asset/exec-command-log/download', { unwrap: true, params: { id } }); diff --git a/orion-ops-ui/src/api/exec/exec-job-log.ts b/orion-ops-ui/src/api/exec/exec-job-log.ts new file mode 100644 index 00000000..3fd40073 --- /dev/null +++ b/orion-ops-ui/src/api/exec/exec-job-log.ts @@ -0,0 +1,162 @@ +import type { DataGrid, Pagination } from '@/types/global'; +import type { TableData } from '@arco-design/web-vue/es/table/interface'; +import axios from 'axios'; +import qs from 'query-string'; + +/** + * 计划执行日志查询请求 + */ +export interface ExecJobLogQueryRequest extends Pagination { + id?: number; + userId?: number; + description?: string; + command?: string; + status?: string; + startTimeRange?: string[]; +} + +/** + * 计划执行日志查询响应 + */ +export interface ExecJobLogQueryResponse extends TableData, ExecJobLogQueryExtraResponse { + id: number; + userId: number; + username: string; + description: string; + command: string; + parameterSchema: string; + timeout: number; + status: string; + startTime: number; + finishTime: number; + hostIdList: Array; + hosts: Array; +} + +/** + * 计划执行日志查询响应 拓展 + */ +export interface ExecJobLogQueryExtraResponse { + hosts: Array; +} + +/** + * 主机计划执行日志查询响应 + */ +export interface ExecJobHostLogQueryResponse extends TableData { + id: number; + logId: number; + hostId: number; + hostName: string; + hostAddress: string; + status: string; + command: string; + parameter: string; + exitStatus: number; + errorMessage: string; + startTime: number; + finishTime: number; +} + +/** + * 计划执行状态查询响应 + */ +export interface ExecJobLogStatusResponse { + logList: Array; + hostList: Array; +} + +/** + * 计划执行日志 tail 请求 + */ +export interface ExecJobLogTailRequest { + execId?: number; + hostExecIdList?: Array; +} + +/** + * 分页查询计划执行日志 + */ +export function getExecJobLogPage(request: ExecJobLogQueryRequest) { + return axios.post>('/asset/exec-job-log/query', request); +} + +/** + * 查询计划执行日志 + */ +export function getExecJobLog(id: number) { + return axios.get('/asset/exec-job-log/get', { params: { id } }); +} + +/** + * 查询主机计划执行日志 + */ +export function getExecJobHostLogList(logId: number) { + return axios.get>('/asset/exec-job-log/host-list', { params: { logId } }); +} + +/** + * 查询命令执行状态 + */ +export function getExecJobLogStatus(idList: Array) { + return axios.get('/asset/exec-job-log/status', { + params: { idList }, + paramsSerializer: params => { + return qs.stringify(params, { arrayFormat: 'comma' }); + } + }); +} + +/** + * 删除计划执行日志 + */ +export function deleteExecJobLog(id: number) { + return axios.delete('/asset/exec-job-log/delete', { params: { id } }); +} + +/** + * 批量删除计划执行日志 + */ +export function batchDeleteExecJobLog(idList: Array) { + return axios.delete('/asset/exec-job-log/batch-delete', { + params: { idList }, + paramsSerializer: params => { + return qs.stringify(params, { arrayFormat: 'comma' }); + } + }); +} + +/** + * 删除主机计划执行日志 + */ +export function deleteExecJobHostLog(id: number) { + return axios.delete('/asset/exec-job-log/delete-host', { params: { id } }); +} + +/** + * 查询计划执行日志数量 + */ +export function getExecJobLogCount(request: ExecJobLogQueryRequest) { + return axios.post('/asset/exec-job-log/query-count', request); +} + +/** + * 清空计划执行日志 + */ +export function clearExecJobLog(request: ExecJobLogQueryRequest) { + return axios.post('/asset/exec-job-log/clear', request); +} + +/** + * 查看计划执行日志 + */ +export function getExecJobLogTailToken(request: ExecJobLogTailRequest) { + return axios.post('/asset/exec-job-log/tail', request); +} + +/** + * 下载计划执行日志文件 + */ +export function downloadExecJobLogFile(id: number) { + return axios.get('/asset/exec-job-log/download', { unwrap: true, params: { id } }); +} diff --git a/orion-ops-ui/src/api/exec/exec-job.ts b/orion-ops-ui/src/api/exec/exec-job.ts new file mode 100644 index 00000000..0e715821 --- /dev/null +++ b/orion-ops-ui/src/api/exec/exec-job.ts @@ -0,0 +1,111 @@ +import type { DataGrid, Pagination } from '@/types/global'; +import type { TableData } from '@arco-design/web-vue/es/table/interface'; +import type { HostQueryResponse } from '@/api/asset/host'; +import axios from 'axios'; + +/** + * 计划执行创建请求 + */ +export interface ExecJobCreateRequest { + name?: string; + expression?: string; + timeout?: number; + command?: string; + parameterSchema?: string; + hostIdList?: Array; +} + +/** + * 计划执行更新请求 + */ +export interface ExecJobUpdateRequest extends ExecJobCreateRequest { + id?: number; +} + +/** + * 计划执行状态更新请求 + */ +export interface ExecJobUpdateStatusRequest { + id: number; + status: number; +} + +/** + * 计划执行查询请求 + */ +export interface ExecJobQueryRequest extends Pagination { + id?: number; + name?: string; + command?: string; + status?: number; + queryRecentLog?: boolean; +} + +/** + * 计划执行查询响应 + */ +export interface ExecJobQueryResponse extends TableData { + id: number; + name: string; + expression: string; + timeout: number; + command: string; + parameterSchema: string; + status: number; + recentLogId: number; + recentLogStatus: string; + recentLogTime: number; + createTime: number; + updateTime: number; + hostIdList: Array; + hostList: Array; +} + +/** + * 创建计划执行 + */ +export function createExecJob(request: ExecJobCreateRequest) { + return axios.post('/asset/exec-job/create', request); +} + +/** + * 更新计划执行 + */ +export function updateExecJob(request: ExecJobUpdateRequest) { + return axios.put('/asset/exec-job/update', request); +} + +/** + * 更新计划执行状态 + */ +export function updateExecJobStatus(request: ExecJobUpdateStatusRequest) { + return axios.put('/asset/exec-job/update-status', request); +} + +/** + * 查询计划执行 + */ +export function getExecJob(id: number) { + return axios.get('/asset/exec-job/get', { params: { id } }); +} + +/** + * 分页查询计划执行 + */ +export function getExecJobPage(request: ExecJobQueryRequest) { + return axios.post>('/asset/exec-job/query', request); +} + +/** + * 删除计划执行 + */ +export function deleteExecJob(id: number) { + return axios.delete('/asset/exec-job/delete', { params: { id } }); +} + +/** + * 手动触发计划执行任务 + */ +export function triggerExecJob(id: number) { + return axios.post('/asset/exec-job/trigger', { id }); +} diff --git a/orion-ops-ui/src/api/meta/expression.ts b/orion-ops-ui/src/api/meta/expression.ts new file mode 100644 index 00000000..95be44e8 --- /dev/null +++ b/orion-ops-ui/src/api/meta/expression.ts @@ -0,0 +1,24 @@ +import axios from 'axios'; + +/** + * cron 下次执行时间请求对象 + */ +export interface CronNextRequest { + expression: number; + times: string; +} + +/** + * cron 下次执行时间响应对象 + */ +export interface CronNextResponse { + valid: boolean; + next: Array; +} + +/** + * 获取 cron 下次执行时间 + */ +export function getCronNextTime(request: CronNextRequest) { + return axios.get('/infra/expression/cron-next', { params: request }); +} diff --git a/orion-ops-ui/src/components/meta/expression/next-cron-modal/index.vue b/orion-ops-ui/src/components/meta/expression/next-cron-modal/index.vue new file mode 100644 index 00000000..f270a46c --- /dev/null +++ b/orion-ops-ui/src/components/meta/expression/next-cron-modal/index.vue @@ -0,0 +1,115 @@ + + + + + + + diff --git a/orion-ops-ui/src/components/view/exec-editor/index.vue b/orion-ops-ui/src/components/view/exec-editor/index.vue index 9700e74c..c6ffb342 100644 --- a/orion-ops-ui/src/components/view/exec-editor/index.vue +++ b/orion-ops-ui/src/components/view/exec-editor/index.vue @@ -62,7 +62,7 @@ } suggestions.push({ label: triggerPrefix + s.name, - kind: monaco.languages.CompletionItemKind.Field, + kind: monaco.languages.CompletionItemKind.Variable, insertText: templatePrefix + s.name + templateSuffix, detail: s.desc || '', documentation: s.desc || '', diff --git a/orion-ops-ui/src/views/asset/host-list/components/config/ssh/ssh-config-form.vue b/orion-ops-ui/src/views/asset/host-list/components/config/ssh/ssh-config-form.vue index 1e0977a9..47bafe33 100644 --- a/orion-ops-ui/src/views/asset/host-list/components/config/ssh/ssh-config-form.vue +++ b/orion-ops-ui/src/views/asset/host-list/components/config/ssh/ssh-config-form.vue @@ -10,7 +10,7 @@ type="round" :checked-value="1" :unchecked-value="0" - :beforeChange="s => updateStatus(s as number)" /> + :before-change="s => updateStatus(s as number)" /> @@ -223,7 +223,7 @@ }] as FieldRule[]; // 修改状态 - const updateStatus = (e: number) => { + const updateStatus = async (e: number) => { setLoading(true); return updateHostConfigStatus({ hostId: props?.hostId, diff --git a/orion-ops-ui/src/views/exec/exec-command-log/components/exec-command-log-clear-modal.vue b/orion-ops-ui/src/views/exec/exec-command-log/components/exec-command-log-clear-modal.vue index 0a53f0ab..17c1bed5 100644 --- a/orion-ops-ui/src/views/exec/exec-command-log/components/exec-command-log-clear-modal.vue +++ b/orion-ops-ui/src/views/exec/exec-command-log/components/exec-command-log-clear-modal.vue @@ -2,7 +2,7 @@
- 执行记录列表 + 批量执行日志列表
diff --git a/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue b/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue index f9d89aa8..2c071b3c 100644 --- a/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue +++ b/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue @@ -17,7 +17,7 @@
- +
{ setLoading(true); try { @@ -96,7 +96,7 @@ } }; - // 加载执行记录 + // 加载批量执行日志 onMounted(fetchExecHistory); diff --git a/orion-ops-ui/src/views/exec/exec-job/components/exec-job-detail-drawer.vue b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-detail-drawer.vue new file mode 100644 index 00000000..444e435c --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-detail-drawer.vue @@ -0,0 +1,179 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue new file mode 100644 index 00000000..9de57260 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue @@ -0,0 +1,255 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job/components/exec-job-table.vue b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-table.vue new file mode 100644 index 00000000..bc135926 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-table.vue @@ -0,0 +1,287 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job/index.vue b/orion-ops-ui/src/views/exec/exec-job/index.vue new file mode 100644 index 00000000..015610be --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/index.vue @@ -0,0 +1,73 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job/types/const.ts b/orion-ops-ui/src/views/exec/exec-job/types/const.ts new file mode 100644 index 00000000..bfa40bb4 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/types/const.ts @@ -0,0 +1,32 @@ +import type { TemplateParam } from '@/components/view/exec-editor/const'; + +// cron 下次执行次数 +export const CronNextTimes = 5; + +// 计划执行状态 +export const ExecJobStatus = { + // 禁用 + DISABLED: 0, + // 启用 + ENABLED: 1, +}; + +// 任务内置参数 +export const jobBuiltinsParams: Array = [ + { + name: 'sourceId', + desc: '计划任务id' + }, { + name: 'seq', + desc: '执行序列' + }, +]; + +// 计划执行状态 字典项 +export const execJobStatusKey = 'execJobStatus'; + +// 执行状态 字典项 +export const execStatusKey = 'execStatus'; + +// 加载的字典值 +export const dictKeys = [execJobStatusKey, execStatusKey]; diff --git a/orion-ops-ui/src/views/exec/exec-job/types/form.rules.ts b/orion-ops-ui/src/views/exec/exec-job/types/form.rules.ts new file mode 100644 index 00000000..6666ed2b --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/types/form.rules.ts @@ -0,0 +1,40 @@ +import type { FieldRule } from '@arco-design/web-vue'; + +export const name = [{ + required: true, + message: '请输入任务名称' +}, { + maxLength: 64, + message: '任务名称长度不能大于64位' +}] as FieldRule[]; + +export const hostIdList = [{ + required: true, + message: '请选择执行主机' +}] as FieldRule[]; + +export const expression = [{ + required: true, + message: '请输入 cron 表达式' +}, { + maxLength: 512, + message: 'cron 表达式长度不能大于512位' +}] as FieldRule[]; + +export const timeout = [{ + required: true, + message: '请输入超时时间' +}] as FieldRule[]; + +export const command = [{ + required: true, + message: '请输入执行命令' +}] as FieldRule[]; + +export default { + name, + hostIdList, + expression, + timeout, + command, +} as Record; diff --git a/orion-ops-ui/src/views/exec/exec-job/types/table.columns.ts b/orion-ops-ui/src/views/exec/exec-job/types/table.columns.ts new file mode 100644 index 00000000..5a11c7d9 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job/types/table.columns.ts @@ -0,0 +1,64 @@ +import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; +import { dateFormat } from '@/utils'; + +const columns = [ + { + title: 'id', + dataIndex: 'id', + slotName: 'id', + width: 70, + align: 'left', + fixed: 'left', + }, { + title: '任务名称', + dataIndex: 'name', + slotName: 'name', + align: 'left', + width: 180, + ellipsis: true, + }, { + title: 'cron', + dataIndex: 'expression', + slotName: 'expression', + align: 'left', + width: 168, + ellipsis: true, + tooltip: true, + }, { + title: '执行命令', + dataIndex: 'command', + slotName: 'command', + align: 'left', + ellipsis: true, + tooltip: true, + }, { + title: '任务状态', + dataIndex: 'status', + slotName: 'status', + align: 'center', + width: 112, + }, { + title: '最近任务状态', + dataIndex: 'recentLogStatus', + slotName: 'recentLogStatus', + align: 'left', + width: 184, + }, { + title: '修改时间', + dataIndex: 'updateTime', + slotName: 'updateTime', + align: 'center', + width: 180, + render: ({ record }) => { + return dateFormat(new Date(record.updateTime)); + }, + }, { + title: '操作', + slotName: 'handle', + width: 228, + align: 'center', + fixed: 'right', + }, +] as TableColumnData[]; + +export default columns; diff --git a/orion-ops-ui/src/views/exec/exec-template/components/exec-template-exec-drawer.vue b/orion-ops-ui/src/views/exec/exec-template/components/exec-template-exec-drawer.vue index a5442bbf..d5760859 100644 --- a/orion-ops-ui/src/views/exec/exec-template/components/exec-template-exec-drawer.vue +++ b/orion-ops-ui/src/views/exec/exec-template/components/exec-template-exec-drawer.vue @@ -47,6 +47,7 @@ - - + +
diff --git a/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts b/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts index dfe7c6ec..a207b05c 100644 --- a/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts +++ b/orion-ops-ui/src/views/user/operator-log/types/table.columns.ts @@ -13,7 +13,7 @@ const columns = [ title: '操作模块', dataIndex: 'module', slotName: 'module', - width: 214, + width: 234, }, { title: '风险等级', dataIndex: 'riskLevel',