diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index 15085c45b..4cd810e28 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -849,6 +849,10 @@ export class GuildHandler { const myUserGuild = await UserGuildModel.getMyGuild(roleId, 'auth guildCode'); if(!myUserGuild) return resResult(STATUS.GUILD_NOT_FOUND); + + // 检查权限 + const checkResult = await checkAuth(GUILD_OPERATE.GET_ACTIVE_RANK, roleId); + if(!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); const hasRank = await existsRank(REDIS_KEY.GUILD_ACTIVE_RANK, serverId); if(!hasRank) await initSingleRankWithServer(REDIS_KEY.GUILD_ACTIVE_RANK, serverId); diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index ac276aa39..89586b038 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -11,7 +11,7 @@ import { pinus } from "pinus"; import { GuildRecType } from "../db/GuildRec"; import { ARMY } from "../pubUtils/dicParam"; import { sendMail } from "./mailService"; -import { setRank } from "./redisService"; +import { setRank, getMyRank, initSingleRank } from "./redisService"; import { GuildRankParam, GuildLeader } from "../pubUtils/interface"; /** @@ -166,24 +166,16 @@ export async function getUserGuildWithRefActive(roleId: string, select: string) */ export async function settleGuildWeekly() { console.log('————— settleGuildWeekly —————'); - const guildList = await GuildModel.findAllGuild('code activeWeekly memberCnt'); + const guildList = await GuildModel.findAllGuild('code activeWeekly memberCnt serverId'); - for(let { code, activeWeekly, memberCnt } of guildList) { + for(let { code, memberCnt, serverId } of guildList) { const userGuildList = await UserGuildModel.getListByGuild(code, 'roleId auth activeWeekly', { activeWeekly: -1, activeUpdateTime: 1 }); - let activeMemberCnt = 0; // 活跃度高于1000的成员人数 let otherMemberCnt = 0; // 除了大将军以外从活跃高到底成员人数,用户计算活跃排名百分比 - let jobNum = 0; // 职位分配权重加成 - let members = new Map(); + let members = new Map(); for(let {roleId, auth, activeWeekly} of userGuildList) { - let active = false; let job = 0; - - if(activeWeekly > ARMY.ARMY_WEEKHONOUR_LIMIT) { - activeMemberCnt ++; - active = true; - } if(auth == GUILD_AUTH.LEADER) { job = GUILD_JOB.DAJIANGJUN; @@ -194,28 +186,25 @@ export async function settleGuildWeekly() { for(let [id, {rankProportion}] of gameData.guildPosition) { let rankCnt = Math.ceil(memberCnt * rankProportion / 100); job = id; - if(otherMemberCnt < rankCnt) break; + if(otherMemberCnt <= rankCnt) break; } } - await UserGuildModel.updateInfo(roleId, { job, activeWeekly: 0 }, {}); - jobNum += gameData.guildPosition.get(job).activeRatio; + await UserGuildModel.updateInfo(roleId, { job,/* activeWeekly: 0*/ }, {}); - members.set(roleId, {job, active}); + if(activeWeekly > ARMY.ARMY_WEEKHONOUR_LIMIT) { // 低于一定不发奖励 + members.set(roleId, job); + } } // 转换周活跃奖励 - let allWeeklyReward = getGuildActiveWeekReward(activeWeekly); - let ratio = 1; - let averageBase = ratio * ( 1- ARMY.ARMY_POSITION_WEEKREWARD) / 100; // 70% 活跃值高于100均分 - let positionBase = ratio * ARMY.ARMY_POSITION_WEEKREWARD / 100; // 30% 职位均分 - for(let [roleId, {job, active}] of members) { - let myAverageRatio = active? (averageBase / activeMemberCnt): 0; - let jobActiveRatio = gameData.guildPosition.get(job).activeRatio / jobNum; - let myJobRewardRatio = positionBase * jobActiveRatio; + let rank = await getMyRank(REDIS_KEY.GUILD_ACTIVE_RANK, serverId, code); + let allWeeklyReward = getGuildActiveWeekReward(rank); + for(let [roleId, job] of members) { + let jobActiveRatio = gameData.guildPosition.get(job).activeRatio; let reward = allWeeklyReward.map(cur => { return { id: cur.id, - count: Math.ceil(cur.count * (myAverageRatio + myJobRewardRatio)) + count: Math.ceil(cur.count * jobActiveRatio) } }); await sendMail(MAIL_TYPE.GUILD_ACTIVE_REWARD, roleId, '系统', [], reward); @@ -223,7 +212,7 @@ export async function settleGuildWeekly() { await GuildModel.updateInfo(code, { activeWeekly: 0 }, {}); } - + await initSingleRank(REDIS_KEY.GUILD_ACTIVE_RANK); await SystemConfigModel.updateSystemConfig({settleGuildWeeklyTime: nowSeconds()}); // 记录一下 console.log('————— settleGuildWeekly结束 —————'); } diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index e12269665..d20a5d1ee 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -71,6 +71,7 @@ export enum GUILD_OPERATE { BE_SET_AUTH = 27, // 被授权头衔 BE_IMPEACH = 28, // 被弹劾 RECEIVE_ACTIVE = 29, // 领取每日活跃宝箱 + GET_ACTIVE_RANK = 30, // 查看活跃排行榜 } // 军团状态 diff --git a/shared/db/UserGuild.ts b/shared/db/UserGuild.ts index 8004039ee..432bbd2df 100644 --- a/shared/db/UserGuild.ts +++ b/shared/db/UserGuild.ts @@ -34,7 +34,7 @@ export default class UserGuild extends BaseModel { @prop({ required: true, default: 0 }) activeDaily: number; - @prop({ required: true, default: Date.now() }) + @prop({ required: true, default: nowSeconds() }) activeUpdateTime: number; @prop({ required: true, default: USER_GUILD_STATUS.ON, enum: USER_GUILD_STATUS}) @@ -128,7 +128,6 @@ export default class UserGuild extends BaseModel { } public static async updateInfo(roleId: string, update: UserGuildUpdateParam, incParam: { activeDaily?: number, activeWeekly?: number, trainCount?: number }, select?: string) { - console.log(roleId, JSON.stringify(update)) const result: UserGuildType = await UserGuildModel.findOneAndUpdate({ roleId, status: USER_GUILD_STATUS.ON }, { $set: update, $inc: incParam }, { new: true }).select(select).lean(); return result; } diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 3a9b50136..c22d6afc4 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -355,10 +355,10 @@ export function getTrainBaseByLv(lv: number) { return gameData.trainBase.get(lv); } -export function getGuildActiveWeekReward(point: number) { +export function getGuildActiveWeekReward(rank: number) { let result = gameData.guildActiveWeekReward.find(cur => { - let {weekPointMax, weekPointMin} = cur; - return point >= weekPointMin && point <= (weekPointMax || weekPointMax == -1); + let {rankMax, rankMin} = cur; + return rank >= rankMin && rank <= (rankMax || rankMax == -1); }); let reward = new Array(); if(result) reward = result.reward; diff --git a/shared/pubUtils/dictionary/DicGuildActiveWeekReward.ts b/shared/pubUtils/dictionary/DicGuildActiveWeekReward.ts index d440febd5..eed0de38b 100644 --- a/shared/pubUtils/dictionary/DicGuildActiveWeekReward.ts +++ b/shared/pubUtils/dictionary/DicGuildActiveWeekReward.ts @@ -8,9 +8,9 @@ export interface DicGuildActiveWeekReward { // id readonly id: number; // 周最低点数 - readonly weekPointMin: number; + readonly rankMin: number; // 周最高点数 - readonly weekPointMax: number; + readonly rankMax: number; // 奖励 readonly reward: RewardInter[]; diff --git a/shared/pubUtils/dictionary/DicStructure.ts b/shared/pubUtils/dictionary/DicStructure.ts index ac661821f..28cd90932 100644 --- a/shared/pubUtils/dictionary/DicStructure.ts +++ b/shared/pubUtils/dictionary/DicStructure.ts @@ -156,12 +156,14 @@ export const dicTrainBase = new Map(); // 练兵场 export const dicDonateBase = new Map(); // 捐献所 export const dicWishPoolBase = new Map(); // 许愿池 export const dicStoreBase = new Map(); // 许愿池 +export let maxMemberCnt = 0; // 满配最大人数 // 中军大帐 const strCenter = readJsonFile(FILENAME.DIC_GUILD_STRUCTURE_CENTER); let arrCenter = JSON.parse(strCenter); arrCenter.forEach(o => { setStructureConsume(o); + if(o.peopleNum > maxMemberCnt) maxMemberCnt = o.peopleNum; dicCenterBase.set(o.level, _.pick(o, Object.keys(DicCenterKeys))); }); arrCenter = undefined; diff --git a/shared/resource/jsons/dic_army_authority.json b/shared/resource/jsons/dic_army_authority.json old mode 100755 new mode 100644 index f0336d22e..9a02749d5 --- a/shared/resource/jsons/dic_army_authority.json +++ b/shared/resource/jsons/dic_army_authority.json @@ -143,5 +143,10 @@ "id": 29, "name": "领取活跃宝箱", "authority": "1&2&3" + }, + { + "id": 30, + "name": "查看军团活跃排行榜", + "authority": "1&2&3&4" } ] \ No newline at end of file