malei05 1 ay önce
ebeveyn
işleme
07b1ce19ff

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

@@ -58,6 +58,16 @@ public class JobBriefing {
          */
         private String jobGroup;
 
+        /**
+         * 任务状态(1已发布 2运行中 3暂停)
+         */
+        private String jobStatus;
+
+        /**
+         * 下次执行时间
+         */
+        private String nextExecuteTime;
+
         /**
          * 执行次数
          */

+ 39 - 6
src/main/java/net/yyc/quartz/executor/JobBriefingExecutor.java

@@ -99,18 +99,20 @@ public class JobBriefingExecutor {
         sb.append("<tr style='background-color: #f5f5f5;'>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: left;'>任务名称</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: left;'>任务组</th>");
+        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>状态</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>执行次数</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>成功</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>失败</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>成功率</th>");
-        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>平均耗时(ms)</th>");
+        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>平均耗时</th>");
+        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>下次执行</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>最后执行</th>");
-        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>状态</th>");
+        sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: center;'>末次结果</th>");
         sb.append("<th style='padding: 8px; border: 1px solid #ddd; text-align: left;'>异常信息</th>");
         sb.append("</tr>");
 
         for (JobBriefing.JobStatInfo job : briefing.getJobStats()) {
-            // 根据状态设置行背景色
+            // 根据失败次数设置行背景色
             String rowBgColor = "";
             if (job.getFailCount() > 0) {
                 rowBgColor = "background-color: #ffebee;"; // 红色背景(失败)
@@ -120,11 +122,28 @@ public class JobBriefingExecutor {
                 rowBgColor = "background-color: #e3f2fd;"; // 蓝色背景(无执行)
             }
 
+            // 格式化任务状态文字
+            String jobStatusText = "";
+            if ("1".equals(job.getJobStatus())) jobStatusText = "已发布";
+            else if ("2".equals(job.getJobStatus())) jobStatusText = "运行中";
+            else if ("3".equals(job.getJobStatus())) jobStatusText = "暂停";
+
+            // 格式化平均耗时
+            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())));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd;'>%s</td>",
                     escapeHtml(job.getJobGroup())));
+            sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center;'>%s</td>",
+                    jobStatusText));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center;'>%d</td>",
                     job.getExecCount()));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center; color: green;'>%d</td>",
@@ -135,10 +154,12 @@ public class JobBriefingExecutor {
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center; %s'>%.2f%%</td>",
                     job.getSuccessRate() < 90 ? "color: orange; font-weight: bold;" : "",
                     job.getSuccessRate()));
-            sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd; text-align: center;'>%d</td>",
-                    job.getAvgExecuteTime()));
+            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() : "-"));
             sb.append(String.format("<td style='padding: 8px; border: 1px solid #ddd;'>%s</td>",
-                    job.getLastExecuteTime() != null ? job.getLastExecuteTime().substring(0, Math.min(19, job.getLastExecuteTime().length())) : ""));
+                    lastExecText));
             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() : "-"));
@@ -166,4 +187,16 @@ public class JobBriefingExecutor {
                 .replace("\"", "&quot;")
                 .replace("'", "&#39;");
     }
+
+    /**
+     * 格式化时长,便于阅读
+     */
+    private String formatDuration(long ms) {
+        if (ms < 0) return "-";
+        if (ms < 1000) return ms + "ms";
+        if (ms < 60000) return String.format("%.1fs", ms / 1000.0);
+        long minutes = ms / 60000;
+        long seconds = (ms % 60000) / 1000;
+        return String.format("%dm%ds", minutes, seconds);
+    }
 }

+ 3 - 3
src/main/java/net/yyc/quartz/service/impl/EmailServiceImpl.java

@@ -8,17 +8,17 @@ import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import javax.mail.internet.MimeMessage;
 
 @Slf4j
 @Service
 @RequiredArgsConstructor
 public class EmailServiceImpl implements EmailService {
-
     private static final String MAIL_TO = "malei@yaoyi.net";
 
-    private final JavaMailSender mailSender;
-
+    @Resource
+    private JavaMailSender mailSender;
     @Value("${spring.mail.username:noreply@yaoyi.net}")
     private String mailFrom;
 

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

@@ -110,6 +110,9 @@ public class JobBriefingServiceImpl implements JobBriefingService {
                     .jobId(jobId)
                     .jobName(jobName)
                     .jobGroup(jobGroup)
+                    .jobStatus(sysJob != null ? sysJob.getJobStatus() : null)
+                    .nextExecuteTime(sysJob != null && sysJob.getNextTime() != null
+                            ? sysJob.getNextTime().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) : null)
                     .execCount(execCount)
                     .successCount(successCount)
                     .failCount(failCount)