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'; import { findWhere } from 'underscore'; class RewardInter { @prop({ required: true }) id: number; @prop({ required: true }) count: number; } class SendRole { @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[]; @prop({ required: true }) mailId: string; @prop({ required: true, type:RewardInter, default: [], _id: false}) goods: RewardInter[]; @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) { await GroupMailModel.insertMany(mails); } public static async addGroupMail(params:{ sendRoles: SendRole[],mailId: string, mailTemType:number, goods?: Array, sendName?: string, endTime?:number, sendTime?: number, params?:string[] }) { const doc = new GroupMailModel(); const mail = Object.assign(doc.toJSON(), params); await GroupMailModel.create(mail); return mail; } 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); return result; } public static async getMail( mailId: string, mailTemType: number, lean = true) { const result: GroupMailType = await GroupMailModel.findOne({ mailId, mailTemType, sendTime:{$lte: nowSeconds()} }).lean(lean); return result; } 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); return result; } public static async getMailById(_id: string, lean = true) { const result: GroupMailType = await GroupMailModel.findOne({ _id, sendTime:{$lte: nowSeconds()} }).lean(lean); 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); 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); 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); return ids; } public static async updateMailStatus(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}); } 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; } 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); return result; } } export const GroupMailModel = getModelForClass(GroupMail); export interface GroupMailType extends Pick, keyof GroupMail>{} export type GroupMailTypeParam = Partial; // 将所有字段变成可选项