malei05 1 月之前
父节点
当前提交
7e22874b34

+ 3 - 3
src/main/java/net/yyc/quartz/entity/JobBriefing.java

@@ -66,7 +66,7 @@ public class JobBriefing {
         /**
          * 下次执行时间
          */
-        private String nextExecuteTime;
+        private LocalDateTime nextExecuteTime;
 
         /**
          * 执行次数
@@ -96,7 +96,7 @@ public class JobBriefing {
         /**
          * 最后执行时间
          */
-        private String lastExecuteTime;
+        private LocalDateTime lastExecuteTime;
 
         /**
          * 最后执行状态
@@ -116,7 +116,7 @@ public class JobBriefing {
     public static class MissedJobInfo {
         private String jobName;
         private String jobGroup;
-        private String nextExecuteTime;
+        private LocalDateTime nextExecuteTime;
         private String remark;
     }
 }

+ 8 - 17
src/main/java/net/yyc/quartz/executor/JobBriefingExecutor.java

@@ -2,15 +2,14 @@ package net.yyc.quartz.executor;
 
 import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
 import lombok.extern.slf4j.Slf4j;
 import net.yyc.quartz.entity.JobBriefing;
 import net.yyc.quartz.service.EmailService;
 import net.yyc.quartz.service.JobBriefingService;
+import net.yyc.quartz.util.DateUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
-import java.time.format.DateTimeFormatter;
-
 /**
  * 每日简报执行器
  * 每天早上9点执行,生成昨日任务执行简报并发送邮件
@@ -25,10 +24,9 @@ public class JobBriefingExecutor {
     @Value("${spring.profiles.active:unknown}")
     private String activeProfile;
 
-    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
     /**
      * 生成并发送每日简报
+     * DATE_FORMATTER
      *
      * @return 执行结果(成功返回"success",失败返回异常信息)
      */
@@ -39,7 +37,7 @@ public class JobBriefingExecutor {
 
             log.info("[简报] 开始构建简报内容");
             String content = buildEmailContent(briefing);
-            String subject = String.format("【%s-定时任务简报】%s", activeProfile, briefing.getReportDate().format(DATE_FORMATTER));
+            String subject = String.format("【%s-定时任务简报】%s", activeProfile, DateUtils.formatLocalDate(briefing.getReportDate()));
 
             log.info("[简报] 准备发送邮件");
             boolean success = emailService.sendBriefing(content, subject);
@@ -63,8 +61,7 @@ public class JobBriefingExecutor {
 
         // 标题
         sb.append("<h2 style='color: #333; margin-bottom: 20px;'>定时任务每日简报</h2>");
-        sb.append(String.format("<p><b>报告日期:</b>%s</p>",
-                briefing.getReportDate().format(DATE_FORMATTER)));
+        sb.append(String.format("<p><b>报告日期:</b>%s</p>", DateUtils.formatLocalDate(briefing.getReportDate())));
 
         // 错过执行告警
         if (!briefing.getMissedJobs().isEmpty()) {
@@ -84,7 +81,7 @@ public class JobBriefingExecutor {
                 sb.append(String.format("<td style='padding: 8px; border: 1px solid #ffc107;'>%s</td>",
                         escapeHtml(job.getJobGroup())));
                 sb.append(String.format("<td style='padding: 8px; border: 1px solid #ffc107;'>%s</td>",
-                        escapeHtml(job.getNextExecuteTime())));
+                        escapeHtml(DateUtils.formatLocalDateTime(job.getNextExecuteTime()))));
                 sb.append(String.format("<td style='padding: 8px; border: 1px solid #ffc107; color: #856404;'>%s</td>",
                         escapeHtml(job.getRemark())));
                 sb.append("</tr>");
@@ -131,12 +128,6 @@ public class JobBriefingExecutor {
             // 格式化平均耗时
             String avgTimeText = formatDuration(job.getAvgExecuteTime());
 
-            // 格式化最后执行时间(只显示月日时分的后19位)
-            String lastExecText = "";
-            if (job.getLastExecuteTime() != null && job.getLastExecuteTime().length() >= 16) {
-                lastExecText = job.getLastExecuteTime().substring(5, 16); // MM-DD HH:mm
-            }
-
             sb.append(String.format("<tr style='%s'>", rowBgColor));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd;'><b>%s</b></td>",
                     escapeHtml(job.getJobName())));
@@ -157,9 +148,9 @@ public class JobBriefingExecutor {
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center;'>%s</td>",
                     avgTimeText));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd;'>%s</td>",
-                    job.getNextExecuteTime() != null ? job.getNextExecuteTime() : "-"));
+                    job.getNextExecuteTime() != null ? DateUtils.formatLocalDateTime(job.getNextExecuteTime()) : "-"));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd;'>%s</td>",
-                    lastExecText));
+                    DateUtils.formatLocalDateTime(job.getLastExecuteTime())));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center; %s'>%s</td>",
                     "失败".equals(job.getLastExecStatus()) ? "color: red; font-weight: bold;" : "color: green;",
                     job.getLastExecStatus() != null ? job.getLastExecStatus() : "-"));

+ 4 - 4
src/main/java/net/yyc/quartz/service/impl/JobBriefingServiceImpl.java

@@ -8,6 +8,7 @@ import net.yyc.quartz.entity.SysJob;
 import net.yyc.quartz.mapper.JobBriefingMapper;
 import net.yyc.quartz.service.JobBriefingService;
 import net.yyc.quartz.service.SysJobService;
+import net.yyc.quartz.util.DateUtils;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -102,14 +103,13 @@ public class JobBriefingServiceImpl implements JobBriefingService {
                     .jobName(jobName)
                     .jobGroup(jobGroup)
                     .jobStatus(sysJob.getJobStatus())
-                    .nextExecuteTime(sysJob.getNextTime() != null
-                            ? sysJob.getNextTime().format(defaultDateTimeFormatter) : null)
+                    .nextExecuteTime(sysJob.getNextTime())
                     .execCount(execCount)
                     .successCount(successCount)
                     .failCount(failCount)
                     .successRate(Math.round(successRate * 100) / 100.0)
                     .avgExecuteTime(avgExecuteTime)
-                    .lastExecuteTime(sysJob.getPreviousTime() != null ? sysJob.getPreviousTime().format(defaultDateTimeFormatter) : "")
+                    .lastExecuteTime(sysJob.getPreviousTime())
                     .lastExecStatus(lastExecStatus)
                     .exceptionInfo(exceptionInfo)
                     .build());
@@ -158,7 +158,7 @@ public class JobBriefingServiceImpl implements JobBriefingService {
                 missed.add(JobBriefing.MissedJobInfo.builder()
                         .jobName(job.getJobName())
                         .jobGroup(job.getJobGroup())
-                        .nextExecuteTime(job.getNextTime() != null ? job.getNextTime().toString() : null)
+                        .nextExecuteTime(job.getNextTime())
                         .remark("下次执行时间已过,请检查任务调度")
                         .build());
             }

+ 25 - 0
src/main/java/net/yyc/quartz/util/DateUtils.java

@@ -0,0 +1,25 @@
+package net.yyc.quartz.util;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class DateUtils {
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    public static String formatLocalDateTime(LocalDateTime localDateTime) {
+        if (localDateTime == null) {
+            return "";
+        }
+        return DATE_TIME_FORMATTER.format(localDateTime);
+    }
+
+    public static String formatLocalDate(LocalDate localDate) {
+        if (localDate == null) {
+            return "";
+        }
+        return DATE_FORMATTER.format(localDate);
+    }
+}