增加延期信息
This commit is contained in:
parent
38cbdf6c04
commit
73b1085925
@ -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
24
pom.xml
@ -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>
|
||||||
|
|||||||
@ -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");
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8081
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user