邮件:修改邮件逻辑
This commit is contained in:
@@ -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 = '系统';
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>;
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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>; // 将所有字段变成可选项
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user