Files
ZYZ/shared/domain/activityField/rebateField.ts
2023-04-07 19:11:21 +08:00

116 lines
3.6 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 { ActivityModelType } from '../../db/Activity';
import { HistoryOrderModelType } from '../../db/HistoryOrder';
import { ActivityBase } from './activityField';
import { deltaDays } from '../../pubUtils/util';
import { UserType } from '../../db/User';
// 数据库
interface ItemDataInDb {
day: number; // 第几天
percent: number; // 百分比
unitReward: string; // 每1元充值金额对应的奖励
}
interface RebatesDataInDb {
rebates: ItemDataInDb[];
}
class ItemData {
day: number; // 第几天
percent: number; // 百分比10%在这里填10这天玩家可以领取的奖励就是 "充值金额*percent/100*unitReward"
rewards: string; // type&id&count 玩家可以领取的奖励
unitReward: string; // 单价
hasReceived: boolean = false; // 是否已经领取
constructor(item: ItemDataInDb) {
this.day = item.day;
this.percent = item.percent;
this.unitReward = item.unitReward;
}
public setRewards(totalPay: number) {
this.rewards = multiRewards(this.unitReward, totalPay * this.percent / 100);
}
public setHasReceive() {
this.hasReceived = true;
}
}
// 数据
export class RebateData extends ActivityBase {
originEndTime: number = 0;
rebates: ItemData[] = [];
totalPay: number = 0;
playerCreateTime: number = 0;
channelId: string;
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime);
this.initData(activityData.data);
this.originEndTime = this.endTime;
this.playerCreateTime = createTime;
this.nextRefreshTime = moment('2100-01-01').valueOf();
this.endTime = moment('2100-01-01').valueOf();
this.todayIndex = deltaDays(moment(createTime).toDate(), new Date) + 1;
}
public initData(data: string) {
let dataObj: RebatesDataInDb = JSON.parse(data);
for(let item of (dataObj?.rebates||[])) this.rebates.push(new ItemData(item));
}
public setPlayerRecords(playerRecords: HistoryOrderModelType[], user: UserType) {
for(let record of playerRecords) {
this.totalPay += record.totalPay;
}
for(let rebate of this.rebates) {
rebate.setRewards(this.totalPay);
}
if(playerRecords.length > 0) {
let { receiveRecords = [] } = playerRecords[0];
for(let { day } of receiveRecords) {
let rebate = this.findRebateByDay(day);
if(rebate) rebate.setHasReceive();
}
}
this.channelId = user.channelId;
}
public findRebateByDay(day: number) {
return this.rebates.find(cur => cur.day == day);
}
private checkReceivedAll() {
return !this.rebates.find(cur => !cur.hasReceived);
}
public getShowResult() {
if(this.totalPay <= 0) return null;
if(this.checkReceivedAll()) return null;
if(this.originEndTime < this.playerCreateTime) return null;
return {
...this.getBaseKeys(),
rebates: this.rebates,
originEndTime: this.originEndTime,
totalPay: this.totalPay,
}
}
}
function multiRewards(rewards: string, multi: number) {
let arr = rewards.split('|');
return arr.map(str => {
let [type, id, count] = str.split('&')||[];
if(type && id && count) {
let _count = Math.ceil(parseInt(count) * multi);
if(isNaN(_count)) return null;
return `${type}&${id}&${_count}`;
}
}).filter(cur => cur).join('|');
}