邮件:循环邮件优化

This commit is contained in:
luying
2022-02-23 20:02:10 +08:00
parent 76fcd98c75
commit e71e1d0850
8 changed files with 43 additions and 35 deletions
+12 -5
View File
@@ -72,14 +72,14 @@ export async function sendMailToGuildByContent(contentId: MAIL_TYPE, guildCode:
class MailTemp {
public code: string;
public gmmail: GMMailTypeParam;
private contentId: MAIL_TYPE = MAIL_TYPE.SEND_MAIL; // 0-读GmMail,1以上读dicMail
private sendName: string = SEND_NAME;
private title: string = SEND_TITLE;
private content: string = '';
private gmmail: GMMailTypeParam;
private hasGoods: boolean = false; // 是否内含奖励
private goods: RewardInter[] = []; // 发送的奖励
private sendTime: number;
public sendTime: number;
private endTime: number;
// 从dicMail读取数据
@@ -148,6 +148,10 @@ export class SendMailFun {
private groupMails: GroupMailType[] = [];
private serverMails: ServerMailType[] = [];
public getMailTemp(code: string) {
return this.mailTemps.get(code);
}
// 从dicMail读取数据
public setWithContentId(contentId: MAIL_TYPE, params: { sendName?: string, params?: string[], goods?: RewardInter[] }) {
let mailTemp = new MailTemp();
@@ -167,29 +171,35 @@ export class SendMailFun {
// 生成单人邮件
public async createSingleMails(code: string, roleIds: string[]) {
let mapTemp = this.mailTemps.get(code);
if(mapTemp.sendTime < nowSeconds()) return;
for(let roleId of roleIds) {
let originMail = await MailModel.addMail({ roleId, ...mapTemp.getCreateMailParams() });
this.mails.push(originMail);
}
await GMMailModel.sendMail(mapTemp.gmmail._id, mapTemp.sendTime);
}
// 生成多人邮件
public async createGroupMails(code: string, roleIds: string[], guildCode?: string) {
let mapTemp = this.mailTemps.get(code);
if(mapTemp.sendTime < nowSeconds()) return;
let roleStatus = roleIds.map(roleId => {
return { roleId, status: MAIL_STATUS.CREATE }
})
let originMail = await GroupMailModel.addMail({ roleStatus, guildCode, ...mapTemp.getCreateMailParams() });
await GMMailModel.sendMail(mapTemp.gmmail._id, mapTemp.sendTime);
this.groupMails.push(originMail);
}
// 生成全服邮件
public async createServerMails(code: string, serverIds: number[]) {
let mapTemp = this.mailTemps.get(code);
if(mapTemp.sendTime < nowSeconds()) return;
for(let serverId of serverIds) {
let originMail = await ServerMailModel.addMail({ serverId, ...mapTemp.getCreateMailParams() });
this.serverMails.push(originMail);
}
await GMMailModel.sendMail(mapTemp.gmmail._id, mapTemp.sendTime);
}
public async setMails(mails: MailType[], groupMails: GroupMailType[], serverMails: ServerMailType[]) {
@@ -206,14 +216,12 @@ export class SendMailFun {
let pushByServerId = new Map<number, MailParam[]>();
for(let mail of this.mails) {
console.log('#####', mail.sendTime)
if(mail.sendTime <= nowSeconds() && mail.endTime > nowSeconds()) {
let mailParam = new MailParam(GM_MAIL_TYPE.SINGLE, mail);
if(!pushByRoleId.has(mail.roleId)) pushByRoleId.set(mail.roleId, []);
pushByRoleId.get(mail.roleId).push(mailParam);
}
}
console.log('#####pushByRoleId', pushByRoleId)
for(let mail of this.groupMails) {
if(mail.sendTime <= nowSeconds() && mail.endTime > nowSeconds()) {
let mailParam = new MailParam(GM_MAIL_TYPE.GROUP, mail);
@@ -238,7 +246,6 @@ export class SendMailFun {
for(let [roleId, mails ] of pushByRoleId) {
let uids = await this.getUids(roleId, myRoleId, mySid);
console.log('###### onMailsAdd', uids, mails);
if(uids.length > 0 && mails.length > 0) {
pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails }), uids);
}
+21 -12
View File
@@ -1,7 +1,7 @@
import { scheduleJob, Job, scheduledJobs, } from 'node-schedule';
import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig';
import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil';
import { nowSeconds, getTimeFun, getSeconds, getZeroPoint } from '../pubUtils/timeUtil';
import { getTodayGuildActivity, gameData } from '../pubUtils/data';
import { pvpSeasonEnd } from './pvpService';
import { getAllOnlineRoles, getAllServers, delGuildActivityRank } from './redisService';
@@ -67,7 +67,7 @@ export async function init() {
scheduleJob('fetchWord', '0 0 4 * * ?', fetch37Words);
// 每天邮件
scheduleJob('circleMail', '0 0 3 * * ?', sendCircleMail);
checkCircleMail();
// 每小时查询邮件推送
checkMailByHour();
@@ -403,18 +403,30 @@ function clearAuctionSchedule() {
// —————————————— 拍卖行 end —————————————— //
// —————————————— 邮件 —————————————— //
let circleMailJob: Job;
async function checkCircleMail() {
if(circleMailJob) {
circleMailJob.cancel();
}
circleMailJob = scheduleJob('circleMail', '0 0 20 * * ?', sendCircleMail);
sendCircleMail();
}
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 { receivers, mailType, sendTimes } = gmmail;
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));
let mapTemp = f.getMailTemp(code);
if(sendTimes.indexOf(mapTemp.sendTime) == -1) {
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();
@@ -433,7 +445,6 @@ async function checkMailByHour() {
}
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();
@@ -460,7 +471,6 @@ async function setMailSchedule(isInit: boolean) {
// 当前时间到下一次定时器之间的定时器
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();
@@ -469,7 +479,6 @@ export async function addMailsToSchedule(mails: MailType[], groupMails: GroupMai
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 () => {