From 3d510783da285707e892f82d77aedbdd9d13f516 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 4 Aug 2023 16:20:36 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E6=B4=BB=E5=8A=A8):=20?= =?UTF-8?q?=E8=8A=82=E6=97=A5=E6=B4=BB=E5=8A=A8=E9=AB=98=E7=BA=A7=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E9=82=AE=E4=BB=B6=E8=A1=A5=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/gm/handler/gmHandler.ts | 4 +++ .../servers/systimer/remote/systimerRemote.ts | 10 ++++++- .../app/services/activity/signInService.ts | 28 ++++++++++++++++++- game-server/app/services/timeTaskService.ts | 23 +++++++++++++++ shared/consts/constModules/mailConst.ts | 1 + shared/db/Activity.ts | 8 +++++- shared/db/ActivitySignIn.ts | 12 ++++++++ shared/resource/jsons/dic_email_content.json | 7 +++++ 8 files changed, 90 insertions(+), 3 deletions(-) diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 2d86ab292..329fd2775 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -161,6 +161,10 @@ export class GmHandler { if(groupShops.length > 0) { pinus.app.rpc.systimer.systimerRemote.initSumSchedule.broadcast(); } + let signIns = activities.filter(cur => cur.type == ACTIVITY_TYPE.COMMON_SIGN_IN); + if(signIns.length > 0) { + pinus.app.rpc.systimer.systimerRemote.initVipSignInMailSchedule.broadcast(); + } return resResult(STATUS.SUCCESS, { activity: activities diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index fc102b2a1..5662286a9 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -1,5 +1,5 @@ import { Application, ChannelService } from 'pinus'; -import { guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, addMailsToSchedule, updateTimeLimitRank, setLadderCountDown, cancelLadderCountDown, initSumSchedule, setPvpSeasonSchedule, initGVGConfigSchedule, gvgBattleStartSchedule, gvgBattleEndSchedule, initHiddenDataSchedule } from '../../../services/timeTaskService'; +import { guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, addMailsToSchedule, updateTimeLimitRank, setLadderCountDown, cancelLadderCountDown, initSumSchedule, setPvpSeasonSchedule, initGVGConfigSchedule, gvgBattleStartSchedule, gvgBattleEndSchedule, initHiddenDataSchedule, initVipSignInMailSchedule } from '../../../services/timeTaskService'; import PvpDefenseType from '../../../db/PvpDefense'; import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity'; import { gameData, reloadResources } from '../../../pubUtils/data'; @@ -302,6 +302,14 @@ export class SystimerRemote { } } + public async initVipSignInMailSchedule() { + try { + await initVipSignInMailSchedule(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } + public async fun() { try { console.log('预留一个函数,用于之后线上维护时需要使用'); diff --git a/game-server/app/services/activity/signInService.ts b/game-server/app/services/activity/signInService.ts index e1908d4bb..4cb7bc3e7 100644 --- a/game-server/app/services/activity/signInService.ts +++ b/game-server/app/services/activity/signInService.ts @@ -1,10 +1,13 @@ import moment = require('moment'); -import { ACTIVITY_TYPE, SERVER_OPEN_TIME, SIGNIN_VIP_OPEN_LIMIT, STATUS } from '../../consts'; +import { ACTIVITY_TYPE, MAIL_TYPE, SERVER_OPEN_TIME, SIGNIN_VIP_OPEN_LIMIT, STATUS } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivitySignInModel, ActivitySignInModelType } from '../../db/ActivitySignIn'; import { SignInData } from '../../domain/activityField/signInField'; import { getRoleCreateTime, getServerCreateTime } from '../redisService'; import { getActivitiesByType, getActivityById } from './activityService'; +import { RewardInter } from '../../pubUtils/interface'; +import { stringToRewardInter } from './giftPackageService'; +import { sendMailByContent } from '../mailService'; /** * 获取活动数据 @@ -135,4 +138,27 @@ export async function checkSignInCanBuy(roleId: string, serverId: number, activi } return true +} + +// 补发签到邮件 +export async function repairSignInMail(playerData: SignInData) { + if(!playerData || playerData.productID == '&') return; + let playerRecords = await ActivitySignInModel.findByActivity(playerData.activityId, 1); + let hasRepaireRoleIds: string[] = [] + for(let playerRecord of playerRecords) { + if(playerRecord.hasRepair) continue; + let notSendGoods: RewardInter[] = []; + let records = playerRecord.records||[]; + for(let item of playerData.list) { + let curRec = records.find(rec => rec.dayIndex == item.dayIndex); + if(!curRec) { + notSendGoods.push(...stringToRewardInter(item.reward)); + } + } + if(notSendGoods.length > 0) { + await sendMailByContent(MAIL_TYPE.REPAIRE_SIGN_IN, playerRecord.roleId, { goods: notSendGoods }); + hasRepaireRoleIds.push(playerRecord.roleId); + } + } + await ActivitySignInModel.repairSignIn(playerData.activityId, hasRepaireRoleIds); } \ No newline at end of file diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 856c9ad2a..cb7e96bd0 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -53,6 +53,11 @@ import { RewardInter } from '../pubUtils/interface'; import { stringToRewardInter } from './activity/giftPackageService'; import { autoCreateServerSchedule } from './serverService'; import { setHiddenData } from './memoryCache/hiddenData'; +import { SignInData } from '../domain/activityField/signInField'; +import * as util from 'util'; +import { ActivitySignInModel } from '../db/ActivitySignIn'; +import { repairSignInMail } from './activity/signInService'; + const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -126,6 +131,9 @@ export async function init() { // 月基金每月未领取 initMonthlyFundSchedule(); + + // 节日活动高级签到补发 + initVipSignInMailSchedule() } // 每日刷新 @@ -998,6 +1006,21 @@ async function initMonthlyFundSchedule() { }); } +// 高级签到自动补发 +export async function initVipSignInMailSchedule() { + let activities = await ActivityModel.findOpenTypeByTime(ACTIVITY_TYPE.COMMON_SIGN_IN); + for(let activityData of activities) { + let playerData = new SignInData(activityData, 0, 0); + if(!playerData || playerData.productID == '&') continue; + + const jobKey = `vipSignMailJob${playerData.activityId}`; + if(scheduledJobs[jobKey]) scheduledJobs[jobKey].cancel(); + scheduleJob(jobKey, playerData.endTime, async () => { + await repairSignInMail(playerData); + }); + } +} + export async function monthlyFundSchedule(roundIndex: number) { let activityMap = new Map(); let playerDatas = await ActivityMonthlyFundModel.findNotReceivedReward(roundIndex); diff --git a/shared/consts/constModules/mailConst.ts b/shared/consts/constModules/mailConst.ts index 7f4738abd..642250c82 100644 --- a/shared/consts/constModules/mailConst.ts +++ b/shared/consts/constModules/mailConst.ts @@ -75,6 +75,7 @@ export enum MAIL_TYPE { MONTHLY_FUND = 45, // 补发月基金奖励 ARTIFACT_OVER = 46, // 宝物数量超过 GVG_BATTLE_PLAYER_SETTLE_RANK_REWARD = 47, // 激战期个人占领排行榜奖励 + REPAIRE_SIGN_IN = 48, // 高级签到补发奖励 }; export const SEND_NAME = '系统'; diff --git a/shared/db/Activity.ts b/shared/db/Activity.ts index 7b3aa913b..9f4934e97 100644 --- a/shared/db/Activity.ts +++ b/shared/db/Activity.ts @@ -1,7 +1,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, ReturnModelType, mongoose } from '@typegoose/typegoose'; import { CounterAllModal } from './CounterAll'; -import { COUNTER } from '../consts'; +import { ACTIVITY_TIME_TYPE, COUNTER } from '../consts'; import { ActivityGroupModel } from './ActivityGroup'; import { UpdateActivityParam } from '../domain/backEndField/params'; @@ -90,6 +90,12 @@ export default class Activity extends BaseModel { return result; } + // 查询 + public static async findOpenTypeByTime(type: number) { + let result: ActivityModelType[] = await ActivityModel.find({ type, isEnable: true, timeType: ACTIVITY_TIME_TYPE.DATE_TIME, beginTime: { $lte: new Date }, endTime: { $gte: new Date() } }).lean(); + return result; + } + //debug测试用接口 public static async debugFindActivityByType(type: number) { let result: ActivityModelType[] = await ActivityModel.findOne({ type }).lean(true); diff --git a/shared/db/ActivitySignIn.ts b/shared/db/ActivitySignIn.ts index 1b7e41ed6..6b8d300bd 100644 --- a/shared/db/ActivitySignIn.ts +++ b/shared/db/ActivitySignIn.ts @@ -27,6 +27,8 @@ export default class Activity_Sign_In extends BaseModel { roundIndex: number; // 周期数,从活动设置的开始时间计算 @prop({ required: true, type: Activity_Sign_In_Record, _id: false }) records: Activity_Sign_In_Record[]; // 领取记录 + @prop({ required: false }) + hasRepair: boolean; // 是否补发了 //签到记录 public static async addSignInRecord(activityId: number, roleId: string, roundIndex: number, dayIndex: number) { @@ -48,6 +50,16 @@ export default class Activity_Sign_In extends BaseModel { return result; } + // 根据活动id查询记录 + public static async findByActivity(activityId: number, roundIndex: number) { + let result: ActivitySignInModelType[] = await ActivitySignInModel.find({ activityId, roundIndex }).lean(); + return result; + } + + public static async repairSignIn(activityId: number, roleIds: string[]) { + await ActivitySignInModel.updateMany({ activityId, roleId: { $in: roleIds } }, { $set: { hasRepair: true } }); + } + //删除签到记录 public static async deleteActivity(activityId: number, roleId: string, roundIndex: number) { await ActivitySignInModel.deleteMany({ roleId, activityId, roundIndex }); diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index 61dd1ab8b..6696ec3db 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -334,5 +334,12 @@ "sendName": "学宫驿使", "content": "亲爱的百家传人,逐鹿中原激战期内,您在积分上为联军做出重要贡献,荣获第%d名,奖励现已发送至邮箱,请查收", "time": 720 + }, + { + "id": 48, + "title": "&", + "sendName": "学宫驿使", + "content": "亲爱的百家传人,您在本期集会活动中有高级签到的奖励未领取,现发送至邮箱,请查收", + "time": 2160 } ] \ No newline at end of file