排行榜:奖励显示首通信息

This commit is contained in:
luying
2021-09-09 20:42:05 +08:00
parent 4c42c45fba
commit e859d5c778
11 changed files with 259 additions and 96 deletions

40
shared/db/RankFirst.ts Normal file
View File

@@ -0,0 +1,40 @@
/**
* 秘境首通
*/
import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { RankParam, GuildRankParam } from '../domain/rank';
export default class RankFirst extends BaseModel {
@prop({ required: true })
serverId: number; // 服务器id
@prop({ required: true })
id: number; // 奖励表id
@prop({ required: true })
type: number; // 排行榜id
@prop({ required: true, type: () => RankParam, _id: false })
userInfo: RankParam; // 玩家信息
@prop({ required: true, type: () => GuildRankParam, _id: false })
guildInfo: GuildRankParam; // 军团信息
public static async createRankFirst(serverId: number, id: number, type: number, update: RankFirstUpdateParam) {
const rec: RankFirstType = await RankFirstModel.findOneAndUpdate({ serverId, id, type}, { $setOnInsert: update }, { new: true, upsert: true }).lean();
return rec;
}
public static async findAllRankRewards() {
let rewards: RankFirstType[] = await RankFirstModel.find({}, { _id: false }).select('serverId id type userInfo guildInfo').lean();
return rewards;
}
}
export const RankFirstModel = getModelForClass(RankFirst);
export interface RankFirstType extends Pick<DocumentType<RankFirst>, keyof RankFirst>{}
export type RankFirstUpdateParam = Partial<RankFirstType>; // 将所有字段变成可选项

View File

@@ -66,6 +66,69 @@ export class RankParam {
}
}
export class GuildLeader {
@prop({ required: true })
roleId: string;
@prop({ required: true })
roleName: string;
@prop({ required: true })
title: number;
@prop({ required: true })
lv: number;
@prop({ required: true })
head: number;
@prop({ required: true })
frame: number;
@prop({ required: true })
spine: number;
constructor(leader: { roleId: string, roleName: string, title: number, lv: number, head: number, frame: number, spine: number}) {
this.roleId = leader.roleId;
this.roleName = leader.roleName;
this.title = leader.title;
this.lv = leader.lv;
this.head = leader.head;
this.frame = leader.frame;
this.spine = leader.spine;
}
}
// 排行榜返回玩家值
export class LineupParam {
@prop({ required: true })
hid: number;
@prop({ required: true })
star: number;
@prop({ required: true })
colorStar: number;
@prop({ required: true })
lv: number;
@prop({ required: true })
quality: number;
@prop({ required: true })
job: number;
constructor(hero: HeroType) {
this.hid = hero.hid;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.lv = hero.lv;
this.quality = hero.quality;
this.job = hero.job;
}
}
export class RoleRankInfo extends RankParam {
rank: number = 1;
roleId: string = "";
@@ -94,23 +157,24 @@ export class RoleRankInfo extends RankParam {
}
}
// 公会排行榜返回值
export class GuildRankParam {
@prop({ required: true })
icon: number;
@prop({ required: true })
name: string;
@prop({ required: true })
lv: number;
@prop({ required: true })
memberCnt: number;
leader: {
roleId: string;
roleName: string;
title: number;
lv: number;
head: number;
frame: number;
spine: number;
};
@prop({ required: true, _id: false })
leader: GuildLeader;
@prop({ required: true })
guildCe: number;
constructor(guild: GuildUpdateParam) {
@@ -186,56 +250,6 @@ export class RoleAndGuildRankInfo {
}
}
export class GuildLeader {
roleId: string;
roleName: string;
title: number;
lv: number;
head: number;
frame: number;
spine: number;
constructor(leader: { roleId: string, roleName: string, title: number, lv: number, head: number, frame: number, spine: number}) {
this.roleId = leader.roleId;
this.roleName = leader.roleName;
this.title = leader.title;
this.lv = leader.lv;
this.head = leader.head;
this.frame = leader.frame;
this.spine = leader.spine;
}
}
// 排行榜返回玩家值
export class LineupParam {
@prop({ required: true })
hid: number;
@prop({ required: true })
star: number;
@prop({ required: true })
colorStar: number;
@prop({ required: true })
lv: number;
@prop({ required: true })
quality: number;
@prop({ required: true })
job: number;
constructor(hero: HeroType) {
this.hid = hero.hid;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.lv = hero.lv;
this.quality = hero.quality;
this.job = hero.job;
}
}
export class SimpleGuildRankParam {
rank: number = 0;
code: string = "";
@@ -366,4 +380,4 @@ export class GeneralRankParam {
this.num = rankInfo.num;
this.received = received;
}
}
}

View File

@@ -72,7 +72,7 @@ export class UpdateHeroes {
funcs: number[] = [];
incHeroNum: number = 0;
incRoleCe: number = 0;
pushHeroes: {hid: number, incHeroCe: number, ce: number}[] = [];
pushHeroes: {hid: number, incHeroCe: number, ce: number, hero: HeroUpdate}[] = [];
roleUpdate: RoleUpdate;
role: RoleType;
guild: GuildType;
@@ -104,7 +104,7 @@ export class UpdateHeroes {
if(isCreate) this.incHeroNum ++;
if(heroInfo != originCe) this.incRoleCe += heroInfo.ce - originCe;
this.addRoleUpdateParam(await calculatetopLineup(role, heroInfo.hid, heroInfo.ce, heroInfo._id ));
this.pushHeroes.push({ hid: heroInfo.hid, incHeroCe: heroInfo.ce - originCe, ce: heroInfo.ce });
this.pushHeroes.push({ hid: heroInfo.hid, incHeroCe: heroInfo.ce - originCe, ce: heroInfo.ce, hero: heroInfo });
}
// 更新战力相关的各个表
@@ -127,37 +127,50 @@ export class UpdateHeroes {
public async updateRedisRank(Rank: any) {
let role = await this.getRole();
let { serverId, roleId, pushHeroes } = this;
console.log('******** guildInfo before', Date.now());
// 更新军团信息
if(this.guild) {
let r = new Rank(REDIS_KEY.GUILD_INFO, { code: this.guild.code });
await r.generParamAndSet(REDIS_KEY.GUILD_INFO, { guildCode: this.guild.code }, { guild: this.guild });
}
console.log('******** guildInfo after', Date.now());
console.log('******** heroNum before', Date.now());
// 武将数量
if(this.incHeroNum > 0) {
let r = new Rank(REDIS_KEY.HERO_NUM_RANK, { serverId });
await r.setRankWithRoleInfo(roleId, role.heroNum, role.heroNumUpdatedAt, role);
}
console.log('******** heroNum after', Date.now());
console.log('******** topLineup before', Date.now());
// 最强阵容
let r = new Rank(REDIS_KEY.TOP_LINEUP_RANK, { serverId });
await r.setRankWithRoleInfo(roleId, reduceCe(role.topLineupCe), 0, role);
console.log('******** topLineup after', Date.now());
console.log('******** hero before', Date.now());
// 最强武将
for(let { hid, ce } of pushHeroes) {
for(let { hid, ce, hero } of pushHeroes) {
console.log('******** hero before', hid, Date.now());
let r2 = new Rank(REDIS_KEY.TOP_HERO_RANK, { serverId });
await r2.setRankWithHeroInfo(roleId, hid, ce, 0);
await r2.setRankWithHeroInfo(roleId, hid, ce, 0, hero);
let r4 = new Rank(REDIS_KEY.HERO_RANK, { serverId, hid });
await r4.setRankWithHeroInfo(roleId, hid, ce, 0);
await r4.setRankWithHeroInfo(roleId, hid, ce, 0, hero);
console.log('******** hero after', hid, Date.now());
}
console.log('******** hero after', Date.now());
console.log('******** sumCe before', Date.now());
// 总战力
let r3 = new Rank(REDIS_KEY.SUM_CE_RANK, { serverId });
await r3.setRankWithRoleInfo(roleId, reduceCe(role.ce), 0, role);
console.log('******** sumCe after', Date.now());
console.log('******** lineup info before', Date.now());
// 更新最强五人阵容信息
let r5 = new Rank(REDIS_KEY.TOP_LINEUP_INFO, { serverId });
await r5.generParamAndSet(REDIS_KEY.TOP_LINEUP_INFO, { roleId }, { role });
console.log('******** lineup info after', Date.now());
}
public async pushMessage(pinus: any, sid: string) {