diff --git a/game-server/app/servers/activity/handler/activityHandler.ts b/game-server/app/servers/activity/handler/activityHandler.ts index ec29a0288..4a06bc5d2 100644 --- a/game-server/app/servers/activity/handler/activityHandler.ts +++ b/game-server/app/servers/activity/handler/activityHandler.ts @@ -15,6 +15,7 @@ import moment = require('moment'); import { RoleModel } from '../../../db/Role'; import { playerThirtyDaysActivityDays, thirtyDaysActivity } from '../../../services/thirtyDaysService'; import { dailyRMBGiftsActivity } from '../../../services/dailyRMBGiftsService'; +import { popUpShopActivity } from '../../../services/popUpShopService'; // import { ActivityDailyChallengesModel } from '../../../db/ActivityDailyChallenges'; // import { isComplete } from '../../../pubUtils/taskUtil'; @@ -332,6 +333,18 @@ export class ActivityHandler { } } + //弹出商店 24 + { + let data = await popUpShopActivity(serverId, roleId); + if (data) { + playerActivityArray.push({ + type: ACTIVITY_TYPE.POP_UP_SHOP, + activityId: 0, + data, + }); + } + } + return resResult(STATUS.SUCCESS, { playerActivityArray }); } diff --git a/game-server/app/servers/activity/handler/popUpShopHandler.ts b/game-server/app/servers/activity/handler/popUpShopHandler.ts index 0b6266fc4..c746ea175 100644 --- a/game-server/app/servers/activity/handler/popUpShopHandler.ts +++ b/game-server/app/servers/activity/handler/popUpShopHandler.ts @@ -55,13 +55,6 @@ export class PopUpShopHandler { if (!activityData) { return resResult(STATUS.ACTIVITY_MISSING); } - let playerRecords: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOpenDataByTaskId(serverId, activityId, roleId, id); - if (!playerRecords) { - return resResult(STATUS.ACTIVITY_POP_UP_SHOP_EXPIRE); - } - if (playerRecords.isBuy) { - return resResult(STATUS.ACTIVITY_REWARDED); - } let allTaskData: any[] = JSON.parse(activityData.data); let taskIndex = allTaskData.findIndex(obj => { return obj && obj.id == id }); @@ -69,7 +62,7 @@ export class PopUpShopHandler { return resResult(STATUS.ACTIVITY_DATA_ERROR); } - let playerData = new PopUpShopData(allTaskData[taskIndex]); + let playerData = new PopUpShopData(allTaskData[taskIndex], activityId); if (playerData.price) { return resResult(STATUS.ACTIVITY_NEED_PAY); @@ -79,6 +72,18 @@ export class PopUpShopHandler { return resResult(STATUS.ACTIVITY_NEED_PAY); } + let playerRecords: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOpenDataByTaskId(serverId, activityId, roleId, id, playerData.taskType); + if (!playerRecords) { + return resResult(STATUS.ACTIVITY_POP_UP_SHOP_EXPIRE); + } + if (playerRecords.isBuy) { + return resResult(STATUS.ACTIVITY_REWARDED); + } + + if (playerData.condition > playerRecords.totalCount) { + return resResult(STATUS.ACTIVITY_TASK_UNCOMPLETED); + } + //元宝消费 let arr = splitString(playerData.consume, '&') if (arr[0] != ACTIVITY_RESOURCES_TYPE.GOODS || arr[1] != CURRENCY_BY_TYPE.get(CURRENCY_TYPE.GOLD)) { @@ -90,7 +95,12 @@ export class PopUpShopHandler { let rewardParamArr: Array = stringToRewardParam(playerData.reward); let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) - return resResult(STATUS.SUCCESS, result); + + playerData.isBuy = true; + return resResult(STATUS.SUCCESS, Object.assign(result, { + param: { activityId, id }, + item: playerData + })); } } diff --git a/game-server/app/servers/activity/handler/thirtyDaysHandler.ts b/game-server/app/servers/activity/handler/thirtyDaysHandler.ts index fbd7a9a07..046ae5300 100644 --- a/game-server/app/servers/activity/handler/thirtyDaysHandler.ts +++ b/game-server/app/servers/activity/handler/thirtyDaysHandler.ts @@ -1,12 +1,10 @@ import { Application, BackendSession } from 'pinus'; -import { deltaDays, resResult } from '../../../pubUtils/util'; -import { STATUS, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../../consts'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, ACTIVITY_TYPE } from '../../../consts'; import { getPlayerThirtyDaysData, playerThirtyDaysActivityDays, thirtyDaysActivity } from '../../../services/thirtyDaysService'; import { ThirtyDaysData, ThirtyDaysItem, ThirtyDaysPointItem } from '../../../domain/activityField/thirtyDaysField'; -import { addItems, createHeroes } from '../../../services/rewardService'; import { ActivityThirtyDaysModel } from '../../../db/ActivityThirtyDays'; import { ActivityThirtyDaysPointRewardModel } from '../../../db/ActivityThirtyDaysPointReward'; -import moment = require('moment'); import { ActivityModel, ActivityModelType } from '../../../db/Activity'; import { ServerlistModel } from '../../../db/Serverlist'; import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; diff --git a/game-server/app/services/popUpShopService.ts b/game-server/app/services/popUpShopService.ts index 141c0a2b0..9c6c90fe1 100644 --- a/game-server/app/services/popUpShopService.ts +++ b/game-server/app/services/popUpShopService.ts @@ -18,9 +18,7 @@ import { ServerlistModel } from '../db/Serverlist'; export async function popUpShopActivity(serverId: number, roleId: string) { let { activityGroupId } = await ServerlistModel.findByServerId(serverId); let activityArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.POP_UP_SHOP, new Date()) - activityArray = activityArray.sort((a, b) => { - return b.activityId - a.activityId - }); + if (activityArray.length == 0) { return null; } @@ -45,11 +43,14 @@ export async function getPlayerPopUpShopData(activityId: number, serverId: numbe let allTaskData = JSON.parse(activityData.data); for (let record of playerRecords) { if (!record.isBuy) {//没有购买 - let index = allTaskData.findIndex(obj => { return obj && obj.id === record.id }) + let index = allTaskData.findIndex(obj => { return obj && obj.id === record.id && obj.taskType === record.type }) if (index != -1) { - let playerData = new PopUpShopData(allTaskData[index]); + let playerData = new PopUpShopData(allTaskData[index], activityData.activityId); playerData.isBuy == false; - allPlayerShop.push(playerData) + playerData.setPlayerRecords(record) + if (playerData.condition <= record.totalCount) { + allPlayerShop.push(playerData) + } } } } @@ -75,20 +76,34 @@ export async function makePopUpShopReward(roleId: string, roleName: string, sid: return STATUS.ACTIVITY_TYPE_ERROR; } let allTaskData: any[] = JSON.parse(activityData.data); - let taskIndex = allTaskData.findIndex(obj => { return obj && obj.data.productID == productID }); + let taskIndex = allTaskData.findIndex(obj => { return obj && obj.productID == productID }); if (taskIndex == -1) { return STATUS.ACTIVITY_NO_PRODUCT; } - let playerData = new PopUpShopData(allTaskData[taskIndex]); - let playerRecords: ActivityPopUpShopModelType = await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, playerData.id); + let playerData = new PopUpShopData(allTaskData[taskIndex], activityId); + let playerRecords: ActivityPopUpShopModelType = await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, playerData.id, playerData.taskType); if (!playerRecords) { return STATUS.APPLY_ORDER_ERROR; } + let curDate = new Date(); + if (curDate < playerRecords.beginTime || curDate > playerData.endTime) { + return STATUS.ACTIVITY_POP_UP_SHOP_CLOSED; + } + if (playerRecords.totalCount < playerData.condition) { + return STATUS.ACTIVITY_TASK_UNCOMPLETED; + } + if (!playerRecords.isBuy) { + return STATUS.ACTIVITY_REWARDED; + } + + playerData.setPlayerRecords(playerRecords); let rewardParamArr: Array = stringToRewardParam(playerData.reward); let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + + playerData.isBuy = true; return { code: 0, - data: Object.assign(result, { item: { isBuy: true }, activityId: activityData.activityId }) + data: Object.assign(result, { item: playerData, activityId: activityData.activityId }) } } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 67d234f1c..9b8fe0162 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -361,6 +361,7 @@ export const STATUS = { ACTIVITY_GOLD_RESOURCE: { code: 50024, simStr: '元宝资源' }, ACTIVITY_ID_ERROR: { code: 50025, simStr: 'id错误' }, ACTIVITY_NEW_PLAYER_GIFT_END: { code: 50026, simStr: '新手活动结束' }, + ACTIVITY_POP_UP_SHOP_CLOSED: { code: 50027, simStr: '商店已经关闭' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityPopUpShop.ts b/shared/db/ActivityPopUpShop.ts index 3f5b23149..608f04831 100644 --- a/shared/db/ActivityPopUpShop.ts +++ b/shared/db/ActivityPopUpShop.ts @@ -21,13 +21,19 @@ export default class Activity_Pop_Up_Shop extends BaseModel { @prop({ required: true }) id: number; // 任务id @prop({ required: true }) + type: number; // 任务类型 + @prop({ required: true }) + totalCount: number; // 累计达成次数 + @prop({ required: true }) + data: string; // 数据信息 + @prop({ required: true }) isBuy: boolean; // 是否购买 //购买记录 - public static async addRecord(serverId: number, activityId: number, roleId: string, id: number) { + public static async addRecord(serverId: number, activityId: number, roleId: string, id: number, type: number) { let nowDate = new Date(); let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate({ - serverId, roleId, activityId, id, + serverId, roleId, activityId, id, type, beginTime: { $lt: nowDate }, endTime: { $gt: nowDate } }, { $set: { isBuy: true } }, { upsert: true, new: true }).lean(true); @@ -39,21 +45,43 @@ export default class Activity_Pop_Up_Shop extends BaseModel { let nowDate = new Date(); let result: ActivityPopUpShopModelType[] = await ActivityPopUpShopModel.find({ serverId, roleId, activityId, - beginTime: { $lt: nowDate }, endTime: { $gt: nowDate } + beginTime: { $lt: nowDate }, endTime: { $gt: nowDate }, + isBuy: { $ne: true }, }).lean(true); return result; } //根据活动taskId查询现在正在进行的活动数据 - public static async findOpenDataByTaskId(serverId: number, activityId: number, roleId: string, id: number) { + public static async findOpenDataByTaskId(serverId: number, activityId: number, roleId: string, id: number, type: number) { let nowDate = new Date(); let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOne({ - serverId, roleId, activityId, id, + serverId, roleId, activityId, id, type, beginTime: { $lt: nowDate }, endTime: { $gt: nowDate } }).lean(true); return result; } + //根据活动统计完成任务次数 + public static async setTaskCount(serverId: number, activityId: number, roleId: string, id: number, type: number, count: number) { + let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate({ serverId, roleId, activityId, id, type }, + { $set: { totalCount: count } }, { upsert: true, new: true }).lean(true); + return result; + } + + //根据活动统计完成任务次数 + public static async addTaskCount(serverId: number, activityId: number, roleId: string, id: number, type: number, addCount: number) { + let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate({ serverId, roleId, activityId, id, type }, + { $inc: { totalCount: addCount } }, { upsert: true, new: true }).lean(true); + return result; + } + + //根据活动记录统计数据 + public static async addTaskRecord(serverId: number, activityId: number, roleId: string, id: number, type: number, data: string,) { + let result: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate({ serverId, roleId, activityId, id, type }, + { $set: { data: data } }, { upsert: true, new: true }).lean(true); + return result; + } + //删除活动领取记录 public static async deleteActivity(_serverId: number, activityId: number, roleId: string, id: number) { let nowDate = new Date(); diff --git a/shared/domain/activityField/dailyRMBGiftsField.ts b/shared/domain/activityField/dailyRMBGiftsField.ts index 8d5074a85..0a0489437 100644 --- a/shared/domain/activityField/dailyRMBGiftsField.ts +++ b/shared/domain/activityField/dailyRMBGiftsField.ts @@ -58,14 +58,14 @@ export class DailyRMBGiftsData extends ActivityBase { return; } let records = data.records ? data.records : []; - let isOver = false; + let isOver = true; for (let item of this.list) { let index = records.findIndex(obj => { return obj.id === item.id }) if (index != -1) { item.isReceive = true; } if (!item.isReceive) { - isOver = true; + isOver = false; } } diff --git a/shared/domain/activityField/popUpShopField.ts b/shared/domain/activityField/popUpShopField.ts index d7690d3ac..b6d8a182d 100644 --- a/shared/domain/activityField/popUpShopField.ts +++ b/shared/domain/activityField/popUpShopField.ts @@ -1,7 +1,9 @@ +import { ActivityPopUpShopModelType } from "../../db/ActivityPopUpShop"; // 弹框商店 export class PopUpShopData { + activityId: number; // 活动id id: number; // 第几个,从1开始 name: string; //名字 consume: string; //消耗资源(这里优先rmb的price价格,其次资源消耗) @@ -13,18 +15,22 @@ export class PopUpShopData { taskType: number; // 任务类型 taskParam: number; // 任务参数 condition: number; // 任务条件 - isBuy: boolean = false; //购买过 + totalCount: number; //一共完成次数 - // //解析玩家购买记录 - // public setPlayerRecords(data: ActivityPopUpShopModelType) { - // if (!data) { - // return; - // } - // for (let item of this.list) { - // let buyRecords = data.records.filter(obj => { return obj && obj.id === item.id }); - // item.buyCount = buyRecords.length; - // } - // } + isBuy: boolean = false; //购买过 + beginTime: Date = null;//开始时间 + endTime: Date = null;//结束时间 + + //解析玩家购买记录 + public setPlayerRecords(data: ActivityPopUpShopModelType) { + if (!data) { + return; + } + this.isBuy = data.isBuy ? data.isBuy : false; + this.beginTime = data.beginTime; + this.endTime = data.endTime; + this.totalCount = data.totalCount; + } public initData(data: any) { @@ -40,9 +46,13 @@ export class PopUpShopData { this.taskParam = data.taskParam; this.condition = data.condition; this.isBuy = false; + this.beginTime = null; + this.endTime = null; + this.totalCount = 0; } - constructor(activityData: any) { + constructor(activityData: any, activityId: number) { + this.activityId = activityId; this.initData(activityData) } } \ No newline at end of file diff --git a/shared/pubUtils/taskUtil.ts b/shared/pubUtils/taskUtil.ts index deb6efc02..7a3aadc20 100644 --- a/shared/pubUtils/taskUtil.ts +++ b/shared/pubUtils/taskUtil.ts @@ -21,6 +21,8 @@ import { ActivityThirtyDaysModel, ActivityThirtyDaysModelType } from '../db/Acti import { ServerlistModel } from '../db/Serverlist'; import { ActivityGrowthFundModel, ActivityGrowthFundModelType } from '../db/ActivityGrowthFund'; import { ActivityBuyRecordsModel } from '../db/ActivityBuyRecords'; +import { PopUpShopData } from '../domain/activityField/popUpShopField'; +import { ActivityPopUpShopModel } from '../db/ActivityPopUpShop'; @@ -567,6 +569,32 @@ export async function accomplishTask(serverId: number, roleId: string, taskType: } } + //弹出商店 + { + allActivity = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.POP_UP_SHOP, new Date()); + for (let activity of allActivity) { + let allTaskData: any[] = JSON.parse(activity.data); + for (let task of allTaskData) { + let popShopData = new PopUpShopData(task, activity.activityId); + let taskRecord = await ActivityPopUpShopModel.findOpenDataByTaskId(serverId, activity.activityId, roleId, popShopData.id, popShopData.taskType) + let recordData = taskRecord && taskRecord.data ? JSON.parse(taskRecord.data) : null + if (!taskRecord || !taskRecord.isBuy) { + let { addCount, record } = isComplete(roleId, task.taskType, task.taskParam, count, parma, recordData); + if (addCount) { + if (taskType == TASK_TYPE.ROLE_LV || taskType == TASK_TYPE.ROLE_TITLE) { + await ActivityPopUpShopModel.addTaskCount(serverId, activity.activityId, roleId, task.id, task.taskType, addCount); + } else { + await ActivityPopUpShopModel.addTaskCount(serverId, activity.activityId, roleId, task.id, task.taskType, addCount); + } + } + if (record) { + await ActivityPopUpShopModel.addTaskRecord(serverId, activity.activityId, roleId, task.id, task.taskType, JSON.stringify(record)); + } + } + } + } + } + //主线成长基金 if (taskType === TASK_TYPE.BATTLE_MAIN) { allActivity = await ActivityModel.findOpenActivityByTypes(activityGroupId, [ACTIVITY_TYPE.GROWTH_FUND_MAIN, ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP], new Date());