From c0b3750f3b4e02336a4c8a3111ecdaaedeabc631 Mon Sep 17 00:00:00 2001 From: qiaoxin Date: Wed, 16 Jun 2021 20:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=EF=BC=9A=E8=8A=82=E6=97=A5?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E6=B7=BB=E5=8A=A0=E6=AF=8F=E6=97=A5=E5=85=B3?= =?UTF-8?q?=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/handler/activityHandler.ts | 657 +++++++++--------- .../activity/handler/dailyCoinHandler.ts | 3 +- .../activity/handler/dailyGKHandler.ts | 79 +++ .../activity/handler/dailyRMBGiftsHandler.ts | 6 +- .../battle/handler/normalBattleHandler.ts | 9 +- game-server/app/services/activityService.ts | 58 +- game-server/app/services/dailyGKService.ts | 72 ++ .../app/services/dailyRMBGiftsService.ts | 4 +- shared/consts/constModules/activityConst.ts | 3 +- shared/consts/constModules/battleConst.ts | 25 +- shared/db/ActivityDailyGK.ts | 41 ++ shared/domain/activityField/dailyGKField.ts | 61 ++ shared/pubUtils/taskUtil.ts | 48 +- 13 files changed, 692 insertions(+), 374 deletions(-) create mode 100644 game-server/app/servers/activity/handler/dailyGKHandler.ts create mode 100644 game-server/app/services/dailyGKService.ts create mode 100644 shared/db/ActivityDailyGK.ts create mode 100644 shared/domain/activityField/dailyGKField.ts diff --git a/game-server/app/servers/activity/handler/activityHandler.ts b/game-server/app/servers/activity/handler/activityHandler.ts index aaea6426f..acbba2b71 100644 --- a/game-server/app/servers/activity/handler/activityHandler.ts +++ b/game-server/app/servers/activity/handler/activityHandler.ts @@ -133,361 +133,360 @@ export class ActivityHandler { // } // } // } - //签到 4 - { - let data = await signInActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.SIGN_IN, - activityId: data.activityId, - data, - }); - } - } - //高级签到 5 - { - let data = await signInVIPActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.SIGN_IN_VIP, - activityId: data.activityId, - data, - }); - } - } + // //签到 4 + // { + // let data = await signInActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.SIGN_IN, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //高级签到 5 + // { + // let data = await signInVIPActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.SIGN_IN_VIP, + // activityId: data.activityId, + // data, + // }); + // } + // } - //成长基金 6 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_MAIN, - activityId: data.activityId, - data, - }); - } - } - //高阶成长基金 7 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, - activityId: data.activityId, - data, - }); - } - } - //镇念塔成长基金 8 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_TOWER, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_TOWER, - activityId: data.activityId, - data, - }); - } - } - //高阶镇念塔成长基金 9 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, - activityId: data.activityId, - data, - }); - } - } - //精英成长基金 10 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, - activityId: data.activityId, - data, - }); - } - } - //高阶精英成长基金 11 - { - let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, - activityId: data.activityId, - data, - }); - } - } + // //成长基金 6 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_MAIN, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //高阶成长基金 7 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //镇念塔成长基金 8 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_TOWER, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_TOWER, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //高阶镇念塔成长基金 9 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //精英成长基金 10 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //高阶精英成长基金 11 + // { + // let data = await growthFundActivity(ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP, + // activityId: data.activityId, + // data, + // }); + // } + // } - //30天目标活动 12 - { - let data = await thirtyDaysActivity(ACTIVITY_TYPE.THIRTY_DAYS, serverId, roleId); - if (data) { - let todayIndex = await playerThirtyDaysActivityDays(roleId); - playerActivityArray.push({ - type: ACTIVITY_TYPE.THIRTY_DAYS, - activityId: data.activityId, - data: { playerData: data, todayIndex }, - }); - } - } + // //30天目标活动 12 + // { + // let data = await thirtyDaysActivity(ACTIVITY_TYPE.THIRTY_DAYS, serverId, roleId); + // if (data) { + // let todayIndex = await playerThirtyDaysActivityDays(roleId); + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.THIRTY_DAYS, + // activityId: data.activityId, + // data: { playerData: data, todayIndex }, + // }); + // } + // } - //自选商店 糜家商队 13 - { - let data = await getSelfServiceShopActivityData(serverId, roleId); - if (data) { - let playerGoods = await ActivitySelfServiceGoodsModel.findData(data.activityId, roleId, data.roundIndex, true); - playerActivityArray.push({ - type: ACTIVITY_TYPE.SELF_SERVICE_SHOP, - activityId: data.activityId, - data: { playerData: data, playerGoods: playerGoods ? playerGoods : [] }, - }); - } - } + // //自选商店 糜家商队 13 + // { + // let data = await getSelfServiceShopActivityData(serverId, roleId); + // if (data) { + // let playerGoods = await ActivitySelfServiceGoodsModel.findData(data.activityId, roleId, data.roundIndex, true); + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.SELF_SERVICE_SHOP, + // activityId: data.activityId, + // data: { playerData: data, playerGoods: playerGoods ? playerGoods : [] }, + // }); + // } + // } - //首冲礼包活动 14 - { - let data = await firstGiftActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.FIRST_GIFT, - activityId: data.activityId, - data, - }); - } - } + // //首冲礼包活动 14 + // { + // let data = await firstGiftActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.FIRST_GIFT, + // activityId: data.activityId, + // data, + // }); + // } + // } - //新手限定RMB购买礼包 15 - { - let { createTime } = await RoleModel.findByRoleId(roleId); - let createDate = moment(createTime * 1000).toDate(); - let endTime = moment(createDate).startOf('d').add(7, 'd').add(5, 'h').toDate(); - if (new Date() <= endTime) { - let data = await newPlayerLimitPackageActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE, - activityId: data.activityId, - data, - }); - } - } - } - //每日限购礼包,RMB购买礼包 16 - { - let data = await limitPackageActivity(serverId, roleId, ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY, - activityId: data.activityId, - data, - }); - } - } - //每日限购礼包,RMB购买礼包 17 - { - let data = await limitPackageActivity(serverId, roleId, ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY, - activityId: data.activityId, - data, - }); - } - } + // //新手限定RMB购买礼包 15 + // { + // let { createTime } = await RoleModel.findByRoleId(roleId); + // let createDate = moment(createTime * 1000).toDate(); + // let endTime = moment(createDate).startOf('d').add(7, 'd').add(5, 'h').toDate(); + // if (new Date() <= endTime) { + // let data = await newPlayerLimitPackageActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE, + // activityId: data.activityId, + // data, + // }); + // } + // } + // } + // //每日限购礼包,RMB购买礼包 16 + // { + // let data = await limitPackageActivity(serverId, roleId, ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //每日限购礼包,RMB购买礼包 17 + // { + // let data = await limitPackageActivity(serverId, roleId, ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY, + // activityId: data.activityId, + // data, + // }); + // } + // } - //元宝商店 18 - { - let data = await yuanbaoActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.YUAN_BAO_SHOP, - activityId: data.activityId, - data, - }); - } - } + // //元宝商店 18 + // { + // let data = await yuanbaoActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.YUAN_BAO_SHOP, + // activityId: data.activityId, + // data, + // }); + // } + // } - //月卡1 19 - { - let data = await monthlyTicketActivity(serverId, roleId, ACTIVITY_TYPE.MONTHLY_TICKET_1); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.MONTHLY_TICKET_1, - activityId: data.activityId, - data, - }); - } - } + // //月卡1 19 + // { + // let data = await monthlyTicketActivity(serverId, roleId, ACTIVITY_TYPE.MONTHLY_TICKET_1); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.MONTHLY_TICKET_1, + // activityId: data.activityId, + // data, + // }); + // } + // } - //月卡2 20 - { - let data = await monthlyTicketActivity(serverId, roleId, ACTIVITY_TYPE.MONTHLY_TICKET_2); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.MONTHLY_TICKET_2, - activityId: data.activityId, - data, - }); - } - } + // //月卡2 20 + // { + // let data = await monthlyTicketActivity(serverId, roleId, ACTIVITY_TYPE.MONTHLY_TICKET_2); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.MONTHLY_TICKET_2, + // activityId: data.activityId, + // data, + // }); + // } + // } - //累计充值RMB活动 21 - { - let data = await rechargeMoneyActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.RECHARGE_MONEY, - activityId: data.activityId, - data, - }); - } - } - //每日特惠RMB购买,一次性购买7天礼包 22 - { - let data = await dailyRMBGiftsActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.DAILY_RMB_GIFTS, - activityId: data.activityId, - data, - }); - } - } + // //累计充值RMB活动 21 + // { + // let data = await rechargeMoneyActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.RECHARGE_MONEY, + // activityId: data.activityId, + // data, + // }); + // } + // } + // //每日特惠RMB购买,一次性购买7天礼包 22 + // { + // let data = await dailyRMBGiftsActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.DAILY_RMB_GIFTS, + // activityId: data.activityId, + // data, + // }); + // } + // } - //寻宝骑兵活动 23 - { - let data = await treasureHuntActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.TREASURE_HUNT, - activityId: data.activityId, - data, - }); - } - } + // //寻宝骑兵活动 23 + // { + // let data = await treasureHuntActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.TREASURE_HUNT, + // activityId: data.activityId, + // data, + // }); + // } + // } - //弹出商店 24 - { - let data = await popUpShopActivity(serverId, roleId); - if (data && data.length > 0) { - for (let obj of data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.POP_UP_SHOP, - activityId: obj.activityId, - data: obj, - }); - } - } - } + // //弹出商店 24 + // { + // let data = await popUpShopActivity(serverId, roleId); + // if (data && data.length > 0) { + // for (let obj of data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.POP_UP_SHOP, + // activityId: obj.activityId, + // data: obj, + // }); + // } + // } + // } - //新手签到 25 - { - let data = await newPlayerSignInActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN, - activityId: data.activityId, - data, - }); - } - } + // //新手签到 25 + // { + // let data = await newPlayerSignInActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN, + // activityId: data.activityId, + // data, + // }); + // } + // } - //vip累计充值活动 26 - { - let data = await vipRechargeMoneyActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.VIP_RECHARGE_MONEY, - activityId: data.activityId, - data, - }); - } - } + // //vip累计充值活动 26 + // { + // let data = await vipRechargeMoneyActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.VIP_RECHARGE_MONEY, + // activityId: data.activityId, + // data, + // }); + // } + // } - //七天乐活动 27 - { - let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.SEVEN_DAY); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.SEVEN_DAY, - activityId: data.activityId, - data, - }); - } - } + // //七天乐活动 27 + // { + // let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.SEVEN_DAY); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.SEVEN_DAY, + // activityId: data.activityId, + // data, + // }); + // } + // } - //十四天乐活动 28 - { - let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.FOURTEEN_DAY); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.FOURTEEN_DAY, - activityId: data.activityId, - data, - }); - } - } + // //十四天乐活动 28 + // { + // let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.FOURTEEN_DAY); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.FOURTEEN_DAY, + // activityId: data.activityId, + // data, + // }); + // } + // } - //通用七天乐活动 29 - { - let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.COMMON_SEVEN_DAY); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.COMMON_SEVEN_DAY, - activityId: data.activityId, - data, - }); - } - } + // //通用七天乐活动 29 + // { + // let data = await sevenDaysActivity(serverId, roleId, ACTIVITY_TYPE.COMMON_SEVEN_DAY); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.COMMON_SEVEN_DAY, + // activityId: data.activityId, + // data, + // }); + // } + // } - //每日领取免费午饭、晚饭活动 - { - let data = await dailyMealActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.DAILY_MEAL, - activityId: data.activityId, - data, - }); - } - } + // //每日领取免费午饭、晚饭活动 30 + // { + // let data = await dailyMealActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.DAILY_MEAL, + // activityId: data.activityId, + // data, + // }); + // } + // } - //每日兑换铜币活动 - { - let data = await dailyCoinActivity(serverId, roleId); - if (data) { - playerActivityArray.push({ - type: ACTIVITY_TYPE.DAILY_COIN, - activityId: data.activityId, - data, - }); - } - } + // //每日兑换铜币活动 31 + // { + // let data = await dailyCoinActivity(serverId, roleId); + // if (data) { + // playerActivityArray.push({ + // type: ACTIVITY_TYPE.DAILY_COIN, + // activityId: data.activityId, + // data, + // }); + // } + // } let { activityGroupId } = await ServerlistModel.findByServerId(serverId); let groups = await ActivityGroupModel.findGroupsData(activityGroupId); let playerGroupArray = []; for (let groupData of groups) { - if (groupData.type !== ACTIVITY_GROUP_TYPE.UNKNOW) { - let playerActivityArray = []; - for (let activityId of groupData.activities) { - let activityData = await ActivityModel.findActivity(activityId); - if (activityData) { - let playerActivityData = await getActivity(serverId, roleId, activityId, activityData.type) - if (playerActivityData) playerActivityArray.push(playerActivityData); - } + let playerGroupActivityArray = []; + for (let activityId of groupData.activities) { + let activityData = await ActivityModel.findActivity(activityId); + if (activityData) { + let playerActivityData = await getActivity(serverId, roleId, activityId, activityData.type) + if (playerActivityData) playerGroupActivityArray.push(playerActivityData); } - playerGroupArray.push({ - type: groupData.type, - activities: playerActivityArray, - }); } + playerGroupArray.push({ + type: groupData.type, + activities: playerGroupActivityArray, + }); + console.log(`${roleId} 活动合集 groupId:${groupData.groupId}, 合集类型${groupData.type}, 一共${playerGroupActivityArray.length}个`) } return resResult(STATUS.SUCCESS, { playerActivityArray, playerGroupArray }); diff --git a/game-server/app/servers/activity/handler/dailyCoinHandler.ts b/game-server/app/servers/activity/handler/dailyCoinHandler.ts index c21879822..d632c43d4 100644 --- a/game-server/app/servers/activity/handler/dailyCoinHandler.ts +++ b/game-server/app/servers/activity/handler/dailyCoinHandler.ts @@ -10,6 +10,7 @@ import { RewardParam } from '../../../domain/activityField/rewardField'; import { ItemInter } from '../../../pubUtils/interface'; import { getGoldObject } from '../../../pubUtils/itemUtils'; import { RoleModel } from '../../../db/Role'; +import moment = require('moment'); export default function (app: Application) { @@ -123,7 +124,7 @@ export class DailyCoinHandler { //免费期间 let result = await addReward(roleId, roleName, sid, serverId, funcs, newReward) - await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.beginTime, count, addCoin, `${count}&${consumeGold}&${addCoin}`); + await ActivityDailyCoinModel.addExchangeRecord(serverId, activityId, roleId, playerData.beginTime, count, addCoin, `${count}&${consumeGold}&${addCoin}&${moment(new Date().valueOf())}`); let exchangeCount = playerData.exchangeCount + count; return resResult(STATUS.SUCCESS, Object.assign(result, { diff --git a/game-server/app/servers/activity/handler/dailyGKHandler.ts b/game-server/app/servers/activity/handler/dailyGKHandler.ts new file mode 100644 index 000000000..403db2b42 --- /dev/null +++ b/game-server/app/servers/activity/handler/dailyGKHandler.ts @@ -0,0 +1,79 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS } from '../../../consts'; +import { getPlayerDailyGKData } from '../../../services/dailyGKService'; +import { DailyGKItem } from '../../../domain/activityField/dailyGKField'; +import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { ActivityDailyGKModel } from '../../../db/ActivityDailyGK'; + + +export default function (app: Application) { + return new DailyGKHandler(app); +} + +export class DailyGKHandler { + constructor(private app: Application) { + } + + /************************每日关卡;按日开启,每日开启一关****************************/ + + /** + * @description 获取每日关卡活动数据 + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof DailyGKHandler + */ + async getDailyGKActivity(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await getPlayerDailyGKData(activityId, serverId, roleId) + + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, playerData); + } + + /** + * @description 获取今日挑战的单个奖励 + * @param {{ activityId: number, dayIndex: number}} msg + * @param {BackendSession} session + * @memberof DailyGKHandler + */ + async getGK(msg: { activityId: number, dayIndex: number }, session: BackendSession) { + const { activityId, dayIndex } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const funcs = session.get('funcs'); + + let playerData = await getPlayerDailyGKData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + if (dayIndex > playerData.todayIndex) { + return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER); + } + + let dailyItemData: DailyGKItem = playerData.findDailyGKItem(dayIndex); + if (!dailyItemData) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (dailyItemData.isSuccess) {//已经达成 + return resResult(STATUS.ACTIVITY_REWARDED); + } + + await ActivityDailyGKModel.addRecord(serverId, activityId, roleId, dayIndex); + + let rewardParamArr: Array = stringToRewardParam(dailyItemData.reward); + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + + dailyItemData.isSuccess = true; + return resResult(STATUS.SUCCESS, { + gkId: dailyItemData.gk + }); + } + +} diff --git a/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts index f3b84f1f2..36f529533 100644 --- a/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts +++ b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts @@ -1,7 +1,7 @@ import { Application, BackendSession } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { STATUS, } from '../../../consts'; -import { getPlayerDailyGiftsData, makeDailyRMBGiftsReward } from '../../../services/dailyRMBGiftsService'; +import { getPlayerDailyRMBGiftsData, makeDailyRMBGiftsReward } from '../../../services/dailyRMBGiftsService'; import { RewardParam } from '../../../domain/activityField/rewardField'; import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; import { ActivityDailyRMBGiftsModel } from '../../../db/ActivityDailyRMBGifts'; @@ -29,7 +29,7 @@ export class DailyRMBGiftsHandler { const roleId = session.get('roleId'); const serverId = session.get('serverId'); - let playerData = await getPlayerDailyGiftsData(activityId, serverId, roleId) + let playerData = await getPlayerDailyRMBGiftsData(activityId, serverId, roleId) if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); return resResult(STATUS.SUCCESS, { playerData }); @@ -49,7 +49,7 @@ export class DailyRMBGiftsHandler { const roleName = session.get('roleName'); const funcs: number[] = session.get('funcs'); - let playerData = await getPlayerDailyGiftsData(activityId, serverId, roleId) + let playerData = await getPlayerDailyRMBGiftsData(activityId, serverId, roleId) if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); if (id > 0) {//领取单个--免费奖励 diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index 150be17ad..c65c77100 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -22,6 +22,7 @@ import { Rank } from '../../../services/rankService'; import { checkTaskWithWar, checkTaskInBattleEnd, checkActivityTask } from '../../../services/taskService'; import { ActivitySelfServiceModel } from '../../../db/ActivitySelfService'; import { getSelfServiceShopActivityData } from '../../../services/selfServiceShopActivityService'; +import { challengeDailyGK } from '../../../services/dailyGKService'; export default function (app: Application) { return new NormalBattleHandler(app); @@ -119,8 +120,8 @@ export class NormalBattleHandler { } // 关卡结算,记录使用的武将,获得奖励 - async battleEnd(msg: { battleCode: string, battleId: number, isSuccess: boolean, star: number, heroes: Array, }, session: BackendSession) { - const { battleCode, battleId, isSuccess, heroes = [], star } = msg; + async battleEnd(msg: { battleCode: string, battleId: number, isSuccess: boolean, star: number, heroes: Array, activityId: number }, session: BackendSession) { + const { battleCode, battleId, isSuccess, heroes = [], star, activityId } = msg; let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); @@ -213,6 +214,10 @@ export class NormalBattleHandler { let playerData = await getSelfServiceShopActivityData(serverId, roleId) await ActivitySelfServiceModel.addChallengeRecord(serverId, playerData.activityId, roleId, playerData.roundIndex, 1, new Date()) } + } else if (warInfo.warType == WAR_TYPE.ACT_DAILY_GK) { + if (isSuccess) { + await challengeDailyGK(serverId, roleId, activityId, battleId) + } } if (isSuccess) { // 挑战胜利 diff --git a/game-server/app/services/activityService.ts b/game-server/app/services/activityService.ts index 3dae3ba22..ed7cd12a3 100644 --- a/game-server/app/services/activityService.ts +++ b/game-server/app/services/activityService.ts @@ -11,6 +11,15 @@ import { getPlayerThirtyDaysData, playerThirtyDaysActivityDays, } from './thirty import { getPlayerVipRechargeMoneyData, } from './vipRechargeMoneyService'; import { getPlayerActivityData, } from './selfServiceShopActivityService'; import { ActivitySelfServiceGoodsModel } from '../db/ActivitySelfServiceGoods'; +import { RoleModel } from '../db/Role'; +import moment = require('moment'); +import { getPlayerTreasureHuntData, getTreasureHuntData } from './treasureHuntService'; +import { getPlayerPopUpShopData } from './popUpShopService'; +import { getPlayerSevenDaysData } from './sevenDaysService'; +import { getPlayerDailyMealData } from './dailyMealService'; +import { getPlayerDailyCoinData } from './dailyCoinService'; +import { getPlayerDailyRMBGiftsData } from './dailyRMBGiftsService'; +import { getPlayerDailyGKData } from './dailyGKService'; /** * 获取活动数据 @@ -59,6 +68,16 @@ export async function getActivity(serverId: number, roleId: string, activityId: activityData = await getPlayerFirstGiftData(activityId, serverId, roleId); break; } + case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE://新手限定RMB购买礼包 15 + { + let { createTime } = await RoleModel.findByRoleId(roleId); + let createDate = moment(createTime * 1000).toDate(); + let endTime = moment(createDate).startOf('d').add(7, 'd').add(5, 'h').toDate(); + if (new Date() <= endTime) { + activityData = await getPlayerLimitPackageData(activityId, serverId, roleId); + } + break; + } case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_DAILY://每日限购礼包,RMB购买礼包 16 case ACTIVITY_TYPE.LIMIT_PACKAGE_SHOP_WEEKLY://每周限购礼包,RMB购买礼包 17 { @@ -83,7 +102,18 @@ export async function getActivity(serverId: number, roleId: string, activityId: } case ACTIVITY_TYPE.DAILY_RMB_GIFTS://每日特惠RMB购买,一次性购买7天礼包 22 { - activityData = await getPlayerDailyGiftsData(activityId, serverId, roleId); + activityData = await getPlayerDailyRMBGiftsData(activityId, serverId, roleId); + break; + } + case ACTIVITY_TYPE.TREASURE_HUNT://寻宝骑兵活动 23 + { + let { huntActivityId, huntBeginTime, huntEndTime, huntRoundIndex } = await getTreasureHuntData(serverId); + activityData = await getPlayerTreasureHuntData(activityId, serverId, roleId, huntRoundIndex, huntBeginTime, huntEndTime); + break; + } + case ACTIVITY_TYPE.POP_UP_SHOP://弹出商店 24 + { + activityData = await getPlayerPopUpShopData(activityId, serverId, roleId); break; } case ACTIVITY_TYPE.VIP_RECHARGE_MONEY://vip累计充值活动 26 @@ -91,6 +121,32 @@ export async function getActivity(serverId: number, roleId: string, activityId: activityData = await getPlayerVipRechargeMoneyData(activityId, serverId, roleId); break; } + case ACTIVITY_TYPE.SEVEN_DAY://七天乐活动 27 + case ACTIVITY_TYPE.FOURTEEN_DAY://十四天乐活动 28 + case ACTIVITY_TYPE.COMMON_SEVEN_DAY://通用七天乐活动 29 + { + activityData = await getPlayerSevenDaysData(activityId, serverId, roleId); + break; + } + case ACTIVITY_TYPE.DAILY_MEAL://每日领取免费午饭、晚饭活动 30 + { + activityData = await getPlayerDailyMealData(activityId, serverId, roleId); + break; + } + case ACTIVITY_TYPE.DAILY_COIN://每日兑换铜币活动 31 + { + activityData = await getPlayerDailyCoinData(activityId, serverId, roleId); + break; + } + case ACTIVITY_TYPE.DAILY_GK://每日关卡(每日开启一关) 32 + { + activityData = await getPlayerDailyGKData(activityId, serverId, roleId); + break; + } + default: { + console.log('未知活动类型.........') + break; + } } return activityData; } diff --git a/game-server/app/services/dailyGKService.ts b/game-server/app/services/dailyGKService.ts new file mode 100644 index 000000000..0d68c687b --- /dev/null +++ b/game-server/app/services/dailyGKService.ts @@ -0,0 +1,72 @@ +import { ACTIVITY_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityDailyGKModel, ActivityDailyGKModelType } from '../db/ActivityDailyGK'; +import { ServerlistModel } from '../db/Serverlist'; +import { DailyGKData, DailyGKItem } from '../domain/activityField/dailyGKField'; + + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function dailyGKActivity(serverId: number, roleId: string) { + let { activityGroupId } = await ServerlistModel.findByServerId(serverId); + let activityDataArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.DAILY_GK, new Date()); + if (activityDataArray.length === 0) { + return null; + } + let activityData: ActivityModelType = activityDataArray[0]; + let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityData.activityId, roleId); + let playerData = new DailyGKData(activityData); + playerData.setPlayerRecords(playerRecord); + return playerData; +} + + +/** + * 玩家玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerDailyGKData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId); + let playerRecord: ActivityDailyGKModelType = await ActivityDailyGKModel.findData(serverId, activityId, roleId); + + let playerData = new DailyGKData(activityData); + playerData.setPlayerRecords(playerRecord); + + return playerData; +} + +/** + * 挑战每日关卡成功 + * + * @param {number} activityId 活动id + * @param {number} gk 关卡id + * + */ +export async function challengeDailyGK(serverId: number, roleId: string, activityId: number, gk: number) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId); + + let playerData = new DailyGKData(activityData); + let item = playerData.findItemByGK(gk); + if (item) { + let dayIndex = item.dayIndex; + await ActivityDailyGKModel.addRecord(serverId, activityId, roleId, dayIndex); + } else { + console.log('没有找到对应关卡活动数据', activityId, gk) + } + + return playerData; +} + + + + diff --git a/game-server/app/services/dailyRMBGiftsService.ts b/game-server/app/services/dailyRMBGiftsService.ts index c9fc73662..1d8748e3b 100644 --- a/game-server/app/services/dailyRMBGiftsService.ts +++ b/game-server/app/services/dailyRMBGiftsService.ts @@ -24,7 +24,7 @@ export async function dailyRMBGiftsActivity(serverId: number, roleId: string) { return null; } let activityData = activityArray[0]; - let playerData = await getPlayerDailyGiftsData(activityData.activityId, serverId, roleId); + let playerData = await getPlayerDailyRMBGiftsData(activityData.activityId, serverId, roleId); return playerData } @@ -36,7 +36,7 @@ export async function dailyRMBGiftsActivity(serverId: number, roleId: string) { * @param {string} roleId 角色Id * */ -export async function getPlayerDailyGiftsData(activityId: number, serverId: number, roleId: string) { +export async function getPlayerDailyRMBGiftsData(activityId: number, serverId: number, roleId: string) { let activityData: ActivityModelType = await ActivityModel.findActivity(activityId); let playerData = new DailyRMBGiftsData(activityData); diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index bf1da3405..8568c2f95 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -1,6 +1,6 @@ /** - * 活动类型 + * 合集类型 */ export enum ACTIVITY_GROUP_TYPE { @@ -44,6 +44,7 @@ export enum ACTIVITY_TYPE { COMMON_SEVEN_DAY = 29, // 通用七天乐活动 DAILY_MEAL = 30, // 每日领取免费午饭、晚饭活动 DAILY_COIN = 31, // 每日兑换铜钱 + DAILY_GK = 32, // 每日关卡(每日开启一关) } /** diff --git a/shared/consts/constModules/battleConst.ts b/shared/consts/constModules/battleConst.ts index d88358812..0288a906b 100644 --- a/shared/consts/constModules/battleConst.ts +++ b/shared/consts/constModules/battleConst.ts @@ -26,6 +26,7 @@ export const WAR_TYPE = { BRANCH: 14, // 支线 ACT_TREASURE_HUNT: 15, // 神州探秘 ACT_SELF_SHOP: 16, // 糜家商队 + ACT_DAILY_GK: 17, // 每日关卡活动 }; // 藏宝图掉落参数 @@ -155,22 +156,22 @@ export const COM_BTL_CONST = { // 寻宝等级区间 export const COM_BTL_LV_RANGE = [ - {id: 1, minLv: 1, maxLv: 19}, - {id: 2, minLv: 20, maxLv: 39}, - {id: 3, minLv: 40, maxLv: 59}, - {id: 4, minLv: 60, maxLv: 79}, - {id: 5, minLv: 80, maxLv: 99}, - {id: 6, minLv: 100, maxLv: 100}, + { id: 1, minLv: 1, maxLv: 19 }, + { id: 2, minLv: 20, maxLv: 39 }, + { id: 3, minLv: 40, maxLv: 59 }, + { id: 4, minLv: 60, maxLv: 79 }, + { id: 5, minLv: 80, maxLv: 99 }, + { id: 6, minLv: 100, maxLv: 100 }, ]; // 机器人名字随机 export const COM_BATTLE_ROBOT_ID_NAME = [ - {robotRoleId: 'cd9h0iy8', robotRoleName: '徐埋农'}, - {robotRoleId: 'rtdgr4oz', robotRoleName: '简普瞳'}, - {robotRoleId: 'rv96unin', robotRoleName: '邛瑛'}, - {robotRoleId: 'b33u625l', robotRoleName: '嵇晁伊'}, - {robotRoleId: 'l6wopj9p', robotRoleName: '颜校'}, - {robotRoleId: '6wdqcumj', robotRoleName: '吉辉娇'} + { robotRoleId: 'cd9h0iy8', robotRoleName: '徐埋农' }, + { robotRoleId: 'rtdgr4oz', robotRoleName: '简普瞳' }, + { robotRoleId: 'rv96unin', robotRoleName: '邛瑛' }, + { robotRoleId: 'b33u625l', robotRoleName: '嵇晁伊' }, + { robotRoleId: 'l6wopj9p', robotRoleName: '颜校' }, + { robotRoleId: '6wdqcumj', robotRoleName: '吉辉娇' } ]; export const ROBOT_NAME = [ diff --git a/shared/db/ActivityDailyGK.ts b/shared/db/ActivityDailyGK.ts new file mode 100644 index 000000000..40d4b0a3b --- /dev/null +++ b/shared/db/ActivityDailyGK.ts @@ -0,0 +1,41 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 活动系统 - 每日关卡活动 +*/ +@index({ roleId: 1 }) + +export default class Activity_Daily_GK extends BaseModel { + @prop({ required: true }) + serverId: number; // 服id + @prop({ required: true }) + activityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + days: number[]; // 第几天的通关 + + //通关记录 + public static async addRecord(serverId: number, activityId: number, roleId: string, day: number) { + let result: ActivityDailyGKModelType = await ActivityDailyGKModel.findOneAndUpdate({ serverId, roleId, activityId }, + { $push: { days: day } }, { upsert: true, new: true }).lean(true); + return result; + } + + //根据活动id查询活动数据 + public static async findData(serverId: number, activityId: number, roleId: string) { + let result: ActivityDailyGKModelType = await ActivityDailyGKModel.findOne({ serverId, roleId, activityId }).lean(true); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(serverId: number, activityId: number, roleId: string) { + await ActivityDailyGKModel.deleteMany({ serverId, roleId, activityId }); + } +} + +export const ActivityDailyGKModel = getModelForClass(Activity_Daily_GK); + +export interface ActivityDailyGKModelType extends Pick, keyof Activity_Daily_GK> { } +export type ActivityDailyGKModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/dailyGKField.ts b/shared/domain/activityField/dailyGKField.ts new file mode 100644 index 000000000..886adf27e --- /dev/null +++ b/shared/domain/activityField/dailyGKField.ts @@ -0,0 +1,61 @@ +import { ActivityModelType } from '../../db/Activity'; +import { ActivityDailyGKModelType } from '../../db/ActivityDailyGK'; +import { ActivityBase } from './activityField'; + + +// 每日配置数据 +export class DailyGKItem { + dayIndex: number; // 第几天,从1开始 + gk: number; // 关卡 + name: string; // 名称 + reward: string; // 奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + isSuccess: boolean; //是否成功 + + constructor(data: any) { + this.dayIndex = data.dayIndex; + this.name = data.name; + this.reward = data.reward; + this.isSuccess = false; + } +} + + +// 每日关卡活动数据 +export class DailyGKData extends ActivityBase { + list: Array = []; + + public findItemByGK(gk: number) { + let index = this.list.findIndex(obj => { return obj && obj.gk == gk }) + return (index != -1) ? this.list[index] : null; + } + + public findDailyGKItem(dayIndex: number) { + let index = this.list.findIndex(obj => { return obj && obj.dayIndex == dayIndex }) + return (index != -1) ? this.list[index] : null; + } + + //解析玩家记录 + public setPlayerRecords(data: ActivityDailyGKModelType) { + if (!data) + return; + let records = data.days ? data.days : []; + for (let obj of this.list) { + let index = records.findIndex(dayIndex => { return obj.dayIndex == dayIndex }) + if (index != -1) { + obj.isSuccess = true + } + } + } + + public initData(data: string) { + let arr = JSON.parse(data); + for (let obj of arr) { + this.list.push(new DailyGKItem(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file diff --git a/shared/pubUtils/taskUtil.ts b/shared/pubUtils/taskUtil.ts index c7d851433..00a1173fc 100644 --- a/shared/pubUtils/taskUtil.ts +++ b/shared/pubUtils/taskUtil.ts @@ -653,30 +653,32 @@ export async function accomplishTask(serverId: number, roleId: string, taskType: let huntEndTime = tempData.huntEndTime; let huntRoundIndex = tempData.huntRoundIndex; let activity = await ActivityModel.findActivity(tempData.huntActivityId); - let playerData = new TreasureHuntData(activity); - playerData.beginTime = moment(huntBeginTime).valueOf(); - playerData.endTime = moment(huntEndTime).valueOf(); - playerData.roundIndex = huntRoundIndex; - let taskArray = playerData.tasks.findItemByTaskType(taskType); - for (let task of taskArray) { - let taskRecord: ActivityTreasureHuntTaskModelType = await ActivityTreasureHuntTaskModel.findDataByCellIndex(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex); - if (!taskRecord || !taskRecord.isPush) { - let recordData = taskRecord && taskRecord.data ? JSON.parse(taskRecord.data) : null - let { addCount, record } = isComplete(roleId, task.taskType, task.taskParam, count, parma, recordData); - if (addCount) { - let playerRecord = await ActivityTreasureHuntTaskModel.addTreasureHuntTaskCount(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex, addCount); - //推送 - if (task.condition <= playerRecord.totalCount) {//已经完成 - playerRecord = await ActivityTreasureHuntTaskModel.pushMessage(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex); - task.totalCount = playerRecord.totalCount; - pushMessage = pushMessage.concat(Object.assign(task, { activityId: activity.activityId })); - } else {//没有完成 - task.totalCount = playerRecord.totalCount; - pushMessage = pushMessage.concat(Object.assign(task, { activityId: activity.activityId })); + if (activity) { + let playerData = new TreasureHuntData(activity); + playerData.beginTime = moment(huntBeginTime).valueOf(); + playerData.endTime = moment(huntEndTime).valueOf(); + playerData.roundIndex = huntRoundIndex; + let taskArray = playerData.tasks.findItemByTaskType(taskType); + for (let task of taskArray) { + let taskRecord: ActivityTreasureHuntTaskModelType = await ActivityTreasureHuntTaskModel.findDataByCellIndex(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex); + if (!taskRecord || !taskRecord.isPush) { + let recordData = taskRecord && taskRecord.data ? JSON.parse(taskRecord.data) : null + let { addCount, record } = isComplete(roleId, task.taskType, task.taskParam, count, parma, recordData); + if (addCount) { + let playerRecord = await ActivityTreasureHuntTaskModel.addTreasureHuntTaskCount(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex, addCount); + //推送 + if (task.condition <= playerRecord.totalCount) {//已经完成 + playerRecord = await ActivityTreasureHuntTaskModel.pushMessage(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex); + task.totalCount = playerRecord.totalCount; + pushMessage = pushMessage.concat(Object.assign(task, { activityId: activity.activityId })); + } else {//没有完成 + task.totalCount = playerRecord.totalCount; + pushMessage = pushMessage.concat(Object.assign(task, { activityId: activity.activityId })); + } + } + if (record) { + await ActivityTreasureHuntTaskModel.addTreasureHuntTaskRecord(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex, JSON.stringify(record)); } - } - if (record) { - await ActivityTreasureHuntTaskModel.addTreasureHuntTaskRecord(serverId, activity.activityId, roleId, huntRoundIndex, task.cellIndex, JSON.stringify(record)); } } }