排行榜:一览&领取

This commit is contained in:
luying
2021-04-12 09:47:16 +08:00
parent 5dca7b304d
commit 22e6a82100
20 changed files with 496 additions and 139 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ export enum GUILD_SELECT {
// 获得邀请列表
INVITED_MEMBER = '_id code isMemberMax +invitedMembers +inviteTime',
// 排行榜字段
RANK = 'code name icon lv memberCnt leader leader activeWeekly activeUpdateTime'
RANK = 'code name icon lv memberCnt leader lvUpdateTime activeWeekly activeUpdateTime'
}
export enum FRIEND_SHIP_SELECT {
+6 -1
View File
@@ -349,6 +349,9 @@ export const KEY_TO_COMPOSE_FIELD = new Map([
[REDIS_KEY.MAIN_ELITE_RANK, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.HERO_RANK, COMPOSE_FIELD_TYPE.ROLE_HERO],
[REDIS_KEY.SHOW_LINEUP, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.SUM_CE_RANK, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.PVP_RANK, COMPOSE_FIELD_TYPE.ROLE],
]);
@@ -456,7 +459,9 @@ export const FILENAME = {
DIC_CITY_ACTIVITY_REWARD: 'dic_zyz_cityActivityReward',
DIC_RACE_ACTIVITY: 'dic_zyz_raceActivity',
DIC_SHOP: 'dic_zyz_shop',
DIC_SHOP_LIST: 'dic_zyz_shopList'
DIC_SHOP_LIST: 'dic_zyz_shopList',
DIC_RANK: 'dic_zyz_rankingType',
DIC_RANK_REWARD: 'dic_zyz_rankingReward'
}
export const WAR_RELATE_TABLES = [
+3
View File
@@ -214,6 +214,9 @@ export const STATUS = {
// 通用 30000 - 30099
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },
ROLE_MATERIAL_NOT_ENOUGH: { code: 30001, simStr: '材料数量不足' },
REWARD_CONDITION_NOT_REACH: { code: 30002, simStr: '未满足领取条件' },
REWARD_HAS_RECEIVED: { code: 30003, simStr: '奖励已领取' },
// 武将养成通用 30100 - 30199
// 武将合成,升级,升星,升品相关 30200 - 30299
+1 -1
View File
@@ -148,7 +148,7 @@ export default class Guild extends BaseModel {
.sort(sort)
.limit(100).skip((page - 1) * 100)
.select(GUILD_SELECT.RANK)
.populate('leader', {roleName: 1, title: 1, frame: 1, head: 1, spine: 1, lv: 1, _id: 0}, 'Role')
.populate('leader', {roleId: 1, roleName: 1, title: 1, frame: 1, head: 1, spine: 1, lv: 1, _id: 0}, 'Role')
.lean({ virtuals: true });
return guildList;
}
+9
View File
@@ -269,6 +269,8 @@ export default class Role extends BaseModel {
// 排行相关
@prop({ required: true, default: 0 })
lvUpdatedAt: number; // 升级时间
@prop({ required: true, default: 0 })
heroNum: number; // 武将数量
@prop({ required: true, default: 0 })
heroNumUpdatedAt: number; // 武将数量更新时间
@@ -284,6 +286,8 @@ export default class Role extends BaseModel {
mainEliteWarId: number; // 精英通关关卡
@prop({ required: true, default: 0 })
mainEliteUpdatedAt: number; // 精英通关时间
@prop({ required: true, default: [], type: Number })
rankReceived: number[]; // 已领取奖励
public static async findAllByUid(uid: number, getters = false, virtuals = true) {
@@ -626,6 +630,11 @@ export default class Role extends BaseModel {
.sort({ ce: -1 }).lean();
return roles[Math.floor(roles.length/2)]
}
public static async receiveRankReward(roleId: string, id: number) {
const role: RoleType = await RoleModel.findOneAndUpdate({ roleId, rankReceived: { $nin: [id] } }, { $push: { rankReceived: id } }, {new: true}).lean();
return role;
}
}
export const RoleModel = getModelForClass(Role);
+87 -25
View File
@@ -3,43 +3,44 @@ import { WoodenHorse } from "./battleField/guildActivity";
import { RoleUpdate, RoleType } from "../db/Role";
import { reduceCe } from "../pubUtils/util";
import { GuildUpdateParam } from "../db/Guild";
import { currentId } from "async_hooks";
import { HeroType } from "../db/Hero";
import { HeroType, HeroUpdate } from "../db/Hero";
// 排行榜返回玩家值
export class RankParam {
roleName: string;
lv: number;
vLv: number;
roleName: string = "";
lv: number = 0;
vLv: number = 0;
guildName: string = "";
head: number = EXTERIOR.EXTERIOR_FACE;
frame: number = EXTERIOR.EXTERIOR_FACECASE;
spine: number = EXTERIOR.EXTERIOR_APPEARANCE;
title: number;
ce: number;
title: number = 1;
ce: number = 0;
constructor(role: RoleUpdate) {
this.roleName = role.roleName;
this.lv = role.lv;
this.vLv = role.vLv;
this.head = role.head;
this.frame = role.frame;
this.spine = role.spine;
this.title = role.title;
this.guildName = role.guildName||"";
if(role.isReducedCe) {
this.ce = role.ce;
} else {
this.ce = reduceCe(role.ce);
constructor(role: RoleUpdate, fromDb: boolean) {
if(role.roleName) this.roleName = role.roleName;
if(role.lv) this.lv = role.lv;
if(role.vLv) this.vLv = role.vLv;
if(role.head) this.head = role.head;
if(role.frame) this.frame = role.frame;
if(role.spine) this.spine = role.spine;
if(role.title) this.title = role.title;
if(role.guildName) this.guildName = role.guildName||"";
if(role.ce) {
if(fromDb && !role.isReducedCe) {
this.ce = reduceCe(role.ce);
} else {
this.ce = role.ce;
}
}
}
}
export class RoleRankInfo extends RankParam {
rank: number;
roleId: string;
num: number;
time: number;
rank: number = 1;
roleId: string = "";
num: number = 0;
time: number = 0;
hero: LineupParam[];
lineup: LineupParam[];
@@ -70,6 +71,7 @@ export class GuildRankParam {
lv: number;
memberCnt: number;
leader: {
roleId: string;
roleName: string;
title: number;
lv: number;
@@ -84,6 +86,7 @@ export class GuildRankParam {
this.name = guild.name;
this.lv = guild.lv;
let leader = <RoleType>guild.leader;
console.log('**', JSON.stringify(leader))
let _leader = new GuildLeader(leader);
this.leader = _leader;
this.memberCnt = guild.memberCnt;
@@ -109,6 +112,7 @@ export class GuildRankInfo extends GuildRankParam {
}
export class GuildLeader {
roleId: string;
roleName: string;
title: number;
lv: number;
@@ -116,7 +120,8 @@ export class GuildLeader {
frame: number;
spine: number;
constructor(leader: {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;
@@ -236,4 +241,61 @@ export interface myIdInter {
roleId?: string;
guildCode?: string;
hid?: number;
}
// 排行榜总览左边的数据
export class GeneralRankParamRole {
type: number; // 排行榜id
roleId: string;
roleName: string;
head: number;
frame: number;
spine: number;
lv: number;
vLv: number;
guildName: string;
ce: number;
num: number;
received: number[];
constructor(type: number, rankInfo: RoleRankInfo, received: number[]) {
this.type = type;
this.roleId = rankInfo.roleId;
this.roleName = rankInfo.roleName;
this.head = rankInfo.head;
this.frame = rankInfo.frame;
this.spine = rankInfo.spine;
this.lv = rankInfo.lv;
this.vLv = rankInfo.vLv;
this.guildName = rankInfo.guildName;
this.ce = rankInfo.ce;
this.num = rankInfo.num;
this.received = received;
}
}
// 排行榜右边的数据
export class GeneralRankParamBattle {
type: number;
roleId: string;
roleName: string;
guildName: string;
hid: number = 0;
skinId: number = 0;
num: number;
received: number[];
constructor(type: number, rankInfo: RoleRankInfo, hero: HeroUpdate, received: number[]) {
this.type = type;
this.roleId = rankInfo.roleId;
this.roleName = rankInfo.roleName;
this.guildName = rankInfo.guildName;
this.num = rankInfo.num;
if(hero) {
this.hid = hero.hid;
let curSkin = hero.skins.find(cur => cur.enable);
this.skinId = curSkin?curSkin.id: 0;
}
this.received = received;
}
}
+5 -1
View File
@@ -71,6 +71,8 @@ import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandValueByMi
import { RACE_EVENT_TYPE } from "../consts";
import { dicShop, dicShopItem } from "./dictionary/DicShop";
import { dicShopList } from "./dictionary/DicShopList";
import { dicRank } from "./dictionary/DicRank";
import { dicRankReward } from "./dictionary/DicRankReward";
export const gameData = {
blurprtCompose: dicBlueprtCompose,
@@ -167,7 +169,9 @@ export const gameData = {
shop: dicShop,
shopItem: dicShopItem,
shopList: dicShopList,
dicMyHeroes: dicMyHeroes
dicMyHeroes: dicMyHeroes,
rank: dicRank,
generalRankReward: dicRankReward
};
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
+26
View File
@@ -0,0 +1,26 @@
// 排行榜表
import { readJsonFile } from '../util'
import { FILENAME } from '../../consts'
export interface DicRank {
// 排行榜id
readonly id: number;
// 属于哪个页签
readonly group: number;
// 总览中的位置
readonly general: number;
}
const str = readJsonFile(FILENAME.DIC_RANK);
let arr = JSON.parse(str);
export const dicRank = new Array<DicRank>();
arr.forEach(o => {
dicRank.push(o);
});
arr = undefined;
@@ -0,0 +1,30 @@
// 排行榜奖励表
import { readJsonFile, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicRankReward {
// 奖励id
readonly id: number;
// 排行榜id
readonly rankId: number;
// 条件
readonly condition: number;
// 奖励
readonly reward: Array<RewardInter>;
}
const str = readJsonFile(FILENAME.DIC_RANK_REWARD);
let arr = JSON.parse(str);
export const dicRankReward = new Map<number, DicRankReward>();
arr.forEach(o => {
o.reward = parseGoodStr(o.reward);
dicRankReward.set(o.id, o);
});
arr = undefined;