diff --git a/game-server/app/servers/activity/handler/signInHandler.ts b/game-server/app/servers/activity/handler/signInHandler.ts index 79c2b88c0..c584d4148 100644 --- a/game-server/app/servers/activity/handler/signInHandler.ts +++ b/game-server/app/servers/activity/handler/signInHandler.ts @@ -61,22 +61,15 @@ export class SignInHandler { let playerData = await getPlayerSignInData(activityId, serverId, roleId) if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); - let curDate = moment(new Date()).valueOf(); - if (curDate < playerData.beginTime || curDate > playerData.endTime) {//未开启 + if (!playerData.canShow()) {//未开启 return resResult(STATUS.ACTIVITY_CLOSED); } - let openTime = SERVER_OPEN_TIME; - if (dayIndex > playerData.todayIndex) { return resResult(STATUS.ACTIVITY_DAY_INDEX_OVER); } //开服第一个月可以签到之前未领取的奖励,下个月只能签到当天奖励,补签 let isDelay = false;//补签 - if (moment().diff(moment(openTime).startOf('months'), 'months') != 0 && (dayIndex != playerData.todayIndex)) { - isDelay = true; - } - let roundIndex = playerData.roundIndex; //高级签到开启条件 @@ -104,7 +97,7 @@ export class SignInHandler { 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 = stringToRewardParam(signinItemData.reward); let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.SIGNIN) diff --git a/game-server/app/services/activity/signInService.ts b/game-server/app/services/activity/signInService.ts index 8efb2d6aa..eb333a78a 100644 --- a/game-server/app/services/activity/signInService.ts +++ b/game-server/app/services/activity/signInService.ts @@ -64,50 +64,6 @@ export async function signInVIPActivity(serverId: number, roleId: string) { 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 playerData = new SignInData(activityData, createTime, serverTime); + console.log('##### getPlayerSignInData',activityId, roleId, playerData.roundIndex, playerData) let playerRecords: ActivitySignInModelType = await ActivitySignInModel.findData(activityId, roleId, playerData.roundIndex); + console.log('##### getPlayerSignInData playerData', playerRecords, !!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; } diff --git a/shared/db/ActivitySignIn.ts b/shared/db/ActivitySignIn.ts index cf74d63c0..197b59f21 100644 --- a/shared/db/ActivitySignIn.ts +++ b/shared/db/ActivitySignIn.ts @@ -1,12 +1,18 @@ import BaseModel from './BaseModel'; 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 }) dayIndex: number; // 第几天 @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 @prop({ required: true }) roundIndex: number; // 周期数,从活动设置的开始时间计算 - @prop({ required: true }) + @prop({ required: true, type: Activity_Sign_In_Record, _id: false }) records: Activity_Sign_In_Record[]; // 领取记录 //签到记录 - public static async addSignInRecord(activityId: number, roleId: string, roundIndex: number, dayIndexs: 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) - } + public static async addSignInRecord(activityId: number, roleId: string, roundIndex: number, dayIndex: number) { 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; } diff --git a/shared/domain/activityField/signInField.ts b/shared/domain/activityField/signInField.ts index dcd6e1000..5b72682e1 100644 --- a/shared/domain/activityField/signInField.ts +++ b/shared/domain/activityField/signInField.ts @@ -1,7 +1,8 @@ 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 { ActivitySignInModelType } from '../../db/ActivitySignIn'; +import { getZeroPoint, getZeroPointOfTime } from '../../pubUtils/timeUtil'; import { ActivityBase } from './activityField'; @@ -21,6 +22,10 @@ export class SignInItem { public canReceive(): boolean { return !this.isReceive; } + + public setReceive(isReceive: boolean) { + this.isReceive = isReceive; + } } @@ -28,6 +33,7 @@ export class SignInItem { export class SignInData extends ActivityBase { list: Array = []; roundIndex: number = 0;//活动周期 + todayIndex: number = 1; price: number = 0;//vip价格,普通签到为0 // rebet: number = 0; productID: string = '';//商品ID @@ -36,6 +42,8 @@ export class SignInData extends ActivityBase { startDate: number = 1;//月卡开启 endDate: number = 30;//月卡关闭 days: number = 8;//新手签到使用,持续的天数 + signBeginTime: number = 0; + signEndTime: number = 0; //第几天的签到奖励 public findDayItem(dayIndex: number) { @@ -50,54 +58,42 @@ export class SignInData extends ActivityBase { return; } let records = data.records ? data.records : []; - for (let obj of this.list) { - let index = records.findIndex(record => { return obj.dayIndex == record.dayIndex }) - if (index != -1) { - obj.isReceive = true; + let day: number[] = []; + for(let obj of records) { + let item = this.findDayItem(obj.dayIndex); + 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 } - //设置新手签到时间 - 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) { let dataObj = JSON.parse(data); this.price = dataObj.price; this.productID = dataObj.productID; this.consume = dataObj.consume; // this.rebet = dataObj.rebet; + this.signBeginTime = this.beginTime; + this.signEndTime = this.endTime; - let date = new Date(); - - 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 { + if(this.type == ACTIVITY_TYPE.SIGN_IN||this.type == ACTIVITY_TYPE.SIGN_IN_VIP) { this.startDate = dataObj.startDate ? dataObj.startDate : SIGNIN_OPEN; this.endDate = dataObj.endDate ? dataObj.endDate : SIGNIN_CLOSE; this.days = dataObj.days ? dataObj.days : 0; - this.beginTime = moment(date.setDate(this.startDate)).startOf('day').add(REFRESH_TIME, 'h').valueOf(); - if (this.startDate > this.endDate) {//跨度下个月 - this.endTime = moment(date.setDate(this.endDate)).endOf('day').add(REFRESH_TIME, 'h').add(1, 'month').valueOf(); - } else { - 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)); + this.signBeginTime = moment().startOf('M').valueOf(); + this.signEndTime = moment().endOf('M').valueOf(); + + this.roundIndex = parseInt(moment().format('YYYYMM')); } diff --git a/shared/pubUtils/timeUtil.ts b/shared/pubUtils/timeUtil.ts index b79a5be85..e3bea3324 100644 --- a/shared/pubUtils/timeUtil.ts +++ b/shared/pubUtils/timeUtil.ts @@ -464,14 +464,14 @@ export function nowSeconds() { * 获取刷新时间点 10位时间戳 * @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); if(refreshType == SHOP_REFRESH_TYPE.DAILY) { - return t.getDayZeroPoint(); + return t.getDayZeroPoint(hour); } else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) { - return t.getWeekZeroPoint(); + return t.getWeekZeroPoint(hour); } else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) { - return t.getMonthZeroPoint(); + return t.getMonthZeroPoint(hour); } else { 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); if(refreshType == SHOP_REFRESH_TYPE.DAILY) { - return t.getDayZeroPoint(); + return t.getDayZeroPoint(hour); } else if (refreshType == SHOP_REFRESH_TYPE.WEEKLY) { - return t.getWeekZeroPoint(); + return t.getWeekZeroPoint(hour); } else if (refreshType == SHOP_REFRESH_TYPE.MONTHLY) { - return t.getMonthZeroPoint(); + return t.getMonthZeroPoint(hour); } else { return 0 }