邮件:修改邮件逻辑

This commit is contained in:
luying
2021-06-28 13:31:29 +08:00
parent 2ffe0f7890
commit 3b1d458a87
29 changed files with 932 additions and 626 deletions
+35 -12
View File
@@ -1,18 +1,41 @@
export const MAIL_STATUS = {
DELETE: -1,
CREATE: 0,
READ: 1,
RECEIVED: 2,
};
export const MAIL_TYPE = {
SINGLEMAIL: 1,
GROUPMAIL: 2,
export enum MAIL_STATUS {
DELETE = -1,
CREATE = 0,
READ = 1,
RECEIVED = 2,
};
export const MAIL_TEM_TYPE = {
GAMEMAIL: 1,
GMTYPE: 2,
};
export const GM_MAIL_TYPE = {
GROUPMAIL: 1, //1:群体邮件
SERVER: 2, //2:分服务器邮件
export enum GM_MAIL_TYPE {
SINGLE = 1, // 单人邮件
GROUP = 2, // 多人邮件
SERVER = 3, // 全服邮件
};
// 邮件内容类型
export enum MAIL_TYPE {
SEND_MAIL = 0,
GUILD_APPLY_REFUSE = 1,
GUILD_BE_IMPEACH = 2,
GUILD_BE_SET_LEADER = 3,
GUILD_BE_KICK = 4,
GUILD_ACTIVE_REWARD = 5,
GUILD_BE_SET_MANAGER = 6,
GUILD_BE_SET_MEMBER = 7,
GUILD_BOSS_OPEN = 8,
GUILD_BOSS_REWARD = 9,
GUILD_TRAIN_REWARD = 10,
WISH_POOL_REWARD = 11,
PVP_RESULT = 12,
PVP_RANK_REWARD = 13,
GUILD_ACTIVITY_REWARD = 14,
GUILD_DIVIDEND = 15, // 拍卖行分红
MONTHLY_REWARD = 16, // 月卡奖品
AUTION_REWARD = 17, // 拍卖行忘领取奖励
};
export const SEND_NAME = '系统';
-21
View File
@@ -476,27 +476,6 @@ export const EQUIP_STRENGTHEN_TYPE = {
ALL_QUICK: 3 // 武将全部装备栏一键强化
}
// 邮件内容类型
export const MAIL_TYPE = {
SEND_MAIL: 0,
GUILD_APPLY_REFUSE: 1,
GUILD_BE_IMPEACH: 2,
GUILD_BE_SET_LEADER: 3,
GUILD_BE_KICK: 4,
GUILD_ACTIVE_REWARD: 5,
GUILD_BE_SET_MANAGER: 6,
GUILD_BE_SET_MEMBER: 7,
GUILD_BOSS_OPEN: 8,
GUILD_BOSS_REWARD: 9,
GUILD_TRAIN_REWARD: 10,
WISH_POOL_REWARD: 11,
PVP_RESULT: 12,
PVP_RANK_REWARD: 13,
GUILD_ACTIVITY_REWARD: 14,
GUILD_DIVIDEND: 15, // 拍卖行分红
MONTHLY_REWARD: 16, // 月卡奖品
};
export const CHAT_SERVER = 'chat-server-1';
export enum FRIEND_RELATION_TYPE {
+1
View File
@@ -10,5 +10,6 @@ export * from './constModules/selectConst';
export * from './constModules/chatConst';
export * from './constModules/httpConst';
export * from './constModules/auctionConst';
export * from './constModules/mailConst';
export * from './statusCode';
export * from './dataName';
+14 -19
View File
@@ -1,29 +1,22 @@
/**
* 邮件的模板,在GM后台能看到的邮件列表
*/
import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
import { GM_MAIL_TYPE } from '../consts/constModules/mailConst';
class RewardInter {
class Reward {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
class SendRole {
@prop({ required: true })
roleId: string;
}
export default class GMMail extends BaseModel {
@prop({ required: true })
serverId: number;
@prop({ required: true, type: SendRole, default:[], _id: false })
sendRoles: SendRole[];
@prop({ required: true, type: RewardInter, default: [], _id: false })
goods: RewardInter[];
@prop({ required: true, type: Reward, default: [], _id: false })
goods: Reward[];
@prop({ required: true, default: nowSeconds() })
sendTime: number;
@@ -37,13 +30,13 @@ export default class GMMail extends BaseModel {
@prop({ required: true })
sendName: string;
@prop({ required: true })
gmMailType: number; //1:群体邮件,2:分服务器邮件
@prop({ required: true, enum: GM_MAIL_TYPE })
mailType: GM_MAIL_TYPE; // 1-单人邮件 2-多人邮件 3-全服邮件
public static async addMail(params: {serverId: number, sendRoles: SendRole[], sendName: string, endTime: number, content: string, gmMailType: number, sendTime?: number, goods?: RewardInter[] }, lean = true) {
public static async addMail(params: GMMailTypeParam) {
const doc = new GMMailModel();
let mail = Object.assign(doc.toJSON(), params);
mail = await GMMailModel.findOneAndUpdate({ _id: mail._id }, { $set: mail }, {upsert: true, new: true}).lean(lean);
mail = await GMMailModel.findOneAndUpdate({ _id: mail._id }, { $set: mail }, {upsert: true, new: true}).lean();
return mail;
}
@@ -66,4 +59,6 @@ export default class GMMail extends BaseModel {
export const GMMailModel = getModelForClass(GMMail);
export interface GMMailType extends Pick<DocumentType<GMMail>, keyof GMMail> { };
export interface GMMailType extends Pick<DocumentType<GMMail>, keyof GMMail> { };
export type GMMailTypeParam = Partial<GMMailType>; // 将所有字段变成可选项
+87 -56
View File
@@ -1,61 +1,94 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
/**
* 多人邮件
*/
import MailTemp from './MailTemp';
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } 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 {
class RoleStatus {
@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[];
@index({ 'roleStatus.roleId': 1 })
export default class GroupMail extends MailTemp {
@prop({ required: true })
mailId: string;
@prop({ required: true, type:RewardInter, default: [], _id: false})
goods: RewardInter[];
@prop({ required: true, type: RoleStatus })
roleStatus: RoleStatus[];
@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<GroupMailType>) {
await GroupMailModel.insertMany(mails);
/**
* @description 根据玩家id获得所有有效邮件
* @param {String} roleId 玩家id
*/
public static async findByRoleId(roleId: string) {
const result: GroupMailType[] = await GroupMailModel.find({
'roleStatus.roleId': roleId,
'roleStatus.status': { $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ, MAIL_STATUS.RECEIVED ] },
sendTime:{ $lte: nowSeconds() }, endTime: { $gte: nowSeconds() }
}).populate('mail').lean();
return result;
}
public static async addGroupMail(params:{ sendRoles: SendRole[],mailId: string, mailTemType:number, goods?: Array<RewardInter>, sendName?: string, endTime?:number, sendTime?: number, params?:string[] }) {
/**
* @description 创建邮件
* @param params
*/
public static async addMail(params: GroupMailTypeParam) {
const doc = new GroupMailModel();
const mail = Object.assign(doc.toJSON(), params);
await GroupMailModel.create(mail);
return mail;
delete mail._id;
let rec: GroupMailType = await GroupMailModel.findByIdAndUpdate(doc._id, mail, { new: true, upsert: true }).populate('mail').lean();
return rec;
}
/**
* 根据id删除单条邮件
* @param _id
*/
public static async delMailById(_id: string, roleId: string) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate(
{
_id, sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
},
{ $set:{ 'roleStatus.$.status': MAIL_STATUS.DELETE } },
{ new: true }
).lean();
return result;
}
/**
* 根据玩家id批量删除
* @param _id
* @param roleId
*/
public static async delMailsByRoleId(roleId: string) {
const ids: { _id: string }[] = await GroupMailModel.find( {
sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
},).select('_id').lean();
const result: GroupMailType[] = [];
for(let _id of ids) {
let rec = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId }, { $set:{ 'roleStatus.$.status': MAIL_STATUS.DELETE }}, { new: true }).lean();
result.push(rec);
}
return result;
}
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);
const result: GroupMailType[] = await GroupMailModel.find({ 'roleStatus.roleId': roleId, 'roleStatus.status': { $ne: -1}, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
@@ -65,7 +98,7 @@ export default class GroupMail extends BaseModel {
}
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);
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ mailId, mailTemType, sendTime:{$lte: nowSeconds()} }, {$push: {roleStatus: {roleId, status: 0}}}).lean(lean);
return result;
}
@@ -74,40 +107,38 @@ export default class GroupMail extends BaseModel {
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);
public static async updateStatusWithCondition(_id: string, roleId: string, status: number, conditions: number[], lean = true) {
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId, sendTime:{$lte: nowSeconds()}, 'roleStatus.status': {$in: conditions} }, {$set:{ 'roleStatus.$.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);
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId, sendTime:{$lte: nowSeconds()}}, {$set:{ 'roleStatus.$.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);
const ids: GroupMailType[] = await GroupMailModel.find({ sendTime:{$lte: nowSeconds()}, roleStatus: { $elemMatch: { roleId, $or:[ {$and: [{status: MAIL_STATUS.READ}, { hasGoods: true }]},{status: MAIL_STATUS.RECEIVED} ] } } }).select('_id').lean(lean);
return ids;
}
public static async updateMailStatus(ids: string[], status: number, roleId: string, lean = true) {
public static async updateStatusByIds(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});
const result: GroupMailType = await GroupMailModel.findOneAndUpdate({_id: id, "roleStatus.roleId": roleId}, { $set:{ 'roleStatus.$.status': status } }, { new: true }).lean(lean);
let { status: resStatus } = findWhere(result.roleStatus, { 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;
}
/**
* 查询有奖励的邮件
* @param roleId
* @param lean
*/
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);
const result: GroupMailType[] = await GroupMailModel.find({ roleStatus: { $elemMatch:{roleId, status:{ $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }} }, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
}
+83 -61
View File
@@ -1,59 +1,97 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import MailTemp from './MailTemp';
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } 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 {
export default class Mail extends MailTemp {
@prop({ required: true })
roleId: string;
@prop({ required: true })
mailId: string;
@prop({ required: true, type: RewardInter, default: [], _id: false })
goods: Array<RewardInter>;
@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<MailType>) {
await MailModel.insertMany(mails);
/**
* @description 根据玩家id获得所有有效邮件
* @param {String} roleId 玩家id
*/
public static async findByRoleId(roleId: string) {
const result: MailType[] = await MailModel.find({
roleId,
status: { $in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ, MAIL_STATUS.RECEIVED ] },
sendTime:{ $lte: nowSeconds() }, endTime: { $gte: nowSeconds() }
}).populate('mail').lean();
return result;
}
public static async addMail(params: { roleId: string, goods: Array<RewardInter>, sendName: string, mailId: string, endTime: number, mailTemType: number, params?: string[], sendTime?: number }) {
/**
* @description 创建邮件
* @param {MailTypeParam} params 邮件内容
*/
public static async addMail(params: MailTypeParam) {
const doc = new MailModel();
const mail = Object.assign(doc.toJSON(), params);
await MailModel.create(mail);
return mail;
delete mail._id;
let rec: MailType = await MailModel.findByIdAndUpdate(doc._id, mail, { new: true, upsert: true }).lean();
return rec;
}
public static async getMailsByRoleId(roleId: string, lean = true) {
const result: MailType[] = await MailModel.find({ roleId, status: { $ne: -1 }, sendTime:{$lte: nowSeconds()} }).lean(lean);
/**
* 根据id更新单个邮件状态
* @param _id
* @param status 邮件状态
* @param conditions 可更新邮件状态
*/
public static async updateStatusWithCondition(_id: string, status: MAIL_STATUS, conditions: MAIL_STATUS[]) {
const result: MailType = await MailModel.findOneAndUpdate(
{ _id, status: { $in: conditions }, sendTime:{$lte: nowSeconds()} },
{ $set: { status } }, { new: true }
).lean();
return result;
}
/**
* 根据id更新多条邮件状态
* @param ids
* @param status
* @param lean
*/
public static async updateStatusByIds(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;
}
/**
* 根据id删除单条邮件
* @param _id
*/
public static async delMailById(_id: string) {
const result: MailType = await MailModel.findOneAndUpdate(
{ _id, $or: [{ $and: [{ status: MAIL_STATUS.READ, hasGoods: false }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} },
{ $set: { status: MAIL_STATUS.DELETE } },
{ new: true }
).lean();
return result;
}
/**
* 根据玩家id批量删除
* @param _id
* @param roleId
*/
public static async delMailsByRoleId(roleId: string) {
const ids: { _id: string }[] = await MailModel.find({ roleId, $or: [{ $and: [{ status: MAIL_STATUS.READ, hasGoods: false }] }, { status: MAIL_STATUS.RECEIVED }], sendTime:{$lte: nowSeconds()} }).select('_id').lean();
let result: MailType[] = [];
for(let _id of ids) {
let rec = await MailModel.findByIdAndUpdate(_id, { $set:{ status: MAIL_STATUS.DELETE }}, { new: true }).lean();
result.push(rec);
}
return result;
}
@@ -67,37 +105,21 @@ export default class Mail extends BaseModel {
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;
}
/**
* 查询有奖励的邮件
* @param roleId
* @param lean
*/
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);
const result: MailType[] = await MailModel.find({ roleId, status: {$in: [ MAIL_STATUS.CREATE, MAIL_STATUS.READ ] }, sendTime:{$lte: nowSeconds()} }).lean(lean);
return result;
}
}
+38
View File
@@ -0,0 +1,38 @@
import BaseModel from './BaseModel';
import { prop, Ref, mongoose } from '@typegoose/typegoose';
import GMMail from './GMMail';
class Reward {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
export default class MailTemp extends BaseModel {
@prop({ required: true })
contentId: number; // dic_email_content.json中的id
@prop({ ref: 'GMMail', type: mongoose.Schema.Types.ObjectId })
mail: Ref<GMMail>;
@prop({ required: true })
sendTime: number;
@prop({ required: true })
endTime: number;
@prop({ required: true, type: String, _id: false})
params: string[];
@prop({ required: true })
sendName: string; // 发件人
@prop({ required: true })
hasGoods: boolean;
@prop({ required: true, type: Reward, default: [], _id: false })
goods: Array<Reward>;
}
+8 -8
View File
@@ -1,13 +1,13 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
class RewardInter {
class Reward {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
class HeroRewardInter {
class HeroReward {
@prop({ required: true })
hid: number;
@prop({ required: true })
@@ -27,10 +27,10 @@ export class HeroScores {
}
export interface pvpUpdate {
rankGoods?:Array<RewardInter>;
rankGoods?:Array<Reward>;
oldSeasonData?: SeasonData;
show?: boolean;
heroGoods?:Array<HeroRewardInter>;
heroGoods?:Array<HeroReward>;
}
class SeasonData {
@@ -73,11 +73,11 @@ export default class PvpSeasonResult extends BaseModel {
@prop({ required: true, default: true })
show: boolean;
@prop({ required: true, type: HeroRewardInter, default: [], _id: false})
heroGoods: Array<HeroRewardInter>;
@prop({ required: true, type: HeroReward, default: [], _id: false})
heroGoods: Array<HeroReward>;
@prop({ required: true, type: RewardInter, default: [], _id: false})
rankGoods: Array<RewardInter>;
@prop({ required: true, type: Reward, default: [], _id: false})
rankGoods: Array<Reward>;
public static async updatePvpSeasonResult(roleId: string, update: pvpUpdate , lean = true) {
let result: PvpSeasonResultType = await PvpSeasonResultModel.findOneAndUpdate({roleId}, {$set: update}, {upsert: true, new: true}).lean(lean);
+138
View File
@@ -0,0 +1,138 @@
/**
*
*/
import MailTemp from './MailTemp';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { nowSeconds } from '../pubUtils/timeUtil';
import { MAIL_STATUS } from '../consts/constModules/mailConst';
class RoleStatus {
@prop({ required: true })
roleId: string;
@prop({ required: true })
status: number;
}
@index({ sendRoles: 1 })
export default class ServerMail extends MailTemp {
@prop({ required: true })
serverId: number;
@prop({ required: true, type: RoleStatus })
roleStatus: RoleStatus[];
@prop({ required: true, type: String })
delRoles: string[];
/**
* @description id获得所有有效邮件
* @param {String} roleId id
* @param {Number} serverId id
*/
public static async findByRoleId(roleId: string, serverId: number) {
const result: ServerMailType[] = await ServerMailModel.find({
serverId,
delRoles: { $ne: roleId },
sendTime:{ $lte: nowSeconds() }, endTime: { $gte: nowSeconds() }
}).populate('mail').lean();
return result;
}
/**
* @description
* @param params
*/
public static async addMail(params: ServerMailTypeParam) {
const doc = new ServerMailModel();
const mail = Object.assign(doc.toJSON(), params);
delete mail._id;
let rec: ServerMailType = await ServerMailModel.findByIdAndUpdate(doc._id, mail, { new: true, upsert: true }).lean();
return rec;
}
/**
* id删除单条邮件
* @param _id
* @param lean
*/
public static async delMailById(_id: string, roleId: string) {
const result: ServerMailType = await ServerMailModel.findOneAndUpdate(
{
sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
},
{ $set:{ 'roleStatus.$.status': MAIL_STATUS.DELETE, $push: { 'delRoles': roleId } } },
{ new: true }
).lean();
return result;
}
/**
* id批量删除
* @param _id
* @param roleId
*/
public static async delMailsByRoleId(roleId: string) {
const ids: { _id: string }[] = await ServerMailModel.find(
{
sendTime:{ $lte: nowSeconds() },
$or: [{
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.READ}}, hasGoods:false
}, {
roleStatus: {$elemMatch: {roleId, status: MAIL_STATUS.RECEIVED}}, hasGoods: true
}]
}
).select('_id').lean();
let result: ServerMailType[] = [];
for(let _id of ids) {
let rec = await ServerMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId }, { $set:{ 'roleStatus.$.status': MAIL_STATUS.DELETE }, $push: { delRoles: roleId }}, { new: true }).lean();
result.push(rec);
}
return result;
}
public static async updateStatusWithCondition(_id: string, roleId: string, status: number, conditions: number[], servermail?: ServerMailType) {
if(!servermail) servermail = await ServerMailModel.findById(_id).lean();
let { roleStatus } = servermail;
let hasRole = roleStatus.find(cur => cur.roleId == roleId);
let myStatus = hasRole?hasRole.status: MAIL_STATUS.CREATE;
if(conditions.indexOf(myStatus) == -1) return null;
if(hasRole) {
servermail = await ServerMailModel.findOneAndUpdate({ _id, 'roleStatus.roleId': roleId }, { $set: { 'roleStatus.$.status': status } }, {new: true}).lean();
} else {
servermail = await ServerMailModel.findByIdAndUpdate(_id, { $push: { roleStatus: { roleId, status } } }, {new: true}).lean();
}
return servermail
}
/**
*
* @param roleId
* @param lean
*/
public static async findRewardsMails(serverId: number, roleId: string, lean = true) {
const allMails: ServerMailType[] = await ServerMailModel.find({ serverId, sendTime:{$lte: nowSeconds()} }).lean(lean);
let result: ServerMailType[] = [];
for(let mail of allMails) {
let { roleStatus } = mail;
let hasRole = roleStatus.find(cur => cur.roleId == roleId);
if(hasRole) {
if(hasRole.status == MAIL_STATUS.CREATE || hasRole.status == MAIL_STATUS.READ) {
result.push(mail);
}
} else {
result.push(mail);
}
}
return result;
}
}
export const ServerMailModel = getModelForClass(ServerMail);
export interface ServerMailType extends Pick<DocumentType<ServerMail>, keyof ServerMail>{}
export type ServerMailTypeParam = Partial<ServerMailType>; // 将所有字段变成可选项
+95
View File
@@ -0,0 +1,95 @@
import { GM_MAIL_TYPE, MAIL_TYPE, MAIL_STATUS, SEND_NAME } from "../../consts";
import { ItemReward } from '../dbGeneral';
import { MailType } from "../../db/Mail";
import { GroupMailType } from "../../db/GroupMail";
import { ServerMailType } from '../../db/ServerMail';
import { GMMailType } from "../../db/GMMail";
import { gameData } from "../../pubUtils/data";
export class MailParam {
id: string; // mongodb生成objectId
mailType: GM_MAIL_TYPE; // 邮件类型
sendName: string = ''; // 发件人
content: string = ''; // 内容
sendTime: number = 0; // 发送时间
endTime: number = 0; // 过期时间
goods: ItemReward[] = []; // 奖励
status: MAIL_STATUS = MAIL_STATUS.CREATE; // 状态
constructor(mailType: GM_MAIL_TYPE, mail: MailType|GroupMailType|ServerMailType, roleId?: string) {
this.setMail(mailType, mail);
if(mailType == GM_MAIL_TYPE.SINGLE) {
this.setSingleMail(<MailType>mail, roleId);
} else if (mailType == GM_MAIL_TYPE.GROUP) {
this.setGroupMail(<GroupMailType>mail, roleId);
} else if (mailType == GM_MAIL_TYPE.SERVER) {
this.setServerMail(<ServerMailType>mail, roleId);
}
}
setMail(mailType: GM_MAIL_TYPE, mail: MailType|GroupMailType|ServerMailType) {
this.id = mail._id;
this.mailType = mailType;
this.sendTime = mail.sendTime;
this.endTime = mail.endTime;
}
setSingleMail(mail: MailType, roleId?: string) {
this.setContent(mail);
if(roleId != undefined) {
if(mail.roleId == roleId) {
this.status = mail.status;
} else {
this.status = MAIL_STATUS.DELETE;
}
}
}
setGroupMail(mail: GroupMailType, roleId?: string) {
this.setContent(mail);
if(roleId != undefined) {
let { roleStatus } = mail;
let myRoleStatus = roleStatus.find(cur => cur.roleId == roleId);
if(myRoleStatus) {
this.status = myRoleStatus.status;
} else {
this.status = MAIL_STATUS.DELETE;
}
}
}
setServerMail(mail: ServerMailType, roleId?: string) {
this.setContent(mail);
if(roleId != undefined) {
let { delRoles, roleStatus } = mail;
if(delRoles.indexOf(roleId) == -1) {
let myRoleStatus = roleStatus.find(cur => cur.roleId == roleId);
if(myRoleStatus) {
this.status = myRoleStatus.status;
} else {
this.status = MAIL_STATUS.CREATE;
}
} else {
this.status = MAIL_STATUS.DELETE;
}
}
}
setContent(mail: MailType|GroupMailType|ServerMailType) {
let { contentId = 0, params, goods, sendName } = mail;
let dicMail = gameData.mail.get(contentId);
if(!dicMail) dicMail = gameData.mail.get(0);
this.content = this.getContent(dicMail.content, params);
this.sendName = sendName||SEND_NAME;
this.goods = goods;
}
getContent(content: string, params: string[]) {
if(!content) content = '%d';
for(let p of params) {
content = content.replace(/%d/, p);
}
return content
}
}
+1 -1
View File
@@ -15,7 +15,7 @@ export function loadMail() {
let arr = readFileAndParse(FILENAME.DIC_MAIL);
arr.forEach(o => {
o.time = o.time * 24 * 60 * 60;
o.time = o.time * 60 * 60;
dicMail.set(o.id, o);
});
arr = undefined;