Files
ZYZ/shared/domain/activityField/monthlyFundField.ts
2023-03-24 19:13:34 +08:00

135 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 周基金
import moment = require('moment');
import { SHOP_REFRESH_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityMonthlyFundModelType } from '../../db/ActivityMonthlyFund';
import { getZeroPointD } from '../../pubUtils/timeUtil';
import { deltaDays } from '../../pubUtils/util';
import { ActivityBase } from './activityField';
interface MonthlyFundRewardInDb {
dayIndex: number; // 第几天
reward: string; // 每天签到的奖励 type&id&count
}
interface MonthlyFundPageInDb {
pageIndex: number;
name: string;
productID: string; // 商品id商品表
price: number; // 购买价格
onceReward: string; // 购买后立刻可以获得的奖励 type&id&count
rewards: MonthlyFundRewardInDb[]; // 每天签到可领取的奖励
rebate: number; // 显示用的返利倍数
buyEndDay: number; // 购买截止时间
}
interface MonthlyFundDataInDb {
list: MonthlyFundPageInDb[];
}
class MonthlyFundReward {
dayIndex: number; // 第几天
reward: string; // 每天签到的奖励 type&id&count
hasReceived: boolean = false; // 是否领取过
constructor(data: MonthlyFundRewardInDb) {
this.dayIndex = data.dayIndex;
this.reward = data.reward;
}
public setHasReceived() {
this.hasReceived = true;
}
}
class MonthlyFundPage {
pageIndex: number; // 第几页
name: string; // 基金
productID: string; // 商品id商品表
price: number; // 购买价格
onceReward: string; // 购买后立刻可以获得的奖励 type&id&count
rebate: number; // 显示用的返利倍数
buyEndTime: number = 0; // 购买截止时间
rewards: MonthlyFundReward[] = []; // 每天签到可领取的奖励
hasBought: boolean = false; // 是否购买了
constructor(dataObj: MonthlyFundPageInDb, beginTime: number) {
this.pageIndex = dataObj.pageIndex;
this.name = dataObj.name;
this.productID = dataObj.productID;
this.price = dataObj.price;
this.onceReward = dataObj.onceReward;
this.rebate = dataObj.rebate;
this.buyEndTime = beginTime + dataObj.buyEndDay * 86400000;
for(let reward of (dataObj.rewards||[])) {
this.rewards.push(new MonthlyFundReward(reward));
}
}
public setPlayerRecord(playerData: ActivityMonthlyFundModelType) {
if(!playerData) return;
this.hasBought = true;
for(let { dayIndex } of playerData.record) {
let reward = this.rewards.find(cur => cur.dayIndex == dayIndex);
if(reward || playerData.hasReceivedAll) reward.setHasReceived();
}
}
public findSignReward(dayIndex: number) {
return this.rewards.find(cur => cur.dayIndex == dayIndex);
}
public 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;
}
}
export class MonthlyFundData extends ActivityBase {
list: MonthlyFundPage[] = [];
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime)
this.initData(activityData.data)
}
public initData(data: string): void {
let dataObj: MonthlyFundDataInDb = JSON.parse(data);
if(!dataObj) return;
for(let data of (dataObj.list||[])) {
let obj = new MonthlyFundPage(data, this.beginTime);
if(obj) this.list.push(obj);
}
this.roundIndex = parseInt(moment(this.beginTime).format('YYYYMM'));
this.todayIndex = deltaDays(getZeroPointD(SHOP_REFRESH_TYPE.MONTHLY), new Date) + 1;
}
public setPlayerRecords(playerDatas: ActivityMonthlyFundModelType[]) {
for(let playerData of playerDatas) {
let data = this.list.find(cur => cur.pageIndex == playerData.pageIndex);
if(data) data.setPlayerRecord(playerData);
}
}
public findPage(pageIndex: number) {
return this.list.find(cur => cur.pageIndex == pageIndex);
}
public findByProductID(productID: string) {
return this.list.find(cur => cur.productID == productID);
}
public getShowResult() {
return {
...this.getBaseKeys(),
list: this.list.map(data => data.getShowResult()).filter(cur => cur)
}
}
}