diff --git a/game-server/app/servers/activity/handler/yuanbaoShopHandler.ts b/game-server/app/servers/activity/handler/yuanbaoShopHandler.ts new file mode 100644 index 000000000..fce87fcd6 --- /dev/null +++ b/game-server/app/servers/activity/handler/yuanbaoShopHandler.ts @@ -0,0 +1,32 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../../consts'; +import { yuanbaoActivity, getPlayerYuanbaoShopData } from '../../../services/yuanbaoService'; + + +export default function (app: Application) { + return new YuanbaoShopHandler(app); +} + +export class YuanbaoShopHandler { + constructor(private app: Application) { + } + + /************************元宝商店****************************/ + + /** + * @description 获取商店活动数据 + * @param {BackendSession} session + * @memberof YuanbaoShopHandler + */ + async getShopActivity(msg: { activityId: number }, session: BackendSession) { + const { activityId } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await getPlayerYuanbaoShopData(activityId, serverId, roleId); + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + return resResult(STATUS.SUCCESS, playerData); + } +} diff --git a/game-server/app/servers/order/handler/orderHandler.ts b/game-server/app/servers/order/handler/orderHandler.ts index 901cac80e..2e0b8472c 100644 --- a/game-server/app/servers/order/handler/orderHandler.ts +++ b/game-server/app/servers/order/handler/orderHandler.ts @@ -1,8 +1,6 @@ import { Application, BackendSession } from 'pinus'; import { genCode, resResult } from '../../../pubUtils/util'; import { ACTIVITY_TYPE, ORDER_STATE, PAY_TYPE, STATUS } from '../../../consts'; -import { RoleModel } from '../../../db/Role'; -import { addReward, stringToRewardParam, useGiftPackage } from '../../../services/giftPackageService'; import { dicRMB } from '../../../pubUtils/dictionary/DicRMB'; import { UserOrderModel } from '../../../db/UserOrder'; import _ = require('underscore'); @@ -22,15 +20,16 @@ export class orderHandler { /** * @description 获取订单号 - * @param {{productID:string, payType:number }} msg + * @param {{productID:string, payType:number ,activityId: number }} msg * @param {BackendSession} session * @memberof orderHandler */ - async applyOrder(msg: { productID: string, payType: number }, session: BackendSession) { - const { productID, payType } = msg; + async applyOrder(msg: { productID: string, payType: number, activityId: number }, session: BackendSession) { + const { productID, payType, activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); + //如果有特殊情况,activityId可为0 if (!productID || !_.isString(productID) || !payType || !_.isNumber(payType)) { return resResult(STATUS.WRONG_PARMS); } @@ -80,7 +79,7 @@ export class orderHandler { console.log('未知支付类型'); return resResult(STATUS.NO_PAY_TYPE); } - await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType); + await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId); return resResult(STATUS.SUCCESS, { orderInfo: sdkOrderInfo, productInfo, localOrderID }); } @@ -174,7 +173,7 @@ export class orderHandler { orderInfo = await UserOrderModel.success(roleId, localOrderID); if (orderInfo) { //结算奖励 - let result = await makeOrder(localOrderID); + let result = await makeOrder(localOrderID, sid); console.log('结算完成', localOrderID) return resResult(STATUS.SUCCESS, result); } diff --git a/game-server/app/services/orderService.ts b/game-server/app/services/orderService.ts index 6b35c0021..5836fa6bb 100644 --- a/game-server/app/services/orderService.ts +++ b/game-server/app/services/orderService.ts @@ -3,6 +3,8 @@ import { ActivitySignInModel, ActivitySignInModelType } from '../db/ActivitySign import { SignInData, SignInItem } from '../domain/activityField/signInField'; import { ACTIVITY_TYPE, ORDER_STATE } from '../consts'; import { dicRMB } from '../pubUtils/dictionary/DicRMB'; +import { makeYuanbaoShopReward } from './yuanbaoService'; +import { RoleModel } from '../db/Role'; @@ -12,7 +14,7 @@ import { dicRMB } from '../pubUtils/dictionary/DicRMB'; * 结算账单 * @param localOrderID 本地订单号 */ -export async function makeOrder(localOrderID: string) { +export async function makeOrder(localOrderID: string, sid: string) { let orderInfo = await UserOrderModel.findOrder(localOrderID); if (!orderInfo) { return '查无此订单'; @@ -31,6 +33,8 @@ export async function makeOrder(localOrderID: string) { let payType = orderInfo.payType;//支付类型 let roleId = orderInfo.roleId;//角色 + const roleInfo = await RoleModel.findByRoleId(roleId); + switch (productType) { case ACTIVITY_TYPE.NEW_PLAYER_LIMIT_PACKAGE: { @@ -41,6 +45,12 @@ export async function makeOrder(localOrderID: string) { { break; } + case ACTIVITY_TYPE.YUAN_BAO_SHOP: + { + let resule = await makeYuanbaoShopReward(roleId, roleInfo.roleName, sid, orderInfo.serverId, roleInfo.funcs, orderInfo.activityId, orderInfo.productID) + break; + } + default: return '未知商品类型'; } diff --git a/game-server/app/services/yuanbaoService.ts b/game-server/app/services/yuanbaoService.ts new file mode 100644 index 000000000..0db7f3ffa --- /dev/null +++ b/game-server/app/services/yuanbaoService.ts @@ -0,0 +1,75 @@ +import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { UserOrderModel, UserOrderModelType } from '../db/UserOrder'; +import { RewardParam } from '../domain/activityField/rewardField'; +import { YuanBaoShopData, YuanBaoShopItem } from '../domain/activityField/yuanbaoShopField'; +import { addReward, stringToRewardParam } from './giftPackageService'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ + +export async function yuanbaoActivity(serverId: number, roleId: string) { + let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(ACTIVITY_TYPE.YUAN_BAO_SHOP, true) + activityArray = activityArray.sort((a, b) => { + return b.activityId - a.activityId + }); + if (activityArray.length == 0) { + return null; + } + let activityData = activityArray[0]; + let playerData = await getPlayerYuanbaoShopData(activityData.activityId, serverId, roleId); + return playerData +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerYuanbaoShopData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerRecord: UserOrderModelType[] = await UserOrderModel.findOrderByActivityID(activityId, roleId); + + let playerData = new YuanBaoShopData(activityData); + playerData.setPlayerRecords(playerRecord); + return playerData; +} + + +/** + * 结算奖励 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * @param {string} productID 商品ID + * + */ +export async function makeYuanbaoShopReward(roleId: string, roleName: string, sid: string, serverId: number, funcs: number[], + activityId: number, productID: string) { + let records = await UserOrderModel.findOrderByProductID(productID, roleId, activityId); + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerData = new YuanBaoShopData(activityData); + let item = playerData.findItem(productID); + + let rewardParamArr: Array = []; + if (records.length == 0) {//首充 + rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward)); + rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.firstReward)); + } else { + rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.baseReward)); + rewardParamArr = rewardParamArr.concat(stringToRewardParam(item.extraReward)); + } + + let result = await addReward(roleId, roleName, sid, serverId, funcs, rewardParamArr) + return result +} diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index de702a3fb..6e1956600 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -22,6 +22,7 @@ export enum ACTIVITY_TYPE { NEW_PLAYER_LIMIT_PACKAGE = 15, // 新手限定RMB购买礼包 LIMIT_PACKAGE_SHOP_DAILY = 16, // 每日限购礼包,RMB购买礼包 LIMIT_PACKAGE_SHOP_WEEKLY = 17, // 每周限购礼包,RMB购买礼包 + YUAN_BAO_SHOP = 18, // 元宝充值商店 } /** diff --git a/shared/db/UserOrder.ts b/shared/db/UserOrder.ts index 7eb18d9a3..2ec3d7492 100644 --- a/shared/db/UserOrder.ts +++ b/shared/db/UserOrder.ts @@ -27,6 +27,8 @@ export default class UserOrder extends BaseModel { state: number; // 订单状态 ORDER_STATE 3.支付成功并结算 @prop({ required: true }) message: string; // 信息 + @prop({ required: true }) + activityId: number; // 活动ID //保存平台订单号 @@ -61,6 +63,18 @@ export default class UserOrder extends BaseModel { return result; } + //查询订单详情 + public static async findOrderByProductID(productID: string, roleId: string, activityId: number) { + let result: UserOrderModelType[] = await UserOrderModel.find({ productID, roleId, activityId }).lean(true); + return result; + } + + //查询订单详情 + public static async findOrderByActivityID(activityId: number, roleId: string,) { + let result: UserOrderModelType[] = await UserOrderModel.find({ activityId, roleId }).lean(true); + return result; + } + //查询订单详情 public static async findOrder(localOrderID: string) { let result: UserOrderModelType = await UserOrderModel.findOne({ localOrderID }).lean(true); @@ -68,8 +82,8 @@ export default class UserOrder extends BaseModel { } //新增订单 - public static async applyOrder(serverId: number, roleId: string, productID: string, localOrderID: string, orderID: string, price: number, payType: number, message: string = '') { - let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ serverId, roleId, productID, localOrderID, orderID, payType }, + public static async applyOrder(serverId: number, roleId: string, productID: string, localOrderID: string, orderID: string, price: number, payType: number, activityId: number, message: string = '') { + let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ serverId, roleId, productID, localOrderID, orderID, payType, activityId }, { $set: { price, state: ORDER_STATE.APPLY, message } }, { upsert: true, new: true }).lean(true); return result; diff --git a/shared/domain/activityField/yuanBaoShopField.ts b/shared/domain/activityField/yuanBaoShopField.ts new file mode 100644 index 000000000..64b74680d --- /dev/null +++ b/shared/domain/activityField/yuanBaoShopField.ts @@ -0,0 +1,66 @@ +import { ActivityModelType } from '../../db/Activity'; +import { UserOrderModelType } from '../../db/UserOrder'; +import { ActivityBase } from './activityField'; + +// 商品的数据 +export class YuanBaoShopItem { + id: number; // 第几个,从1开始 + price: number; // 价格RMB + productID: string; // 商品id + name: string; //名称 + baseReward: string; //购买即可获得的基础奖励 + firstReward: string; //首充时,赠送的奖励 + extraReward: string; //不是首冲时,赠送的奖励 + + buyCount: number = 0; //购买过的次数 + + constructor(data: any) { + this.id = data.id; + this.price = data.price; + this.productID = data.productID; + this.name = data.name; + this.baseReward = data.baseReward; + this.firstReward = data.firstReward; + this.extraReward = data.extraReward; + } +} + +// 元宝充值商店数据 +export class YuanBaoShopData extends ActivityBase { + list: Array = [];//商品 + + //商品 + public findItem(productID: string): YuanBaoShopItem { + let listIndex = this.list.findIndex(obj => { return obj && obj.productID == productID }); + if (listIndex != -1) { + return this.list[listIndex]; + } + return null; + } + + //解析玩家购买记录 + public setPlayerRecords(data: UserOrderModelType[]) { + this.todayIndex = 0; + if (!data) { + return; + } + for (let obj of this.list) { + let arr = data.filter(obj => { return obj.productID === obj.productID }) + obj.buyCount = arr.length; + } + } + + public initData(data: string) { + let dataObj = JSON.parse(data); + + let arr = dataObj.data; + for (let obj of arr) { + this.list.push(new YuanBaoShopItem(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file