邮件:定时邮件优化
This commit is contained in:
@@ -32,6 +32,9 @@ import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
||||
import { RegionModel, RegionType } from '../db/Region';
|
||||
import { CreateServerParam } from '../domain/backEndField/params';
|
||||
import { infologger } from '../util/logger';
|
||||
import { MailModel, MailType } from '../db/Mail';
|
||||
import { GroupMailModel, GroupMailType } from '../db/GroupMail';
|
||||
import { ServerMailModel, ServerMailType } from '../db/ServerMail';
|
||||
|
||||
const PER_SECOND = 1 * 1000;
|
||||
const PER_DAY = 24 * 60 * 60;
|
||||
@@ -65,6 +68,8 @@ export async function init() {
|
||||
|
||||
// 每天邮件
|
||||
scheduleJob('circleMail', '0 0 3 * * ?', sendCircleMail);
|
||||
// 每小时查询邮件推送
|
||||
checkMailByHour();
|
||||
|
||||
// 军团活动排行榜
|
||||
guildActivitySchedule();
|
||||
@@ -400,19 +405,90 @@ function clearAuctionSchedule() {
|
||||
// —————————————— 邮件 —————————————— //
|
||||
async function sendCircleMail() {
|
||||
let gmmails = await GMMailModel.findCircleMails(pinus.app.get('env'));
|
||||
let f = new SendMailFun();
|
||||
for(let gmmail of gmmails) {
|
||||
let { receivers, mailType } = gmmail;
|
||||
let f = new SendMailFun();
|
||||
await f.setWithGmMail(gmmail);
|
||||
|
||||
if (mailType == GM_MAIL_TYPE.SINGLE || mailType == GM_MAIL_TYPE.GROUP) {
|
||||
let roleIds = receivers.map(cur => cur.roleId);
|
||||
await f.sendToUsers(mailType, roleIds);
|
||||
} else {
|
||||
let serverIds = receivers.map(cur => cur.serverId);
|
||||
await f.sendToServer(serverIds);
|
||||
let code = await f.setWithGmMail(gmmail);
|
||||
if(mailType == GM_MAIL_TYPE.SINGLE) {
|
||||
await f.createSingleMails(code, receivers.map(cur => cur.roleId));
|
||||
} else if (mailType == GM_MAIL_TYPE.GROUP) {
|
||||
await f.createGroupMails(code, receivers.map(cur => cur.roleId));
|
||||
} else if (mailType == GM_MAIL_TYPE.SERVER) {
|
||||
await f.createServerMails(code, receivers.map(cur => cur.serverId));
|
||||
}
|
||||
}
|
||||
await f.pushToUsers();
|
||||
}
|
||||
|
||||
let mailByHourJob: Job;
|
||||
async function checkMailByHour() {
|
||||
if(mailByHourJob) {
|
||||
mailByHourJob.cancel();
|
||||
}
|
||||
// 每小时一次,为了和每天循环邮件任务不重复,设在每小时05分
|
||||
mailByHourJob = scheduleJob('setMailTimerByHour', '0 5 0/1 * * ?', async () => {
|
||||
await setMailSchedule(false)
|
||||
});
|
||||
setMailSchedule(true); // 初始时候启动一次
|
||||
}
|
||||
|
||||
async function setMailSchedule(isInit: boolean) {
|
||||
console.log('####### setMailSchedule')
|
||||
let minuteNow = moment().minute();
|
||||
let beforeTime = minuteNow >= 5? moment().minute(5).unix(): moment().minute(5).add(-1, 'h').unix();
|
||||
let time = minuteNow >= 5? moment().minute(5).add(1, 'h').unix(): moment().minute(5).unix();
|
||||
|
||||
let mails = await MailModel.findByTimeGap(beforeTime, time);
|
||||
let groupMails = await GroupMailModel.findByTimeGap(beforeTime, time);
|
||||
let serverMails = await ServerMailModel.findByTimeGap(beforeTime, time);
|
||||
|
||||
let times: number[] = [];
|
||||
for(let { sendTime } of [...mails, ...groupMails, ...serverMails]) {
|
||||
if(times.indexOf(sendTime) == -1) times.push(sendTime);
|
||||
}
|
||||
|
||||
for(let time of times) {
|
||||
if(Date.now() > time * 1000) {
|
||||
if(!isInit) await pushMailSchedule(time);
|
||||
} else {
|
||||
scheduleJob(`mailPush${time}`, time * 1000, async () => {
|
||||
await pushMailSchedule(time);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 当前时间到下一次定时器之间的定时器
|
||||
export async function addMailsToSchedule(mails: MailType[], groupMails: GroupMailType[], serverMails: ServerMailType[]) {
|
||||
console.log('####### addMailsToSchedule')
|
||||
let minuteNow = moment().minute();
|
||||
let time = minuteNow >= 5? moment().minute(5).add(1, 'h').unix(): moment().minute(5).unix();
|
||||
|
||||
let times: number[] = [];
|
||||
for(let { sendTime } of [...mails, ...groupMails, ...serverMails]) {
|
||||
if(sendTime * 1000 > Date.now() && sendTime < time && times.indexOf(sendTime) == -1) times.push(sendTime);
|
||||
}
|
||||
|
||||
console.log('#######', times);
|
||||
for(let time of times) {
|
||||
if(!scheduledJobs[`mailPush${time}`]) {
|
||||
scheduleJob(`mailPush${time}`, time * 1000, async () => {
|
||||
await pushMailSchedule(time);
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function pushMailSchedule(time: number) {
|
||||
if(scheduledJobs[`mailPush${time}`]) scheduledJobs[`mailPush${time}`].cancel();
|
||||
|
||||
let mails = await MailModel.findBySendTime(time);
|
||||
let groupMails = await GroupMailModel.findBySendTime(time);
|
||||
let serverMails = await ServerMailModel.findBySendTime(time);
|
||||
|
||||
let f = new SendMailFun();
|
||||
f.setMails(mails, groupMails, serverMails);
|
||||
await f.pushToUsers();
|
||||
}
|
||||
|
||||
// —————————————— 邮件 end —————————————— //
|
||||
|
||||
Reference in New Issue
Block a user