import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { MailType } from './Mail'; import { GroupMailType } from './GroupMail'; import { ServerMailType } from './ServerMail'; import { GM_MAIL_TYPE } from '../consts'; import { MailParam } from '../domain/roleField/mail'; class Reward { @prop({ required: true }) id: number; @prop({ required: true }) count: number; } @index({ roleId: 1 }) export default class GMMailRecord extends BaseModel { @prop({ required: true }) content: string; // 内容 @prop({ required: true }) sendName: string; // 发件人 @prop({ required: true }) sendTime: number; // 发送时间 @prop({ required: true }) endTime: number; // 过期时间 @prop({ required: true, type: Reward }) goods: Reward[]; // 奖励 @prop({ required: true, enum: GM_MAIL_TYPE }) mailType: GM_MAIL_TYPE; @prop({ required: true }) roleIds: string[]; @prop({ required: true }) serverIds: number[]; @prop({ required: true }) mailId: string; /** * @description 创建记录 * @param mailType 邮件类型 * @param mail 邮件 * @param uid 操作人 */ public static async createRecord(mailType: GM_MAIL_TYPE, mail: MailType|GroupMailType|ServerMailType, uid = 1) { const doc = new GMMailRecordModel(); let params = new MailParam(mailType, mail); let roleIds: string[] = [], serverIds: number[] = []; if(mailType == GM_MAIL_TYPE.SINGLE) { roleIds.push((mail).roleId); } else if (mailType == GM_MAIL_TYPE.GROUP) { let roleStatus = (mail).roleStatus; for(let {roleId} of roleStatus) { roleIds.push(roleId); } } else if (mailType == GM_MAIL_TYPE.SERVER) { serverIds.push((mail).serverId) } const update = Object.assign(doc.toJSON(), params, { roleIds, serverIds, mailId: mail._id, createdBy: uid, updatedBy: uid }); delete update._id; let rec: MailType = await GMMailRecordModel.findByIdAndUpdate(doc._id, update, { new: true, upsert: true }).lean(); return rec; } // private static getSearchObj(form: {_id?: string, content?: string}) { // let searchObj = {}; // if(form['_id']) searchObj['_id'] = form._id; // if(form['content']) searchObj['context'] = { $regex: new RegExp(form.content.toString(), 'i') } // return searchObj // } public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: {} = {}) { let searchObj = form; let sort = {}; if(sortField && sortOrder) { if(sortOrder == 'ascend') { sort[sortField] = 1; } else if (sortOrder == 'descend') { sort[sortField] = -1; } } const result: GMMailRecordType[] = await GMMailRecordModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); return result; } } export const GMMailRecordModel = getModelForClass(GMMailRecord); export interface GMMailRecordType extends Pick, keyof GMMailRecord> { }; export type GMMailRecordParam = Partial; // 将所有字段变成可选项