diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index f197ca062..69e289170 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -85,6 +85,7 @@ export class GmHandler { } async sendMail(msg: { id: string, mailType: number, roleIds?: string[], serverIds?: number[] }, session: BackendSession) { + const uid: number = session.get('uid') let { id, mailType, roleIds, serverIds } = msg; let f = new SendMailFun(); await f.setWithGmMail(id); @@ -93,6 +94,7 @@ export class GmHandler { } else { await f.sendToServer(serverIds); } + await f.saveRecord(uid); return resResult(STATUS.SUCCESS); } diff --git a/game-server/app/services/mailService.ts b/game-server/app/services/mailService.ts index 98bb190af..47741e700 100644 --- a/game-server/app/services/mailService.ts +++ b/game-server/app/services/mailService.ts @@ -12,6 +12,7 @@ import { GM_MAIL_TYPE, MAIL_STATUS, MAIL_TYPE, SEND_NAME } from "../consts"; import { MailParam } from '../domain/roleField/mail'; import { GMMailType, GMMailModel } from "../db/GMMail"; import { getGuildChannelSid, getWorldChannelSid } from "./chatChannelService"; +import { GMMailRecordModel } from "../db/GMMailRecord"; /** * 获取邮件信息 @@ -69,6 +70,9 @@ export class SendMailFun { private sendTime: number; private endTime: number; private notPush: boolean = false; + private mails: MailType[] = []; + private groupMails: GroupMailType[] = []; + private serverMails: ServerMailType[] = []; // 从dicMail读取数据 public setWithContentId(contentId: MAIL_TYPE, params: { sendName?: string, endTime?: number, params?: string[], goods?: RewardInter[] }) { @@ -126,6 +130,7 @@ export class SendMailFun { let mails = new Map(); for(let roleId of roleIds) { let originMail = await MailModel.addMail({ roleId, ...this.getCreateMailParams() }); + this.mails.push(originMail); let mail = new MailParam(this.mailType, originMail); mails.set(roleId, mail); } @@ -139,6 +144,7 @@ export class SendMailFun { return { roleId, status: MAIL_STATUS.CREATE } }) let originMail = await GroupMailModel.addMail({ roleStatus, ...this.getCreateMailParams() }); + this.groupMails.push(originMail); return new MailParam(this.mailType, originMail); } @@ -148,6 +154,7 @@ export class SendMailFun { for(let serverId of serverIds) { let originMail = await ServerMailModel.addMail({ serverId, ...this.getCreateMailParams() }); mails.set(serverId, new MailParam(this.mailType, originMail)); + this.serverMails.push(originMail); } return mails } @@ -206,4 +213,16 @@ export class SendMailFun { } } } + + public async saveRecord(createUid: number) { + for(let mail of this.mails) { + await GMMailRecordModel.createRecord(GM_MAIL_TYPE.SINGLE, mail, createUid); + } + for(let mail of this.groupMails) { + await GMMailRecordModel.createRecord(GM_MAIL_TYPE.GROUP, mail, createUid); + } + for(let mail of this.serverMails) { + await GMMailRecordModel.createRecord(GM_MAIL_TYPE.SERVER, mail, createUid); + } + } } \ No newline at end of file diff --git a/gm-server/app/controller/mail.ts b/gm-server/app/controller/mail.ts index 02f7f9fc0..f69e47e49 100644 --- a/gm-server/app/controller/mail.ts +++ b/gm-server/app/controller/mail.ts @@ -11,14 +11,27 @@ export default class MailController extends Controller { public async updateGMMail() { const { ctx } = this; - const { _id, content, sendName, sendTime, endTime, useTempTime, continueHour } = ctx.request.body; + const { _id, content, sendName, sendTime, endTime, useTempTime, continueHour, goods } = ctx.request.body; if(!_id) return ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); if(useTempTime) { if(!sendTime || !endTime) return ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); } else { if(!continueHour) return ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); } - ctx.body = await ctx.service.mail.updateGMMail(_id, content, sendName, useTempTime, sendTime, endTime, continueHour); + let updateGoods = []; + try{ + updateGoods = JSON.parse(goods); + } catch(e) { + return ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); + } + ctx.body = await ctx.service.mail.updateGMMail(_id, content, sendName, useTempTime, sendTime, endTime, continueHour, updateGoods); + return + } + + public async getGMMailRecords() { + const { ctx } = this; + const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + ctx.body = await ctx.service.mail.getGMMailRecords(page, pageSize, sortField, sortOrder, form); return } } diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index d570a2de6..09694351b 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -75,4 +75,5 @@ export default (app: Application) => { router.post('/api/mail/getgmmaillist', controller.mail.getGMMailList); router.post('/api/mail/updategmmail', controller.mail.updateGMMail); + router.post('/api/mail/getgmmailrecords', controller.mail.getGMMailRecords); }; diff --git a/gm-server/app/service/Mail.ts b/gm-server/app/service/Mail.ts index 4cfc77cd5..ee28eb0ba 100644 --- a/gm-server/app/service/Mail.ts +++ b/gm-server/app/service/Mail.ts @@ -2,6 +2,8 @@ import { Service } from 'egg'; import { GMMailModel } from '@db/GMMail'; import { STATUS } from '@consts'; +import { GMMailRecordModel } from '@db/GMMailRecord'; +import { RewardInter } from '@pubUtils/interface'; export default class Mail extends Service { @@ -14,13 +16,21 @@ export default class Mail extends Service { }); } - public async updateGMMail(_id: string, content: string, sendName: string, useTempTime: boolean, sendTime: number, endTime: number, continueHour: number) { + public async updateGMMail(_id: string, content: string, sendName: string, useTempTime: boolean, sendTime: number, endTime: number, continueHour: number, goods: RewardInter[]) { const { ctx } = this; if(_id == 'new') { - await GMMailModel.addMail({ content, sendName, useTempTime, sendTime, endTime, continueHour }); + await GMMailModel.addMail({ content, sendName, useTempTime, sendTime, endTime, continueHour, goods }); } else { - await GMMailModel.updateMailById(_id, { content, sendName, useTempTime, sendTime, endTime, continueHour }); + await GMMailModel.updateMailById(_id, { content, sendName, useTempTime, sendTime, endTime, continueHour, goods }); } return ctx.service.utils.resResult(STATUS.SUCCESS); } + + public async getGMMailRecords(page: number, pageSize: number, sortField: string, sortOrder: string, form: {}) { + const { ctx } = this; + const list = await GMMailRecordModel.findByCondition(page, pageSize, sortField, sortOrder, form); + return ctx.service.utils.resResult(STATUS.SUCCESS, { + list + }); + } } \ No newline at end of file diff --git a/shared/db/GMMailRecord.ts b/shared/db/GMMailRecord.ts new file mode 100644 index 000000000..6db4516f3 --- /dev/null +++ b/shared/db/GMMailRecord.ts @@ -0,0 +1,102 @@ + +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; // 将所有字段变成可选项