增加延期信息

This commit is contained in:
dengqichen 2025-07-01 14:39:22 +08:00
parent 38cbdf6c04
commit 73b1085925
6 changed files with 82 additions and 14 deletions

View File

@ -13,7 +13,7 @@ services:
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
volumes: volumes:
- ./logs:/app/logs - /opt/task-reminder/logs:/app/logs
networks: networks:
default: default:
external: true external: true

24
pom.xml
View File

@ -102,6 +102,10 @@
<argument>stop</argument> <argument>stop</argument>
<argument>task-reminder-app</argument> <argument>task-reminder-app</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
@ -118,6 +122,10 @@
<argument>remove</argument> <argument>remove</argument>
<argument>task-reminder-app</argument> <argument>task-reminder-app</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
@ -134,6 +142,10 @@
<argument>rmi</argument> <argument>rmi</argument>
<argument>172.22.222.100:28082/task-reminder:1.0.0</argument> <argument>172.22.222.100:28082/task-reminder:1.0.0</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
<!-- 在install阶段构建Docker镜像 --> <!-- 在install阶段构建Docker镜像 -->
@ -153,6 +165,10 @@
<argument>172.22.222.100:28082/task-reminder:1.0.0</argument> <argument>172.22.222.100:28082/task-reminder:1.0.0</argument>
<argument>.</argument> <argument>.</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
<!-- 在install阶段推送Docker镜像 --> <!-- 在install阶段推送Docker镜像 -->
@ -170,6 +186,10 @@
<argument>push</argument> <argument>push</argument>
<argument>172.22.222.100:28082/task-reminder:1.0.0</argument> <argument>172.22.222.100:28082/task-reminder:1.0.0</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
@ -187,6 +207,10 @@
<argument>up</argument> <argument>up</argument>
<argument>-d</argument> <argument>-d</argument>
</arguments> </arguments>
<successCodes>
<successCode>0</successCode>
<successCode>1</successCode>
</successCodes>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

View File

@ -188,27 +188,39 @@ public class ZentaoTaskReminderService {
// 显示真实姓名 // 显示真实姓名
String displayName = getDisplayName(items, assignedTo); String displayName = getDisplayName(items, assignedTo);
int totalItems = items.tasks.size() + items.bugs.size(); 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) { for (ZentaoTask task : items.tasks) {
String statusIcon = task.isOverdue() ? "<font color=\"warning\">" : "<font color=\"info\">"; String statusIcon = task.isOverdue() ? "<font color=\"warning\">" : "<font color=\"common\">";
message.append(statusIcon).append(" [TASK-").append(task.getId()).append("] ").append(task.getName()); 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())) { if (task.getDeadline() != null && !task.getDeadline().isEmpty() && !"0000-00-00".equals(task.getDeadline())) {
message.append(" \n截止日期").append(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("</font>\n"); message.append("</font>\n");
} }
// 显示BUG // 显示BUG
for (ZentaoBug bug : items.bugs) { for (ZentaoBug bug : items.bugs) {
String statusIcon = bug.isOverdue() ? "<font color=\"warning\">🔴" : "<font color=\"info\">🐛"; String statusIcon = bug.isOverdue() ? "<font color=\"warning\">🔴" : "<font color=\"common\">🐛";
message.append(statusIcon).append(" [BUGFIX-").append(bug.getId()).append("] ").append(bug.getTitle()); message.append(statusIcon).append(" [BUGFIX-").append(bug.getId()).append("] ").append(bug.getTitle());
if (bug.getSeverity() != null && !bug.getSeverity().isEmpty()) { if (bug.getSeverity() != null && !bug.getSeverity().isEmpty()) {
message.append(" [").append(bug.getSeverityDesc()).append("]"); message.append(" [").append(bug.getSeverityDesc()).append("]");
} }
if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() && !"0000-00-00".equals(bug.getDeadline())) { if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() && !"0000-00-00".equals(bug.getDeadline())) {
message.append(" \n截止日期").append(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("</font>\n"); message.append("</font>\n");
} }
@ -216,11 +228,29 @@ public class ZentaoTaskReminderService {
} }
// 提示信息 // 提示信息
message.append("请及时登录禅道系统更新状态"); message.append("\n请及时登录禅道系统更新状态");
return message.toString(); 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按负责人分组 * 合并任务和BUG按负责人分组
*/ */
@ -325,7 +355,14 @@ public class ZentaoTaskReminderService {
// 截止日期 // 截止日期
if (task.getDeadline() != null && !task.getDeadline().isEmpty() && if (task.getDeadline() != null && !task.getDeadline().isEmpty() &&
!"0000-00-00".equals(task.getDeadline())) { !"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"); message.append("\n");
@ -392,7 +429,14 @@ public class ZentaoTaskReminderService {
// 截止日期 // 截止日期
if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() && if (bug.getDeadline() != null && !bug.getDeadline().isEmpty() &&
!"0000-00-00".equals(bug.getDeadline())) { !"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"); message.append("\n");

View File

@ -1,5 +1,5 @@
server: server:
port: 8080 port: 8081
spring: spring:
application: application:

View File

@ -18,7 +18,7 @@ task:
- id: "chainhub" - id: "chainhub"
name: "一站式平台" name: "一站式平台"
webhook: 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 等 task-system: "zentao" # 任务管理系统类型zentao, smartsheet, jira, trello 等
# 禅道配置 # 禅道配置
zentao: zentao:

View File

@ -95,7 +95,7 @@ class TaskReminderServiceTest {
when(reminderHandlerFactory.getHandler(ScheduleType.MORNING, TaskSystemType.ZENTAO)).thenReturn(reminderHandler); 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)); 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); 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()); verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString());
@ -120,7 +120,7 @@ class TaskReminderServiceTest {
when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(true); 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()); verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString());
@ -171,7 +171,7 @@ class TaskReminderServiceTest {
when(taskReminderConfig.getGroupById("invalid-group")).thenReturn(null); when(taskReminderConfig.getGroupById("invalid-group")).thenReturn(null);
// 执行测试 // 执行测试
taskReminderService.sendReminder("invalid-group", "morning"); taskReminderService.sendReminder("invalid-group", ScheduleType.MORNING);
// 验证不发送消息 // 验证不发送消息
verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString());
@ -184,7 +184,7 @@ class TaskReminderServiceTest {
when(enabledCheckService.isReminderEnabled(testGroup, "morning")).thenReturn(false); when(enabledCheckService.isReminderEnabled(testGroup, "morning")).thenReturn(false);
// 执行测试 // 执行测试
taskReminderService.sendReminder("test-group", "morning"); taskReminderService.sendReminder("test-group", ScheduleType.MORNING);
// 验证不发送消息 // 验证不发送消息
verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString());