From 73b10859259f5439f3c79d0475d20f7a2dfbfce8 Mon Sep 17 00:00:00 2001 From: dengqichen Date: Tue, 1 Jul 2025 14:39:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BB=B6=E6=9C=9F=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- pom.xml | 24 ++++++++ .../service/ZentaoTaskReminderService.java | 56 +++++++++++++++++-- src/main/resources/application-local.yml | 2 +- src/main/resources/application-prod.yml | 2 +- .../service/TaskReminderServiceTest.java | 10 ++-- 6 files changed, 82 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9a1d8c0..5eefda2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: environment: - TZ=Asia/Shanghai volumes: - - ./logs:/app/logs + - /opt/task-reminder/logs:/app/logs networks: default: external: true \ No newline at end of file diff --git a/pom.xml b/pom.xml index a374ad8..ec7af87 100644 --- a/pom.xml +++ b/pom.xml @@ -102,6 +102,10 @@ stop task-reminder-app + + 0 + 1 + @@ -118,6 +122,10 @@ remove task-reminder-app + + 0 + 1 + @@ -134,6 +142,10 @@ rmi 172.22.222.100:28082/task-reminder:1.0.0 + + 0 + 1 + @@ -153,6 +165,10 @@ 172.22.222.100:28082/task-reminder:1.0.0 . + + 0 + 1 + @@ -170,6 +186,10 @@ push 172.22.222.100:28082/task-reminder:1.0.0 + + 0 + 1 + @@ -187,6 +207,10 @@ up -d + + 0 + 1 + diff --git a/src/main/java/com/zeodao/reminder/service/ZentaoTaskReminderService.java b/src/main/java/com/zeodao/reminder/service/ZentaoTaskReminderService.java index 8d822ba..8296f1a 100644 --- a/src/main/java/com/zeodao/reminder/service/ZentaoTaskReminderService.java +++ b/src/main/java/com/zeodao/reminder/service/ZentaoTaskReminderService.java @@ -188,27 +188,39 @@ public class ZentaoTaskReminderService { // 显示真实姓名 String displayName = getDisplayName(items, assignedTo); int totalItems = items.tasks.size() + items.bugs.size(); - message.append(displayName).append(" (").append(totalItems).append("个事项)\n"); + message.append("## ").append(displayName).append(" (").append(totalItems).append("个事项)\n"); // 显示任务 for (ZentaoTask task : items.tasks) { - String statusIcon = task.isOverdue() ? "" : ""; + String statusIcon = task.isOverdue() ? "" : ""; message.append(statusIcon).append(" [TASK-").append(task.getId()).append("] ").append(task.getName()); if (task.getDeadline() != null && !task.getDeadline().isEmpty() && !"0000-00-00".equals(task.getDeadline())) { message.append(" \n截止日期:").append(task.getDeadline()); + if (task.isOverdue()) { + long overdueDays = getOverdueDays(task.getDeadline()); + if (overdueDays > 0) { + message.append(",已延期").append(overdueDays).append("天"); + } + } } message.append("\n"); } // 显示BUG for (ZentaoBug bug : items.bugs) { - String statusIcon = bug.isOverdue() ? "🔴" : "🐛"; + String statusIcon = bug.isOverdue() ? "🔴" : "🐛"; message.append(statusIcon).append(" [BUGFIX-").append(bug.getId()).append("] ").append(bug.getTitle()); if (bug.getSeverity() != null && !bug.getSeverity().isEmpty()) { message.append(" [").append(bug.getSeverityDesc()).append("]"); } if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() && !"0000-00-00".equals(bug.getDeadline())) { message.append(" \n截止日期:").append(bug.getDeadline()); + if (bug.isOverdue()) { + long overdueDays = getOverdueDays(bug.getDeadline()); + if (overdueDays > 0) { + message.append(",已延期").append(overdueDays).append("天"); + } + } } message.append("\n"); } @@ -216,11 +228,29 @@ public class ZentaoTaskReminderService { } // 提示信息 - message.append("请及时登录禅道系统更新状态"); + message.append("\n请及时登录禅道系统更新状态"); return message.toString(); } + /** + * 计算延期天数 + */ + private long getOverdueDays(String deadline) { + if (deadline == null || deadline.isEmpty() || "0000-00-00".equals(deadline)) { + return 0; + } + + try { + LocalDate deadlineDate = LocalDate.parse(deadline); + LocalDate today = LocalDate.now(); + return today.toEpochDay() - deadlineDate.toEpochDay(); + } catch (Exception e) { + logger.debug("Failed to parse deadline: {}", deadline); + return 0; + } + } + /** * 合并任务和BUG按负责人分组 */ @@ -325,7 +355,14 @@ public class ZentaoTaskReminderService { // 截止日期 if (task.getDeadline() != null && !task.getDeadline().isEmpty() && !"0000-00-00".equals(task.getDeadline())) { - message.append(" (").append(task.getDeadline()).append(")"); + message.append(" (").append(task.getDeadline()); + if (task.isOverdue()) { + long overdueDays = getOverdueDays(task.getDeadline()); + if (overdueDays > 0) { + message.append(",已延期").append(overdueDays).append("天"); + } + } + message.append(")"); } message.append("\n"); @@ -392,7 +429,14 @@ public class ZentaoTaskReminderService { // 截止日期 if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() && !"0000-00-00".equals(bug.getDeadline())) { - message.append(" (").append(bug.getDeadline()).append(")"); + message.append(" (").append(bug.getDeadline()); + if (bug.isOverdue()) { + long overdueDays = getOverdueDays(bug.getDeadline()); + if (overdueDays > 0) { + message.append(",已延期").append(overdueDays).append("天"); + } + } + message.append(")"); } message.append("\n"); diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 1e40be2..985a999 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8081 spring: application: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 0d37345..66f3fa6 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -18,7 +18,7 @@ task: - id: "chainhub" name: "一站式平台" webhook: - url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=614b110b-8957-4be8-95b9-4eca84c15028" + url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6c33fed6-c883-493d-a1c3-a7a23b9b4175" task-system: "zentao" # 任务管理系统类型:zentao, smartsheet, jira, trello 等 # 禅道配置 zentao: diff --git a/src/test/java/com/zeodao/reminder/service/TaskReminderServiceTest.java b/src/test/java/com/zeodao/reminder/service/TaskReminderServiceTest.java index f7f5c62..b4f5e58 100644 --- a/src/test/java/com/zeodao/reminder/service/TaskReminderServiceTest.java +++ b/src/test/java/com/zeodao/reminder/service/TaskReminderServiceTest.java @@ -95,7 +95,7 @@ class TaskReminderServiceTest { when(reminderHandlerFactory.getHandler(ScheduleType.MORNING, TaskSystemType.ZENTAO)).thenReturn(reminderHandler); // 执行测试 - taskReminderService.sendReminder("test-group", "morning"); + taskReminderService.sendReminder("test-group", ScheduleType.MORNING); // 验证 verify(reminderHandler, times(1)).handleReminder(eq(testGroup), eq(ScheduleType.MORNING), any(TaskReminderConfig.Schedule.class)); @@ -107,7 +107,7 @@ class TaskReminderServiceTest { when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(true); // 执行测试 - taskReminderService.sendReminder("test-group", "morning"); + taskReminderService.sendReminder("test-group", ScheduleType.MORNING); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); @@ -120,7 +120,7 @@ class TaskReminderServiceTest { when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(true); // 执行测试 - taskReminderService.sendReminder("test-group", "morning"); + taskReminderService.sendReminder("test-group", ScheduleType.MORNING); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); @@ -171,7 +171,7 @@ class TaskReminderServiceTest { when(taskReminderConfig.getGroupById("invalid-group")).thenReturn(null); // 执行测试 - taskReminderService.sendReminder("invalid-group", "morning"); + taskReminderService.sendReminder("invalid-group", ScheduleType.MORNING); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); @@ -184,7 +184,7 @@ class TaskReminderServiceTest { when(enabledCheckService.isReminderEnabled(testGroup, "morning")).thenReturn(false); // 执行测试 - taskReminderService.sendReminder("test-group", "morning"); + taskReminderService.sendReminder("test-group", ScheduleType.MORNING); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString());