邮件:修改邮件逻辑

This commit is contained in:
luying
2021-06-28 13:31:29 +08:00
parent 2ffe0f7890
commit 3b1d458a87
29 changed files with 932 additions and 626 deletions
+83 -61
View File
@@ -1,59 +1,97 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import MailTemp from './MailTemp';
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
import { MAIL_STATUS, MAIL_TYPE } from '../consts/constModules/mailConst';
class RewardInter {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
@index({ roleId: 1 })
@index({ roleId: 1, mailId: 1, type: 1 })
export default class Mail extends BaseModel {
export default class Mail extends MailTemp {
@prop({ required: true })
roleId: string;
@prop({ required: true })
mailId: string;
@prop({ required: true, type: RewardInter, default: [], _id: false })
goods: Array<RewardInter>;
@prop({ required: true, default: nowSeconds() })
sendTime: number;
@prop({ required: true, type: String, _id: false})
params: string[];
@prop({ required: true, default: MAIL_STATUS.CREATE })
status: number;
@prop({ required: true })
mailTemType: number; //1:表示从gm下发的邮件,2:表示系统邮件
@prop({ required: true })
sendName: string;
@prop({ required: true })
endTime: number;
public static async addMails(mails: Array<MailType>) {
await MailModel.insertMany(mails);
/**
* @description 根据玩家id获得所有有效邮件
* @param {String} roleId 玩家id
*/
public static async findByRoleId(roleId: string) {
const result: MailType[] = await MailModel.find({
roleId,
status: { $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ, MAIL_STATUS.RECEIVED ] },
sendTime:{ $lte: nowSeconds() }, endTime: { $gte: nowSeconds() }
}).populate('mail').lean();
return result;
}
public static async addMail(params: { roleId: string, goods: Array<RewardInter>, sendName: string, mailId: string, endTime: number, mailTemType: number, params?: string[], sendTime?: number }) {
/**
* @description 创建邮件
* @param {MailTypeParam} params 邮件内容
*/
public static async addMail(params: MailTypeParam) {
const doc = new MailModel();
const mail = Object.assign(doc.toJSON(), params);
await MailModel.create(mail);
return mail;
delete mail._id;
let rec: MailType = await MailModel.findByIdAndUpdate(doc._id, mail, { new: true, upsert: true }).lean();
return rec;
}
public static async getMailsByRoleId(roleId: string, lean = true) {
const result: MailType[] = await MailModel.find({ roleId, status: { $ne: -1 }, sendTime:{$lte: nowSeconds()} }).lean(lean);
/**
* 根据id更新单个邮件状态
* @param _id
* @param status 邮件状态
* @param conditions 可更新邮件状态
*/
public static async updateStatusWithCondition(_id: string, status: MAIL_STATUS, conditions: MAIL_STATUS[]) {
const result: MailType = await MailModel.findOneAndUpdate(
{ _id, status: { $in: conditions }, sendTime:{$lte: nowSeconds()} },
{ $set: { status } }, { new: true }
).lean();
return result;
}
/**
* 根据id更新多条邮件状态
* @param ids
* @param status
* @param lean
*/
public static async updateStatusByIds(ids: string[], status: number, lean = true) {
let mails = [];
for(let id of ids) {
const result: MailType = await MailModel.findOneAndUpdate({_id: id}, { $set:{ 'status': status } }, { new: true }).lean(lean);
mails.push({id: result._id, status: result.status, /* mailType: MAIL_TYPE.SINGLEMAIL */});
}
return mails;
}
/**
* 根据id删除单条邮件
* @param _id
*/
public static async delMailById(_id: string) {
const result: MailType = await MailModel.findOneAndUpdate(
{ _id, $or: [{ $and: [{ status: MAIL_STATUS.READ, hasGoods: false }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} },
{ $set: { status: MAIL_STATUS.DELETE } },
{ new: true }
).lean();
return result;
}
/**
* 根据玩家id批量删除
* @param _id
* @param roleId
*/
public static async delMailsByRoleId(roleId: string) {
const ids: { _id: string }[] = await MailModel.find({ roleId, $or: [{ $and: [{ status: MAIL_STATUS.READ, hasGoods: false }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} }).select('_id').lean();
let result: MailType[] = [];
for(let _id of ids) {
let rec = await MailModel.findByIdAndUpdate(_id, { $set:{ status: MAIL_STATUS.DELETE }}, { new: true }).lean();
result.push(rec);
}
return result;
}
@@ -67,37 +105,21 @@ export default class Mail extends BaseModel {
return result;
}
public static async updateMailByStatus(_id: string, conditions: number[], update: MailTypeParam, lean = true) {
const result: MailType = await MailModel.findOneAndUpdate({ _id, status: { $in: conditions }, sendTime:{$lte: nowSeconds()} }, { $set: update }, { new: true }).lean(lean);
return result;
}
public static async updateMail(_id: string, update: MailTypeParam, lean = true) {
const result: MailType = await MailModel.findOneAndUpdate({ _id, sendTime:{$lte: nowSeconds()} }, { $set: update }, { new: true }).lean(lean);
return result;
}
public static async findReadAndRewardsMails(roleId: string, lean = true) {
const ids: MailType[] = await MailModel.find({ roleId, $or: [{ $and: [{ status: MAIL_STATUS.READ, goods: [] }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} }).select('_id').lean(lean);
return ids;
}
public static async updateMailStatus(ids: string[], status: number, lean = true) {
let mails = [];
for(let id of ids) {
const result: MailType = await MailModel.findOneAndUpdate({_id: id}, { $set:{ 'status': status } }, { new: true }).lean(lean);
mails.push({id: result._id, status: result.status, mailType: MAIL_TYPE.SINGLEMAIL});
}
return mails;
}
public static async delMail(_id: string, lean = true) {
const result: MailType = await MailModel.findOneAndUpdate({ _id, $or: [{ $and: [{ status: MAIL_STATUS.READ, goods: [] }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} }, { $set: { status: MAIL_STATUS.DELETE } }, { new: true }).lean(lean);
return result;
}
/**
* 查询有奖励的邮件
* @param roleId
* @param lean
*/
public static async findRewardsMails(roleId: string, lean = true) {
const result: MailType[] = await MailModel.find({ roleId, status: {$in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }, sendTime:{$lte: nowSeconds()} }).select('_id goods mailId mailTemType status').lean(lean);
const result: MailType[] = await MailModel.find({ roleId, status: {$in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
}