diff --git a/game-server/app/servers/activity/handler/popUpShopHandler.ts b/game-server/app/servers/activity/handler/popUpShopHandler.ts index 6c43175d2..673f6bfc6 100644 --- a/game-server/app/servers/activity/handler/popUpShopHandler.ts +++ b/game-server/app/servers/activity/handler/popUpShopHandler.ts @@ -1,11 +1,11 @@ import { Application, BackendSession, HandlerService, } from 'pinus'; import { resResult, splitString } from '../../../pubUtils/util'; -import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, STATUS, CURRENCY_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, } from '../../../consts'; -import { checkPopUpCondition, getPopUpShopDataShow } from '../../../services/activity/popUpShopService'; +import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, STATUS, CURRENCY_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, ACTIVITY_TYPE, } from '../../../consts'; +import { checkPopUpCondition, getPopUpShopData, getPopUpShopDataShow } from '../../../services/activity/popUpShopService'; import { ActivityModel, ActivityModelType } from '../../../db/Activity'; import { ActivityPopUpShopModel, ActivityPopUpShopModelType } from '../../../db/ActivityPopUpShop'; import { PopUpShopData } from '../../../domain/activityField/popUpShopField'; -import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService'; +import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { RewardParam } from '../../../domain/activityField/rewardField'; import { handleCost } from '../../../services/rewardService'; import moment = require('moment'); @@ -57,73 +57,50 @@ export class PopUpShopHandler { } - // /** - // * @description 购买礼包 - // * @param {{ activityId: number, id: number, beginTimeStamp: number}} msg - // * @param {BackendSession} session - // * @memberof PopUpShopHandler - // */ - // async buyGift(msg: { activityId: number, id: number, beginTimeStamp: number }, session: BackendSession) { - // const { activityId, id, beginTimeStamp } = msg; - // const roleId = session.get('roleId'); - // const serverId = session.get('serverId'); - // const sid = session.get('sid'); - // const roleName = session.get('roleName'); + /** + * @description 购买礼包 + * @param {{ activityId: number, id: number, beginTimeStamp: number}} msg + * @param {BackendSession} session + * @memberof PopUpShopHandler + */ + async buyGift(msg: { activityId: number, id: number, code: string }, session: BackendSession) { + const { activityId, code, id } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); - // let beginTime = moment(beginTimeStamp).toDate(); + let playerData = await getPopUpShopData(activityId, serverId, roleId); + if (!playerData) { + return resResult(STATUS.ACTIVITY_MISSING); + } + if (playerData.type !== ACTIVITY_TYPE.POP_UP_SHOP) { + return resResult(STATUS.ACTIVITY_TYPE_ERROR); + } - // let activityData: ActivityModelType = await getActivityById(activityId); - // if (!activityData) { - // return resResult(STATUS.ACTIVITY_MISSING); - // } + let record = await ActivityPopUpShopModel.findByCode(serverId, activityId, roleId, code); + if(!record) return resResult(STATUS.ACTIVITY_TASK_NOT_COMPLETE); + let pkg = playerData.findPackageById(record.id); + let item = pkg?.findItemById(id); + if(!item) { + return resResult(STATUS.ACTIVITY_MISSING); + } - // let allTaskData: any[] = JSON.parse(activityData.data); - // let taskIndex = allTaskData.findIndex(obj => { return obj && obj.id == id }); - // if (taskIndex == -1) { - // return resResult(STATUS.ACTIVITY_DATA_ERROR); - // } + let consume = stringToConsumeParam(item.consume); + let consumeResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT); + if(!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); + + record = await ActivityPopUpShopModel.addRecordById(serverId, activityId, roleId, code, id); + let showItem = playerData.updateRecordById(record, id); - // let playerData = new PopUpShopData(allTaskData[taskIndex], activityId); + let rewardParamArr: Array = stringToRewardParam(item.reward); + let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT) - // if (playerData.price) { - // return resResult(STATUS.ACTIVITY_NEED_PAY); - // } - - // if (playerData.consume) { - // return resResult(STATUS.ACTIVITY_NEED_PAY); - // } - - // let playerRecords: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findDataByBeginTime(serverId, activityId, roleId, id, playerData.taskType, beginTime); - // if (!playerRecords) { - // return resResult(STATUS.ACTIVITY_POP_UP_SHOP_EXPIRE); - // } - // if (playerRecords.buyCount >= playerData.count) { - // return resResult(STATUS.ACTIVITY_MAX_COUNT); - // } - - // 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)) { - // return resResult(STATUS.ACTIVITY_GOLD_RESOURCE); - // } - // let price = arr[2];//数量 - // let resourceResult = await handleCost(roleId, sid, [{ id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.GOLD), count: price }], ITEM_CHANGE_REASON.POP_UP_BUY_GIFT); - // if (!resourceResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - - // let rewardParamArr: Array = stringToRewardParam(playerData.reward); - // let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT) - - // await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, id, playerData.taskType, 1, beginTime); - - // playerData.buyCount += 1; - // return resResult(STATUS.SUCCESS, Object.assign(result, { - // param: { activityId, id }, - // item: playerData - // })); - // } + + return resResult(STATUS.SUCCESS, { + ...result, param: { activityId, id }, + item: showItem + }); + } } diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index bdc7c033a..0e7fe3110 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -494,6 +494,7 @@ export const STATUS = { ERROR_TYPE: { code: 70012, simStr: '未知活动类型' }, ORDER_PARAM_ERROR: { code: 70013, simStr: '订单参数错误' }, CHANNEL_INFO_NOT_FOUND: { code: 70014, simStr: '未找到玩家渠道数据' }, + ACTIVITY_TASK_NOT_COMPLETE: { code: 70015, simStr: '条件未达成' }, } diff --git a/shared/db/ActivityPopUpShop.ts b/shared/db/ActivityPopUpShop.ts index f5db9f819..eb19dc28c 100644 --- a/shared/db/ActivityPopUpShop.ts +++ b/shared/db/ActivityPopUpShop.ts @@ -91,6 +91,11 @@ export default class Activity_Pop_Up_Shop extends BaseModel { return rec; } + public static async findByCode(serverId: number, activityId: number, roleId: string, code: string) { + let rec: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOne({ serverId, activityId, roleId, code }).lean(); + return rec; + } + public static async addRecord(serverId: number, activityId: number, roleId: string, code: string, productID: string) { let rec: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate( { serverId, activityId, roleId, code, 'items.productID': productID }, @@ -98,6 +103,14 @@ export default class Activity_Pop_Up_Shop extends BaseModel { { new: true} ).lean(); return rec; } + + public static async addRecordById(serverId: number, activityId: number, roleId: string, code: string, itemid: number) { + let rec: ActivityPopUpShopModelType = await ActivityPopUpShopModel.findOneAndUpdate( + { serverId, activityId, roleId, code, 'items.id': itemid }, + { $set: { hasBought: true }, $inc: { 'items.$.hasBoughtCnt': 1 } }, + { new: true} ).lean(); + return rec; + } } export const ActivityPopUpShopModel = getModelForClass(Activity_Pop_Up_Shop); diff --git a/shared/domain/activityField/popUpShopField.ts b/shared/domain/activityField/popUpShopField.ts index 3919014ca..823ae5d95 100644 --- a/shared/domain/activityField/popUpShopField.ts +++ b/shared/domain/activityField/popUpShopField.ts @@ -103,7 +103,7 @@ export class PopUpShopData extends ActivityBase { } } - private findPackageById(id: number) { + public findPackageById(id: number) { let index = this.packageMap.get(id); return this.packages[index]; } @@ -119,6 +119,13 @@ export class PopUpShopData extends ActivityBase { let item = pkg.findItemByProductID(productID); return item.updateItem(dataItem); } + + public updateRecordById(data: ActivityPopUpShopModelType, id: number) { + let pkg = this.findPackageById(data.id); + let dataItem = data.items.find(cur => cur.id == id); + let item = pkg.findItemById(id); + return item.updateItem(dataItem); + } } // 同一礼包类型为一组,共享cd,档位 @@ -135,6 +142,7 @@ export class PopUpShopPackage { items: PopShopItem[] = []; // 礼包 keyItem: PopUpShopKeyItem[] = []; // 关键资源限制,refreshDay内可以获得Y个 private itemByProductID: Map = new Map(); // productID => index + private itemById: Map = new Map(); private parent: PopUpShopData; // setPlayerRecord的时候处理的数据 @@ -159,6 +167,7 @@ export class PopUpShopPackage { let obj = new PopShopItem(item, this); this.items.push(obj); this.itemByProductID.set(obj.productID, this.items.length - 1); + this.itemById.set(obj.id, this.items.length - 1); } for(let key of data.keyItem) { this.keyItem.push(new PopUpShopKeyItem(key)); @@ -175,6 +184,11 @@ export class PopUpShopPackage { return this.items[index]; } + public findItemById(id: number) { + let index = this.itemById.get(id); + return this.items[index]; + } + public addPlayerRecord(data: ActivityPopUpShopModelType) { let now = new Date(); this.hasPushCnt++;