diff --git a/game-server/app/servers/activity/handler/firstGiftHandler.ts b/game-server/app/servers/activity/handler/firstGiftHandler.ts index 98a8af40f..6987e4c94 100644 --- a/game-server/app/servers/activity/handler/firstGiftHandler.ts +++ b/game-server/app/servers/activity/handler/firstGiftHandler.ts @@ -5,6 +5,7 @@ import { getPlayerFirstGiftData } from '../../../services/activity/firstGiftServ import { RoleModel } from '../../../db/Role'; import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { ActivityFirstGiftModel } from '../../../db/ActivityFirstGift'; +import { RewardParam } from '../../../domain/activityField/rewardField'; export default function (app: Application) { new HandlerService(app, {}); @@ -48,8 +49,8 @@ export class FirstGiftHandler { * @param {BackendSession} session * @memberof FirstGiftHandler */ - async getFirstGiftReward(msg: { activityId: number, index: number }, session: BackendSession) { - const { activityId, index } = msg; + async getFirstGiftReward(msg: { activityId: number, pageIndex: number }, session: BackendSession) { + const { activityId, pageIndex } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); const sid = session.get('sid'); @@ -60,28 +61,30 @@ export class FirstGiftHandler { if (!playerData) { return resResult(STATUS.ACTIVITY_MISSING); } - if (playerData.state === FIRST_GIFT_STATE.CLOSED) { + + let playerPageData = playerData.findPageByIndex(pageIndex); + if (playerPageData.state === FIRST_GIFT_STATE.NOT_PAY) { return resResult(STATUS.ACTIVITY_FIRST_GIFT_NOT_OPEN); } - let items = playerData.canReceiveItems(); + let items = playerPageData.getCanReceiveItems(); if (items.length === 0) { return resResult(STATUS.ACTIVITY_REWARDED); } - let rewardArray = []; - let indexArray = []; + let rewardArray: RewardParam[] = []; + let indexArray: number[] = []; for (let item of items) { - rewardArray = rewardArray.concat(stringToRewardParam(item.reward)) + rewardArray.push(...stringToRewardParam(item.reward)); indexArray.push(item.index) item.isReceive = true; } let result = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.FIRST_GIFT); - let isOver = playerData.isComplete(); + let isOver = playerPageData.isComplete(); - await ActivityFirstGiftModel.addRecord(activityId, roleId, indexArray, isOver); + await ActivityFirstGiftModel.addRecord(activityId, roleId, pageIndex, indexArray, isOver); return resResult(STATUS.SUCCESS, Object.assign(result, { - param: { activityId }, + param: { activityId, pageIndex }, items: items })); } diff --git a/game-server/app/servers/gm/handler/gmOrderHandler.ts b/game-server/app/servers/gm/handler/gmOrderHandler.ts index 06164573b..c871a45f4 100644 --- a/game-server/app/servers/gm/handler/gmOrderHandler.ts +++ b/game-server/app/servers/gm/handler/gmOrderHandler.ts @@ -6,7 +6,7 @@ import _ = require('underscore'); import { dicRMB } from '../../../pubUtils/dictionary/DicRMB'; import { getActivityById } from '../../../services/activity/activityService'; import { UserOrderModel } from '../../../db/UserOrder'; -import { makeOrder, settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService'; +import { settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService'; import { getActivityProducts, getParamStr } from '../../../services/gmService'; import { ActivityGroupModel } from '../../../db/ActivityGroup'; import { Receiver } from '../../../db/GMMail'; diff --git a/game-server/app/servers/order/handler/orderHandler.ts b/game-server/app/servers/order/handler/orderHandler.ts index 17238b640..bccc87985 100644 --- a/game-server/app/servers/order/handler/orderHandler.ts +++ b/game-server/app/servers/order/handler/orderHandler.ts @@ -7,7 +7,7 @@ import _ = require('underscore'); import { applyOrderWX, checkOrderWX } from '../../../services/pay/weixinPay'; import { applyOrderALI, checkOrderALI } from '../../../services/pay/aliPay'; import { applyOrder37 } from '../../../services/pay/37Pay'; -import { makeOrder, settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService'; +import { settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService'; import { addRechargeMoney } from '../../../services/activity/rechargeMoneyService'; import { addVipRechargeMoney } from '../../../services/activity/vipRechargeMoneyService'; import { checkActivityTask } from '../../../services/taskService'; diff --git a/game-server/app/services/activity/firstGiftService.ts b/game-server/app/services/activity/firstGiftService.ts index bfdb04f57..fa36dd6f8 100644 --- a/game-server/app/services/activity/firstGiftService.ts +++ b/game-server/app/services/activity/firstGiftService.ts @@ -1,38 +1,38 @@ import { ACTIVITY_TYPE } from '../../consts'; import { ActivityModel, ActivityModelType } from '../../db/Activity'; import { ActivityFirstGiftModel, ActivityFirstGiftModelType } from '../../db/ActivityFirstGift'; -import { RoleModel } from '../../db/Role'; +import { RoleModel, RoleType } from '../../db/Role'; import { ServerlistModel } from '../../db/Serverlist'; import { FirstGiftData } from '../../domain/activityField/firstGiftField'; import { getActivityById } from './activityService'; -/** - * 获取活动数据 - * - * @param {number} serverId 区Id - * @param {number} type 活动类型 ACTIVITY_TYPE - * @param {string} roleId 角色Id - * - */ +// /** +// * 获取活动数据 +// * +// * @param {number} serverId 区Id +// * @param {number} type 活动类型 ACTIVITY_TYPE +// * @param {string} roleId 角色Id +// * +// */ -export async function firstGiftActivity(serverId: number, roleId: string) { - let { activityGroupId } = await ServerlistModel.findByServerId(serverId); - let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, 1) +// export async function firstGiftActivity(serverId: number, roleId: string) { +// let { activityGroupId } = await ServerlistModel.findByServerId(serverId); +// let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, 1) - if (activityArray.length == 0) { - return null; - } - let activityData = activityArray[0]; - let playerRecord: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findData(activityData.activityId, roleId); - if (!playerRecord || playerRecord.isOver) { - return null; - } +// if (activityArray.length == 0) { +// return null; +// } +// let activityData = activityArray[0]; +// let playerRecord: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findData(activityData.activityId, roleId); +// if (!playerRecord || playerRecord.isOver) { +// return null; +// } - let { createTime } = await RoleModel.findByRoleId(roleId); - let playerData = new FirstGiftData(activityData, createTime); - playerData.setPlayerRecords(playerRecord); - return playerData; -} +// let { createTime } = await RoleModel.findByRoleId(roleId); +// let playerData = new FirstGiftData(activityData, createTime); +// playerData.setPlayerRecords(playerRecord); +// return playerData; +// } /** * 玩家活动数据 @@ -44,10 +44,28 @@ export async function firstGiftActivity(serverId: number, roleId: string) { */ export async function getPlayerFirstGiftData(activityId: number, serverId: number, roleId: string) { let activityData = await getActivityById(activityId); - let playerRecord: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findData(activityId, roleId); + let playerRecord = await ActivityFirstGiftModel.findData(activityId, roleId); let { createTime } = await RoleModel.findByRoleId(roleId); let playerData = new FirstGiftData(activityData, createTime); playerData.setPlayerRecords(playerRecord); return playerData; } + +/** + * 记录玩家首充记录 + * @param {RoleType} role 玩家数据 + * @param {number} serverId 区id + */ +export async function recordFirstGift(role: RoleType, serverId: number) { + let { activityGroupId } = await ServerlistModel.findByServerId(serverId); + let activityArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, new Date()) + for (let obj of activityArray) { + let playerData = new FirstGiftData(obj, role.createTime); + for(let { pageIndex, targetMoney } of playerData.list) { + if(role.totalPay >= targetMoney) { + await ActivityFirstGiftModel.begin(obj.activityId, role.roleId, pageIndex ); + } + } + } +} diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index 97a0a9258..72112f7f1 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -28,6 +28,7 @@ import { getRoleOnlineInfo } from './redisService'; import { PayCallback37Data } from '../domain/sdk'; import { reportTAEvent, reportTAUserSet } from './sdkService'; import { savePayLog } from '../pubUtils/logUtil'; +import { recordFirstGift } from './activity/firstGiftService'; /** @@ -49,16 +50,6 @@ export async function makeOrder(orderInfo: UserOrderModelType, sid: string) { let rewardResult: any = { code: 0, data: null }; - //首冲礼包 - { - let { activityGroupId } = await ServerlistModel.findByServerId(orderInfo.serverId); - let activityArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.FIRST_GIFT, new Date()) - for (let obj of activityArray) { - await ActivityFirstGiftModel.begin(obj.activityId, roleId); - } - } - - switch (productType) { case ACTIVITY_TYPE.SIGN_IN_VIP: { @@ -144,6 +135,11 @@ export async function makeOrder(orderInfo: UserOrderModelType, sid: string) { rewardResult = STATUS.ERROR_TYPE; break; } + + if(rewardResult.code == 0) { + await recordFirstGift(roleInfo, orderInfo.serverId); + } + pinus.app.get('channelService').pushMessageByUids('onPlayerDataChange', resResult(STATUS.SUCCESS, { totalPay: roleInfo.totalPay }), [{ uid: roleId, sid }]); diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index eb7f3c73d..d29a38411 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -95,8 +95,8 @@ export enum SELF_SERVICE_SHOP_CELL_TYPE { * 活动首充礼包的状态 */ export enum FIRST_GIFT_STATE { - CLOSED = 0, // 未开启 - OPEN = 1, // 开启中 + NOT_PAY = 0, // 未充值 + PAY = 1, // 已充值 } /** diff --git a/shared/db/ActivityFirstGift.ts b/shared/db/ActivityFirstGift.ts index ffd35cb6f..83d61a25a 100644 --- a/shared/db/ActivityFirstGift.ts +++ b/shared/db/ActivityFirstGift.ts @@ -12,26 +12,29 @@ export default class Activity_First_Gift extends BaseModel { @prop({ required: true }) roleId: string; // 用户Id @prop({ required: true }) + pageIndex: number; // 活动第几页 + @prop({ required: true }) days: Array; // 领取过的奖励 @prop({ required: true }) isOver: boolean; // 是否全部领取结束 //添加领取记录 - public static async addRecord(activityId: number, roleId: string, indexArray: number[], isOver: boolean) { - let result: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findOneAndUpdate({ roleId, activityId, }, + public static async addRecord(activityId: number, roleId: string, pageIndex: number, indexArray: number[], isOver: boolean) { + let result: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findOneAndUpdate({ roleId, activityId, pageIndex }, { $push: { days: { $each: indexArray } }, $set: { isOver: isOver } }, { new: true }).lean(true); return result; } //可以领取首充礼包,充值时间记录 - public static async begin(activityId: number, roleId: string) { - let result: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findOneAndUpdate({ roleId, activityId }, + public static async begin(activityId: number, roleId: string, pageIndex: number) { + let result: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findOneAndUpdate({ roleId, activityId, pageIndex }, {}, { upsert: true, new: true }).lean(true); return result; } + public static async findData(activityId: number, roleId: string) { - let result: ActivityFirstGiftModelType = await ActivityFirstGiftModel.findOne({ roleId, activityId }, {}).lean(true); + let result: ActivityFirstGiftModelType[] = await ActivityFirstGiftModel.find({ roleId, activityId }, {}).lean(true); return result; } diff --git a/shared/domain/activityField/firstGiftField.ts b/shared/domain/activityField/firstGiftField.ts index d93b61f79..d37701864 100644 --- a/shared/domain/activityField/firstGiftField.ts +++ b/shared/domain/activityField/firstGiftField.ts @@ -5,76 +5,134 @@ import { ActivityFirstGiftModelType } from '../../db/ActivityFirstGift'; import { deltaDays } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; +/************** 在数据库中首充礼包的格式 ***********/ + +interface FirstGiftRewardInDb { + index: number; // 第几天,从1开始 + reward: string; // type&id&count, type: 1-武将 2-道具 3-礼包 + goldCount: number; // 元宝数量 +} + +interface FirstGiftDataInDb { + pageIndex: number; // 首充第几页 + targetMoney: number; // 充值到几元 + rewards: FirstGiftRewardInDb[]; // 可领取奖励 +} + +interface FirstGiftInDb { + data: FirstGiftDataInDb[] +} + +/************** 给客户端返回的数据 ***********/ // 首充礼包的数据 export class FirstGiftItem { index: number; // 第几天,从1开始 - name: string; //名称 reward: string; //奖励 - goldCount: number; // 显示用的可获得元宝 + goldCount: number; isReceive: boolean = false; //是否领取过奖励 - constructor(data: any) { - this.name = data.name; + constructor(data: FirstGiftRewardInDb) { this.index = data.index; this.reward = data.reward; this.goldCount = data.goldCount; - this.isReceive = false; + } + + public setReceived(daysNum: number[] = []) { + if (daysNum.indexOf(this.index) !== -1) { + this.isReceive = true; + } + } + + public canReceive(todayIndex: number) { + return !this.isReceive && this.index <= todayIndex; } } -// 30天任务活动数据 -export class FirstGiftData extends ActivityBase { - state: number = FIRST_GIFT_STATE.CLOSED;//活动状态 - list: Array = [];//奖励 +export class FirstGiftPage { + pageIndex: number; + targetMoney: number; // 这页的目标充值金额 + state: number = FIRST_GIFT_STATE.NOT_PAY; //活动状态 + todayIndex: number = 0; // 玩家首次充值到达该金额后第几天 + items: FirstGiftItem[] = []; //奖励 + + constructor(data: FirstGiftDataInDb) { + console.log(data) + this.pageIndex = data.pageIndex; + this.targetMoney = data.targetMoney; + for (let obj of data.rewards) { + this.items.push(new FirstGiftItem(obj)) + } + } + + public setPlayerRecord(playerData: ActivityFirstGiftModelType) { + if(playerData) { + this.state = FIRST_GIFT_STATE.PAY; + this.todayIndex = deltaDays(moment(playerData.createdAt).startOf('d').toDate(), new Date) + 1; + + let daysNum = playerData.days||[]; + for (let obj of this.items) { + obj.setReceived(daysNum); + } + } + } - //全部领取完成 public isComplete() { - for (let i = 0; i < this.list.length; i++) { - if (!this.list[i].isReceive) { + for (let i = 0; i < this.items.length; i++) { + if (!this.items[i].isReceive) { return false } } return true; } - //奖励内容 - public findFirstGiftItem(index: number): FirstGiftItem { - let listIndex = this.list.findIndex(obj => { return obj && obj.index == index }); + // 寻找每日奖励领取数据 + public findItem(index: number) { + let listIndex = this.items.findIndex(obj => { return obj && obj.index == index }); if (listIndex != -1) { - return this.list[listIndex]; + return this.items[listIndex]; } return null; } - //可以领取的奖励 - public canReceiveItems(): FirstGiftItem[] { - return this.list.filter(obj => { return obj && !obj.isReceive && obj.index <= this.todayIndex }); + public getCanReceiveItems() { + return this.items.filter(obj => { + return obj && obj.canReceive(this.todayIndex); + }); + } +} + +// 30天任务活动数据 +export class FirstGiftData extends ActivityBase { + list: FirstGiftPage[] = [];//奖励 + private map: Map = new Map(); // pageIndex => index + + // 根据页码获得对象 + public findPageByIndex(pageIndex: number) { + let index = this.map.get(pageIndex); + return this.list[index]; } //解析玩家任务领取记录 - public setPlayerRecords(data: ActivityFirstGiftModelType) { + public setPlayerRecords(data: ActivityFirstGiftModelType[]) { this.todayIndex = 0; if (!data) { return; } - this.todayIndex = deltaDays(moment(data.createdAt).startOf('d').toDate(), new Date) + 1; - this.state = FIRST_GIFT_STATE.OPEN - - let daysNum = data.days ? data.days : []; - for (let obj of this.list) { - if (daysNum.indexOf(obj.index) !== -1) { - obj.isReceive = true; - } + for(let playerData of data) { + let pageData = this.findPageByIndex(playerData.pageIndex); + if(pageData) pageData.setPlayerRecord(playerData); } } public initData(data: string) { - let dataObj = JSON.parse(data); + let dataObj: FirstGiftInDb = JSON.parse(data); let arr = dataObj.data; for (let obj of arr) { - this.list.push(new FirstGiftItem(obj)) + let page = new FirstGiftPage(obj); + this.list.push(page); + this.map.set(page.pageIndex, this.list.length - 1); } }