collect-system/apps/server/src/tasks/reminder/reminder.service.ts

82 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-12-30 08:26:40 +08:00
/**
* @file reminder.service.ts
* @description ,
* @author xxx
* @date 2023-xx-xx
*/
import { Injectable, Logger } from '@nestjs/common';
import dayjs from 'dayjs';
2024-12-30 09:22:38 +08:00
2024-12-30 08:26:40 +08:00
import { MessageService } from '@server/models/message/message.service';
/**
*
*/
@Injectable()
export class ReminderService {
/**
*
* @private
*/
private readonly logger = new Logger(ReminderService.name);
/**
*
* @param messageService
*/
constructor(private readonly messageService: MessageService) { }
/**
*
* @param totalDays
* @returns
*/
generateReminderTimes(totalDays: number): number[] {
// 如果总天数小于3天则不需要提醒
if (totalDays < 3) return [];
// 使用Set存储提醒时间点,避免重复
const reminders: Set<number> = new Set();
// 按照2的幂次方划分时间点
for (let i = 1; i <= totalDays / 2; i++) {
reminders.add(Math.ceil(totalDays / Math.pow(2, i)));
}
// 将Set转为数组并升序排序
return Array.from(reminders).sort((a, b) => a - b);
}
/**
*
* @param createdAt
* @param deadline
* @returns
*/
shouldSendReminder(createdAt: Date, deadline: Date) {
// 获取当前时间
const now = dayjs();
const end = dayjs(deadline);
// 计算总时间和剩余时间(天)
const totalTimeDays = end.diff(createdAt, 'day');
const timeLeftDays = end.diff(now, 'day');
if (totalTimeDays > 1) {
// 获取提醒时间点
const reminderTimes = this.generateReminderTimes(totalTimeDays);
// 如果剩余时间在提醒时间点内,则需要提醒
if (reminderTimes.includes(timeLeftDays)) {
return { shouldSend: true, timeLeft: timeLeftDays };
}
}
return { shouldSend: false, timeLeft: timeLeftDays };
}
/**
*
*/
async remindDeadline() {
2024-12-30 09:22:38 +08:00
this.logger.log('开始检查截止日期以发送提醒。');
2024-12-30 08:26:40 +08:00
2024-12-30 09:22:38 +08:00
2024-12-30 08:26:40 +08:00
}
}