diff --git a/game-server/app/servers/guild/handler/guildHandler.ts b/game-server/app/servers/guild/handler/guildHandler.ts index dc8695b53..4197f7510 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -26,7 +26,7 @@ import { checkTask } from '../../../services/task/taskService'; import { guildInter } from '../../../pubUtils/interface'; import * as dicParam from '../../../pubUtils/dicParam'; import { reportTAEvent } from '../../../services/sdkService'; -import { changeGuildActivity, guildDismisActivity } from '../../../services/activity/guildPayService'; +import { changeGuildActivity, guildDismisActivity, guildPayQuitGuild } from '../../../services/activity/guildPayService'; import { sendMessageToUserWithSuc } from '../../../services/pushService'; import { GuildActiveModel } from '../../../db/GuildActive'; import { leaveRaceActivityToRemote, leaveRaceWhenDismissToRemote, leaveRaceWhenQuitGuildToRemote } from '../../../services/guildActivity/guildActivityService'; @@ -615,6 +615,7 @@ export class GuildHandler { reportTAEvent(roleId, TA_EVENT.GUILD_QUIT, { name: guild.name, way: GUILD_QUIT_WAY.QUIT }, ip); changeGuildActivity('', serverId, roleId, sid); leaveRaceWhenQuitGuildToRemote(serverId, guildCode, roleId); + guildPayQuitGuild(serverId, code, roleId); return resResult(STATUS.SUCCESS, { hasGuild: role.hasGuild }); } @@ -655,6 +656,7 @@ export class GuildHandler { await sendMailByContent(MAIL_TYPE.GUILD_BE_KICK, memberRoleId, { sendName: roleName, params: [guild.name] }); reportTAEvent(memberRoleId, TA_EVENT.GUILD_QUIT, { name: guild.name, way: GUILD_QUIT_WAY.KICK }); leaveRaceWhenQuitGuildToRemote(serverId, code, memberRoleId); + guildPayQuitGuild(serverId, code, memberRoleId); return resResult(STATUS.SUCCESS, { memberCnt: guild.memberCnt }); } diff --git a/game-server/app/services/activity/guildPayService.ts b/game-server/app/services/activity/guildPayService.ts index 620942491..ffd55df15 100644 --- a/game-server/app/services/activity/guildPayService.ts +++ b/game-server/app/services/activity/guildPayService.ts @@ -40,25 +40,48 @@ export async function getGuildPayDataShow(serverId: number, activityId: number, export async function addGuildPay(role: RoleType, price: number) { let { hasGuild, roleId, roleName, serverId, guildCode } = role; - if(hasGuild) { // 向全军团推送充值的人 - let { openTime } = await ServerlistModel.findByServerId(serverId); - let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY); - let pushResult: pushActivityInter[] = []; - for(let activityData of activities) { - let { activityId, type: activityType } = activityData; - let obj = new GuildPayData(activityData, 0, openTime * 1000); - if(obj && obj.canShow()) { - let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, { - roleId, roleName, price - }); - if(isNew) { - let { memberRecord } = result; - pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt: memberRecord.length } }); - } + if(!hasGuild) return; + let serverTime = await getServerCreateTime(serverId); + let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY); + let pushResult: pushActivityInter[] = []; + for(let activityData of activities) { + let { activityId, type: activityType } = activityData; + let obj = new GuildPayData(activityData, 0, serverTime); + if(obj && obj.canPay()) { + let { isNew, result } = await ActivityGuildPayModel.addRecord(serverId, activityId, obj.roundIndex, guildCode, { + roleId, roleName, price, hasQuit: false + }); + if(isNew) { + let { memberRecord = [] } = result; + let payMemberCnt = memberRecord.filter(member => !member.hasQuit).length; + pushResult.push({ activityId, activityType, param: { payMember: roleName, payMemberCnt } }); } } - await pushActivitiesToGuild(pushResult, guildCode); } + console.log('##### addGuildPay', pushResult.length) + await pushActivitiesToGuild(pushResult, guildCode); +} + +export async function guildPayQuitGuild(serverId: number, guildCode: string, roleId: string) { + if(!guildCode) return; + + let serverTime = await getServerCreateTime(serverId); + let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.GUILD_PAY); + let pushResult: pushActivityInter[] = []; + for(let activityData of activities) { + let { activityId, type: activityType } = activityData; + let obj = new GuildPayData(activityData, 0, serverTime); + if(obj && obj.canPay()) { + let result = await ActivityGuildPayModel.quitGuild(serverId, activityId, obj.roundIndex, guildCode, roleId); + if(result) { + let { memberRecord = [] } = result; + let records = memberRecord.filter(member => !member.hasQuit); + let payRecord = records.map(member => member.roleName); + pushResult.push({ activityId, activityType, param: { payRecord, payMemberCnt: payRecord.length } }); + } + } + } + await pushActivitiesToGuild(pushResult, guildCode); } export async function changeGuildActivity(guildCode: string, serverId: number, roleId: string, sid: string) { diff --git a/shared/db/ActivityGuildPay.ts b/shared/db/ActivityGuildPay.ts index 7548c5a31..e41fa3c1d 100644 --- a/shared/db/ActivityGuildPay.ts +++ b/shared/db/ActivityGuildPay.ts @@ -8,6 +8,8 @@ class MemberRecord { roleName: string; @prop({ required: true }) price: number; // 金额 + @prop({ required: true }) + hasQuit: boolean; // 金额 } @@ -40,11 +42,12 @@ export default class Activity_Guild_Pay extends BaseModel { result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex }, { $push: { memberRecord } }, { new: true, upsert: true }).lean(); } else { result = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex, 'memberRecord.roleId': memberRecord.roleId }, { - $set: { 'memberRecord.$.roleName': memberRecord.roleName }, + $set: { 'memberRecord.$.roleName': memberRecord.roleName, 'memberRecord.$.hasQuit': false }, $inc: { 'memberRecord.$.price': memberRecord.price } }, { new: true }).lean(); } - return { result, isNew: !hasUser }; + let isNew = hasUser? hasUser.hasQuit: true; + return { result, isNew }; } //根据活动id查询活动数据 @@ -52,6 +55,11 @@ export default class Activity_Guild_Pay extends BaseModel { let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOne({ serverId, activityId, roundIndex, guildCode }).lean(true); return result; } + + public static async quitGuild(serverId: number, activityId: number, roundIndex: number, guildCode: string, roleId: string) { + let result: ActivityGuildPayModelType = await ActivityGuildPayModel.findOneAndUpdate({ serverId, guildCode, activityId, roundIndex, 'memberRecord.roleId': roleId }, { $set: { 'memberRecord.$.hasQuit': true } }, { new: true }).lean(); + return result; + } } export const ActivityGuildPayModel = getModelForClass(Activity_Guild_Pay); diff --git a/shared/domain/activityField/guildPay.ts b/shared/domain/activityField/guildPay.ts index 5acfb14ba..fce8f4e58 100644 --- a/shared/domain/activityField/guildPay.ts +++ b/shared/domain/activityField/guildPay.ts @@ -72,8 +72,9 @@ export class GuildPayData extends ActivityBase { public setGuildRecord(guildRecord: ActivityGuildPayModelType) { if(!guildRecord) return; - this.payMemberCnt = guildRecord.memberRecord.length; - this.payRecord = guildRecord.memberRecord.map(cur => cur.roleName); + let records = guildRecord.memberRecord.filter(cur => !cur.hasQuit); + this.payMemberCnt = records.length; + this.payRecord = records.map(cur => cur.roleName); } public getShowResult() { @@ -105,4 +106,12 @@ export class GuildPayData extends ActivityBase { if(items.length <= 0) return false; return items } + + public canPay() { + if(!this.isEnable) return false; + if(this.beginTime > Date.now() || this.endTime < Date.now()) return false; + if(this.nextRefreshTime && this.nextRefreshTime < Date.now()) return false; + if(this.payEndTime && this.payEndTime < Date.now()) return false; + return true; + } } \ No newline at end of file