import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } 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 { @prop({ required: true }) roleId: string; @prop({ required: true }) mailId: string; @prop({ required: true, type: RewardInter, default: [], _id: false }) goods: Array; @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) { await MailModel.insertMany(mails); } public static async addMail(params: { roleId: string, goods: Array, sendName: string, mailId: string, endTime: number, mailTemType: number, params?: string[], sendTime?: number }) { const doc = new MailModel(); const mail = Object.assign(doc.toJSON(), params); await MailModel.create(mail); return mail; } public static async getMailsByRoleId(roleId: string, lean = true) { const result: MailType[] = await MailModel.find({ roleId, status: { $ne: -1 }, sendTime:{$lte: nowSeconds()} }).lean(lean); return result; } public static async getMail(roleId: string, mailId: string, mailTemType: number, lean = true) { const result: MailType = await MailModel.findOne({ roleId, mailId, mailTemType, sendTime:{$lte: nowSeconds()} }).lean(lean); return result; } public static async getMailById(_id: string, lean = true) { const result: MailType = await MailModel.findOne({ _id, sendTime:{$lte: nowSeconds()} }).lean(lean); 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; } 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); return result; } } export const MailModel = getModelForClass(Mail); export interface MailType extends Pick, keyof Mail> { }; export type MailTypeParam = Partial; // 将所有字段变成可选项