diff --git a/game-server/app/servers/activity/handler/newHeroGiftsHandler.ts b/game-server/app/servers/activity/handler/newHeroGiftsHandler.ts new file mode 100644 index 000000000..c9850ae3f --- /dev/null +++ b/game-server/app/servers/activity/handler/newHeroGiftsHandler.ts @@ -0,0 +1,74 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, } from '../../../consts'; +import { getPlayerNewHeroGiftsData } from '../../../services/newHeroGiftsService'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; +import { ActivityNewHeroGiftModel } from '../../../db/ActivityNewHeroGift'; +import moment = require('moment'); + +export default function (app: Application) { + return new NewHeroGiftsHandler(app); +} + +export class NewHeroGiftsHandler { + constructor(private app: Application) { + } + + /************************新将好礼,很多红包,用积分兑换一遍结束****************************/ + + /** + * @description 获取新将好礼活动数据 + * @param {{ }} msg + * @param {{ activityId: number}} msg + * @param {BackendSession} session + * @memberof NewHeroGiftsHandler + */ + async getNewHeroGiftsActivity(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await getPlayerNewHeroGiftsData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, { playerData }); + } + + /** + * @description 兑换点数 + * @param {{ activityId: number, index:number}} msg + * @param {BackendSession} session + * @memberof NewHeroGiftsHandler + */ + async exchangePoint(msg: { activityId: number, index: number }, session: BackendSession) { + const { activityId, index } = 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 getPlayerNewHeroGiftsData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let item = playerData.findItem(index); + if (!item) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (item.countMax <= item.buyCount) { + return resResult(STATUS.ACTIVITY_MAX_COUNT); + } + if (item.consumePoint + playerData.consumeTotalPoint > playerData.totalPoint) { + return resResult(STATUS.ACTIVITY_NO_POINT); + } + let rewardParamArr: Array = stringToRewardParam(item.reward); + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + await ActivityNewHeroGiftModel.addReceiveRecord(serverId, activityId, roleId, index, item.consumePoint); + item.buyCount += 1; + return resResult(STATUS.SUCCESS, Object.assign(result, { + param: { activityId, index }, + item: item, consumeTotalPoint: playerData.consumeTotalPoint + item.consumePoint + })); + } +} diff --git a/game-server/app/servers/activity/handler/refreshTaskHandler.ts b/game-server/app/servers/activity/handler/refreshTaskHandler.ts index 81e74a988..9a2a751e0 100644 --- a/game-server/app/servers/activity/handler/refreshTaskHandler.ts +++ b/game-server/app/servers/activity/handler/refreshTaskHandler.ts @@ -1,12 +1,14 @@ import { Application, BackendSession } from 'pinus'; import { resResult } from '../../../pubUtils/util'; -import { STATUS } from '../../../consts'; +import { ACTIVITY_TYPE, STATUS } from '../../../consts'; import { getPlayerRefreshTaskData } from '../../../services/refreshTaskService'; import { RefreshTaskItem } from '../../../domain/activityField/refreshTaskField'; import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; import { RewardParam } from '../../../domain/activityField/rewardField'; import { ActivityRefreshTaskModel } from '../../../db/ActivityRefreshTask'; import { ActivityRefreshTaskPointModel } from '../../../db/ActivityRefreshTaskPoint'; +import { newHeroGiftPoint } from '../../../services/newHeroGiftsService'; +import { ActivityModel } from '../../../db/Activity'; export default function (app: Application) { @@ -75,6 +77,16 @@ export class RefreshTaskHandler { //获得点数 await ActivityRefreshTaskPointModel.addPoint(serverId, activityId, roleId, dailyItemData.point); + let addPointActivityId = playerData.addPointActivityId;//点数关联其他活动id + if (addPointActivityId) { + let activityData = await ActivityModel.findActivity(addPointActivityId); + if (activityData) { + if (activityData.type === ACTIVITY_TYPE.NEW_HERO_GIFTS) { + await newHeroGiftPoint(serverId, addPointActivityId, roleId, dailyItemData.point); + } + } + } + dailyItemData.receiveRewardCount += 1; return resResult(STATUS.SUCCESS, Object.assign(result, { param: { activityId, roundIndex, pageIndex, id, type }, diff --git a/game-server/app/services/activityService.ts b/game-server/app/services/activityService.ts index 32b22dc2c..16048b6de 100644 --- a/game-server/app/services/activityService.ts +++ b/game-server/app/services/activityService.ts @@ -23,6 +23,7 @@ import { getPlayerDailyGKData } from './dailyGKService'; import { getPlayerRefreshShopData } from './refreshShopService'; import { getPlayerRefreshTaskData } from './refreshTaskService'; import { getMonopolyActivity, getPlayerMonopolyData } from './monopolyService'; +import { getPlayerNewHeroGiftsData } from './newHeroGiftsService'; /** * 获取活动数据 @@ -166,6 +167,11 @@ export async function getActivity(serverId: number, roleId: string, activityId: activityData = await getPlayerSignInData(activityId, serverId, roleId); break; } + case ACTIVITY_TYPE.NEW_HERO_GIFTS://新将好礼(很多红包,用积分兑换一遍结束) 37 + { + activityData = await getPlayerNewHeroGiftsData(activityId, serverId, roleId); + break; + } default: { console.log('未知活动类型.........', activityType) break; diff --git a/game-server/app/services/newHeroGiftsService.ts b/game-server/app/services/newHeroGiftsService.ts new file mode 100644 index 000000000..fdddcce3d --- /dev/null +++ b/game-server/app/services/newHeroGiftsService.ts @@ -0,0 +1,55 @@ +import { ACTIVITY_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityNewHeroGiftModel, ActivityNewHeroGiftModelType } from '../db/ActivityNewHeroGift'; +import { NewHeroGiftData } from '../domain/activityField/newHeroGiftField'; +import { ServerlistModel } from '../db/Serverlist'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ + +export async function getNewHeroGiftsActivity(serverId: number, roleId: string) { + let { activityGroupId } = await ServerlistModel.findByServerId(serverId); + let activityArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(activityGroupId, ACTIVITY_TYPE.DAILY_RMB_GIFTS, new Date()) + + if (activityArray.length == 0) { + return null; + } + let activityData = activityArray[0]; + let playerData = await getPlayerNewHeroGiftsData(activityData.activityId, serverId, roleId); + return playerData +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerNewHeroGiftsData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId); + + let playerData = new NewHeroGiftData(activityData); + let playerRecord: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findData(serverId, activityId, roleId); + playerData.setPlayerRecords(playerRecord); + return playerData; +} + +/** + * 任务活动完成后会获得点数 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function newHeroGiftPoint(serverId: number, activityId: number, roleId: string, addPoint: number) { + await ActivityNewHeroGiftModel.addPoint(serverId, activityId, roleId, addPoint); +} diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index cc619cfa9..5acb5d620 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -49,6 +49,7 @@ export enum ACTIVITY_TYPE { REFRESH_TASK = 34, // 通用的刷新任务(分页,可刷新,限制领取次数) MONOPOLY = 35, //大富翁游戏 COMMON_SIGN_IN = 36, //通用签到 + NEW_HERO_GIFTS = 37, //新将好礼(很多红包,用积分兑换一遍结束) } /** diff --git a/shared/db/ActivityNewHeroGift.ts b/shared/db/ActivityNewHeroGift.ts new file mode 100644 index 000000000..2bcd86a79 --- /dev/null +++ b/shared/db/ActivityNewHeroGift.ts @@ -0,0 +1,64 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 购买记录 +*/ + +export class Record { + @prop({ required: true }) + index: number; //下标记录 + @prop({ required: true }) + point: number; //消耗点数 + @prop({ required: true }) + time: Date; //兑换时间 +} + + +/** + * 活动系统 - 新将好礼(很多红包,用积分兑换一遍结束),点数兑换奖品记录 +*/ +@index({ roleId: 1 }) + +export default class Activity_New_Hero_Gift extends BaseModel { + @prop({ required: true }) + serverId: number; // 服id + @prop({ required: true }) + activityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + totalPoint: number; // 获得总点数 + @prop({ required: true }) + records: Record[]; // 兑换红包消耗点数记录 + + //兑换记录 + public static async addPoint(serverId: number, activityId: number, roleId: string, addPoint: number) { + let result: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findOneAndUpdate({ serverId, roleId, activityId, }, + { $inc: { totalPoint: addPoint } }, { upsert: true, new: true }).lean(true); + return result; + } + + //兑换记录 + public static async addReceiveRecord(serverId: number, activityId: number, roleId: string, index: number, point: number) { + let result: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findOneAndUpdate({ serverId, roleId, activityId, }, + { $push: { records: { index, point, time: new Date() } } }, { upsert: true, new: true }).lean(true); + return result; + } + + //根据活动id查询活动数据 + public static async findData(serverId: number, activityId: number, roleId: string,) { + let result: ActivityNewHeroGiftModelType = await ActivityNewHeroGiftModel.findOne({ serverId, roleId, activityId }).lean(true); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(serverId: number, activityId: number, roleId: string) { + await ActivityNewHeroGiftModel.deleteMany({ serverId, roleId, activityId }); + } +} + +export const ActivityNewHeroGiftModel = getModelForClass(Activity_New_Hero_Gift); + +export interface ActivityNewHeroGiftModelType extends Pick, keyof Activity_New_Hero_Gift> { } +export type ActivityNewHeroGiftModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/newHeroGiftField.ts b/shared/domain/activityField/newHeroGiftField.ts new file mode 100644 index 000000000..98c8dfb8b --- /dev/null +++ b/shared/domain/activityField/newHeroGiftField.ts @@ -0,0 +1,70 @@ +import { ActivityModelType } from '../../db/Activity'; +import { ActivityNewHeroGiftModelType } from '../../db/ActivityNewHeroGift'; +import { ActivityBase } from './activityField'; + +// 礼包的内容 +export class NewHeroGiftItem { + index: number; // 下标 + reward: string; //任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + countMax: number = 0; //可购买的最大次数,0表示不限制 + name: string; //名字 + consumePoint: number; //消耗点数 + + buyCount: number = 0; //兑换过的次数 + + constructor(data: any) { + this.index = data.index; + this.reward = data.reward; + this.countMax = data.countMax; + this.name = data.name; + this.consumePoint = data.consumePoint; + this.buyCount = 0; + } +} + +// 新将礼包数据 +export class NewHeroGiftData extends ActivityBase { + name: string = '';//活动名称 + list: Array = [];//礼包列表 + totalPoint: number = 0;//获得总点数 + consumeTotalPoint: number = 0;//消耗总点数 + + public findItem(index: number) { + let itemIndex = this.list.findIndex(obj => { return obj && obj.index === index }); + return (itemIndex != -1) ? this.list[itemIndex] : null; + } + + //解析玩家购买记录 + public setPlayerRecords(data: ActivityNewHeroGiftModelType) { + if (!data) { + return; + } + this.totalPoint = data.totalPoint ? data.totalPoint : 0; + let records = data.records ? data.records : []; + for (let item of this.list) { + let buyRecords = records.filter(obj => { return obj && obj.index === item.index }); + item.buyCount = buyRecords.length; + } + for (let obj of records) { + this.consumeTotalPoint += obj.point; + } + } + + + public initData(data: string) { + let dataObj = JSON.parse(data); + this.name = dataObj.name; + this.totalPoint = 0; + this.consumeTotalPoint = 0; + + let arr = dataObj.data; + for (let obj of arr) { + this.list.push(new NewHeroGiftItem(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file diff --git a/shared/domain/activityField/refreshTaskField.ts b/shared/domain/activityField/refreshTaskField.ts index b903d15ea..16b0cbc53 100644 --- a/shared/domain/activityField/refreshTaskField.ts +++ b/shared/domain/activityField/refreshTaskField.ts @@ -59,6 +59,7 @@ export class RefreshTaskData extends ActivityBase { list: Array = []; nextRefreshTime: number;//下次刷新时间 roundIndex: number = 1;//周期数从1开始 + addPointActivityId: number = 0;//获得的点数,关联其他活动id(新将礼物) consumePoint: number = 0;//消耗点数兑换奖品 reward: string = ''//消耗点数的奖品内容 @@ -112,6 +113,7 @@ export class RefreshTaskData extends ActivityBase { this.interval = dataObj.interval; this.consumePoint = dataObj.consumePoint; this.reward = dataObj.reward; + this.addPointActivityId = dataObj.addPointActivityId ? dataObj.addPointActivityId : 0; this.totalPoint = 0; this.exchangePoint = 0;