Files
ZYZ/shared/domain/activityField/activityField.ts
2022-10-11 10:27:59 +08:00

181 lines
7.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 { ACTIVITY_TIME_TYPE, REFRESH_TIME } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { deltaDays } from '../../pubUtils/util';
// 活动数据
export abstract class ActivityBase {
groupId: number;
activityId: number = 0;
name: string = '';
beginTime: number = 0;
endTime: number = 0;
type: number = 0;
todayIndex: number = 0;//从1开始
delayDay: number = 0;//延迟多少天开启0表示按照原计划开启
effectDay: number = 0;// 活动生效天数
hideDayByServer: number = 0;
isEnable: boolean = false;
interval: number = 0;
roundIndex: number = 0;//周期活动第几个周期从1开始
nextRefreshTime: number = 0;//周期活动下次刷新时间
abstract initData(data: string): void;
//今天是活动第几天
public today(): number {
return this.todayIndex;
}
public canShow() {
if(!this.isEnable) return false;
if(this.beginTime > Date.now() || this.endTime < Date.now()) return false;
if(this.nextRefreshTime && this.nextRefreshTime < Date.now()) return false;
return true;
}
/**
* getBaseKeys
*/
public getBaseKeys() {
return {
activityId: this.activityId,
name: this.name,
beginTime: this.beginTime,
endTime: this.endTime,
type: this.type,
todayIndex: this.todayIndex,
delayDay: this.delayDay,
roundIndex: this.roundIndex,
nextRefreshTime: this.nextRefreshTime,
}
}
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
this.activityId = activityData.activityId;
this.groupId = activityData.groupId;
this.delayDay = activityData.delayDay ? activityData.delayDay : 0;
this.hideDayByServer = activityData.hideDayByServer||0;
this.roundIndex = 1;
this.name = activityData.name;
this.isEnable = activityData.isEnable;
this.interval = activityData.interval * 86400;
this.type = activityData.type;
// console.log('今天是活动第几天', activityData.beginTime, new Date, this.todayIndex, createTime, serverTime)
// console.log('***** activityData', activityData.timeType, this.beginTime, this.endTime, this.interval, this.todayIndex, this.roundIndex, this.nextRefreshTime, this.effectDay)
switch (activityData.timeType) {
case ACTIVITY_TIME_TYPE.SERVER_OPEN_TIME: {
this.beginTime = moment(serverTime * 1000).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
if (activityData.days > 0) {
this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf();
} else {
this.endTime = moment(this.beginTime).add(1, 'd').valueOf();
}
this.todayIndex = deltaDays(moment(this.beginTime).toDate(), new Date) + 1;
break;
}
case ACTIVITY_TIME_TYPE.ROLE_REGISTER_TIME: {
this.beginTime = moment(createTime * 1000).add(this.delayDay, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
if (activityData.days > 0) {
this.endTime = moment(this.beginTime).add(activityData.days, 'd').valueOf();
} else {
this.endTime = moment(this.beginTime).add(1, 'd').valueOf();
}
this.todayIndex = deltaDays(moment(this.beginTime).toDate(), new Date) + 1;
break;
}
case ACTIVITY_TIME_TYPE.DATE_TIME: {
this.beginTime = activityData.beginTime.valueOf();
this.endTime = activityData.endTime.valueOf();
let startOfBeginDay = moment(activityData.beginTime).startOf('d').add(REFRESH_TIME, 'h');
this.todayIndex = deltaDays(startOfBeginDay.toDate(), new Date) + 1;
break;
}
default: {
break;
}
}
if (activityData.interval > 0) {
this.roundIndex = Math.ceil((moment(new Date).valueOf() - this.beginTime) / (activityData.interval * 86400000));
this.nextRefreshTime = moment(this.beginTime).add(activityData.interval * (this.roundIndex - 1), 'day').add(activityData.effectDay, 'd').valueOf();
this.todayIndex = Math.ceil(((moment(new Date).valueOf() - this.beginTime) / (24 * 60 * 60 * 1000)));
} else {
this.nextRefreshTime = this.endTime;
}
if(activityData.hideDayByServer > 0) {
let hidOverTime = moment(serverTime * 1000).add(activityData.hideDayByServer, 'd').startOf('d').add(REFRESH_TIME, 'h').valueOf();
if(this.beginTime < hidOverTime) this.beginTime = hidOverTime;
}
// console.log('活动时间数据...', '活动id:', activityData.activityId, '类型:', activityData.timeType, '开始时间:', this.beginTime, moment(this.beginTime).toDate(),
// '结束:', this.endTime, moment(this.endTime).toDate(),
// '今天第几天:', this.todayIndex, '回合:', this.roundIndex, '下次刷新:', this.nextRefreshTime, moment(this.nextRefreshTime).toDate())
}
}
/**
* 存在内存内的活动
*/
export class ActivityInRemote {
groupId: number; // 组Id
activityId: number; // 活动Id
beginTime: number = 0; // 开启时间 timeType=3
endTime: number = 0; // 结束时间 timeType=3
type: number; // 活动类型
data: string; // 活动表中的数据
timeType: number; // 活动时间类型 ACTIVITY_TIME_TYPE 1.服务器开启时间 2.角色创建时间 3.指定开启时间(beginTime,endTime)
days: number = 0; // 活动持续天数 timeType=1、2
delayDay: number = 0; // 迟几天开启活动0表示按照规定时间开启
effectDay: number = 0; // 生效天数
interval: number = 0; // 周期性活动时间间隔,天
hideDayByServer: number = 0;
isEnable: boolean;
name: string;
constructor(activity?: ActivityModelType) {
this.groupId = activity.groupId;
this.activityId = activity.activityId;
if(activity.beginTime) this.beginTime = activity.beginTime.getTime();
if(activity.endTime) this.endTime = activity.endTime.getTime();
this.type = activity.type;
this.data = activity.data;
this.timeType = activity.timeType;
this.days = activity.days;
this.delayDay = activity.delayDay;
this.interval = activity.interval;
this.hideDayByServer = activity.hideDayByServer;
this.isEnable = activity.isEnable;
this.name = activity.name;
this.effectDay = activity.effectDay;
}
}
export function transActivityInRemoteToModelType(activity: ActivityInRemote): ActivityModelType {
if(!activity) return null;
return {
...activity,
beginTime: new Date(activity.beginTime),
endTime: new Date(activity.endTime),
_id: '',
createdAt: new Date(),
updatedAt: new Date(),
createdBy: 0,
updatedBy: 0
}
}
export class ActivityData extends ActivityBase {
public initData(_data: string) {
}
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime)
this.initData(activityData.data)
}
}