import { PrizeItem, PrizeType, PrizeUserStatus } from '../types/mission'; import axios from 'axios'; /** * 奖励活动类 * 封装奖励活动相关的数据和操作方法 */ export class AwardActivity { /** 兑换活动code */ public readonly activityCode: string; /** 活动开始时间 */ public readonly startTime: number; /** 活动结束时间 */ public readonly endTime: number; /** 是否进行中 */ public readonly isActive: boolean; /** 可兑换奖品数 */ public readonly availablePrizesCount: number; /** 奖品列表 */ public readonly items: PrizeItem[]; constructor(data: { activityCode: string; startTime: number; endTime: number; isActive: boolean; availablePrizesCount: number; items: PrizeItem[]; }) { this.activityCode = data.activityCode; this.startTime = data.startTime; this.endTime = data.endTime; this.isActive = data.isActive; this.availablePrizesCount = data.availablePrizesCount; this.items = data.items; } /** * 获取可兑换的奖品列表 */ getAvailablePrizes(): PrizeItem[] { return this.items.filter(item => item.userStatus === 0); } // 兑换接口 convertPrize({ prizeCode, prizeActivityCode, step, ...otherCustomParams }: { prizeCode: string; prizeActivityCode: string; step?: number; [key: string]: any; }): Promise { return axios.post('/spread/activity/prize/convert', { ...otherCustomParams, prizeCode, prizeActivityCode, step }); } /** * 获取不可兑换的奖品列表 抢光了或者已兑换 */ getUnavailablePrizes(): PrizeItem[] { return this.items.filter(item => item.userStatus !== 0); } /** * 按奖品类型获取奖品列表 */ getPrizesByType(type: PrizeType): PrizeItem[] { return this.items.filter(item => item.type === type); } /** * 获取积分类奖品 */ getPointsPrizes(): PrizeItem[] { return this.getPrizesByType('POINTS'); } /** * 获取实物奖品 */ getGoodsPrizes(): PrizeItem[] { return this.getPrizesByType('GOODS'); } /** * 获取虚拟奖品 */ getVirtualPrizes(): PrizeItem[] { return this.getPrizesByType('VIRTUAL'); } /** * 获取抽奖券奖品 */ getLotteryPrizes(): PrizeItem[] { return this.getPrizesByType('LOTTERY'); } /** * 获取皮肤奖品 */ getSkinPrizes(): PrizeItem[] { return this.getPrizesByType('SKIN'); } /** * 获取头像框奖品 */ getAvatarBoxPrizes(): PrizeItem[] { return this.getPrizesByType('AVATAR_BOX'); } /** * 获取抽奖装扮奖品 */ getSlotDressingPrizes(): PrizeItem[] { return this.getPrizesByType('SLOT_DRESSING'); } /** * 获取定时抽奖奖品 */ getSlotScheduledPrizes(): PrizeItem[] { return this.getPrizesByType('SLOT_SCHEDULED'); } /** * 按用户状态获取奖品列表 */ getPrizesByUserStatus(status: PrizeUserStatus): PrizeItem[] { return this.items.filter(item => item.userStatus === status); } /** * 根据奖品code查找奖品 */ getPrizeByCode(itemCode: string): PrizeItem | undefined { return this.items.find(item => item.itemCode === itemCode); } /** * 检查用户是否可以兑换指定奖品 */ canRedeemPrize(itemCode: string): boolean { const prize = this.getPrizeByCode(itemCode); return prize ? prize.userStatus === 0 : false; } /** * 获取奖品总数 */ getTotalPrizeCount(): number { return this.items.length; } /** * 获取已达到兑换上限的奖品数 */ getMaxedOutPrizeCount(): number { return this.items.filter(item => item.userStatus === -2).length; } /** * 获取活动剩余时间(毫秒) */ getTimeRemaining(): number { const now = Date.now(); return Math.max(0, this.endTime - now); } /** 判断活动未开始 */ isNotStarted(): boolean { const now = Date.now(); return now < this.startTime; } /** 判断活动是否结束 */ isEnded(): boolean { const now = Date.now(); return now > this.endTime; } /** * 格式化活动剩余时间 */ getTimeRemainingText(): string { const timeRemaining = this.getTimeRemaining(); if (timeRemaining <= 0) return '已结束'; const seconds = Math.floor(timeRemaining / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); const days = Math.floor(hours / 24); if (days > 0) return `${days}天${hours % 24}小时`; if (hours > 0) return `${hours}小时${minutes % 60}分钟`; if (minutes > 0) return `${minutes}分钟`; return `${seconds}秒`; } /** * 检查是否有可用奖品 */ hasAvailablePrizes(): boolean { return this.availablePrizesCount > 0; } /** * 转换为JSON对象 */ toJSON() { return { activityCode: this.activityCode, startTime: this.startTime, endTime: this.endTime, isActive: this.isActive, availablePrizesCount: this.availablePrizesCount, items: this.items }; } }