diff --git a/game-server/app/servers/battle/handler/guildTrainHandler.ts b/game-server/app/servers/battle/handler/guildTrainHandler.ts index 08b39cdba..082029d1f 100644 --- a/game-server/app/servers/battle/handler/guildTrainHandler.ts +++ b/game-server/app/servers/battle/handler/guildTrainHandler.ts @@ -42,7 +42,7 @@ export class GuildTrainHandler { } let { trainCount, trainRewards, buyTrainCount } = userGuild; let result:any = getGuildTrainInfo(guildTrain, roleId, trainCount, trainRewards); - result.buyTrainCount = buyTrainCount; + result.buyTrainCount = buyTrainCount||0; result.trainLv = trainLv; return resResult(STATUS.SUCCESS, result); } diff --git a/game-server/app/servers/gm/remote/gmRemote.ts b/game-server/app/servers/gm/remote/gmRemote.ts index 7b8510a29..0f803cbec 100644 --- a/game-server/app/servers/gm/remote/gmRemote.ts +++ b/game-server/app/servers/gm/remote/gmRemote.ts @@ -160,14 +160,14 @@ export class GMRemote { if (!gmMail || !gmMail.goods.length|| gmMail.endTime < nowSeconds()) { return; } - mailGoods.push(...goods); + mailGoods.push(...gmMail.goods); } else { - if (goods.length) + if (!goods.length) return; mailGoods.push(...goods); } mails.push({id: _id, status: MAIL_STATUS.RECEIVED, mailType: MAIL_TYPE.GROUPMAIL}); - groupMailIds.push(ObjectId(_id)); + groupMailIds.push(_id); }); mailRewards.map(({_id, goods, mailId, mailTemType})=>{ if (mailTemType == MAIL_TEM_TYPE.GMTYPE) { @@ -177,12 +177,12 @@ export class GMRemote { } mailGoods.push(...gmMail.goods); } else { - if (goods.length) + if (!goods.length) return; mailGoods.push(...goods); } mails.push({id: _id, status: MAIL_STATUS.RECEIVED, mailType: MAIL_TYPE.SINGLEMAIL}); - mailIds.push(ObjectId(_id)); + mailIds.push(_id); }); return {mailIds, groupMailIds, mails, mailGoods}; } diff --git a/game-server/app/servers/role/handler/mailHandler.ts b/game-server/app/servers/role/handler/mailHandler.ts index 38d0bb951..f378c8efd 100644 --- a/game-server/app/servers/role/handler/mailHandler.ts +++ b/game-server/app/servers/role/handler/mailHandler.ts @@ -58,13 +58,13 @@ export class RoleHandler { let resGroupMailIds = await GroupMailModel.findReadAndRewardsMails(roleId); let groupMailIds = resGroupMailIds.map(({_id})=>{ mails.push({id:_id, status: MAIL_STATUS.DELETE, mailType: MAIL_TYPE.GROUPMAIL}); - return ObjectId(_id); + return _id; }); await GroupMailModel.updateMailStatus(groupMailIds, MAIL_STATUS.DELETE, roleId); let resMailIds = await MailModel.findReadAndRewardsMails(roleId); let mailIds = resMailIds.map(({_id})=>{ mails.push({id: _id, status: MAIL_STATUS.DELETE, mailType: MAIL_TYPE.SINGLEMAIL}); - return ObjectId(_id); + return _id; }); await MailModel.updateMailStatus(mailIds, MAIL_STATUS.DELETE); @@ -106,13 +106,12 @@ export class RoleHandler { } else {//一键领取 let groupMailRewards = await GroupMailModel.findRewardsMails(roleId); let mailRewards = await MailModel.findRewardsMails(roleId); - let { mailGoods: goods, mailIds, groupMailIds, mails: resMails} = await this.app.rpc.gm.gmRemote.getUseMails.toServer('gm-server-1', serverId, groupMailRewards, mailRewards); + let { mailGoods: goods, mailIds, groupMailIds} = await this.app.rpc.gm.gmRemote.getUseMails.toServer('gm-server-1', serverId, groupMailRewards, mailRewards); mailGoods = goods; - mails = resMails; - if (!!mailIds.length) - await GroupMailModel.updateMailStatus(mailIds, MAIL_STATUS.RECEIVED, roleId); if (!!groupMailIds.length) - await MailModel.updateMailStatus(groupMailIds, MAIL_STATUS.RECEIVED); + mails = await GroupMailModel.updateMailStatus(groupMailIds, MAIL_STATUS.RECEIVED, roleId); + if (!!mailIds.length) + mails = await MailModel.updateMailStatus(mailIds, MAIL_STATUS.RECEIVED); } let resGoods = []; if (!!mailGoods && !!mailGoods.length) diff --git a/shared/db/GroupMail.ts b/shared/db/GroupMail.ts index c5fb68c4c..714cedb0c 100644 --- a/shared/db/GroupMail.ts +++ b/shared/db/GroupMail.ts @@ -1,8 +1,9 @@ import BaseModel from './BaseModel'; -import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { index, getModelForClass, mongoose, prop, DocumentType } from '@typegoose/typegoose'; import { nowSeconds } from '../pubUtils/timeUtil'; -import { MAIL_STATUS } from '../consts/constModules/mailConst'; - +import { MAIL_STATUS, MAIL_TYPE } from '../consts/constModules/mailConst'; +import { findWhere } from 'underscore'; +const { ObjectId } = mongoose.Types; class RewardInter { id: number; count: number; @@ -82,22 +83,28 @@ export default class GroupMail extends BaseModel { } public static async findReadAndRewardsMails(roleId: string, lean = true) { - const ids: GroupMailType[] = await GroupMailModel.find({ 'sendRoles.roleId': roleId, sendTime:{$lte: nowSeconds()}, $or:[ {$and: [{'sendRoles.status': MAIL_STATUS.READ, goods: []}]}, {'sendRoles.status': MAIL_STATUS.RECEIVED}] }).select('_id').lean(lean); + 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: any[], status: number, roleId: string) { - const count = await GroupMailModel.update({_id: {$in: ids}, 'sendRoles.roleId': roleId, sendTime:{$lte: nowSeconds()}}, { $set:{ 'sendRoles.$.status': status } }); - return count; + 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); + mails.push({id: result._id, status: result.sendRoles[0].status, mailType: MAIL_TYPE.GROUPMAIL}); + } + return mails; } public static async delMail(_id: string, roleId: string, lean = true) { - const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'sendRoles.roleId': roleId, $or:[ {$and: [{'sendRoles.status': MAIL_STATUS.READ, goods: []}]}, {'sendRoles.status': MAIL_STATUS.RECEIVED}], sendTime:{$lte: nowSeconds() }}, { $set:{ 'sendRoles.$.status': MAIL_STATUS.DELETE } }, { new: true }).lean(lean); + 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.roleId': roleId, 'sendRoles.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({ sendRoles: { $elemMatch:{roleId, status:{ $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }} }, sendTime:{$lte: nowSeconds()} }).select('_id goods mailId mailTemType status').lean(lean); return result; } } diff --git a/shared/db/Mail.ts b/shared/db/Mail.ts index 65fcb4134..a4d1ee849 100644 --- a/shared/db/Mail.ts +++ b/shared/db/Mail.ts @@ -1,7 +1,8 @@ import BaseModel from './BaseModel'; -import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { index, getModelForClass, prop, DocumentType, mongoose } from '@typegoose/typegoose'; import { nowSeconds } from '../pubUtils/timeUtil'; -import { MAIL_STATUS } from '../consts/constModules/mailConst'; +import { MAIL_STATUS, MAIL_TYPE } from '../consts/constModules/mailConst'; +const { ObjectId } = mongoose.Types; class RewardInter { @prop({ required: true }) id: number; @@ -81,9 +82,13 @@ export default class Mail extends BaseModel { return ids; } - public static async updateMailStatus(ids: any[], status: number) { - let count = await MailModel.update({ _id: { $in: ids } }, { $set: { status } }); - return count; + public static async updateMailStatus(ids: string[], status: number) { + let mails = []; + for(let id of ids) { + const result: MailType = await MailModel.findOneAndUpdate({_id: id}, { $set:{ 'status': status } }); + mails.push({id: result._id, status: result.status, mailType: MAIL_TYPE.SINGLEMAIL}); + } + return mails; } public static async delMail(_id: string, lean = true) {