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());