feat: 任务调度日志,修改部分缺陷,新增文档内容

This commit is contained in:
bunny 2024-10-18 13:51:40 +08:00
parent d44b9f1138
commit 5f38730956
35 changed files with 730 additions and 81 deletions

View File

@ -118,3 +118,91 @@ docker run -d \
-e "MINIO_ROOT_PASSWORD=02120212" \
minio/minio server /data --console-address ":9090"
```
# Quartz 方法
## TriggerBuilder
`TriggerBuilder` 是一个用于构建 `Trigger` 实例的类。它提供了一系列方法来设置触发器的各种属性。以下是一些常用的方法:
1. `withIdentity(String name, String group)``withIdentity(TriggerKey triggerKey)`:设置触发器的名称和组名。
2. `startAt(Date startTime)`:设置触发器首次触发的时间。
3. `endAt(Date endTime)`:设置触发器最后一次触发的时间。
4. `withSchedule(ScheduleBuilder scheduleBuilder)`:设置触发器的调度计划,可以是简单重复、按日历重复等。
5. `forJob(JobKey jobKey)``forJob(String jobName, String jobGroup)`指定触发器关联的作业Job
6. `usingJobData(String key, String value)`:为触发器添加自定义数据。
7. `modifiedByCalendar(String calName)`:指定一个日历,用于修改触发器的触发时间。
8. `build()`:构建并返回最终的 `Trigger` 实例。
9. `withDescription(String description)`:为触发器设置描述信息。
10. `usingJobData(JobDataMap jobData)`:使用 `JobDataMap` 为触发器设置多个作业数据。
11. `withPriority(int priority)`:设置触发器的优先级。
12. `replaceTriggerKey(TriggerKey oldKey, TriggerKey newKey)`:替换触发器的键值。
## JobBuilder
`JobBuilder` 类用于构建 `JobDetail` 实例它定义了要执行的作业Job的属性。以下是一些常用的方法
1. `withIdentity(String name, String group)``withIdentity(JobKey jobKey)`:设置作业的名称和组名。
2. `storeDurably()`:当作业没有触发器时,仍然允许作业被存储。这对于持久作业(即不被触发器触发,但可以手动调度的作业)很有用。
3. `requestRecovery()`指示Quartz在作业执行失败或调度器重启时尝试恢复作业。
4. `usingJobData(JobDataMap jobData)`:为作业添加自定义数据。
5. `usingJobData(String key, String value)`:为作业添加单个自定义数据。
6. `ofType(Class<? extends Job> jobClass)`:指定作业的类型(实现 `Job` 接口的类)。
7. `build()`:构建并返回最终的 `JobDetail` 实例。
8. `withDescription(String description)`:为作业设置描述信息。
9. `usingJobData(JobDataMap jobData, boolean merge)`:添加自定义数据,并指定是否与现有的 `JobDataMap` 合并。
10. `build()`:构建并返回最终的 `JobDetail` 实例。
# 展望未来
## 定时任务加入
数据备份:根据数据的重要性和变化频率,定时备份数据库或文件系统。例如,每晚备份数据库,或者在数据变更达到一定量后触发备份。
系统维护:包括软件更新、系统清理、磁盘碎片整理等,这些任务可能在系统负载较低的时段执行。
监控报告:定时生成系统或网络的使用报告、性能报告等,用于分析和审计。
内容更新:对于网站或应用,定时更新内容,如新闻网站定时更新新闻,天气应用定时更新天气信息。
缓存清理:定期清理缓存文件,以释放存储空间和提高系统性能。
日志轮转:自动归档和压缩旧的日志文件,以便于管理和分析。
邮件发送:定时发送邮件,如账单、通知、营销邮件等。
资源调度:在云计算环境中,根据需求动态调整资源分配,如自动扩展或缩减服务器实例。
数据同步:在多个系统或数据库之间定时同步数据,保持数据一致性。
安全扫描:定期执行安全扫描,检测系统漏洞或异常行为。
任务调度:在工作流管理系统中,根据预设的规则和条件动态触发任务。
库存管理:在电子商务或仓库管理中,定时检查库存水平,自动触发补货或调整价格。
广告轮播:在广告系统中,定时更换展示的广告内容。
用户行为分析:定时收集和分析用户行为数据,用于改进产品或服务。
健康检查:对关键系统组件进行定时健康检查,确保系统稳定运行。

View File

@ -14,13 +14,13 @@ public class AdminCodeGenerator {
// 作者名称
public static final String author = "Bunny";
// 公共路径
// public static final String outputDir = "D:\\MyFolder\\Bunny\\BunnyBBS\\BunnyBBS-server-admin\\service";
public static final String outputDir = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service";
public static final String outputDir = "D:\\MyFolder\\auth-admin\\auth-server-java\\service";
// public static final String outputDir = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service";
// 实体类名称
public static final String entity = "Bunny";
public static void main(String[] args) {
Generation("sys_schedulers_group");
Generation("quartz_execute_log");
}
/**
@ -45,7 +45,7 @@ public class AdminCodeGenerator {
.controller("controller")// 控制层包名
.mapper("mapper")// mapper层包名
.service("service")// service层包名
.serviceImpl("service·impl")// service实现类包名
.serviceImpl("service.impl")// service实现类包名
// 自定义mapper.xml文件输出目录
.pathInfo(Collections.singletonMap(OutputFile.xml, outputDir + "/src/main/resources/mapper")))
.strategyConfig(builder -> {

View File

@ -3,11 +3,11 @@ package cn.bunny.common.generator.generator;
import cn.bunny.common.generator.entity.BaseField;
import cn.bunny.common.generator.entity.BaseResultMap;
import cn.bunny.common.generator.utils.GeneratorCodeUtils;
import cn.bunny.dao.dto.quartz.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupUpdateDto;
import cn.bunny.dao.entity.quartz.SchedulersGroup;
import cn.bunny.dao.vo.quartz.SchedulersGroupVo;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogAddDto;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogDto;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogUpdateDto;
import cn.bunny.dao.entity.quartz.QuartzExecuteLog;
import cn.bunny.dao.vo.quartz.QuartzExecuteLogVo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.base.CaseFormat;
import io.swagger.v3.oas.annotations.media.Schema;
@ -36,26 +36,26 @@ import java.util.stream.Stream;
@Service
public class WebGeneratorCode {
// 公共路径
public static String commonPath = "D:\\Project\\web\\PC\\auth\\auth-web\\src";
public static String commonPath = "D:\\MyFolder\\auth-admin\\auth-web\\src";
// 生成API请求路径
public static String apiPath = commonPath + "\\api\\v1\\";
// 生成vue路径
public static String vuePath = commonPath + "\\views\\monitor\\";
public static String vuePath = commonPath + "\\views\\scheduler\\";
// 生成仓库路径
public static String storePath = commonPath + "\\store\\monitor\\";
public static String storePath = commonPath + "\\store\\scheduler\\";
// 后端controller
public static String controllerPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\controller\\";
public static String servicePath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\service\\";
public static String serviceImplPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\service\\impl\\";
public static String mapperPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\mapper\\";
public static String resourceMapperPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\resources\\mapper\\";
public static String controllerPath = "D:\\MyFolder\\auth-admin\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\controller\\";
public static String servicePath = "D:\\MyFolder\\auth-admin\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\service\\";
public static String serviceImplPath = "D:\\MyFolder\\auth-admin\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\service\\impl\\";
public static String mapperPath = "D:\\MyFolder\\auth-admin\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\mapper\\";
public static String resourceMapperPath = "D:\\MyFolder\\auth-admin\\auth-server-java\\service\\src\\main\\resources\\mapper\\";
public static void main(String[] args) throws Exception {
Class<?> originalClass = SchedulersGroup.class;
Class<?> dtoClass = SchedulersGroupDto.class;
Class<?> addDtoClass = SchedulersGroupAddDto.class;
Class<?> updateDtoClass = SchedulersGroupUpdateDto.class;
Class<?> voClass = SchedulersGroupVo.class;
Class<?> originalClass = QuartzExecuteLog.class;
Class<?> dtoClass = QuartzExecuteLogDto.class;
Class<?> addDtoClass = QuartzExecuteLogAddDto.class;
Class<?> updateDtoClass = QuartzExecuteLogUpdateDto.class;
Class<?> voClass = QuartzExecuteLogVo.class;
// 设置velocity资源加载器
Properties prop = new Properties();

View File

@ -0,0 +1,55 @@
package cn.bunny.dao.dto.quartz.executeLog;
import cn.bunny.dao.entity.quartz.QuartzExecuteLogJson;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "QuartzExecuteLogAddDto对象", title = "添加调度任务执行日志", description = "添加调度任务执行日志")
public class QuartzExecuteLogAddDto {
@Schema(name = "jobName", title = "任务名称")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobGroup;
@Schema(name = "jobClassName", title = "执行任务类名")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobClassName;
@Schema(name = "cronExpression", title = "执行任务core表达式")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String triggerName;
@Schema(name = "executeResult", title = "执行结果")
private QuartzExecuteLogJson executeResult;
@Schema(name = "duration", title = "执行时间")
private Integer duration;
@Schema(name = "endTime", title = "结束时间")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,36 @@
package cn.bunny.dao.dto.quartz.executeLog;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "QuartzExecuteLogDto对象", title = "调度任务执行日志分页查询", description = "调度任务执行日志分页查询")
public class QuartzExecuteLogDto {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "jobClassName", title = "执行任务类名")
private String jobClassName;
@Schema(name = "cronExpression", title = "执行任务core表达式")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "endTime", title = "结束时间")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,59 @@
package cn.bunny.dao.dto.quartz.executeLog;
import cn.bunny.dao.entity.quartz.QuartzExecuteLogJson;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "QuartzExecuteLogUpdateDto对象", title = "更新调度任务执行日志", description = "更新调度任务执行日志")
public class QuartzExecuteLogUpdateDto {
@Schema(name = "id", title = "主键")
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "jobName", title = "任务名称")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobGroup;
@Schema(name = "jobClassName", title = "执行任务类名")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobClassName;
@Schema(name = "cronExpression", title = "执行任务core表达式")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String triggerName;
@Schema(name = "executeResult", title = "执行结果")
private QuartzExecuteLogJson executeResult;
@Schema(name = "duration", title = "执行时间")
private Integer duration;
@Schema(name = "endTime", title = "结束时间")
private LocalDateTime endTime;
}

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.schedule;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.schedule;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.schedule;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.scheduleGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.scheduleGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.quartz;
package cn.bunny.dao.dto.quartz.scheduleGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -0,0 +1,26 @@
package cn.bunny.dao.dto.system.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RouterUpdateByIdWithRankDto对象", title = "根据菜单Id更新菜单排序", description = "根据菜单Id更新菜单排序")
public class RouterUpdateByIdWithRankDto {
@Schema(name = "id", title = "唯一标识")
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "routerRank", title = "等级")
@JsonProperty("rank")
private Integer routerRank;
}

View File

@ -59,3 +59,4 @@ public class RouterUpdateDto {
@Schema(name = "visible", title = "是否显示")
private Boolean visible;
}

View File

@ -0,0 +1,53 @@
package cn.bunny.dao.entity.quartz;
import cn.bunny.dao.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* <p>
* 调度任务执行日志
* </p>
*
* @author Bunny
* @since 2024-10-18
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("quartz_execute_log")
@Schema(name = "QuartzExecuteLog对象", title = "调度任务执行日志", description = "调度任务执行日志")
public class QuartzExecuteLog extends BaseEntity {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "jobClassName", title = "执行任务类名")
private String jobClassName;
@Schema(name = "cronExpression", title = "执行任务core表达式")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "executeResult", title = "执行结果")
private String executeResult;
@Schema(name = "duration", title = "执行时间")
private Integer duration;
@Schema(name = "endTime", title = "结束时间")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,30 @@
package cn.bunny.dao.entity.quartz;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "QuartzExecuteLog对象", title = "执行任务的日志", description = "执行任务的日志")
public class QuartzExecuteLogJson {
@Schema(name = "result", title = "执行结果")
private String result;
@Schema(name = "status", title = "执行状态")
private String status;
@Schema(name = "message", title = "执行消息")
private String message;
@Schema(name = "operationTime", title = "操作时间")
private String operationTime;
@Schema(name = "executeParams", title = "执行任务参数")
private String executeParams;
}

View File

@ -18,7 +18,7 @@ import lombok.experimental.Accessors;
@Getter
@Setter
@Accessors(chain = true)
@TableName("qrtz_schedulers_group")
@TableName("quartz_schedulers_group")
@Schema(name = "SchedulersGroup对象", title = "任务调度分组", description = "任务调度分组")
public class SchedulersGroup extends BaseEntity {

View File

@ -0,0 +1,42 @@
package cn.bunny.dao.vo.quartz;
import cn.bunny.dao.entity.quartz.QuartzExecuteLogJson;
import cn.bunny.dao.vo.BaseVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "QuartzExecuteLogVo对象", title = "调度任务执行日志返回对象", description = "调度任务执行日志返回对象")
public class QuartzExecuteLogVo extends BaseVo {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "jobClassName", title = "执行任务类名")
private String jobClassName;
@Schema(name = "cronExpression", title = "执行任务core表达式")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "executeResult", title = "执行结果")
private QuartzExecuteLogJson executeResult;
@Schema(name = "duration", title = "执行时间")
private Integer duration;
@Schema(name = "endTime", title = "结束时间")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,55 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogDto;
import cn.bunny.dao.entity.quartz.QuartzExecuteLog;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.quartz.QuartzExecuteLogVo;
import cn.bunny.services.service.QuartzExecuteLogService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import java.util.List;
/**
* <p>
* 调度任务执行日志表 前端控制器
* </p>
*
* @author Bunny
* @since 2024-10-18 12:56:39
*/
@Tag(name = "调度任务执行日志", description = "调度任务执行日志相关接口")
@RestController
@RequestMapping("admin/quartzExecuteLog")
public class QuartzExecuteLogController {
@Autowired
private QuartzExecuteLogService quartzExecuteLogService;
@Operation(summary = "分页查询调度任务执行日志", description = "分页查询调度任务执行日志")
@GetMapping("getQuartzExecuteLogList/{page}/{limit}")
public Mono<Result<PageResult<QuartzExecuteLogVo>>> getQuartzExecuteLogList(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
QuartzExecuteLogDto dto) {
Page<QuartzExecuteLog> pageParams = new Page<>(page, limit);
PageResult<QuartzExecuteLogVo> pageResult = quartzExecuteLogService.getQuartzExecuteLogList(pageParams, dto);
return Mono.just(Result.success(pageResult));
}
@Operation(summary = "删除调度任务执行日志", description = "删除调度任务执行日志")
@DeleteMapping("deleteQuartzExecuteLog")
public Mono<Result<String>> deleteQuartzExecuteLog(@RequestBody List<Long> ids) {
quartzExecuteLogService.deleteQuartzExecuteLog(ids);
return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS));
}
}

View File

@ -2,6 +2,7 @@ package cn.bunny.services.controller;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateByIdWithRankDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.result.PageResult;
@ -80,6 +81,13 @@ public class RouterController {
return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS));
}
@Operation(summary = "快速更新菜单排序", description = "快速更新菜单排序")
@PutMapping("updateMenuByIdWithRank")
public Mono<Result<String>> updateMenuByIdWithRank(@Valid @RequestBody RouterUpdateByIdWithRankDto dto) {
routerService.updateMenuByIdWithRank(dto);
return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS));
}
@Operation(summary = "删除路由菜单", description = "删除路由菜单")
@DeleteMapping("deletedMenuByIds")
public Mono<Result<String>> deletedMenuByIds(@RequestBody List<Long> ids) {

View File

@ -1,8 +1,8 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.quartz.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.SchedulersDto;
import cn.bunny.dao.dto.quartz.SchedulersOperationDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersDto;
import cn.bunny.dao.entity.quartz.Schedulers;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;

View File

@ -1,8 +1,8 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.quartz.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupUpdateDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupUpdateDto;
import cn.bunny.dao.entity.quartz.SchedulersGroup;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;

View File

@ -0,0 +1,39 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogDto;
import cn.bunny.dao.entity.quartz.QuartzExecuteLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 调度任务执行日志 Mapper 接口
* </p>
*
* @author Bunny
* @since 2024-10-18 12:56:39
*/
@Mapper
public interface QuartzExecuteLogMapper extends BaseMapper<QuartzExecuteLog> {
/**
* * 分页查询调度任务执行日志内容
*
* @param pageParams 调度任务执行日志分页参数
* @param dto 调度任务执行日志查询表单
* @return 调度任务执行日志分页结果
*/
IPage<QuartzExecuteLog> selectListByPage(@Param("page") Page<QuartzExecuteLog> pageParams, @Param("dto") QuartzExecuteLogDto dto);
/**
* 物理删除调度任务执行日志
*
* @param ids 删除 id 列表
*/
void deleteBatchIdsWithPhysics(List<Long> ids);
}

View File

@ -1,6 +1,6 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.quartz.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupDto;
import cn.bunny.dao.entity.quartz.SchedulersGroup;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -1,6 +1,6 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.quartz.SchedulersDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersDto;
import cn.bunny.dao.entity.quartz.Schedulers;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -0,0 +1,35 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogDto;
import cn.bunny.dao.entity.quartz.QuartzExecuteLog;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.QuartzExecuteLogVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 调度任务执行日志 服务类
* </p>
*
* @author Bunny
* @since 2024-10-18 12:56:39
*/
public interface QuartzExecuteLogService extends IService<QuartzExecuteLog> {
/**
* * 获取调度任务执行日志列表
*
* @return 调度任务执行日志返回列表
*/
PageResult<QuartzExecuteLogVo> getQuartzExecuteLogList(Page<QuartzExecuteLog> pageParams, QuartzExecuteLogDto dto);
/**
* * 删除|批量删除调度任务执行日志类型
*
* @param ids 删除id列表
*/
void deleteQuartzExecuteLog(List<Long> ids);
}

View File

@ -2,6 +2,7 @@ package cn.bunny.services.service;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateByIdWithRankDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.result.PageResult;
@ -65,4 +66,11 @@ public interface RouterService extends IService<Router> {
* @param ids 删除id列表
*/
void deletedMenuByIds(List<Long> ids);
/**
* * 快速更新菜单排序
*
* @param dto 根据菜单Id更新菜单排序
*/
void updateMenuByIdWithRank(RouterUpdateByIdWithRankDto dto);
}

View File

@ -1,8 +1,8 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.quartz.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupUpdateDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupUpdateDto;
import cn.bunny.dao.entity.quartz.SchedulersGroup;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.SchedulersGroupVo;

View File

@ -1,8 +1,8 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.quartz.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.SchedulersDto;
import cn.bunny.dao.dto.quartz.SchedulersOperationDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersDto;
import cn.bunny.dao.entity.quartz.Schedulers;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.SchedulersVo;

View File

@ -0,0 +1,63 @@
package cn.bunny.services.service.impl;
import cn.bunny.dao.dto.quartz.executeLog.QuartzExecuteLogDto;
import cn.bunny.dao.entity.quartz.QuartzExecuteLog;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.QuartzExecuteLogVo;
import cn.bunny.services.mapper.QuartzExecuteLogMapper;
import cn.bunny.services.service.QuartzExecuteLogService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 调度任务执行日志 服务实现类
* </p>
*
* @author Bunny
* @since 2024-10-18 12:56:39
*/
@Service
public class QuartzExecuteLogServiceImpl extends ServiceImpl<QuartzExecuteLogMapper, QuartzExecuteLog> implements QuartzExecuteLogService {
/**
* * 调度任务执行日志 服务实现类
*
* @param pageParams 调度任务执行日志分页查询page对象
* @param dto 调度任务执行日志分页查询对象
* @return 查询分页调度任务执行日志返回对象
*/
@Override
public PageResult<QuartzExecuteLogVo> getQuartzExecuteLogList(Page<QuartzExecuteLog> pageParams, QuartzExecuteLogDto dto) {
// 分页查询菜单图标
IPage<QuartzExecuteLog> page = baseMapper.selectListByPage(pageParams, dto);
List<QuartzExecuteLogVo> voList = page.getRecords().stream().map(quartzExecuteLog -> {
QuartzExecuteLogVo quartzExecuteLogVo = new QuartzExecuteLogVo();
BeanUtils.copyProperties(quartzExecuteLog, quartzExecuteLogVo);
return quartzExecuteLogVo;
}).toList();
return PageResult.<QuartzExecuteLogVo>builder()
.list(voList)
.pageNo(page.getCurrent())
.pageSize(page.getSize())
.total(page.getTotal())
.build();
}
/**
* 删除|批量删除调度任务执行日志
*
* @param ids 删除id列表
*/
@Override
public void deleteQuartzExecuteLog(List<Long> ids) {
baseMapper.deleteBatchIdsWithPhysics(ids);
}
}

View File

@ -4,6 +4,7 @@ import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateByIdWithRankDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
@ -221,4 +222,23 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
baseMapper.deleteBatchIdsWithPhysics(ids);
}
/**
* * 快速更新菜单排序
*
* @param dto 根据菜单Id更新菜单排序
*/
@Override
public void updateMenuByIdWithRank(RouterUpdateByIdWithRankDto dto) {
Router router = getOne(Wrappers.<Router>lambdaQuery().eq(Router::getId, dto.getId()));
// 判断更新数据是否存在
if (router == null) throw new BunnyException(ResultCodeEnum.DATA_NOT_EXIST);
// 更新排序
router = new Router();
router.setId(dto.getId());
router.setRouterRank(dto.getRouterRank());
updateById(router);
}
}

View File

@ -1,8 +1,8 @@
package cn.bunny.services.service.impl;
import cn.bunny.dao.dto.quartz.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.SchedulersGroupUpdateDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupAddDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupDto;
import cn.bunny.dao.dto.quartz.scheduleGroup.SchedulersGroupUpdateDto;
import cn.bunny.dao.entity.quartz.SchedulersGroup;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.SchedulersGroupVo;

View File

@ -1,9 +1,9 @@
package cn.bunny.services.service.impl;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.quartz.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.SchedulersDto;
import cn.bunny.dao.dto.quartz.SchedulersOperationDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersAddDto;
import cn.bunny.dao.dto.quartz.schedule.SchedulersDto;
import cn.bunny.dao.entity.quartz.Schedulers;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.quartz.SchedulersVo;

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bunny.services.mapper.QuartzExecuteLogMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.dao.entity.quartz.QuartzExecuteLog">
<id column="id" property="id"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
<id column="create_user" property="createUser"/>
<id column="update_user" property="updateUser"/>
<id column="is_deleted" property="isDeleted"/>
<id column="job_name" property="jobName"/>
<id column="job_group" property="jobGroup"/>
<id column="job_class_name" property="jobClassName"/>
<id column="cron_expression" property="cronExpression"/>
<id column="trigger_name" property="triggerName"/>
<id column="execute_result" property="executeResult"/>
<id column="duration" property="duration"/>
<id column="end_time" property="endTime"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, create_time, update_time, create_user, update_user, is_deleted, job_name, job_group, job_class_name, cron_expression, trigger_name, execute_result, duration, end_time
</sql>
<!-- 分页查询调度任务执行日志内容 -->
<select id="selectListByPage" resultType="cn.bunny.dao.entity.quartz.QuartzExecuteLog">
select
<include refid="Base_Column_List"/>
from quartz_execute_log
<where>
<if test="dto.jobName != null and dto.jobName != ''">
and job_name like CONCAT('%',#{dto.jobName},'%')
</if>
<if test="dto.jobGroup != null and dto.jobGroup != ''">
and job_group like CONCAT('%',#{dto.jobGroup},'%')
</if>
<if test="dto.jobClassName != null and dto.jobClassName != ''">
and job_class_name like CONCAT('%',#{dto.jobClassName},'%')
</if>
<if test="dto.cronExpression != null and dto.cronExpression != ''">
and cron_expression like CONCAT('%',#{dto.cronExpression},'%')
</if>
<if test="dto.triggerName != null and dto.triggerName != ''">
and trigger_name like CONCAT('%',#{dto.triggerName},'%')
</if>
<if test="dto.endTime != null and dto.endTime != ''">
and end_time like CONCAT('%',#{dto.endTime},'%')
</if>
</where>
order by update_time desc
</select>
<!-- 物理删除调度任务执行日志 -->
<delete id="deleteBatchIdsWithPhysics">
delete
from quartz_execute_log
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -1,35 +0,0 @@
package cn.bunny.service;
import java.util.HashSet;
import java.util.Set;
class Solution {
public int longestConsecutive(int[] nums) {
if (nums.length == 0) {
return 0;
}
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int longestStreak = 0;
for (int num : numSet) {
if (!numSet.contains(num - 1)) {
int currentStreak = 1;
while (numSet.contains(num + 1)) {
num++;
currentStreak++;
}
// 更新最长连续序列长度
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
}