import { ACTIVITY_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, STATUS } from '../../consts'; import { ActivityModel, ActivityModelType } from '../../db/Activity'; import { PopShopItem, PopUpConditionParamInter, PopUpShopData, PopUpShopPackage, PopUpShopItemShow, } from '../../domain/activityField/popUpShopField'; import { RewardParam } from '../../domain/activityField/rewardField'; import { addReward, stringToRewardParam } from './giftPackageService'; import { ActivityPopUpShopModel, ActivityPopUpShopModelType, PopUpShopItem } from '../../db/ActivityPopUpShop'; import { ServerlistModel } from '../../db/Serverlist'; import moment = require('moment'); import { getActivitiesByType, getActivityById, pushActivities, pushActivityInter, pushSingleActivity } from './activityService'; import { RoleModel, RoleType } from '../../db/Role'; import { HeroType } from '../../db/Hero'; /** * 玩家活动数据 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * */ export async function getPopUpShopData(activityId: number, serverId: number, roleId: string, role?: RoleType) { if(!role) role = await RoleModel.findByRoleId(roleId, 'roleId totalPay'); let activityData = await getActivityById(activityId); let playerRecords = await ActivityPopUpShopModel.findAllEffectData(serverId, activityId, roleId); let latestRecords = await ActivityPopUpShopModel.findAllLastData(serverId, activityId, roleId); let playerData = new PopUpShopData(activityData); playerData.setPlayerRecords(playerRecords, latestRecords, role.totalPay); return playerData; } export async function getPopUpShopDataShow(activityId: number, serverId: number, roleId: string, role?: RoleType) { let playerData = await getPopUpShopData(activityId, serverId, roleId, role); if(playerData && playerData.canShow && playerData.canShow()) { return playerData.getShowResult(); } return null } export async function checkPopUpConditionInCreateHero(serverId: number, roleId: string, heroes: HeroType[]) { let conditions = heroes.map(hero => ({ conditionType: POP_UP_SHOP_CONDITION_TYPE.GET_HERO_BY_QUALITY, param: { quality: hero.quality } })); return await checkPopUpConditions(serverId, roleId, conditions); } export async function checkPopUpCondition(serverId: number, roleId: string, conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter) { return await checkPopUpConditions(serverId, roleId, [{ conditionType, param }]); } // 弹出礼包任务 export async function checkPopUpConditions(serverId: number, roleId: string, conditions: { conditionType: POP_UP_SHOP_CONDITION_TYPE, param: PopUpConditionParamInter }[]) { let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.POP_UP_SHOP); let pushData: pushActivityInter[] = []; for(let { activityId, type: activityType } of activities) { let playerData = await getPopUpShopData(activityId, serverId, roleId); let pushItems: PopUpShopItemShow[] = []; for(let { conditionType, param } of conditions) { for(let pkg of playerData.packages) { console.log('##### 3', pkg.id, pkg.checkPackageCanPush(conditionType)) if( !pkg.checkPackageCanPush(conditionType)) { // 筛选推送 continue; } let items = pkg.getItemsByCondition(param); console.log('##### 4', items, items.length) if(items.length > 0) { let popUpShopRec = await ActivityPopUpShopModel.createRecord({ serverId, activityId, roleId, id: pkg.id, ...pkg.getEffectTime(), items: items.map(item => new PopUpShopItem(item)) }); let result = pkg.pushPackage(popUpShopRec); pushItems.push(...result); } } } console.log('##### 5', pushItems.length) if(pushItems.length > 0) { pushData.push({ activityId, activityType, param: { popUpShopItems: pushItems } }); } } console.log('##### 6', pushData.length) return await pushActivities(pushData, roleId); } /** * 结算购买礼包的奖励 * * @param {number} serverId 区Id * @param {number} activityId 活动Id * @param {string} roleId 角色Id * @param {string} productID 商品ID * */ export async function makePopUpShopReward(roleId: string, roleName: string, sid: string, serverId: number, activityId: number, productID: string, paramStr: string, roleInfo: RoleType) { if (!paramStr) { return STATUS.ORDER_PARAM_ERROR; } let paramObj = JSON.parse(paramStr); let code = paramObj.code; let playerData = await getPopUpShopData(activityId, serverId, roleId, roleInfo); if (!playerData) { return STATUS.ACTIVITY_MISSING; } if (playerData.type !== ACTIVITY_TYPE.POP_UP_SHOP) { return STATUS.ACTIVITY_TYPE_ERROR; } let playerRecord: ActivityPopUpShopModelType = await ActivityPopUpShopModel.addRecord(serverId, activityId, roleId, code, productID); if (!playerRecord) { return STATUS.APPLY_ORDER_ERROR; } let item = playerData.updateRecord(playerRecord, productID); let rewardParamArr: Array = stringToRewardParam(item.reward); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT) return { code: 0, data: Object.assign(result, { item: item, activityId }) } }