邮件:修改邮件逻辑

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
+87 -56
View File
@@ -1,61 +1,94 @@
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';
import { findWhere } from 'underscore';
class RewardInter {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
class SendRole {
class RoleStatus {
@prop({ required: true })
roleId: string;
@prop({ required: true })
status: number;
}
@index({ sendRoles: 1 })
@index({ mailId: 1, type: 1 })
export default class GroupMail extends BaseModel {
@prop({ required: true, type: SendRole, default: [], _id: false })
sendRoles: SendRole[];
@index({ 'roleStatus.roleId': 1 })
export default class GroupMail extends MailTemp {
@prop({ required: true })
mailId: string;
@prop({ required: true, type:RewardInter, default: [], _id: false})
goods: RewardInter[];
@prop({ required: true, type: RoleStatus })
roleStatus: RoleStatus[];
@prop({ required: true, default: nowSeconds() })
sendTime: number;
@prop({ required: true, default: nowSeconds() })
endTime: number;
@prop({ required: true })
params: string[];
@prop({ required: true })
mailTemType: number; //1:表示模板邮件,2:表示系统邮件
@prop({ required: true })
sendName: string;
public static async addGroupMails(mails: Array<GroupMailType>) {
await GroupMailModel.insertMany(mails);
/**
* @description 根据玩家id获得所有有效邮件
* @param {String} roleId 玩家id
*/
public static async findByRoleId(roleId: string) {
const result: GroupMailType[] = await GroupMailModel.find({
'roleStatus.roleId': roleId,
'roleStatus.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 addGroupMail(params:{ sendRoles: SendRole[],mailId: string, mailTemType:number, goods?: Array<RewardInter>, sendName?: string, endTime?:number, sendTime?: number, params?:string[] }) {
/**
* @description 创建邮件
* @param params
*/
public static async addMail(params: GroupMailTypeParam) {
const doc = new GroupMailModel();
const mail = Object.assign(doc.toJSON(), params);
await GroupMailModel.create(mail);
return mail;
delete mail._id;
let rec: GroupMailType = await GroupMailModel.findByIdAndUpdate(doc._id, mail, { new: true, upsert: true }).populate('mail').lean();
return rec;
}
/**
* 根据id删除单条邮件
* @param _id
*/
public static async delMailById(_id: string, roleId: string) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate(
{
_id, sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
},
{ $set:{ 'roleStatus.$.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 GroupMailModel.find( {
sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
},).select('_id').lean();
const result: GroupMailType[] = [];
for(let _id of ids) {
let rec = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId }, { $set:{ 'roleStatus.$.status': MAIL_STATUS.DELETE }}, { new: true }).lean();
result.push(rec);
}
return result;
}
public static async getGroupMailsByRoleId(roleId: string, lean = true) {
const result: GroupMailType[] = await GroupMailModel.find({ 'sendRoles.roleId': roleId, 'sendRoles.status': { $ne: -1}, sendTime:{$lte: nowSeconds()} }).lean(lean);
const result: GroupMailType[] = await GroupMailModel.find({ 'roleStatus.roleId': roleId, 'roleStatus.status': { $ne: -1}, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
@@ -65,7 +98,7 @@ export default class GroupMail extends BaseModel {
}
public static async pushRoleMail( roleId: string, mailId: string, mailTemType: number, lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ mailId, mailTemType, sendTime:{$lte: nowSeconds()} }, {$push: {sendRoles: {roleId, status: 0}}}).lean(lean);
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ mailId, mailTemType, sendTime:{$lte: nowSeconds()} }, {$push: {roleStatus: {roleId, status: 0}}}).lean(lean);
return result;
}
@@ -74,40 +107,38 @@ export default class GroupMail extends BaseModel {
return result;
}
public static async updateMailByStatus(_id: string, roleId: string, status: number, conditions: number[], lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'sendRoles.roleId': roleId,sendTime:{$lte: nowSeconds()}, 'sendRoles.status': {$in: conditions} }, {$set:{ 'sendRoles.$.status': status }}, { new: true }).lean(lean);
public static async updateStatusWithCondition(_id: string, roleId: string, status: number, conditions: number[], lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId, sendTime:{$lte: nowSeconds()}, 'roleStatus.status': {$in: conditions} }, {$set:{ 'roleStatus.$.status': status }}, { new: true }).lean(lean);
return result;
}
public static async deleteMail(_id: string, roleId: string, status: number, lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'sendRoles.roleId': roleId, sendTime:{$lte: nowSeconds()}}, {$set:{ 'sendRoles.$.status': status }}, { new: true }).lean(lean);
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId, sendTime:{$lte: nowSeconds()}}, {$set:{ 'roleStatus.$.status': status }}, { new: true }).lean(lean);
return result;
}
public static async findReadAndRewardsMails(roleId: string, lean = true) {
const ids: GroupMailType[] = await GroupMailModel.find({ sendTime:{$lte: nowSeconds()}, sendRoles: { $elemMatch: { roleId, $or:[ {$and: [{status: MAIL_STATUS.READ}, {goods: []}]},{status: MAIL_STATUS.RECEIVED} ] } } }).select('_id').lean(lean);
const ids: GroupMailType[] = await GroupMailModel.find({ sendTime:{$lte: nowSeconds()}, roleStatus: { $elemMatch: { roleId, $or:[ {$and: [{status: MAIL_STATUS.READ}, { hasGoods: true }]},{status: MAIL_STATUS.RECEIVED} ] } } }).select('_id').lean(lean);
return ids;
}
public static async updateMailStatus(ids: string[], status: number, roleId: string, lean = true) {
public static async updateStatusByIds(ids: string[], status: number, roleId: string, lean = true) {
let mails = [];
for(let id of ids) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({_id: id, "sendRoles.roleId": roleId}, { $set:{ 'sendRoles.$.status': status } }, { new: true }).lean(lean);
let { status: resStatus } = findWhere(result.sendRoles, { roleId });
mails.push({id: result._id, status: resStatus, mailType: MAIL_TYPE.GROUPMAIL});
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({_id: id, "roleStatus.roleId": roleId}, { $set:{ 'roleStatus.$.status': status } }, { new: true }).lean(lean);
let { status: resStatus } = findWhere(result.roleStatus, { roleId });
mails.push({id: result._id, status: resStatus, /*mailType: MAIL_TYPE.GROUPMAIL*/});
}
return mails;
}
public static async delMail(_id: string, roleId: string, lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, sendTime:{ $lte: nowSeconds() },
sendRoles: { $elemMatch: { roleId, $or:[ {$and: [{status: MAIL_STATUS.READ}, {goods: []}]},{status: MAIL_STATUS.RECEIVED} ] } } },
{ $set:{ 'sendRoles.$.status': MAIL_STATUS.DELETE } }, { new: true }).lean(lean);
return result;
}
/**
* 查询有奖励的邮件
* @param roleId
* @param lean
*/
public static async findRewardsMails(roleId: string, lean = true) {
const result: GroupMailType[] = await GroupMailModel.find({ sendRoles: { $elemMatch:{roleId, status:{ $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }} }, sendTime:{$lte: nowSeconds()} }).select('_id goods mailId mailTemType status').lean(lean);
const result: GroupMailType[] = await GroupMailModel.find({ roleStatus: { $elemMatch:{roleId, status:{ $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }} }, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
}