diff --git a/game-server/app/servers/guild/handler/donateHandler.ts b/game-server/app/servers/guild/handler/donateHandler.ts index b2756d0b3..5ac5d6210 100644 --- a/game-server/app/servers/guild/handler/donateHandler.ts +++ b/game-server/app/servers/guild/handler/donateHandler.ts @@ -1,7 +1,7 @@ import { Application, BackendSession, HandlerService, } from 'pinus'; import { UserGuildModel } from '../../../db/UserGuild'; import { resResult } from '../../../pubUtils/util'; -import { STATUS, TASK_TYPE } from '../../../consts'; +import { DATA_NAME, STATUS, TASK_TYPE } from '../../../consts'; import { DonationModel } from '../../../db/Donation'; import { nowSeconds } from '../../../pubUtils/timeUtil'; import { getArmyDonateBaseByLv, getArmyDonateBoxBaseById } from '../../../pubUtils/data'; @@ -14,6 +14,8 @@ import { ARMY } from '../../../pubUtils/dicParam'; import { addActive } from '../../../services/guildService' import { checkActivityTask, checkTask } from '../../../services/taskService'; import { guildInter } from '../../../pubUtils/interface'; +import { lockData } from '../../../services/redLockService'; + export default function (app: Application) { new HandlerService(app, {}); return new DonationHandler(app); @@ -52,33 +54,51 @@ export class DonationHandler { const serverId: number = parseInt(session.get('serverId')); const sid: string = session.get('sid'); - let userGuild = await refreshUserGuild(myUserGuild, roleId); - if (!userGuild) return resResult(STATUS.WRONG_PARMS); - const { guildCode: code, donateCnt: resdonateCnt } = userGuild; - if (resdonateCnt >= ARMY.ARMY_DONATE_TIMES) - return resResult(STATUS.GUILD_DONATE_TIMES_NOT_ENOUGH); - let { donationLv } = await getDonation(code, serverId); - let { donateReward } = getArmyDonateBaseByLv(donationLv); - let { rewardGood, rewardFund, cosume } = donateReward.get(id); - let result = await handleCost(roleId, sid, [cosume]); - if (!result) - return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let { donateCnt } = await UserGuildModel.donateFund(roleId, 1); + let res: any = await lockData(serverId, DATA_NAME.DONATE, roleId);// 玩家可能会快速做多次操作,加一下锁 + try { + if (!res) { + return resResult(STATUS.REDLOCK_ERR); + } - let { donateFund, reports } = await DonationModel.donation(code, rewardFund, { reports: { id, roleName, time: nowSeconds() } }); - let goods = []; - if (!!rewardGood) - goods = await addItems(roleId, roleName, sid, [rewardGood]); - //增加基金 - const { fund } = await GuildModel.updateInfo(code, {}, { fund: rewardFund }, 'fund'); - this.app.rpc.chat.guildRemote.updateInfo.toServer(CHAT_SERVER, code, { fund }); - await addActive(roleId, serverId, GUILD_POINT_WAYS.DONATE, id); - // 任务 - await checkTask(roleId, sid, TASK_TYPE.GUILD_DONATE, 1, true, {}); - //活动任务 - await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GUILD_DONATE, 1); + let userGuild = await refreshUserGuild(myUserGuild, roleId); + if (!userGuild) { + res.releaseCallback(); + return resResult(STATUS.WRONG_PARMS); + } + const { guildCode: code, donateCnt: resdonateCnt } = userGuild; + if (resdonateCnt >= ARMY.ARMY_DONATE_TIMES) { + res.releaseCallback(); + return resResult(STATUS.GUILD_DONATE_TIMES_NOT_ENOUGH); + } + let { donationLv } = await getDonation(code, serverId); + let { donateReward } = getArmyDonateBaseByLv(donationLv); + let { rewardGood, rewardFund, cosume } = donateReward.get(id); + let result = await handleCost(roleId, sid, [cosume]); + if (!result) { + res.releaseCallback(); + return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); + } + let { donateCnt } = await UserGuildModel.donateFund(roleId, 1); - return resResult(STATUS.SUCCESS, { donateFund, reports, donateCnt, simpleGoods: goods }); + let { donateFund, reports } = await DonationModel.donation(code, rewardFund, { reports: { id, roleName, time: nowSeconds() } }); + let goods = []; + if (!!rewardGood) + goods = await addItems(roleId, roleName, sid, [rewardGood]); + //增加基金 + const { fund } = await GuildModel.updateInfo(code, {}, { fund: rewardFund }, 'fund'); + this.app.rpc.chat.guildRemote.updateInfo.toServer(CHAT_SERVER, code, { fund }); + await addActive(roleId, serverId, GUILD_POINT_WAYS.DONATE, id); + // 任务 + await checkTask(roleId, sid, TASK_TYPE.GUILD_DONATE, 1, true, {}); + //活动任务 + await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GUILD_DONATE, 1); + + res.releaseCallback(); + return resResult(STATUS.SUCCESS, { donateFund, reports, donateCnt, simpleGoods: goods }); + } catch (e) { + res.releaseCallback(); + throw e; + } } /** * 领取宝箱 diff --git a/shared/consts/dataName.ts b/shared/consts/dataName.ts index cc774830b..75078a6ec 100644 --- a/shared/consts/dataName.ts +++ b/shared/consts/dataName.ts @@ -10,4 +10,5 @@ export enum DATA_NAME { WEEKLY_GUILD_SUM = 'WeeklyGuildSum', // 每周结算活跃和奖励 GAMEMAIL = 'Mail', AUCTION_LOT = 'LotCode', + DONATE = 'Donate', }