diff --git a/game-server/app/servers/activity/handler/growthFundHandler.ts b/game-server/app/servers/activity/handler/growthFundHandler.ts index b59492774..189ec02bf 100644 --- a/game-server/app/servers/activity/handler/growthFundHandler.ts +++ b/game-server/app/servers/activity/handler/growthFundHandler.ts @@ -52,6 +52,10 @@ export class SevenDaysHandler { let playerData = await getPlayerGrowthFundData(activityId, serverId, roleId) if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + if (playerData.isVipActivity() && !playerData.isBuy(pageIndex)) {//vip高阶活动,需要购买 + return resResult(STATUS.ACTIVITY_NEED_BUY); + } + let growthFundItemData: GrowthFundItem = playerData.findGrowthFundItem(pageIndex, cellIndex); if (!growthFundItemData) { return resResult(STATUS.ACTIVITY_DATA_ERROR); diff --git a/game-server/app/services/growthFundService.ts b/game-server/app/services/growthFundService.ts index 3a0418e12..cccdb4d83 100644 --- a/game-server/app/services/growthFundService.ts +++ b/game-server/app/services/growthFundService.ts @@ -1,6 +1,7 @@ import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; import { ActivityModel, ActivityModelType } from '../db/Activity'; import { ActivityGrowthFundModel, ActivityGrowthFundModelType } from '../db/ActivityGrowthFund'; +import { ActivityBuyRecordsModel, ActivityBuyRecordsModelType } from '../db/ActivityBuyRecords'; import { RoleModel } from '../db/Role'; import { GrowthFundData, GrowthFundItem } from '../domain/activityField/growthFundField'; @@ -12,8 +13,17 @@ import { GrowthFundData, GrowthFundItem } from '../domain/activityField/growthFu * @param {string} roleId 角色Id * */ +/*ACTIVITY_TYPE类型 + GROWTH_FUND_MAIN = 6, // 主线成长基金 + GROWTH_FUND_MAIN_VIP = 7, // 主线成长基金(高阶) + GROWTH_FUND_TOWER = 8, // 镇念塔成长基金 + GROWTH_FUND_TOWER_VIP = 9, // 镇念塔成长基金(高阶) + GROWTH_FUND_MAIN_ELITE = 10, // 精英成长基金 + GROWTH_FUND_MAIN_ELITE_VIP = 11, // 精英成长基金(高阶) +*/ export async function growthFundActivity(type: number, serverId: number, roleId: string) { - let activityArray: ActivityModelType[] = await (await ActivityModel.findActivityByType(type, true)).sort((a, b) => { + let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(type, true) + activityArray = activityArray.sort((a, b) => { return a.acvitityId - b.acvitityId }); for (let i = 0; i < activityArray.length; i++) { @@ -40,6 +50,10 @@ export async function getPlayerGrowthFundData(activityId: number, serverId: numb let playerData = new GrowthFundData(activityData); playerData.setPlayerRecords(playerRecords); + if (playerData.isVipActivity()) {//vip高阶需要购买 + let buyRecords = await ActivityBuyRecordsModel.findRecordsByActivityId(activityData.acvitityId, roleId); + playerData.initBuyRecords(buyRecords); + } let activityType = activityData.type; switch (activityType) { diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index 82ba84b5a..c33aa8e14 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -11,8 +11,11 @@ export enum ACTIVITY_TYPE { SIGN_IN = 4, // 签到活动 SIGN_IN_VIP = 5, // 签到活动(高级) GROWTH_FUND_MAIN = 6, // 主线成长基金 - GROWTH_FUND_TOWER = 7, // 镇念塔成长基金 - GROWTH_FUND_MAIN_ELITE = 8, // 精英成长基金 + GROWTH_FUND_MAIN_VIP = 7, // 主线成长基金(高阶) + GROWTH_FUND_TOWER = 8, // 镇念塔成长基金 + GROWTH_FUND_TOWER_VIP = 9, // 镇念塔成长基金(高阶) + GROWTH_FUND_MAIN_ELITE = 10, // 精英成长基金 + GROWTH_FUND_MAIN_ELITE_VIP = 11, // 精英成长基金(高阶) } /** diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index eb21fad2b..9f02bc91f 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -347,6 +347,7 @@ export const STATUS = { ACTIVITY_DAY_INDEX_OVER: { code: 50010, simStr: '心急吃不了热豆腐' }, ACTIVITY_EXPIRE: { code: 50011, simStr: '活动到期,刷新' }, ACTIVITY_GROWTH_FUND_END: { code: 50012, simStr: '成长基金活动结束' }, + ACTIVITY_NEED_BUY: { code: 50012, simStr: '成长基金需要购买' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityBuyRecords.ts b/shared/db/ActivityBuyRecords.ts new file mode 100644 index 000000000..b5b431169 --- /dev/null +++ b/shared/db/ActivityBuyRecords.ts @@ -0,0 +1,48 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 活动购买记录 +*/ +@index({ roleId: 1 }) + +export default class ActivityBuyRecords extends BaseModel { + @prop({ required: true }) + acvitityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + type: number; // 活动类型 + @prop({ required: true }) + pageIndex: number; // 第几页(成长基金使用) + + + //添加购买记录 + public static async addRecord(acvitityId: number, roleId: string, type: number, pageIndex: number, lean = true) { + let result: ActivityBuyRecordsModelType = await ActivityBuyRecordsModel.findOneAndUpdate({ roleId, acvitityId, type, pageIndex }, + {}, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动id查询数据 + public static async findRecordsByActivityId(acvitityId: number, roleId: string, lean = true) { + let result: ActivityBuyRecordsModelType[] = await ActivityBuyRecordsModel.find({ roleId, acvitityId }).lean(lean); + return result; + } + + //查询第几页的活动数据 + public static async findDataBypageIndex(acvitityId: number, type: number, roleId: string, pageIndex: number, lean = true) { + let result: ActivityBuyRecordsModelType[] = await ActivityBuyRecordsModel.find({ roleId, type, acvitityId, pageIndex }).lean(lean); + return result; + } + + //删除活动购买记录 + public static async deleteActivity(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number) { + await ActivityBuyRecordsModel.deleteMany({ roleId, acvitityId, pageIndex, cellIndex }); + } +} + +export const ActivityBuyRecordsModel = getModelForClass(ActivityBuyRecords); + +export interface ActivityBuyRecordsModelType extends Pick, keyof ActivityBuyRecords> { } +export type ActivityBuyRecordsModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/growthFundField.ts b/shared/domain/activityField/growthFundField.ts index b47e1aaed..bd4935852 100644 --- a/shared/domain/activityField/growthFundField.ts +++ b/shared/domain/activityField/growthFundField.ts @@ -1,5 +1,6 @@ -import { TASK_TYPE, ACTIVITY_RESOURCES_TYPE } from '../../consts'; +import { TASK_TYPE, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; +import { ActivityBuyRecordsModelType } from '../../db/ActivityBuyRecords'; import { ActivityGrowthFundModelType } from '../../db/ActivityGrowthFund'; import { RewardInter } from '../../pubUtils/interface'; import { parseGoodStrWithType, parseHeroStrWithType, splitString } from '../../pubUtils/util'; @@ -21,6 +22,7 @@ export class GrowthFundItem { isComplete: boolean = false; //是否完成任务 isReceive: boolean = false; //是否领取过奖励 + constructor(data: any) { this.pageIndex = data.pageIndex; this.cellIndex = data.cellIndex; @@ -61,6 +63,21 @@ export class GrowthFundItem { // 成长基金活动数据 export class GrowthFundData extends ActivityBase { list: Array = []; + price: number = 0;//高阶价格 + buyRecords: Array = [];//高阶购买记录 + + //是否是高阶,需要购买 + public isVipActivity() { + return this.type == ACTIVITY_TYPE.GROWTH_FUND_MAIN_VIP + || this.type == ACTIVITY_TYPE.GROWTH_FUND_TOWER_VIP + || this.type == ACTIVITY_TYPE.GROWTH_FUND_MAIN_ELITE_VIP + } + + //是否购买page + public isBuy(pageIndex: number) { + let index = this.buyRecords.findIndex(obj => { return obj == pageIndex }); + return index != -1; + } //全部领取完成 public isComplete() { @@ -88,8 +105,17 @@ export class GrowthFundData extends ActivityBase { } } + //高阶版购买记录 + public initBuyRecords(buyRecords: ActivityBuyRecordsModelType[]) { + for (let obj of buyRecords) { + this.buyRecords.push(obj.pageIndex); + } + } + public initData(data: string) { - let arr = JSON.parse(data); + let dataObj = JSON.parse(data); + this.price = dataObj.price; + let arr = dataObj.data; for (let obj of arr) { this.list.push(new GrowthFundItem(obj)) }