diff --git a/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts new file mode 100644 index 000000000..35845d568 --- /dev/null +++ b/game-server/app/servers/activity/handler/dailyRMBGiftsHandler.ts @@ -0,0 +1,58 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, } from '../../../consts'; +import { getPlayerDailyGiftsData, makeDailyRMBGiftsReward } from '../../../services/dailyRMBGiftsService'; + +export default function (app: Application) { + return new DailyRMBGiftsHandler(app); +} + +export class DailyRMBGiftsHandler { + constructor(private app: Application) { + } + + /************************每日特惠礼包RMB购买4挡,一次性支付购买7天,每天只能领取当天的礼包奖励****************************/ + + /** + * @description 获取每日特惠礼包活动数据 + * @param {{ }} msg + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof DailyRMBGiftsHandler + */ + async getDailyRMBGiftsActivity(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await getPlayerDailyGiftsData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_THIRTY_DAYS_END); + + return resResult(STATUS.SUCCESS, { playerData }); + } + + /** + * @description 一次性购买7天后,获取当天的礼包 + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof DailyRMBGiftsHandler + */ + async getDailyRMBGiftsReward(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + 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) + + return resResult(STATUS.SUCCESS, resulet); + } + +} diff --git a/game-server/app/services/dailyRMBGiftsService.ts b/game-server/app/services/dailyRMBGiftsService.ts new file mode 100644 index 000000000..31e2b9e11 --- /dev/null +++ b/game-server/app/services/dailyRMBGiftsService.ts @@ -0,0 +1,84 @@ +import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityDailyRMBGiftsModel, ActivityDailyRMBGiftsModelType } from '../db/ActivityDailyRMBGifts'; +import { DailyRMBGiftsData, DailyRMBGiftsItem } from '../domain/activityField/dailyRMBGiftsField'; +import { RoleModel } from '../db/Role'; +import moment = require('moment'); +import { UserOrderModel, UserOrderModelType } from '../db/UserOrder'; +import { RewardParam } from '../domain/activityField/rewardField'; +import { addReward, stringToRewardParam } from './giftPackageService'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ + +export async function thirtyDaysActivity(type: number, serverId: number, roleId: string) { + let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(type, true) + activityArray = activityArray.sort((a, b) => { + return a.activityId - b.activityId + }); + let allPlayerActivity = []; + for (let i = 0; i < activityArray.length; i++) { + let activityData = activityArray[i]; + let playerData = await getPlayerDailyGiftsData(activityData.activityId, serverId, roleId); + allPlayerActivity.push(playerData) + } + + return allPlayerActivity +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerDailyGiftsData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + + let playerData = new DailyRMBGiftsData(activityData); + let productID = playerData.productID; + + 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() + 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); + + playerData.setPlayerRecords(playerRecords, endTime); + return playerData; +} + +/** + * 结算购买礼包的奖励 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * @param {string} productID 商品ID + * + */ +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, true); + let playerData = new DailyRMBGiftsData(activityData); + let bigGiftProductID = playerData.productID; + if (bigGiftProductID == productID) {//一次性购买7天礼包 + return { goods: [], addHeros: [] } + } else { + let item = playerData.findProduct(productID); + let rewardParamArr: Array = stringToRewardParam(item.reward); + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + return result + } +} diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index 538bbb0ba..a3ccc8684 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -7,6 +7,7 @@ import { makeYuanbaoShopReward } from './yuanbaoService'; import { RoleModel } from '../db/Role'; import { makeMonthlyTicketReward } from './monthlyTicketService'; import { makeSignInVIP } from './signInService'; +import { makeDailyRMBGiftsReward } from './dailyRMBGiftsService'; @@ -64,7 +65,11 @@ export async function makeOrder(localOrderID: string, sid: string) { let resule = await makeMonthlyTicketReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, roleInfo.funcs, orderInfo.activityId, orderInfo.productID) break; } - + case ACTIVITY_TYPE.RECHARGE_MONEY: + { + let resule = await makeDailyRMBGiftsReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, roleInfo.funcs, orderInfo.activityId, orderInfo.productID) + break; + } default: return '未知商品类型'; } diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index 9fb8a83d5..d2cbe9bb0 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -88,3 +88,6 @@ export enum ORDER_STATE { export const SERVER_OPEN_TIME = '2021-02-11T20:03:16.637+08:00'; //玩家等级大于等于15级才能开启vip签到 export const SIGNIN_VIP_OPEN_LIMIT = 15; + +//每日特惠礼包RMB购买4挡,一次性支付购买7天,每天只能领取当天的礼包奖励 +export const DAILYRMBGIFTS_DAYS = 7;//一次性购买*天 \ No newline at end of file diff --git a/shared/db/ActivityDailyRMBGifts.ts b/shared/db/ActivityDailyRMBGifts.ts new file mode 100644 index 000000000..429f45b27 --- /dev/null +++ b/shared/db/ActivityDailyRMBGifts.ts @@ -0,0 +1,43 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 每日特惠礼包RMB购买4挡,一次性支付购买7天,每天只能领取当天的礼包奖励 +*/ + + +@index({ roleId: 1 }) + +export default class ActivityDailyRMBGifts extends BaseModel { + @prop({ required: true }) + serverId: number; // 服Id + @prop({ required: true }) + activityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + id: number; // 领取的商品id + + //添加领取记录 + public static async addRecord(serverId: number, activityId: number, roleId: string, id: number) { + await ActivityDailyRMBGiftsModel.insertMany( + { serverId, roleId, activityId, id } + ) + } + + //历史领取的记录 + 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); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(serverId: number, activityId: number, roleId: string) { + await ActivityDailyRMBGiftsModel.deleteMany({ serverId, roleId, activityId }); + } +} + +export const ActivityDailyRMBGiftsModel = getModelForClass(ActivityDailyRMBGifts); + +export interface ActivityDailyRMBGiftsModelType extends Pick, keyof ActivityDailyRMBGifts> { } +export type ActivityDailyRMBGiftsModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/UserOrder.ts b/shared/db/UserOrder.ts index 2ec3d7492..f141080f1 100644 --- a/shared/db/UserOrder.ts +++ b/shared/db/UserOrder.ts @@ -69,6 +69,12 @@ export default class UserOrder extends BaseModel { return result; } + //查询订单详情 + public static async findPlayerOrder(productID: string, roleId: string, activityId: number, limit: number) { + let result: UserOrderModelType[] = await UserOrderModel.find({ productID, roleId, activityId }, {}).limit(limit).sort({ createdAt: -1 }).lean(true); + return result; + } + //查询订单详情 public static async findOrderByActivityID(activityId: number, roleId: string,) { let result: UserOrderModelType[] = await UserOrderModel.find({ activityId, roleId }).lean(true); diff --git a/shared/domain/activityField/dailyRMBGiftsField.ts b/shared/domain/activityField/dailyRMBGiftsField.ts new file mode 100644 index 000000000..f640a0596 --- /dev/null +++ b/shared/domain/activityField/dailyRMBGiftsField.ts @@ -0,0 +1,89 @@ +import { DAILYRMBGIFTS_DAYS } from '../../consts'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityDailyRMBGiftsModelType } from '../../db/ActivityDailyRMBGifts'; +import { deltaDays } from '../../pubUtils/util'; +import { ActivityBase } from './activityField'; + +// 商品数据 +export class DailyRMBGiftsItem { + id: number; // 第几个,从1开始 + productID: string; // 商品id支付时使用 + name: string; // 名字 + price: number; //消费点数 + reward: string; //任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + + isBuy: boolean = false; //是否已经购买 + isReceive: boolean = false; //是否领取过奖励 + + constructor(data: any) { + this.id = data.id; + this.productID = data.productID; + this.name = data.name; + this.price = data.price; + this.reward = data.reward; + } +} + +// 每日特惠礼包RMB购买4挡,一次性支付购买7天活动数据 +export class DailyRMBGiftsData extends ActivityBase { + name: string = '';//活动名称 + day: number = DAILYRMBGIFTS_DAYS;//一次购买几天 + price: number = 0;//一次性购买的价格 + productID: string = '';//一次性购买的商品id + list: Array = [];//每件商品信息 + + receiveCount: number = 0;//已经领取次数(一次性购买) + + public findTodayItem() { + let index = this.list.findIndex(obj => { return obj.productID == '' }); + return (index != -1) ? this.list[index] : null + } + + public findProduct(productID: string) { + let index = this.list.findIndex(obj => { return obj.productID == productID }); + return (index != -1) ? this.list[index] : null + } + + //解析玩家领取记录 + public setPlayerRecords(data: ActivityDailyRMBGiftsModelType[], endTime: Date) { + let isOver = true; + for (let item of this.list) { + let index = data.findIndex(obj => { obj.id == item.id }); + if (index != -1) { + item.isBuy = true; + item.isReceive = true; + } else { + item.isBuy = false; + item.isReceive = false; + isOver = false; + } + } + if (endTime) {//DAILYRMBGIFTS_DAYS天内有购买过一次性礼包结束时间 + // if (moment(new Date()).toDate() < endTime) { + // for (let item of this.list) { + // item.isBuy = true; + // } + // } + this.receiveCount = deltaDays(new Date, endTime) + (isOver ? 0 : 1); + } + } + + + public initData(data: string) { + let dataObj = JSON.parse(data); + this.name = dataObj.name; + this.day = dataObj.day; + this.price = dataObj.price; + this.productID = dataObj.productID; + + let arr = dataObj.data; + for (let obj of arr) { + this.list.push(new DailyRMBGiftsItem(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file