邮件:循环邮件优化
This commit is contained in:
@@ -104,17 +104,7 @@ export class GmHandler {
|
||||
await f.pushToUsers();
|
||||
// await f.saveRecord(uid);
|
||||
}
|
||||
let sendTime = '';
|
||||
if(isPass) {
|
||||
if(timeType == MAIL_TIME_TYPE.IMMEDIATE) {
|
||||
sendTime = moment().format('YYYY-MM-DD HH:mm:ss');
|
||||
} else if (timeType == MAIL_TIME_TYPE.DELAY) {
|
||||
sendTime = moment(startTime * 1000).format('YYYY-MM-DD HH:mm:ss');
|
||||
} else if (timeType == MAIL_TIME_TYPE.CIRCLE) {
|
||||
sendTime = (circleDay == 0?'每天': '每周'+circleDay) + ' ' + circleHour;
|
||||
}
|
||||
}
|
||||
await GMMailModel.updateMailById(id, { status: isPass? GM_MAIL_STATUS.PASS: GM_MAIL_STATUS.NOT_PASS, viewAt: new Date(), viewBy: uid, sendTime }, uid);
|
||||
await GMMailModel.updateMailById(id, { status: isPass? GM_MAIL_STATUS.PASS: GM_MAIL_STATUS.NOT_PASS, viewAt: new Date(), viewBy: uid }, uid);
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ import { RegionModel, RegionType } from '../../../db/Region';
|
||||
import { gameData } from '../../../pubUtils/data';
|
||||
import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist';
|
||||
import { nowSeconds } from '../../../pubUtils/timeUtil';
|
||||
import { GM_MAIL_TYPE, MAIL_TIME_TYPE, REF_CIRCLE_MAIL_TIME } from '../../../consts';
|
||||
import { SendMailFun } from '../../../services/mailService';
|
||||
import { createNewServer, sendOpenServerMail } from '../../../services/gmService';
|
||||
import { initAutoCreateServer, initMaintenance, stopMaintenance } from '../../../services/timeTaskService';
|
||||
import { isNumber } from 'util';
|
||||
|
||||
@@ -55,7 +55,6 @@ export class GuildRefineHandler {
|
||||
let dicGoods = gameData.goods.get(id);
|
||||
if(!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let dicItid = ITID.get(dicGoods.itid);
|
||||
console.log('####', dicItid.type, CONSUME_TYPE.DRAWING)
|
||||
if(!dicItid || dicItid.type != CONSUME_TYPE.DRAWING) return resResult(STATUS.GUILD_CANNOT_REFINE_THIS);
|
||||
|
||||
let { guildCode: code } = userGuild;
|
||||
@@ -66,10 +65,8 @@ export class GuildRefineHandler {
|
||||
let { scienceTrees } = guildRefine;
|
||||
let dicDevelopConsume: DicArmyDevelopConsume;
|
||||
for(let scienceTree of scienceTrees) {
|
||||
console.log('####', scienceTree.endTime)
|
||||
if(scienceTree.endTime && scienceTree.endTime >= nowSeconds()) continue; // 没有炼完
|
||||
let _dicDevelopConsume = getArmyDevelopConsumeById(scienceTree.id);
|
||||
console.log('####', _dicDevelopConsume.quality, dicGoods.quality)
|
||||
if(_dicDevelopConsume.quality != dicGoods.quality) continue; // 品质错误
|
||||
if(!dicDevelopConsume || dicDevelopConsume.qualityLevel < _dicDevelopConsume.qualityLevel) { // 选择等级最高的
|
||||
dicDevelopConsume = _dicDevelopConsume;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -21,7 +21,7 @@ export const TEEN_DAILY_MAX_TIME = 1.5 * 60 * 60; // 未成年人工作日每天
|
||||
export const GUEST_DAY = 15; // 同一设备15天内不得重复体验游客模式
|
||||
|
||||
export const REFRESH_TIME = 5; // 统一一天刷新时间
|
||||
export const REF_CIRCLE_MAIL_TIME = 3; // 统一一天刷新定期邮件时间
|
||||
export const REF_CIRCLE_MAIL_TIME = 6; // 统一一天刷新定期邮件时间
|
||||
export const PUSH_BATCH = 100; // 推送分批人数
|
||||
export const PUSH_INTERVAL = 5 * 1000; // 分批时间,5秒一批
|
||||
|
||||
|
||||
@@ -87,6 +87,9 @@ export default class GMMail extends BaseModel {
|
||||
@prop({ required: true })
|
||||
viewAt: Date; // 审核时间
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
sendTimes: number[]; // 是否已经发件
|
||||
|
||||
@prop({ required: true })
|
||||
sendTime: string; // 发送时间
|
||||
|
||||
@@ -192,6 +195,11 @@ export default class GMMail extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async sendMail(id: string, time: number) {
|
||||
const result: GMMailType = await GMMailModel.findByIdAndUpdate(id, { $push: { sendTimes: time}}, {new: true}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export let GMMailModel: ReturnModelType<typeof GMMail, {}>;
|
||||
|
||||
@@ -124,7 +124,6 @@ export default class UserOrder extends BaseModel {
|
||||
if (form.createTimeStart && form.createTimeEnd) {
|
||||
searchObj['createdAt'] = { $lte: new Date(form.createTimeEnd * 1000), $gte: new Date(form.createTimeStart * 1000) };
|
||||
}
|
||||
console.log('###', searchObj)
|
||||
return searchObj
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user