diff --git a/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts new file mode 100644 index 000000000..e2ca189b4 --- /dev/null +++ b/game-server/app/servers/activity/handler/rechargeMoneyHandler.ts @@ -0,0 +1,76 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../../consts'; +import { addRechargeMoney, getPlayerRechargeMoneyData } from '../../../services/rechargeMoneyService'; +import { RechargeMoneyItem } from '../../../domain/activityField/rechargeMoneyField'; +import { addReward, stringToRewardParam } from '../../../services/giftPackageService'; +import { RewardParam } from '../../../domain/activityField/rewardField'; +import { ActivityRechargeMoneyModel } from '../../../db/ActivityRechargeMoney'; + + +export default function (app: Application) { + return new RechargeMoneyHandler(app); +} + +export class RechargeMoneyHandler { + constructor(private app: Application) { + } + + /************************每日累计充值****************************/ + + /** + * @description 获取活动数据 + * @param {BackendSession} session + * @memberof RechargeMoneyHandler + */ + async getRechargeMoneyActivity(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await getPlayerRechargeMoneyData(activityId, serverId, roleId); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + delete playerData.recordArray; + + return resResult(STATUS.SUCCESS, playerData); + } + + /** + * @description 获取奖励 + * @param {BackendSession} session + * @memberof RechargeMoneyHandler + */ + async getRechargeMoneyReward(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 getPlayerRechargeMoneyData(activityId, serverId, roleId); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + if (playerData.totalCount <= playerData.receiveCount) { + return resResult(STATUS.ACTIVITY_RECHARGE_MONEY_NO_REWARD); + } + + let item: RechargeMoneyItem = playerData.randomReward(); + if (!item) { + return resResult(STATUS.ACTIVITY_RECHARGE_MONEY_ERROR); + } + + let recordArray = playerData.recordArray.filter(obj => { return obj && !obj.id }) + let rechargeItem = recordArray[0]; + console.log(JSON.stringify(recordArray)); + await ActivityRechargeMoneyModel.addRecord(rechargeItem._id, item.id, item.reward) + let rewardParamArr: Array = stringToRewardParam(item.reward); + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + if (playerData.isLast()) { + let _ids = playerData.recordArray.map(a => a._id) + await ActivityRechargeMoneyModel.setEndState(serverId, roleId, _ids); + } + + return resResult(STATUS.SUCCESS, result); + } +} diff --git a/game-server/app/servers/order/handler/orderHandler.ts b/game-server/app/servers/order/handler/orderHandler.ts index 2e0b8472c..e9e4bb4e3 100644 --- a/game-server/app/servers/order/handler/orderHandler.ts +++ b/game-server/app/servers/order/handler/orderHandler.ts @@ -7,6 +7,7 @@ import _ = require('underscore'); import { applyOrderWX, checkOrderWX } from '../../../services/pay/weixinPay'; import { applyOrderALI, checkOrderALI } from '../../../services/pay/aliPay'; import { makeOrder } from '../../../services/orderService'; +import { addRechargeMoney } from '../../../services/rechargeMoneyService'; export default function (app: Application) { return new orderHandler(app); @@ -174,6 +175,8 @@ export class orderHandler { if (orderInfo) { //结算奖励 let result = await makeOrder(localOrderID, sid); + //活动统计 + await addRechargeMoney(roleId, serverId, price); console.log('结算完成', localOrderID) return resResult(STATUS.SUCCESS, result); } diff --git a/game-server/app/services/rechargeMoneyService.ts b/game-server/app/services/rechargeMoneyService.ts new file mode 100644 index 000000000..5835f9bc2 --- /dev/null +++ b/game-server/app/services/rechargeMoneyService.ts @@ -0,0 +1,64 @@ +import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityRechargeMoneyModel, ActivityRechargeMoneyModelType } from '../db/ActivityRechargeMoney'; +import { RewardParam } from '../domain/activityField/rewardField'; +import { RechargeMoneyData, RechargeMoneyItem } from '../domain/activityField/rechargeMoneyField'; +import { addReward, stringToRewardParam } from './giftPackageService'; + +import moment = require('moment'); + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ + +export async function rechargeMoneyActivity(serverId: number, roleId: string) { + let activityArray: ActivityModelType[] = await ActivityModel.findOpenActivityByType(ACTIVITY_TYPE.RECHARGEMONEY, new Date()) + activityArray = activityArray.sort((a, b) => { + return b.activityId - a.activityId + }); + let playerDataArray = []; + for (let activityData of activityArray) { + let playerData = await getPlayerRechargeMoneyData(activityData.activityId, serverId, roleId); + playerDataArray.push(playerData) + } + return playerDataArray +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerRechargeMoneyData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerRecord: ActivityRechargeMoneyModelType[] = await ActivityRechargeMoneyModel.findData(serverId, roleId); + + let playerData = new RechargeMoneyData(activityData); + playerData.setPlayerRecords(playerRecord); + return playerData; +} + + + +/** + * 统计充值金额 + * + * @param {number} serverId 区Id + * @param {string} roleId 角色Id + * @param {string} RMB 金额 + * + */ +export async function addRechargeMoney(roleId: string, serverId: number, RMB: number) { + let beginTime = moment(new Date()).startOf('d').toDate(); + let endTime = moment(new Date()).endOf('d').toDate(); + await ActivityRechargeMoneyModel.addRMB(serverId, roleId, RMB, beginTime, endTime); +} + diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index a190d975c..461a5c145 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -25,6 +25,7 @@ export enum ACTIVITY_TYPE { YUAN_BAO_SHOP = 18, // 元宝充值商店 MONTHLY_TICKET_1 = 19, // 月卡1(普通) MONTHLY_TICKET_2 = 20, // 月卡2(至尊) + RECHARGEMONEY = 21, // 累计充值RMB活动 } /** diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index ec66bd3c7..cc383f013 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -352,6 +352,8 @@ export const STATUS = { ACTIVITY_FIRST_GIFT_NOT_OPEN: { code: 50015, simStr: '首充没开' }, ACTIVITY_FIRST_GIFT_END: { code: 50016, simStr: '首充结束' }, ACTIVITY_NEW_PLAYER_LIMIT_PACKAGE_END: { code: 50017, simStr: '新手礼包结束' }, + ACTIVITY_RECHARGE_MONEY_ERROR: { code: 50018, simStr: '充值数据错误' }, + ACTIVITY_RECHARGE_MONEY_NO_REWARD: { code: 50019, simStr: '没有可领取的奖励' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityRechargeMoney.ts b/shared/db/ActivityRechargeMoney.ts new file mode 100644 index 000000000..8a8e8d19a --- /dev/null +++ b/shared/db/ActivityRechargeMoney.ts @@ -0,0 +1,63 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 累计充值活动 +*/ +@index({ roleId: 1 }) + +export default class ActivityRechargeMoney extends BaseModel { + + @prop({ required: true }) + serverId: number; // 区号 + @prop({ required: true }) + roleId: string; // 用户id + @prop({ required: true }) + beginTime: Date; // 充值开始统计时间 + @prop({ required: true }) + endTime: Date; // 充值结束统计时间 + @prop({ required: true }) + RMB: number; // 充值金额 + @prop({ required: true }) + index: number; // 第几个格子 + @prop({ required: true }) + reward: string; // 领取奖励内容 + @prop({ required: true }) + rewardTime: Date; // 领取奖励时间 + @prop({ required: true }) + isEnd: boolean; // 结束 + + //添加领取记录 + public static async addRecord(_id: string, id: number, reward: string) { + let result: ActivityRechargeMoneyModelType = await ActivityRechargeMoneyModel.findOneAndUpdate({ _id }, + { $set: { index: id, reward, rewardTime: new Date() } }, + { upsert: true, new: true }).lean(true); + return result; + } + + //本轮结束 + public static async setEndState(serverId: number, roleId: string, _ids: string[]) { + await ActivityRechargeMoneyModel.updateMany({ serverId, roleId, _id: { $in: _ids } }, + { $set: { isEnd: true } }, { multi: true, }); + } + + + //查询 + public static async findData(serverId: number, roleId: string) { + let result: ActivityRechargeMoneyModelType[] = await ActivityRechargeMoneyModel.find({ serverId, roleId, isEnd: { $ne: true } }).lean(true); + return result; + } + + //统计支付金额 + public static async addRMB(serverId: number, roleId: string, RMB: number, beginTime: Date, endTime: Date) { + let result: ActivityRechargeMoneyModelType = await ActivityRechargeMoneyModel.findOneAndUpdate({ serverId, roleId, beginTime, endTime }, + { $inc: { RMB } }, + { upsert: true, new: true }).lean(true); + return result; + } +} + +export const ActivityRechargeMoneyModel = getModelForClass(ActivityRechargeMoney); + +export interface ActivityRechargeMoneyModelType extends Pick, keyof ActivityRechargeMoney> { } +export type ActivityRechargeMoneyModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/rechargeMoneyField.ts b/shared/domain/activityField/rechargeMoneyField.ts new file mode 100644 index 000000000..cc304e218 --- /dev/null +++ b/shared/domain/activityField/rechargeMoneyField.ts @@ -0,0 +1,91 @@ +import moment = require('moment'); +import { random } from 'underscore'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityRechargeMoneyModelType } from '../../db/ActivityRechargeMoney'; +import { ActivityBase } from './activityField'; + +// 充值记录 +export class RechargeMoneyItem { + _id: string; //mongodb + id: number; //商品id + name: string; //商品名称 + reward: string; //奖励 + + rewardTime: Date; //领奖时间 + + constructor(data: any) { + this.id = data.id; + this.name = data.name; + this.reward = data.reward; + } +} + +// 累计充值数据 +export class RechargeMoneyData extends ActivityBase { + list: Array = [];//记录 + days: number = 0; + price: number = 0; + + totalCount: number = 0;//一共可领取次数 + receiveCount: number = 0;//已经领取次数 + + recordArray = [] + + //当前回合最后一个 + public isLast() { + let items = this.list.filter(obj => { return obj && !obj.rewardTime }); + return items.length === 1; + } + + public randomReward(): RechargeMoneyItem { + let items = this.list.filter(obj => { return obj && (!obj.rewardTime || obj.rewardTime == undefined) }) + if (items.length == 0) { + return null; + } + console.log('ddddddddddd', JSON.stringify(items), items.length) + let index = random(items.length - 1); + return items[index]; + } + + //解析玩家购买记录 + public setPlayerRecords(data: ActivityRechargeMoneyModelType[]) { + this.todayIndex = 0; + if (!data) { + return; + } + this.recordArray = data.filter(obj => { + return obj.RMB >= this.price; + }).sort((a, b) => { + return moment(a.beginTime).valueOf() - moment(b.beginTime).valueOf() + }) + + this.totalCount = this.recordArray.length; + this.receiveCount = 0; + for (let item of this.list) { + let index = this.recordArray.findIndex(obj => { return obj.index === item.id }) + if (index != -1) { + this.receiveCount++; + item.rewardTime = this.recordArray[index].rewardTime; + } + } + } + + public initData(data: string) { + let dataObj = JSON.parse(data); + this.days = dataObj.days; + this.price = dataObj.price; + + let arr = dataObj.data; + for (let obj of arr) { + this.list.push(new RechargeMoneyItem(obj)) + } + this.list = this.list.sort((a, b) => { + return a.id - b.id + }) + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file