增加延期信息

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:
- TZ=Asia/Shanghai
volumes:
- ./logs:/app/logs
- /opt/task-reminder/logs:/app/logs
networks:
default:
external: true

24
pom.xml
View File

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

View File

@ -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() ? "<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());
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("</font>\n");
}
// 显示BUG
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());
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("</font>\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");

View File

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

View File

@ -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:

View File

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