军团活动:排行榜&军功上报
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
|
||||
import { ItemReward } from '../domain/dbGeneral';
|
||||
import { getTodayZeroDate } from '../pubUtils/timeUtil';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
|
||||
|
||||
@index({ code: 1 })
|
||||
export default class GuildActivityRecord extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
code: string; // 本次记录唯一值
|
||||
|
||||
@prop({ required: true })
|
||||
guildCode: string; // 军团code
|
||||
|
||||
@prop({ required: true })
|
||||
serverId: number; // 分服
|
||||
|
||||
@prop({ required: true })
|
||||
aid: number; // 军团活动id
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
isSuccess: boolean; // 是否胜利
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
isCompleted: boolean; // 是否胜利
|
||||
|
||||
@prop({ required: true })
|
||||
rank: number; // 最终排名
|
||||
|
||||
@prop({ required: true, type: String, default: [] })
|
||||
members: string[]; // 参与活动的团员的roleId列表
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
memberCnt: number; // 参加的团员的数量
|
||||
|
||||
@prop({ required: true, type: ()=> ItemReward, default: [] })
|
||||
rewards: ItemReward[]; // 转到拍卖行的道具
|
||||
|
||||
@prop({ required: true })
|
||||
score: number; // 蛮夷入侵总军功
|
||||
|
||||
@prop({ required: true })
|
||||
cityId: number; // 诸侯混战占领了的城池
|
||||
|
||||
@prop({ required: true })
|
||||
damage: number; // 对城门造成的伤害
|
||||
|
||||
@prop({ required: true })
|
||||
raceTime: number; // 粮草先行比赛时间(s)
|
||||
|
||||
@prop({ required: true })
|
||||
distance: number; // 粮草先行最后的距离
|
||||
|
||||
@prop({ required: true })
|
||||
speed: number; // 粮草先行最后的速度(m/s)
|
||||
|
||||
@prop({ required: true })
|
||||
durability: number; // 粮草先行最后的耐久度
|
||||
|
||||
// 每天一条记录
|
||||
public static async getRecord(guildCode: string, serverId: number, aid: number) {
|
||||
let today = getTodayZeroDate();
|
||||
let docs = new GuildActivityRecordModel();
|
||||
let code = genCode(10);
|
||||
let update = Object.assign(docs, { code, guildCode, serverId, aid, createdAt: new Date() })
|
||||
let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate(
|
||||
{ guildCode, createdAt: { $gte: today }},
|
||||
{ $setOnInsert: update },
|
||||
{new: true, upsert: true}).lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const GuildActivityRecordModel = getModelForClass(GuildActivityRecord);
|
||||
|
||||
export interface GuildActivityRecordType extends Pick<DocumentType<GuildActivityRecord>, keyof GuildActivityRecord> { };
|
||||
export type GuildActivityRecordUpdateParam = Partial<GuildActivityRecordType>; // 将所有字段变成可选项
|
||||
+20
-11
@@ -4,7 +4,7 @@ import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typ
|
||||
import User from './User';
|
||||
import { shouldRefresh, reduceCe } from '../pubUtils/util';
|
||||
import { initRoleAtrr } from '../pubUtils/playerCe';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { nowSeconds, getBeforeDayDate } from '../pubUtils/timeUtil';
|
||||
import { Figure } from '../domain/dbGeneral';
|
||||
import { EXTERIOR } from '../pubUtils/dicParam';
|
||||
import Hero from './Hero';
|
||||
@@ -483,7 +483,7 @@ export default class Role extends BaseModel {
|
||||
* @param invitedMembers 当天已邀请过的人
|
||||
*/
|
||||
public static async getInviteList(time: number, serverId: number) {
|
||||
const result = await RoleModel.find({ loginTime: { $gt: time }, hasGuild: false, serverId })
|
||||
const result: RoleType[] = await RoleModel.find({ loginTime: { $gt: time }, hasGuild: false, serverId })
|
||||
.select({roleId: 1, roleName: 1,ce: 1, head: 1, frame: 1, lv: 1,title: 1,job: 1,quitTime: 1, _id: 0})
|
||||
.sort({quitTime: -1, lv: -1, ce: -1})
|
||||
.limit(100).lean({getters: true, virtuals: true});
|
||||
@@ -492,7 +492,7 @@ export default class Role extends BaseModel {
|
||||
|
||||
// 获取好友推荐列表
|
||||
public static async getRecommedList(minLv: number, maxLv: number, time: number) {
|
||||
const result = await RoleModel.find({ loginTime: { $gt: time }, lv: { $gte: minLv, $lte: maxLv } }, { _id: 0 })
|
||||
const result: RoleType[] = await RoleModel.find({ loginTime: { $gt: time }, lv: { $gte: minLv, $lte: maxLv } }, { _id: 0 })
|
||||
.select(ROLE_SELECT.SHOW_FRIEND_APPLY_LIST)
|
||||
.sort({quitTime: -1, lv: -1, ce: -1})
|
||||
.limit(200).lean({ getters: true, virtuals: true });
|
||||
@@ -501,7 +501,7 @@ export default class Role extends BaseModel {
|
||||
|
||||
// 查询玩家
|
||||
public static async searchByNameOrId(value: string) {
|
||||
const result = await RoleModel.find({
|
||||
const result: RoleType[] = await RoleModel.find({
|
||||
$or: [
|
||||
{ roleName: { $regex: new RegExp(value.toString(), 'i') } },
|
||||
{ roleId: value }
|
||||
@@ -521,7 +521,7 @@ export default class Role extends BaseModel {
|
||||
|
||||
// 退出公会
|
||||
public static async quitGuild(roleId: string, now: number) {
|
||||
const result = await RoleModel.findOneAndUpdate({ roleId, hasGuild: true }, { hasGuild: false, guildCode: "", guildName: "", quitGuildTime: now }, { new: true }).lean();
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate({ roleId, hasGuild: true }, { hasGuild: false, guildCode: "", guildName: "", quitGuildTime: now }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -531,35 +531,44 @@ export default class Role extends BaseModel {
|
||||
if(max) {
|
||||
condition['friendCnt'] = {$lte: max - inc};
|
||||
}
|
||||
const result = await RoleModel.findOneAndUpdate(condition, {$inc: { friendCnt: inc }}, {new: true}).lean();
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate(condition, {$inc: { friendCnt: inc }}, {new: true}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
// 增加好友申请数量
|
||||
public static async increaseFriendApplyCnt(roleId: string, inc: number, max: number) {
|
||||
const result = await RoleModel.findOneAndUpdate({ roleId, recFrdApplyCnt: {$lte: max - inc}}, {$inc: { recFrdApplyCnt: inc }}, {new: true}).lean();
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate({ roleId, recFrdApplyCnt: {$lte: max - inc}}, {$inc: { recFrdApplyCnt: inc }}, {new: true}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
// 增加黑名单数量
|
||||
public static async increaseBlockCnt(roleId: string, blockCnt: number, friendCnt: number, maxBlockCnt: number) {
|
||||
const result = await RoleModel.findOneAndUpdate({ roleId, blockCnt: {$lte: maxBlockCnt - blockCnt}}, {$inc: { blockCnt, friendCnt }}, {new: true}).lean();
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate({ roleId, blockCnt: {$lte: maxBlockCnt - blockCnt}}, {$inc: { blockCnt, friendCnt }}, {new: true}).lean();
|
||||
return result;
|
||||
}
|
||||
public static async updatedRoleMailAt(roleId: string, updatedMailAt: number, lean = true) {
|
||||
const result = await RoleModel.findOneAndUpdate({ roleId }, {$set: { updatedMailAt }}, {new: true}).lean(lean);
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate({ roleId }, {$set: { updatedMailAt }}, {new: true}).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async addFigure(roleId: string, id: number, figure: Figure) {
|
||||
const result = await RoleModel.findOneAndUpdate({roleId}, { $pull: { heads: { id: id }, $push: { heads: figure } }}, {new: true}).lean();
|
||||
const result: RoleType = await RoleModel.findOneAndUpdate({roleId}, { $pull: { heads: { id: id }, $push: { heads: figure } }}, {new: true}).lean();
|
||||
return result
|
||||
}
|
||||
|
||||
public static async checkName(roleName: string, serverId: number) {
|
||||
const role = await RoleModel.findOne({ roleName, serverId }).lean();
|
||||
const role: RoleType = await RoleModel.findOne({ roleName, serverId }).lean();
|
||||
return !!role;
|
||||
}
|
||||
|
||||
// 获取战力在中位数的玩家
|
||||
public static async getMedianRole(serverId: number) {
|
||||
let yesterday = getBeforeDayDate(1);
|
||||
const roles: RoleType[] = await RoleModel.find({ serverId, updatedAt: { $gte: new Date(yesterday) } })
|
||||
.select('topLineup')
|
||||
.sort({ ce: -1 }).lean();
|
||||
return roles[Math.floor(roles.length/2)]
|
||||
}
|
||||
}
|
||||
|
||||
export const RoleModel = getModelForClass(Role);
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
import { APP_ID } from './../consts';
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
||||
|
||||
// 暂时服务器列表是从game表取的,之后会转移到使用这张表,目前用作查询该服战力中位数
|
||||
|
||||
/**
|
||||
* 游戏字段接口
|
||||
*/
|
||||
@index({ id: 1 })
|
||||
@modelOptions({schemaOptions: {id: false}})
|
||||
export default class Serverlist extends BaseModel {
|
||||
|
||||
@prop({ required: true, default: 1 })
|
||||
gameId: number; // 游戏id Game表的id
|
||||
|
||||
@prop({ required: true })
|
||||
id: number; // 小区id
|
||||
|
||||
@prop({ required: true })
|
||||
name: string; // 小区区名
|
||||
|
||||
@prop({ required: true })
|
||||
groupId: number; // 大区id
|
||||
|
||||
@prop({ required: true })
|
||||
groupName: string; // 大区区名
|
||||
|
||||
@prop({ required: true })
|
||||
host: string; // pinus连接地址
|
||||
|
||||
@prop({ required: false })
|
||||
port: number; // pinus端口
|
||||
|
||||
@prop({ required: true })
|
||||
serverStatus: number; // 服务器状态
|
||||
|
||||
public get status() {
|
||||
let now = new Date();
|
||||
if( now > this.openTime) {
|
||||
return this.serverStatus;
|
||||
} else {
|
||||
return 3; // 未开服
|
||||
}
|
||||
}
|
||||
|
||||
@prop({ required: true })
|
||||
openTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
createTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
serverType: string;
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
medianCe: number; // 中位数武将战力、缩小10000倍后的结果
|
||||
|
||||
public static async getAllServerList() {
|
||||
let servers: ServerlistType[] = await ServerlistModel.find().lean({ getters: true, virtuals: true });
|
||||
return servers;
|
||||
}
|
||||
|
||||
public static async findByServerId(serverId: number) {
|
||||
let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).select('medianCe').lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async updateByServerId(serverId: number, update: ServerlistUpdate) {
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({id: serverId}, {$set: update}).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async newServer(serverId: number, serverType: string, params: ServerlistUpdate) {
|
||||
const doc = new ServerlistModel();
|
||||
const update = Object.assign(doc.toJSON(), { id: serverId, serverType }, params);
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId, serverType }, {$setOnInsert: update }, {new: true, upsert: true}).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
}
|
||||
|
||||
export const ServerlistModel = getModelForClass(Serverlist);
|
||||
|
||||
export interface ServerlistType extends Pick<DocumentType<Serverlist>, keyof Serverlist>{
|
||||
id: number;
|
||||
};
|
||||
export type ServerlistUpdate = Partial<ServerlistType>; // 将所有字段变成可选项
|
||||
@@ -0,0 +1,97 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
|
||||
import { getTodayZeroDate } from '../pubUtils/timeUtil';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
|
||||
export class Record {
|
||||
@prop({ required: true })
|
||||
round: number; // 第几回合
|
||||
|
||||
@prop({ required: true })
|
||||
dataId: number; // 出兵表上的dataId
|
||||
|
||||
@prop({ required: true })
|
||||
score: number; // 得分
|
||||
}
|
||||
|
||||
@index({ code: 1 })
|
||||
export default class UserGuildActivityRec extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
code: string; // 本次记录唯一值
|
||||
|
||||
@prop({ required: true })
|
||||
sourceCode: string; // 军团记录的code
|
||||
|
||||
@prop({ required: true })
|
||||
roleId: string; // 玩家id
|
||||
|
||||
@prop({ required: true })
|
||||
roleName: string; // 军团唯一记录
|
||||
|
||||
@prop({ required: true })
|
||||
guildCode: string; // 军团code
|
||||
|
||||
@prop({ required: true })
|
||||
serverId: number; // 分服
|
||||
|
||||
@prop({ required: true })
|
||||
aid: number; // 军团活动id
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
isSuccess: boolean; // 是否胜利
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
isCompleted: boolean; // 是否完成结算了
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
rank: number; // 最终排名
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
challengeCnt: number; // 向上累加的挑战次数
|
||||
|
||||
// 南蛮入侵字段
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
heroes: number[]; // 使用的武将
|
||||
|
||||
@prop({ required: true })
|
||||
round: number; // 坚持回合数
|
||||
|
||||
@prop({ required: true })
|
||||
score: number; // 个人总军功
|
||||
|
||||
@prop({ required: true, type: Record })
|
||||
record: Record[]; // 个人总军功
|
||||
|
||||
// 每天一条记录
|
||||
public static async getRecord(roleId: string, roleName: string, guildCode: string, serverId: number, sourceCode: string, heroes: number[], aid: number) {
|
||||
let today = getTodayZeroDate();
|
||||
let docs = new UserGuildActivityRecModel();
|
||||
let code = genCode(10);
|
||||
let update = Object.assign(docs, { code, roleId, roleName, guildCode, serverId, aid });
|
||||
delete update.heroes;
|
||||
let rec: UserGuildActivityRecType = await UserGuildActivityRecModel.findOneAndUpdate(
|
||||
{ roleId, sourceCode, createdAt: { $gte: today }},
|
||||
{ $setOnInsert: update },
|
||||
{new: true, upsert: true}).lean();
|
||||
if(heroes.length > 0 && rec) {
|
||||
rec = await UserGuildActivityRecModel.findOneAndUpdate( { code: rec.code}, { $push: { heroes: { $each: heroes}}}, {new: true}).lean();
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async pushRecord(code: string, records: Record[]) {
|
||||
let rec: UserGuildActivityRec = await UserGuildActivityRecModel.findOneAndUpdate(
|
||||
{ code },
|
||||
{ $push: { record: { $each: records } } },
|
||||
{ new: true }
|
||||
).lean();
|
||||
return rec;
|
||||
}
|
||||
}
|
||||
|
||||
export const UserGuildActivityRecModel = getModelForClass(UserGuildActivityRec);
|
||||
|
||||
export interface UserGuildActivityRecType extends Pick<DocumentType<UserGuildActivityRec>, keyof UserGuildActivityRec> { };
|
||||
export type UserGuildActivityRecUpdateParam = Partial<UserGuildActivityRecType>; // 将所有字段变成可选项
|
||||
Reference in New Issue
Block a user