军团活动:修复粮草先行索引问题

This commit is contained in:
luying
2022-09-05 12:13:16 +08:00
parent 3cc2f06e50
commit 6d0f05f5b4
5 changed files with 36 additions and 41 deletions
@@ -1,7 +1,7 @@
import { Application, ChannelService, BackendSession, HandlerService, } from "pinus"; import { Application, ChannelService, BackendSession, HandlerService, } from "pinus";
import { GUILD_ACTIVITY_TYPE, STATUS, GUILD_ACTIVITY_STATUS, GUILD_POINT_WAYS, REDIS_KEY, TASK_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../../consts"; import { GUILD_ACTIVITY_TYPE, STATUS, GUILD_ACTIVITY_STATUS, GUILD_POINT_WAYS, REDIS_KEY, TASK_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../../consts";
import { genCode, resResult } from "../../../pubUtils/util"; import { genCode, resResult } from "../../../pubUtils/util";
import { getGuildActivityStatus, getRaceActivityObj, getWoodenHorseList, calWoodenHorseAndSend, raceActivitySettleReward, getGAIndexInPinus } from "../../../services/guildActivity/guildActivityService"; import { getGuildActivityStatus, getRaceActivityObj, getWoodenHorseList, getGAIndexInPinus, getJoinIndex } from "../../../services/guildActivity/guildActivityService";
import { UserGuildModel } from "../../../db/UserGuild"; import { UserGuildModel } from "../../../db/UserGuild";
import { GuildActivityRecordModel } from "../../../db/GuildActivityRec"; import { GuildActivityRecordModel } from "../../../db/GuildActivityRec";
import { UserGuildActivityRecModel } from "../../../db/UserGuildActivityRec"; import { UserGuildActivityRecModel } from "../../../db/UserGuildActivityRec";
@@ -48,7 +48,7 @@ export class RaceActivityHandler {
let ranks: { myGuildRank?: RaceActivityRankParam, guildRank?: RaceActivityRankParam[] } = {}; let ranks: { myGuildRank?: RaceActivityRankParam, guildRank?: RaceActivityRankParam[] } = {};
let hasJoin = obj.getMember(guildCode, roleId); let hasJoin = obj.getMember(guildCode, roleId);
if(obj.status == RACE_ACTIVITY_STATUS.START) { if(obj.status == GUILD_ACTIVITY_STATUS.START) {
ranks = await obj.getRanks(serverId, guildCode); ranks = await obj.getRanks(serverId, guildCode);
} else { } else {
let index = getGAIndexInPinus(this.aid); let index = getGAIndexInPinus(this.aid);
@@ -81,7 +81,7 @@ export class RaceActivityHandler {
const guildCode = session.get('guildCode'); const guildCode = session.get('guildCode');
const sid = session.get('sid'); const sid = session.get('sid');
if (!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); if (!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH);
let index = getGAIndexInPinus(this.aid); let joinIndex = getJoinIndex();
let statusResult = getGuildActivityStatus(this.aid); let statusResult = getGuildActivityStatus(this.aid);
if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
@@ -93,8 +93,7 @@ export class RaceActivityHandler {
return resResult(STATUS.RACE_HAS_JOIN); return resResult(STATUS.RACE_HAS_JOIN);
} }
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, joinIndex, obj.getEvents(guildCode, 0));
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, index, obj.getEvents(guildCode, 0));
if (!guildActivityRec) return resResult(STATUS.WRONG_PARMS); if (!guildActivityRec) return resResult(STATUS.WRONG_PARMS);
let { code: sourceCode } = guildActivityRec; let { code: sourceCode } = guildActivityRec;
@@ -162,7 +161,7 @@ export class RaceActivityHandler {
let serverId = session.get('serverId'); let serverId = session.get('serverId');
let guildCode = session.get('guildCode'); let guildCode = session.get('guildCode');
let sid = session.get('sid'); let sid = session.get('sid');
let index = getGAIndexInPinus(this.aid); let joinIndex = getJoinIndex();
let { id, count, toGuild } = msg; let { id, count, toGuild } = msg;
let obj = getRaceActivityObj(); let obj = getRaceActivityObj();
@@ -172,7 +171,7 @@ export class RaceActivityHandler {
let event = await obj.useItem(serverId, roleId, sid, guildCode, toGuild, id, count); let event = await obj.useItem(serverId, roleId, sid, guildCode, toGuild, id, count);
if (!event) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); if (!event) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
await GuildActivityRecordModel.pushEvent(guildCode, this.aid, index, event); await GuildActivityRecordModel.pushEvent(guildCode, this.aid, joinIndex, event);
return resResult(STATUS.SUCCESS, { return resResult(STATUS.SUCCESS, {
timestamp: Date.now(), timestamp: Date.now(),
@@ -186,13 +185,13 @@ export class RaceActivityHandler {
let serverId = session.get('serverId'); let serverId = session.get('serverId');
let { code, isSuccess } = msg; let { code, isSuccess } = msg;
let index = getGAIndexInPinus(this.aid); let joinIndex = getJoinIndex();
let statusResult = getGuildActivityStatus(this.aid); let statusResult = getGuildActivityStatus(this.aid);
if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// 更新userGuildActivityRecord // 更新userGuildActivityRecord
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, index); let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid, joinIndex);
let myGuildActivityRec = await UserGuildActivityRecModel.updateInfo(code, { isSuccess, isCompleted: true }); let myGuildActivityRec = await UserGuildActivityRecModel.updateInfo(code, { isSuccess, isCompleted: true });
if (!guildActivityRec || !myGuildActivityRec) return resResult(STATUS.WRONG_PARMS); if (!guildActivityRec || !myGuildActivityRec) return resResult(STATUS.WRONG_PARMS);
@@ -205,7 +204,7 @@ export class RaceActivityHandler {
let obj = getRaceActivityObj(); let obj = getRaceActivityObj();
let myGuildRank = 0; let myGuildRank = 0;
let woodenHorse = await obj.getWoodenHorse(guildCode, serverId); let woodenHorse = await obj.getWoodenHorse(guildCode, serverId);
if(obj.status == RACE_ACTIVITY_STATUS.START) { if(obj.status == GUILD_ACTIVITY_STATUS.START) {
let { myGuildRank: rank, guildRank } = await obj.getRanks(serverId, guildCode); let { myGuildRank: rank, guildRank } = await obj.getRanks(serverId, guildCode);
// console.log('#', JSON.stringify(guildRank)) // console.log('#', JSON.stringify(guildRank))
myGuildRank = rank?.rank||0; myGuildRank = rank?.rank||0;
@@ -227,17 +226,6 @@ export class RaceActivityHandler {
}) })
} }
async settleReward(msg: { serverId: number }, session: BackendSession) {
let guildCode = session.get('guildCode');
let serverId = session.get('serverId');
let obj = getRaceActivityObj();
let woodenHorse = await obj.getWoodenHorse(guildCode, serverId);
if (woodenHorse) {
await raceActivitySettleReward(guildCode, woodenHorse)
}
}
// 加入木马 // 加入木马
async debugAddHorse(msg: { magicWord: string, memberCnt: number }, session: BackendSession) { async debugAddHorse(msg: { magicWord: string, memberCnt: number }, session: BackendSession) {
const { magicWord, memberCnt } = msg; const { magicWord, memberCnt } = msg;
@@ -31,16 +31,16 @@ export class GateActivityObject {
} }
public pushMembers(guildCode: string, serverId: number, roleId: string, job: number, code: string) { public pushMembers(guildCode: string, serverId: number, roleId: string, job: number, code: string) {
let member: Member;
if(this.members.has(guildCode)) { if(this.members.has(guildCode)) {
let members = this.members.get(guildCode); let members = this.members.get(guildCode);
if(members.findIndex(cur => cur.roleId == roleId) == -1) { if(members.findIndex(cur => cur.roleId == roleId) == -1) {
members.push({ roleId, job, code }); member = { roleId, job, code }
members.push(member);
} }
} else { } else {
let arr = new Array<string>(); member = { roleId, job, code }
arr.push(roleId); this.members.set(guildCode, [member]);
this.members.set(guildCode, [{ roleId, job, code }]);
} }
if(this.guilds.has(serverId)) { if(this.guilds.has(serverId)) {
let arr = this.guilds.get(serverId); let arr = this.guilds.get(serverId);
@@ -49,7 +49,7 @@ export class GateActivityObject {
} else { } else {
this.guilds.set(serverId, [guildCode]); this.guilds.set(serverId, [guildCode]);
} }
return member;
} }
public getMemberRecord(recCode: string, roleId: string) { public getMemberRecord(recCode: string, roleId: string) {
@@ -5,7 +5,7 @@ import { gameData, getGuildAuctionRewards, getCityActivityRewards, getGuildAucti
import { getCurDay, nowSeconds, getTimeFun, getZeroPoint } from "../../pubUtils/timeUtil"; import { getCurDay, nowSeconds, getTimeFun, getZeroPoint } from "../../pubUtils/timeUtil";
import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE, COUNTER } from "../../consts"; import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, AUCTION_SOURCE, MAIL_TYPE, CITY_STATUS, DEBUG_MAGIC_WORD, GUILD_POINT_WAYS, TASK_TYPE, AUCTION_TIME, CITY_ACTIVITY_DOOR, ABI_TYPE, PUSH_ROUTE, RACE_ACTIVITY_STATUS, SHOP_REFRESH_TYPE, COUNTER } from "../../consts";
import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec"; import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec";
import { GateMembersRec, CityParam, Member, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity"; import { GateMembersRec, CityParam, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity";
import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity"; import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity";
import { getAllServers, getRoleOnlineInfo } from "../redisService"; import { getAllServers, getRoleOnlineInfo } from "../redisService";
import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank";
@@ -462,7 +462,6 @@ export async function cityActivitySettleReward(cityId: number, serverId: number)
let members = obj.getMembersOfGuild(guildCode); let members = obj.getMembersOfGuild(guildCode);
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, index, { let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.CITY_ACTIVITY, index, {
memberCnt: members.length, members,
isSuccess, isCompleted: true, isSuccess, isCompleted: true,
rank: guildRank, damage: num, remainGateHp: gateHp, rank: guildRank, damage: num, remainGateHp: gateHp,
rewards: rewards.map(cur => cur.goods), rewards: rewards.map(cur => cur.goods),
@@ -660,8 +659,9 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W
let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode); let { guildRank, myGuildRank } = await obj.getRanks(serverId, guildCode);
let rank = myGuildRank?.rank||0; let rank = myGuildRank?.rank||0;
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY); let joinIndex = getJoinIndex();
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId, index }); console.log('##### raceActivitySettleReward', joinIndex, serverId, guildCode);
let r = new Rank(REDIS_KEY.RACE_ACTIVITY, { serverId, index: joinIndex });
await r.setRankWithGuildInfo2(guildCode, myGuildRank.num, myGuildRank.sortTime, myGuildRank.durability); await r.setRankWithGuildInfo2(guildCode, myGuildRank.num, myGuildRank.sortTime, myGuildRank.durability);
let nextWeek = <number>getTimeFun().getAfterDayWithHour(7); let nextWeek = <number>getTimeFun().getAfterDayWithHour(7);
await r.setExpire(nextWeek); await r.setExpire(nextWeek);
@@ -670,8 +670,7 @@ export async function raceActivitySettleReward(guildCode: string, woodenHorse: W
let members = obj.getMembersOfGuild(guildCode); let members = obj.getMembersOfGuild(guildCode);
let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, rank); let rewards = getGuildAuctionRewards(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, rank);
let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, index, { let rec = await GuildActivityRecordModel.updateInfo(guildCode, GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, joinIndex, {
memberCnt: members.length, members,
isSuccess, isCompleted: true, rank, isSuccess, isCompleted: true, rank,
rewards: rewards.map(cur => cur.goods), rewards: rewards.map(cur => cur.goods),
woodenHorse: woodenHorse.getTreatTime(), woodenHorse: woodenHorse.getTreatTime(),
@@ -860,4 +859,11 @@ export function getDeclareIndex() {
let obj = getCityActivityObj(); let obj = getCityActivityObj();
if(obj.guildActivityStatus == GUILD_ACTIVITY_STATUS.START) return index; if(obj.guildActivityStatus == GUILD_ACTIVITY_STATUS.START) return index;
return index + 1; return index + 1;
}
export function getJoinIndex() {
let index = getGAIndexInPinus(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY);
let obj = getRaceActivityObj();
if(obj.status == GUILD_ACTIVITY_STATUS.START) return index;
return index + 1;
} }
@@ -6,13 +6,13 @@ import { RewardInter } from "../../pubUtils/interface";
import { getRaceEventItems, gameData } from "../../pubUtils/data"; import { getRaceEventItems, gameData } from "../../pubUtils/data";
import { GuildModel } from "../../db/Guild"; import { GuildModel } from "../../db/Guild";
import { sendSingleRaceActEndMsg } from "./guildActivityService"; import { sendSingleRaceActEndMsg } from "./guildActivityService";
import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, RACE_ACTIVITY_STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../consts"; import { REDIS_KEY, RACE_EVENT_TYPE, RACE_EVENT_EFFECT_TYPE, RACE_EVENT, STATUS, PUSH_ROUTE, GUILD_ACTIVITY_STATUS, DEBUG_MAGIC_WORD } from "../../consts";
import { getRandEelm, sortArrRandom, resResult, getRandResultByMember } from "../../pubUtils/util"; import { getRandEelm, sortArrRandom, resResult, getRandResultByMember } from "../../pubUtils/util";
import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUserWithSuc } from "../pushService"; import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUserWithSuc } from "../pushService";
// 粮草先行 // 粮草先行
export class RaceActivityObject { export class RaceActivityObject {
public status = RACE_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束 public status = GUILD_ACTIVITY_STATUS.WAITING; // 活动状态 0-未开始 1-已开始 2-已结束
private allStartTime = 0; // 开启时间,每天晚上8点 private allStartTime = 0; // 开启时间,每天晚上8点
public guildList: Array<{ serverId: number, guildCode: string }> = []; // 所有军团 public guildList: Array<{ serverId: number, guildCode: string }> = []; // 所有军团
private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}] private members: Map<string, Array<Member>> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}]
@@ -88,7 +88,7 @@ export class RaceActivityObject {
let member = woodenHorse.joinMember(roleId, roleName, sid, code) let member = woodenHorse.joinMember(roleId, roleName, sid, code)
this.pushMember(guildCode, roleId, job, code); this.pushMember(guildCode, roleId, job, code);
if(this.status == RACE_ACTIVITY_STATUS.START) { if(this.status == GUILD_ACTIVITY_STATUS.START) {
this.sendRandItemsToMembers([member], woodenHorse, woodenHorse.remainItems); this.sendRandItemsToMembers([member], woodenHorse, woodenHorse.remainItems);
this.woodenHorseStartRace(woodenHorse); this.woodenHorseStartRace(woodenHorse);
} }
@@ -150,7 +150,7 @@ export class RaceActivityObject {
// 定时任务到,开始比赛,设置开始赛道,发放初始道具 // 定时任务到,开始比赛,设置开始赛道,发放初始道具
public startRace() { public startRace() {
this.status = RACE_ACTIVITY_STATUS.START; this.status = GUILD_ACTIVITY_STATUS.START;
if(this.allStartTime == 0) this.allStartTime = Date.now(); if(this.allStartTime == 0) this.allStartTime = Date.now();
let guildCodes = new Array<string>(); let guildCodes = new Array<string>();
for(let [code, woodenHorse] of this.woodenHorses) { for(let [code, woodenHorse] of this.woodenHorses) {
@@ -163,7 +163,7 @@ export class RaceActivityObject {
} }
public stopRace() { public stopRace() {
this.status = RACE_ACTIVITY_STATUS.END; this.status = GUILD_ACTIVITY_STATUS.END;
for(let [_, woodenHorse] of this.woodenHorses) { for(let [_, woodenHorse] of this.woodenHorses) {
woodenHorse.stopRace(); woodenHorse.stopRace();
} }
+4 -3
View File
@@ -6,6 +6,7 @@ import { Member, WoodenHorse, Event } from '../domain/battleField/guildActivity'
@index({ code: 1 }) @index({ code: 1 })
@index({ guildCode: 1, aid: 1, index: 1, status: 1 })
export default class GuildActivityRecord extends BaseModel { export default class GuildActivityRecord extends BaseModel {
@prop({ required: true }) @prop({ required: true })
@@ -40,7 +41,7 @@ export default class GuildActivityRecord extends BaseModel {
@prop({ required: true, type: Member, default: [], _id: false }) @prop({ required: true, type: Member, default: [], _id: false })
members: Member[]; // 参与活动的团员的roleId列表 members: Member[]; // 参与活动的团员的roleId列表
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
memberCnt: number; // 参加的团员的数量 memberCnt: number; // 参加的团员的数量
@@ -86,14 +87,14 @@ export default class GuildActivityRecord extends BaseModel {
public static async updateInfo(guildCode: string, aid: number, index: number, update: GuildActivityRecordUpdateParam) { public static async updateInfo(guildCode: string, aid: number, index: number, update: GuildActivityRecordUpdateParam) {
let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate( let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate(
{ guildCode, aid, index, status: 1 }, { guildCode, aid, index, status: 1 },
{ $set: update }, { new: true }).lean(); { $set: update }, { new: true, upsert: true }).lean();
return rec; return rec;
} }
public static async pushEvent(guildCode: string, aid: number, index: number, event: Event) { public static async pushEvent(guildCode: string, aid: number, index: number, event: Event) {
let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate( let rec: GuildActivityRecordType = await GuildActivityRecordModel.findOneAndUpdate(
{ guildCode, index, aid, status: 1 }, { guildCode, index, aid, status: 1 },
{ $push: { events: event } }, { new: true }).lean(); { $push: { events: event } }, { new: true, upsert: true }).lean();
return rec; return rec;
} }