diff --git a/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts index 35845d568..4c9bf7659 100644 --- a/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts +++ b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts @@ -2,6 +2,10 @@ import { Application, BackendSession } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { STATUS, } from '../../../consts'; import { getPlayerDailyGiftsData, makeDailyRMBGiftsReward } from '../../../services/dailyRMBGiftsService'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; +import { ActivityDailyRMBGiftsModel } from '../../../db/ActivityDailyRMBGifts'; +import moment = require('moment'); export default function (app: Application) { return new DailyRMBGiftsHandler(app); @@ -26,19 +30,19 @@ export class DailyRMBGiftsHandler { const serverId = session.get('serverId'); let playerData = await getPlayerDailyGiftsData(activityId, serverId, roleId) - if (!playerData) return resResult(STATUS.ACTIVITY_THIRTY_DAYS_END); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); return resResult(STATUS.SUCCESS, { playerData }); } /** * @description 一次性购买7天后,获取当天的礼包 - * @param {{ activityId: number}} msg + * @param {{ activityId: number, id:number}} msg * @param {BackendSession} session * @memberof DailyRMBGiftsHandler */ - async getDailyRMBGiftsReward(msg: { activityId: number }, session: BackendSession) { - const { activityId } = msg; + async getDailyRMBGiftsReward(msg: { activityId: number, id: number }, session: BackendSession) { + const { activityId, id } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); const sid = session.get('sid'); @@ -46,13 +50,50 @@ export class DailyRMBGiftsHandler { const funcs: number[] = session.get('funcs'); let playerData = await getPlayerDailyGiftsData(activityId, serverId, roleId) - if (!playerData) return resResult(STATUS.ACTIVITY_THIRTY_DAYS_END); - let item = playerData.findTodayItem(); - let productID = item.productID; - let resulet = await makeDailyRMBGiftsReward(roleId, roleName, sid, serverId, funcs, - activityId, productID) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); - return resResult(STATUS.SUCCESS, resulet); + if (id > 0) {//领取单个--免费奖励 + let item = playerData.findItem(id); + if (!item) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (item.isReceive) { + return resResult(STATUS.ACTIVITY_REWARDED); + } + if (item.price > 0) { + return resResult(STATUS.ACTIVITY_NEED_PAY); + } + let rewardParamArr: Array = stringToRewardParam(item.reward); + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + await ActivityDailyRMBGiftsModel.receiveRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), [item.id]); + item.isReceive = true; + return resResult(STATUS.SUCCESS, Object.assign(result, { + param: { activityId, id }, + items: [item] + })); + } else {//一键领取全天的奖励 + if (!playerData.isBuy) { + return resResult(STATUS.ACTIVITY_UNOPENED); + } + let items = playerData.unReceiveItem(); + if (items.length == 0) { + return resResult(STATUS.ACTIVITY_REWARDED); + } + let rewardArray = []; + let ids = [] + for (let item of items) { + ids.push(item.id) + let rewardParamArr: Array = stringToRewardParam(item.reward); + rewardArray = rewardArray.concat(rewardParamArr); + item.isReceive = true; + } + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardArray) + await ActivityDailyRMBGiftsModel.receiveRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), ids); + return resResult(STATUS.SUCCESS, Object.assign(result, { + param: { activityId }, + items: items + })); + } } } diff --git a/game-server/app/services/dailyRMBGiftsService.ts b/game-server/app/services/dailyRMBGiftsService.ts index b29f279c9..5346fc77e 100644 --- a/game-server/app/services/dailyRMBGiftsService.ts +++ b/game-server/app/services/dailyRMBGiftsService.ts @@ -1,4 +1,4 @@ -import { ACTIVITY_TYPE, STATUS, TASK_TYPE } from '../consts'; +import { ACTIVITY_TYPE, REFRESH_TIME, STATUS, TASK_TYPE } from '../consts'; import { ActivityModel, ActivityModelType } from '../db/Activity'; import { ActivityDailyRMBGiftsModel, ActivityDailyRMBGiftsModelType } from '../db/ActivityDailyRMBGifts'; import { DailyRMBGiftsData, DailyRMBGiftsItem } from '../domain/activityField/dailyRMBGiftsField'; @@ -46,14 +46,15 @@ export async function getPlayerDailyGiftsData(activityId: number, serverId: numb let playerOrders: UserOrderModelType[] = await UserOrderModel.findPlayerOrder(productID, roleId, activityId, 1); let buyTime = moment(new Date()).startOf('d').toDate() - let endTime = moment(new Date()).endOf('d').toDate() + let endTime = null; if (playerOrders.length > 0) { buyTime = playerOrders[0].createdAt;//购买时候的日期 endTime = moment(buyTime).add(7, 'd').endOf('d').toDate() } - let playerRecords: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.findRecord(serverId, activityId, roleId, buyTime); + let playerRecord: ActivityDailyRMBGiftsModelType = await ActivityDailyRMBGiftsModel.findRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate()); + let unReceiveRecord: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.findBuyRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate()); - playerData.setPlayerRecords(playerRecords, endTime); + playerData.setPlayerRecords(playerRecord, unReceiveRecord.length); return playerData; } @@ -69,23 +70,34 @@ export async function getPlayerDailyGiftsData(activityId: number, serverId: numb export async function makeDailyRMBGiftsReward(roleId: string, roleName: string, sid: string, serverId: number, funcs: number[], activityId: number, productID: string) { let activityData: ActivityModelType = await ActivityModel.findActivity(activityId); - if (activityData.type !== ACTIVITY_TYPE.RECHARGE_MONEY) { - return STATUS.ACTIVITY_TYPE_ERROR; + if (activityData.type !== ACTIVITY_TYPE.DAILY_RMB_GIFTS) { + return { + code: STATUS.ACTIVITY_TYPE_ERROR, + } } let playerData = new DailyRMBGiftsData(activityData); let bigGiftProductID = playerData.productID; if (bigGiftProductID == productID) {//一次性购买7天礼包 - let buyTime = moment(new Date()).startOf('d').toDate() - let endTime = moment(buyTime).add(7, 'd').endOf('d').toDate() + for (let i = 0; i < playerData.day; i++) { + let beginTime = playerData.beginTime + 24 * 60 * 60 * 1000 * i; + // let beginTime = moment(new Date()).startOf('d').add(i, 'day').add(REFRESH_TIME, 'h').toDate(); + await ActivityDailyRMBGiftsModel.buyRecord(serverId, activityId, roleId, moment(beginTime).toDate(), true); + } + let endTime = moment(playerData.endTime).add(playerData.day, 'd').toDate() return { code: 0, data: Object.assign({}, { item: { endTime, receiveCount: 0 } }) } } else { let item = playerData.findProduct(productID); + if (!item) { + return { + code: STATUS.ACTIVITY_NO_PRODUCT, + } + } let rewardParamArr: Array = stringToRewardParam(item.reward); let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) - item.isBuy = true; + await ActivityDailyRMBGiftsModel.receiveRecord(serverId, activityId, roleId, moment(playerData.beginTime).toDate(), [item.id]); item.isReceive = true; return { code: 0, diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index d57ffe24c..f5b43f694 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -1,7 +1,7 @@ import { UserOrderModel, UserOrderModelType } from '../db/UserOrder'; import { ActivitySignInModel, ActivitySignInModelType } from '../db/ActivitySignIn'; import { SignInData, SignInItem } from '../domain/activityField/signInField'; -import { ACTIVITY_TYPE, ORDER_STATE } from '../consts'; +import { ACTIVITY_TYPE, ORDER_STATE, STATUS } from '../consts'; import { dicRMB } from '../pubUtils/dictionary/DicRMB'; import { makeYuanbaoShopReward } from './yuanbaoService'; import { RoleModel } from '../db/Role'; @@ -78,7 +78,7 @@ export async function makeOrder(localOrderID: string, sid: string, orderInfo: Us rewardResult = await makeMonthlyTicketReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, roleInfo.funcs, orderInfo.activityId, orderInfo.productID) break; } - case ACTIVITY_TYPE.RECHARGE_MONEY: + case ACTIVITY_TYPE.DAILY_RMB_GIFTS: { rewardResult = await makeDailyRMBGiftsReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, roleInfo.funcs, orderInfo.activityId, orderInfo.productID) break; @@ -104,6 +104,7 @@ export async function makeOrder(localOrderID: string, sid: string, orderInfo: Us break; } default: + rewardResult = STATUS.ERROR_TYPE; break; } return rewardResult diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 613216b97..67d234f1c 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -388,6 +388,7 @@ export const STATUS = { NO_PAY: { code: 70008, simStr: '未支付' }, NO_MOTHLY_TICKET_REWARD: { code: 70009, simStr: '没有可领取的月卡奖励' }, ACTIVITY_TYPE_ERROR: { code: 70010, simStr: '活动类型错误' }, - ACTIVITY_NO_PRODUCT: { code: 70011, simStr: '活动数据错误' } + ACTIVITY_NO_PRODUCT: { code: 70011, simStr: '活动数据错误' }, + ERROR_TYPE: { code: 70012, simStr: '未知活动类型' }, } diff --git a/shared/db/ActivityDailyRMBGifts.ts b/shared/db/ActivityDailyRMBGifts.ts index 24aaf908a..370c17f1b 100644 --- a/shared/db/ActivityDailyRMBGifts.ts +++ b/shared/db/ActivityDailyRMBGifts.ts @@ -1,6 +1,18 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +/** + * 购买记录 +*/ + +export class BuyRecord { + @prop({ required: true }) + id: number; //物品id标识 + @prop({ required: true }) + time: Date; //购买时间 +} + + /** * 每日特惠礼包RMB购买4挡,一次性支付购买7天,每天只能领取当天的礼包奖励 */ @@ -16,18 +28,46 @@ export default class Activity_Daily_RMB_Gifts extends BaseModel { @prop({ required: true }) roleId: string; // 用户Id @prop({ required: true }) - id: number; // 领取的商品id + beginTime: Date; // 开始时间 + @prop({ required: true }) + isBuy: boolean; // 是否已经购买过 + @prop({ required: true }) + records: BuyRecord[]; // 领取记录 //添加领取记录 - public static async addRecord(serverId: number, activityId: number, roleId: string, id: number) { - await ActivityDailyRMBGiftsModel.insertMany( - { serverId, roleId, activityId, id } - ) + public static async receiveRecord(serverId: number, activityId: number, roleId: string, beginTime: Date, ids: number[]) { + let data = []; + for (let id of ids) { + data.push({ + id, + time: new Date() + }) + } + let result = await ActivityDailyRMBGiftsModel.findOneAndUpdate( + { serverId, roleId, activityId, beginTime }, { $push: { records: { $each: data } } }, { upsert: true, new: true } + ).lean(true) + return result; + } + + //添加购买记录 + public static async buyRecord(serverId: number, activityId: number, roleId: string, beginTime: Date, isBuy: boolean) { + let result = await ActivityDailyRMBGiftsModel.findOneAndUpdate( + { serverId, roleId, activityId, beginTime }, { $set: { isBuy } }, { upsert: true, new: true } + ).lean(true) + return result; } //历史领取的记录 public static async findRecord(serverId: number, activityId: number, roleId: string, beginTime: Date) { - let result: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.find({ serverId, roleId, activityId, createdAt: { $gt: beginTime } }).lean(true); + let result: ActivityDailyRMBGiftsModelType = await ActivityDailyRMBGiftsModel.findOne( + { serverId, roleId, activityId, beginTime }).lean(true); + return result; + } + + //获取已经购买还没有领取的数据 + public static async findBuyRecord(serverId: number, activityId: number, roleId: string, beginTime: Date) { + let result: ActivityDailyRMBGiftsModelType[] = await ActivityDailyRMBGiftsModel.find( + { serverId, roleId, activityId, beginTime: { $gt: beginTime } }).lean(true); return result; } diff --git a/shared/domain/activityField/dailyRMBGiftsField.ts b/shared/domain/activityField/dailyRMBGiftsField.ts index e419c5964..8d5074a85 100644 --- a/shared/domain/activityField/dailyRMBGiftsField.ts +++ b/shared/domain/activityField/dailyRMBGiftsField.ts @@ -1,7 +1,7 @@ -import { DAILYRMBGIFTS_DAYS } from '../../consts'; +import moment = require('moment'); +import { DAILYRMBGIFTS_DAYS, REFRESH_TIME } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityDailyRMBGiftsModelType } from '../../db/ActivityDailyRMBGifts'; -import { deltaDays } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; // 商品数据 @@ -12,7 +12,6 @@ export class DailyRMBGiftsItem { price: number; //价格 reward: string; //奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 - isBuy: boolean = false; //是否已经购买 isReceive: boolean = false; //是否领取过奖励 constructor(data: any) { @@ -21,6 +20,7 @@ export class DailyRMBGiftsItem { this.name = data.name; this.price = data.price; this.reward = data.reward; + this.isReceive = false; } } @@ -31,11 +31,17 @@ export class DailyRMBGiftsData extends ActivityBase { price: number = 0;//一次性购买的价格 productID: string = '';//一次性购买的商品id list: Array = [];//每件商品信息 + isBuy: boolean = false;//是否一次性购买过 - receiveCount: number = 0;//已经领取次数(一次性购买) + unReceiveCount: number = 0;//剩余领取次数(一次性购买) - public findTodayItem() { - let index = this.list.findIndex(obj => { return obj.productID == '' }); + public unReceiveItem() { + return this.list.filter(obj => { return !obj.isReceive }); + } + + + public findItem(id: number) { + let index = this.list.findIndex(obj => { return obj.id == id }); return (index != -1) ? this.list[index] : null } @@ -45,36 +51,47 @@ export class DailyRMBGiftsData extends ActivityBase { } //解析玩家领取记录 - public setPlayerRecords(data: ActivityDailyRMBGiftsModelType[], endTime: Date) { - let isOver = true; + public setPlayerRecords(data: ActivityDailyRMBGiftsModelType, unReceiveCount: number) { + this.isBuy = false; + this.unReceiveCount = 0; + if (!data) { + return; + } + let records = data.records ? data.records : []; + let isOver = false; for (let item of this.list) { - let index = data.findIndex(obj => { obj.id == item.id }); + let index = records.findIndex(obj => { return obj.id === item.id }) if (index != -1) { - item.isBuy = true; item.isReceive = true; - } else { - item.isBuy = false; - item.isReceive = false; - isOver = false; + } + if (!item.isReceive) { + isOver = true; } } - if (endTime) {//DAILYRMBGIFTS_DAYS天内有购买过一次性礼包结束时间 - if (new Date() < endTime) { - for (let item of this.list) { - item.isBuy = true; - } - } - this.receiveCount = deltaDays(new Date, endTime) + (isOver ? 0 : 1); + + this.isBuy = data.isBuy; + this.unReceiveCount = unReceiveCount; + if (this.isBuy && !isOver) { + this.unReceiveCount += 1; } } - public initData(data: string) { + this.isBuy = false; + this.unReceiveCount = 0; let dataObj = JSON.parse(data); this.name = dataObj.name; this.day = dataObj.day; this.price = dataObj.price; this.productID = dataObj.productID; + let curDate = moment(new Date()); + if (curDate.hour() < REFRESH_TIME) { + this.beginTime = moment(new Date()).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').valueOf(); + this.endTime = moment(new Date()).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').valueOf(); + } else { + this.beginTime = moment(new Date()).startOf('d').add(REFRESH_TIME, 'h').valueOf(); + this.endTime = moment(new Date()).startOf('d').add(REFRESH_TIME, 'h').valueOf(); + } let arr = dataObj.data; for (let obj of arr) {