活动:签到
This commit is contained in:
@@ -61,22 +61,15 @@ export class SignInHandler {
|
|||||||
let playerData = await getPlayerSignInData(activityId, serverId, roleId)
|
let playerData = await getPlayerSignInData(activityId, serverId, roleId)
|
||||||
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
if (!playerData) return resResult(STATUS.ACTIVITY_MISSING);
|
||||||
|
|
||||||
let curDate = moment(new Date()).valueOf();
|
if (!playerData.canShow()) {//未开启
|
||||||
if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启
|
|
||||||
return resResult(STATUS.ACTIVITY_CLOSED);
|
return resResult(STATUS.ACTIVITY_CLOSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
let openTime = SERVER_OPEN_TIME;
|
|
||||||
|
|
||||||
if (dayIndex > playerData.todayIndex) {
|
if (dayIndex > playerData.todayIndex) {
|
||||||
return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER);
|
return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER);
|
||||||
}
|
}
|
||||||
//开服第一个月可以签到之前未领取的奖励,下个月只能签到当天奖励,补签
|
//开服第一个月可以签到之前未领取的奖励,下个月只能签到当天奖励,补签
|
||||||
let isDelay = false;//补签
|
let isDelay = false;//补签
|
||||||
if (moment().diff(moment(openTime).startOf('months'), 'months') != 0 && (dayIndex != playerData.todayIndex)) {
|
|
||||||
isDelay = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
let roundIndex = playerData.roundIndex;
|
let roundIndex = playerData.roundIndex;
|
||||||
|
|
||||||
//高级签到开启条件
|
//高级签到开启条件
|
||||||
@@ -104,7 +97,7 @@ export class SignInHandler {
|
|||||||
if (!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
if (!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
await ActivitySignInModel.addSignInRecord(activityId, roleId, roundIndex, [dayIndex]);
|
await ActivitySignInModel.addSignInRecord(activityId, roleId, roundIndex, dayIndex);
|
||||||
|
|
||||||
let rewardParamArr: Array<RewardParam> = stringToRewardParam(signinItemData.reward);
|
let rewardParamArr: Array<RewardParam> = stringToRewardParam(signinItemData.reward);
|
||||||
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.SIGNIN)
|
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.SIGNIN)
|
||||||
|
|||||||
@@ -64,50 +64,6 @@ export async function signInVIPActivity(serverId: number, roleId: string) {
|
|||||||
return playerData;
|
return playerData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取活动数据
|
|
||||||
*
|
|
||||||
* @param {number} type 新手签到
|
|
||||||
* @param {number} serverId 区Id
|
|
||||||
* @param {number} activityId 活动Id
|
|
||||||
* @param {string} roleId 角色Id
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export async function newPlayerSignInActivity(serverId: number, roleId: string) {
|
|
||||||
let activityArray = await getActivitiesByType(serverId, ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN);
|
|
||||||
if (activityArray.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
let activityData = activityArray[0];
|
|
||||||
let createTime = await getRoleCreateTime(roleId);
|
|
||||||
let serverTime = await getServerCreateTime(serverId);
|
|
||||||
let playerData = new SignInData(activityData, createTime, serverTime);
|
|
||||||
|
|
||||||
let betinTime = null;
|
|
||||||
let endTime = null
|
|
||||||
let curDate = moment(createTime * 1000);
|
|
||||||
if (curDate.hour() < REFRESH_TIME) {
|
|
||||||
betinTime = moment(createTime * 1000).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').toDate();
|
|
||||||
endTime = moment(betinTime).add(playerData.days, 'd').toDate()
|
|
||||||
} else {
|
|
||||||
betinTime = moment(createTime * 1000).startOf('d').add(REFRESH_TIME, 'h').toDate();
|
|
||||||
endTime = moment(betinTime).add(playerData.days, 'd').toDate()
|
|
||||||
}
|
|
||||||
if (curDate > endTime) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
playerData.setNewPlayerDate(betinTime, endTime);
|
|
||||||
let curDateStamp = moment(new Date()).valueOf();
|
|
||||||
if (curDateStamp < playerData.beginTime || curDateStamp > playerData.endTime) {//未开启
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityData.activityId, roleId, playerData.roundIndex);
|
|
||||||
playerData.setPlayerRecords(playerRecords);
|
|
||||||
return playerData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 玩家活动数据
|
* 玩家活动数据
|
||||||
*
|
*
|
||||||
@@ -126,22 +82,11 @@ export async function getPlayerSignInData(activityId: number, serverId: number,
|
|||||||
let serverTime = await getServerCreateTime(serverId);
|
let serverTime = await getServerCreateTime(serverId);
|
||||||
|
|
||||||
let playerData = new SignInData(activityData, createTime, serverTime);
|
let playerData = new SignInData(activityData, createTime, serverTime);
|
||||||
|
console.log('##### getPlayerSignInData',activityId, roleId, playerData.roundIndex, playerData)
|
||||||
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityId, roleId, playerData.roundIndex);
|
let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityId, roleId, playerData.roundIndex);
|
||||||
|
|
||||||
|
console.log('##### getPlayerSignInData playerData', playerRecords, !!playerRecords)
|
||||||
playerData.setPlayerRecords(playerRecords);
|
playerData.setPlayerRecords(playerRecords);
|
||||||
if (playerData.type === ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN) {
|
|
||||||
let betinTime = null;
|
|
||||||
let endTime = null
|
|
||||||
let curDate = moment(createTime * 1000);
|
|
||||||
if (curDate.hour() < REFRESH_TIME) {
|
|
||||||
betinTime = moment(createTime * 1000).startOf('d').add(-1, 'd').add(REFRESH_TIME, 'h').toDate();
|
|
||||||
endTime = moment(betinTime).add(playerData.days, 'd').toDate()
|
|
||||||
} else {
|
|
||||||
betinTime = moment(createTime * 1000).startOf('d').add(REFRESH_TIME, 'h').toDate();
|
|
||||||
endTime = moment(betinTime).add(playerData.days, 'd').toDate()
|
|
||||||
}
|
|
||||||
playerData.setNewPlayerDate(betinTime, endTime)
|
|
||||||
}
|
|
||||||
return playerData;
|
return playerData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-12
@@ -1,12 +1,18 @@
|
|||||||
import BaseModel from './BaseModel';
|
import BaseModel from './BaseModel';
|
||||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||||
|
import { getZeroPoint } from '../pubUtils/timeUtil';
|
||||||
|
|
||||||
|
|
||||||
export class Activity_Sign_In_Record extends BaseModel {
|
export class Activity_Sign_In_Record {
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
dayIndex: number; // 第几天
|
dayIndex: number; // 第几天
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
time: Date; // 时间
|
time: number; // 时间
|
||||||
|
|
||||||
|
constructor(dayIndex: number, time: number) {
|
||||||
|
this.dayIndex = dayIndex;
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,20 +27,13 @@ export default class Activity_Sign_In extends BaseModel {
|
|||||||
roleId: string; // 用户Id
|
roleId: string; // 用户Id
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
roundIndex: number; // 周期数,从活动设置的开始时间计算
|
roundIndex: number; // 周期数,从活动设置的开始时间计算
|
||||||
@prop({ required: true })
|
@prop({ required: true, type: Activity_Sign_In_Record, _id: false })
|
||||||
records: Activity_Sign_In_Record[]; // 领取记录
|
records: Activity_Sign_In_Record[]; // 领取记录
|
||||||
|
|
||||||
//签到记录
|
//签到记录
|
||||||
public static async addSignInRecord(activityId: number, roleId: string, roundIndex: number, dayIndexs: number[]) {
|
public static async addSignInRecord(activityId: number, roleId: string, roundIndex: number, dayIndex: number) {
|
||||||
let records = [];
|
|
||||||
for (let dayIndex of dayIndexs) {
|
|
||||||
let record = new Activity_Sign_In_Record();
|
|
||||||
record.dayIndex = dayIndex;
|
|
||||||
record.time = new Date();
|
|
||||||
records.push(record)
|
|
||||||
}
|
|
||||||
let result: ActivitySignInModelType = await ActivitySignInModel.findOneAndUpdate({ roleId, activityId, roundIndex },
|
let result: ActivitySignInModelType = await ActivitySignInModel.findOneAndUpdate({ roleId, activityId, roundIndex },
|
||||||
{ $push: { records: { $each: records } } }, { upsert: true, new: true }).lean(true);
|
{ $push: { records: new Activity_Sign_In_Record(dayIndex, Date.now()) } }, { upsert: true, new: true }).lean(true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import moment = require('moment');
|
import moment = require('moment');
|
||||||
import { ACTIVITY_TYPE, REFRESH_TIME, SERVER_OPEN_TIME, SIGNIN_CLOSE, SIGNIN_OPEN } from '../../consts';
|
import { ACTIVITY_TYPE, REFRESH_TIME, SERVER_OPEN_TIME, SHOP_REFRESH_TYPE, SIGNIN_CLOSE, SIGNIN_OPEN } from '../../consts';
|
||||||
import { ActivityModelType } from '../../db/Activity';
|
import { ActivityModelType } from '../../db/Activity';
|
||||||
import { ActivitySignInModelType } from '../../db/ActivitySignIn';
|
import { ActivitySignInModelType } from '../../db/ActivitySignIn';
|
||||||
|
import { getZeroPoint, getZeroPointOfTime } from '../../pubUtils/timeUtil';
|
||||||
import { ActivityBase } from './activityField';
|
import { ActivityBase } from './activityField';
|
||||||
|
|
||||||
|
|
||||||
@@ -21,6 +22,10 @@ export class SignInItem {
|
|||||||
public canReceive(): boolean {
|
public canReceive(): boolean {
|
||||||
return !this.isReceive;
|
return !this.isReceive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public setReceive(isReceive: boolean) {
|
||||||
|
this.isReceive = isReceive;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -28,6 +33,7 @@ export class SignInItem {
|
|||||||
export class SignInData extends ActivityBase {
|
export class SignInData extends ActivityBase {
|
||||||
list: Array<SignInItem> = [];
|
list: Array<SignInItem> = [];
|
||||||
roundIndex: number = 0;//活动周期
|
roundIndex: number = 0;//活动周期
|
||||||
|
todayIndex: number = 1;
|
||||||
price: number = 0;//vip价格,普通签到为0
|
price: number = 0;//vip价格,普通签到为0
|
||||||
// rebet: number = 0;
|
// rebet: number = 0;
|
||||||
productID: string = '';//商品ID
|
productID: string = '';//商品ID
|
||||||
@@ -36,6 +42,8 @@ export class SignInData extends ActivityBase {
|
|||||||
startDate: number = 1;//月卡开启
|
startDate: number = 1;//月卡开启
|
||||||
endDate: number = 30;//月卡关闭
|
endDate: number = 30;//月卡关闭
|
||||||
days: number = 8;//新手签到使用,持续的天数
|
days: number = 8;//新手签到使用,持续的天数
|
||||||
|
signBeginTime: number = 0;
|
||||||
|
signEndTime: number = 0;
|
||||||
|
|
||||||
//第几天的签到奖励
|
//第几天的签到奖励
|
||||||
public findDayItem(dayIndex: number) {
|
public findDayItem(dayIndex: number) {
|
||||||
@@ -50,54 +58,42 @@ export class SignInData extends ActivityBase {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let records = data.records ? data.records : [];
|
let records = data.records ? data.records : [];
|
||||||
for (let obj of this.list) {
|
let day: number[] = [];
|
||||||
let index = records.findIndex(record => { return obj.dayIndex == record.dayIndex })
|
for(let obj of records) {
|
||||||
if (index != -1) {
|
let item = this.findDayItem(obj.dayIndex);
|
||||||
obj.isReceive = true;
|
console.log('setPlayerRecords0', obj.dayIndex, item)
|
||||||
|
if(item) {
|
||||||
|
item.setReceive(true);
|
||||||
|
let time = getZeroPointOfTime(obj.time, SHOP_REFRESH_TYPE.DAILY, 0)
|
||||||
|
let today = getZeroPoint(SHOP_REFRESH_TYPE.DAILY, 0);
|
||||||
|
console.log('setPlayerRecords', time, today)
|
||||||
|
if(day.indexOf(time) == -1 && time < today) {
|
||||||
|
this.todayIndex++;
|
||||||
|
day.push(time);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.isVip = true
|
this.isVip = true
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置新手签到时间
|
|
||||||
public setNewPlayerDate(beginTime: Date, endTime: Date) {
|
|
||||||
this.beginTime = moment(beginTime).valueOf();
|
|
||||||
this.endTime = moment(endTime).valueOf();
|
|
||||||
this.roundIndex = 1;
|
|
||||||
let date = new Date();
|
|
||||||
this.todayIndex = Math.ceil((moment(date).valueOf() - this.beginTime) / (24 * 60 * 60 * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
public initData(data: string) {
|
public initData(data: string) {
|
||||||
let dataObj = JSON.parse(data);
|
let dataObj = JSON.parse(data);
|
||||||
this.price = dataObj.price;
|
this.price = dataObj.price;
|
||||||
this.productID = dataObj.productID;
|
this.productID = dataObj.productID;
|
||||||
this.consume = dataObj.consume;
|
this.consume = dataObj.consume;
|
||||||
// this.rebet = dataObj.rebet;
|
// this.rebet = dataObj.rebet;
|
||||||
|
this.signBeginTime = this.beginTime;
|
||||||
|
this.signEndTime = this.endTime;
|
||||||
|
|
||||||
let date = new Date();
|
if(this.type == ACTIVITY_TYPE.SIGN_IN||this.type == ACTIVITY_TYPE.SIGN_IN_VIP) {
|
||||||
|
|
||||||
if (this.type === ACTIVITY_TYPE.COMMON_SIGN_IN) {//通用签到
|
|
||||||
this.beginTime = moment(this.beginTime).startOf('day').add(REFRESH_TIME, 'h').valueOf();
|
|
||||||
this.endTime = moment(this.endTime).endOf('day').add(REFRESH_TIME, 'h').valueOf();
|
|
||||||
this.roundIndex = moment(this.beginTime).diff(moment(SERVER_OPEN_TIME).startOf('months'), 'months') + 1;
|
|
||||||
this.todayIndex = Math.ceil((moment(date).valueOf() - this.beginTime) / (24 * 60 * 60 * 1000));
|
|
||||||
} else {
|
|
||||||
this.startDate = dataObj.startDate ? dataObj.startDate : SIGNIN_OPEN;
|
this.startDate = dataObj.startDate ? dataObj.startDate : SIGNIN_OPEN;
|
||||||
this.endDate = dataObj.endDate ? dataObj.endDate : SIGNIN_CLOSE;
|
this.endDate = dataObj.endDate ? dataObj.endDate : SIGNIN_CLOSE;
|
||||||
|
|
||||||
this.days = dataObj.days ? dataObj.days : 0;
|
this.days = dataObj.days ? dataObj.days : 0;
|
||||||
this.beginTime = moment(date.setDate(this.startDate)).startOf('day').add(REFRESH_TIME, 'h').valueOf();
|
this.signBeginTime = moment().startOf('M').valueOf();
|
||||||
if (this.startDate > this.endDate) {//跨度下个月
|
this.signEndTime = moment().endOf('M').valueOf();
|
||||||
this.endTime = moment(date.setDate(this.endDate)).endOf('day').add(REFRESH_TIME, 'h').add(1, 'month').valueOf();
|
|
||||||
} else {
|
this.roundIndex = parseInt(moment().format('YYYYMM'));
|
||||||
this.endTime = moment(date.setDate(this.endDate)).endOf('day').add(REFRESH_TIME, 'h').valueOf();
|
|
||||||
}
|
|
||||||
this.roundIndex = moment(this.beginTime).diff(moment(SERVER_OPEN_TIME).startOf('months'), 'months') + 1;
|
|
||||||
if (this.type === ACTIVITY_TYPE.NEW_PLAYER_SIGN_IN) {
|
|
||||||
this.roundIndex = 1;
|
|
||||||
}
|
|
||||||
this.todayIndex = Math.ceil((moment().valueOf() - this.beginTime) / (24 * 60 * 60 * 1000));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -464,14 +464,14 @@ export function nowSeconds() {
|
|||||||
* 获取刷新时间点 10位时间戳
|
* 获取刷新时间点 10位时间戳
|
||||||
* @param refreshType 刷新类型,每天/每周/每月,默认每天
|
* @param refreshType 刷新类型,每天/每周/每月,默认每天
|
||||||
*/
|
*/
|
||||||
export function getZeroPoint(refreshType: SHOP_REFRESH_TYPE = SHOP_REFRESH_TYPE.DAILY) {
|
export function getZeroPoint(refreshType: SHOP_REFRESH_TYPE = SHOP_REFRESH_TYPE.DAILY, hour = REFRESH_TIME) {
|
||||||
let t = new Time(TIME_OUTPUT_TYPE.STAMP_10);
|
let t = new Time(TIME_OUTPUT_TYPE.STAMP_10);
|
||||||
if(refreshType == SHOP_REFRESH_TYPE.DAILY) {
|
if(refreshType == SHOP_REFRESH_TYPE.DAILY) {
|
||||||
return <number>t.getDayZeroPoint();
|
return <number>t.getDayZeroPoint(hour);
|
||||||
} else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) {
|
} else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) {
|
||||||
return <number>t.getWeekZeroPoint();
|
return <number>t.getWeekZeroPoint(hour);
|
||||||
} else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) {
|
} else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) {
|
||||||
return <number>t.getMonthZeroPoint();
|
return <number>t.getMonthZeroPoint(hour);
|
||||||
} else {
|
} else {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -492,14 +492,14 @@ export function getZeroPointD(refreshType: SHOP_REFRESH_TYPE = SHOP_REFRESH_TYPE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getZeroPointOfTime(refTime: Date|number, refreshType: SHOP_REFRESH_TYPE = SHOP_REFRESH_TYPE.DAILY) {
|
export function getZeroPointOfTime(refTime: Date|number, refreshType: SHOP_REFRESH_TYPE = SHOP_REFRESH_TYPE.DAILY, hour = REFRESH_TIME) {
|
||||||
let t = new Time(TIME_OUTPUT_TYPE.STAMP_10, refTime);
|
let t = new Time(TIME_OUTPUT_TYPE.STAMP_10, refTime);
|
||||||
if(refreshType == SHOP_REFRESH_TYPE.DAILY) {
|
if(refreshType == SHOP_REFRESH_TYPE.DAILY) {
|
||||||
return <number>t.getDayZeroPoint();
|
return <number>t.getDayZeroPoint(hour);
|
||||||
} else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) {
|
} else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) {
|
||||||
return <number>t.getWeekZeroPoint();
|
return <number>t.getWeekZeroPoint(hour);
|
||||||
} else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) {
|
} else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) {
|
||||||
return <number>t.getMonthZeroPoint();
|
return <number>t.getMonthZeroPoint(hour);
|
||||||
} else {
|
} else {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user