// 周基金 import moment = require('moment'); import { pick } from 'underscore'; import { ActivityModelType } from '../../db/Activity'; import { ActivityWeeklyFundModelType } from '../../db/ActivityWeeklyFund'; import { ActivityBase } from './activityField'; interface WeeklyFundRewardInDb { dayIndex: number; // 第几天 reward: string; // 每天签到的奖励 type&id&count } interface WeeklyFundDataInDb { productID: string; // 商品id,商品表 price: number; // 购买价格 onceReward: string; // 购买后立刻可以获得的奖励 type&id&count rewards: WeeklyFundRewardInDb[]; // 每天签到可领取的奖励 rebate: number; // 显示用的返利倍数 } class WeeklyFundReward { dayIndex: number; // 第几天 reward: string; // 每天签到的奖励 type&id&count hasReceived: boolean = false; // 是否领取过 constructor(data: WeeklyFundRewardInDb) { this.dayIndex = data.dayIndex; this.reward = data.reward; } public setHasReceived() { this.hasReceived = true; } } export class WeeklyFundData extends ActivityBase { productID: string; // 商品id,商品表 price: number; // 购买价格 onceReward: string; // 购买后立刻可以获得的奖励 type&id&count rebate: number; // 显示用的返利倍数 buyEndTime: number = 0; // 购买截止时间 rewards: WeeklyFundReward[] = []; // 每天签到可领取的奖励 hasBought: boolean = false; // 是否购买了 constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { super(activityData, createTime, serverTime) this.initData(activityData.data) } public initData(data: string): void { let dataObj: WeeklyFundDataInDb = JSON.parse(data); if(!dataObj) return; this.productID = dataObj.productID; this.price = dataObj.price; this.onceReward = dataObj.onceReward; this.rebate = dataObj.rebate; for(let reward of (dataObj.rewards||[])) { this.rewards.push(new WeeklyFundReward(reward)); } this.buyEndTime = this.nextRefreshTime; this.nextRefreshTime = moment('2100-01-01').valueOf(); this.endTime = moment('2100-01-01').valueOf(); } public setPlayerRecord(playerData: ActivityWeeklyFundModelType) { if(!playerData) return; this.hasBought = true; for(let { dayIndex } of playerData.record) { let reward = this.rewards.find(cur => cur.dayIndex == dayIndex); if(reward) reward.setHasReceived(); } } public findSignReward(dayIndex: number) { return this.rewards.find(cur => cur.dayIndex == dayIndex); } private hasReceivedAll() { return !this.rewards.find(cur => !cur.hasReceived); } public getShowResult() { if(this.buyEndTime < Date.now() && !this.hasBought) return null; if(this.hasReceivedAll()) return null return { ...this.getBaseKeys(), ...pick(this, ['productID', 'price', 'onceReward', 'rebate', 'buyEndTime', 'rewards', 'hasBought']) } } }