|
|
@@ -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("\"", """)
|
|
|
.replace("'", "'");
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化时长,便于阅读
|
|
|
+ */
|
|
|
+ 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);
|
|
|
+ }
|
|
|
}
|