🐞 fix(gvg): 千机阁取消解锁的时候后置节点也要取消

This commit is contained in:
luying
2023-03-15 17:18:55 +08:00
parent d6ff95fc6c
commit c13cc650d4
3 changed files with 28 additions and 12 deletions
@@ -410,9 +410,6 @@ export class GVGHandler {
let { configId, period } = getGVGPeriodData(); let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
const dicTech = gameData.gvgTech.get(techId);
if(!dicTech) return resResult(STATUS.DIC_DATA_NOT_FOUND);
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
@@ -420,18 +417,37 @@ export class GVGHandler {
const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.UNLOCK_TECH); const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.UNLOCK_TECH);
if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH);
let dicTech = gameData.gvgTech.get(techId);
if(!dicTech) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// 并发锁 // 并发锁
let res: any = await lockLeagueData(DATA_NAME.LEAGUE_TECH, myLeague.leagueCode);//加锁 let res: any = await lockLeagueData(DATA_NAME.LEAGUE_TECH, myLeague.leagueCode);//加锁
if (!!res.err) return resResult(STATUS.REDLOCK_ERR); if (!!res.err) return resResult(STATUS.REDLOCK_ERR);
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode); let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
if(!checkTechProgress(techId, leaguePrepare?.techQueue||[])) { let techIds: number[] = [], preTechId = techId;
res.releaseCallback(); // 如果有后置节点,那么后置节点也需要解锁
return resResult(STATUS.GVG_TECH_HAS_PROGRESS); for(let { id, progress } of (leaguePrepare?.techQueue||[]) ) {
if(id == techId) {
if(progress > 0) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_HAS_PROGRESS);
}
techIds.push(id)
} else {
let dicCurTech = gameData.gvgTech.get(id);
if(dicCurTech.prepositionId.find(arr => arr.indexOf(preTechId) != -1)) {
if(progress > 0) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_HAS_PROGRESS);
}
techIds.push(id);
preTechId = id;
}
}
} }
leaguePrepare = await GVGLeaguePrepareModel.rollbackTech(configId, myLeague.leagueCode, techId); leaguePrepare = await GVGLeaguePrepareModel.rollbackTech(configId, myLeague.leagueCode, techIds);
if(!leaguePrepare) { if(!leaguePrepare) {
res.releaseCallback(); res.releaseCallback();
return resResult(STATUS.GVG_TECH_QUEUECNT_MAX); return resResult(STATUS.GVG_TECH_QUEUECNT_MAX);
@@ -440,7 +456,7 @@ export class GVGHandler {
res.releaseCallback(); res.releaseCallback();
// 推送千机阁解锁消息 // 推送千机阁解锁消息
await pushTechRollback(myLeague.guildCodes, techId); await pushTechRollback(myLeague.guildCodes, techIds);
return resResult(STATUS.SUCCESS, { return resResult(STATUS.SUCCESS, {
queue: leaguePrepare?.techQueue||[] queue: leaguePrepare?.techQueue||[]
@@ -484,10 +484,10 @@ export async function pushTechChange(guildCodes: string[], isActive: boolean, id
} }
} }
export async function pushTechRollback(guildCodes: string[], id: number) { export async function pushTechRollback(guildCodes: string[], ids: number[]) {
for(let guildCode of guildCodes) { for(let guildCode of guildCodes) {
await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_TECH_ROLLBACK, { await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_TECH_ROLLBACK, {
id ids
}); });
} }
} }
+2 -2
View File
@@ -124,8 +124,8 @@ export default class GVGLeaguePrepare extends BaseModel {
return result; return result;
} }
public static async rollbackTech(configId: number, leagueCode: string, techId: number) { public static async rollbackTech(configId: number, leagueCode: string, techIds: number[]) {
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $pull: { techQueue: { id: techId } }, $inc: { techQueueCnt: -1 } }, { new: true }).lean(); const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $pull: { techQueue: { id: { $in: techIds } } }, $inc: { techQueueCnt: -techIds.length } }, { new: true }).lean();
return result; return result;
} }