diff --git a/game-server/app/services/activity/groupShopService.ts b/game-server/app/services/activity/groupShopService.ts index 4701fd775..ba321a515 100644 --- a/game-server/app/services/activity/groupShopService.ts +++ b/game-server/app/services/activity/groupShopService.ts @@ -1,7 +1,10 @@ -import { GROUP_SHOP_PRICE_STATUS } from "../../consts"; +import { ACTIVITY_TYPE, GROUP_SHOP_PRICE_STATUS, PUSH_ROUTE } from "../../consts"; +import { ActivityModel, ActivityModelType } from "../../db/Activity"; import { ActivityGroupShopRecModel } from "../../db/ActivityGroupShopRec"; import { ActivityGroupShopUserRecModel } from "../../db/ActivityGroupShopUserRec"; import { GroupShopData } from "../../domain/activityField/groupShopField"; +import { RewardInter } from "../../pubUtils/interface"; +import { sendMessageToGroupShopWithSuc } from "../pushService"; import { getRoleCreateTime, getServerCreateTime } from "../redisService"; import { getActivityById } from "./activityService"; @@ -38,4 +41,48 @@ export function getGroupShopPriceStatus(clientPrice: number, price: number) { if(clientPrice == price) return GROUP_SHOP_PRICE_STATUS.NORMAL; if(clientPrice < price) return GROUP_SHOP_PRICE_STATUS.NOT_ENOUGH; return GROUP_SHOP_PRICE_STATUS.OVER; +} + +export async function getGroupShopServerData(activityData: ActivityModelType) { + let playerData = new GroupShopData(activityData, 0, 0); + let serverRecords = await ActivityGroupShopRecModel.findByActivity(activityData.activityId); + playerData.setRecords(serverRecords); + + return playerData; +} + +export async function getGroupShopTimers(activity: ActivityModelType) { + if(!activity) return []; + let playerData = await getGroupShopServerData(activity); + return playerData?.timer||[]; +} + +export async function setGroupShopToSetSum(arr: { activityId: number, itemId: number, sum: number }[]) { + for(let { activityId, itemId, sum } of arr) { + let serverRecord = await ActivityGroupShopRecModel.setSum(activityId, itemId, sum); + if(serverRecord) { + let activityData = await getActivityById(activityId); + let playerData = new GroupShopData(activityData, 0, 0); + playerData.setRecords([serverRecord]); + + let item = playerData.findItemById(itemId); + let nextDiscount = item.getCurDiscount(); + // 推送频道 + await sendMessageToGroupShopWithSuc(PUSH_ROUTE.GROUP_SHOP_UPDATE, { activityId, id: itemId, curDiscount: nextDiscount }); + } + } +} + +export async function refundGroupShop() { + let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP); + + let recs = new Map(); + for(let activityData of activities) { + let playerData = await getGroupShopServerData(activityData); + let items = playerData.items||[]; + for(let item of items) { + let playerRecords = await ActivityGroupShopUserRecModel.findByPrice(activityData.activityId, item.id, item.getCurDiscount().price); + + } + } } \ No newline at end of file diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 3a270910e..1fb74a172 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -21,7 +21,6 @@ import { LADDER, PVP } from '../pubUtils/dicParam'; import { fetch37Words } from './sdkService'; import { GMMailModel, GMMailType } from '../db/GMMail'; import { Maintenance, ServerlistModel, ServerlistType } from '../db/Serverlist'; -import { getWorldChannelSid } from './chatService'; import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService'; import { RegionModel, RegionType } from '../db/Region'; import { CreateServerParam } from '../domain/backEndField/params'; @@ -32,9 +31,8 @@ import { ServerMailModel, ServerMailType } from '../db/ServerMail'; import { ActivityModel, ActivityModelType } from '../db/Activity'; import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField'; import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService'; -import { getActivitiesByType } from './activity/activityService'; import { ActivityGroupModel } from '../db/ActivityGroup'; -import { sendMessageToServer } from './pushService'; +import { sendMessageToGroupShopWithSuc, sendMessageToServer } from './pushService'; import { resResult } from '../pubUtils/util'; import { checkPopUpConditionWhenGuildActivityEnd } from './activity/popUpShopService'; import { pushRefreshTime } from './connectorService'; @@ -42,6 +40,7 @@ import { sendUnReceivedActivityDailyCoin } from './activity/dailyCoinService'; import { ladderTimeout, ladderTimeWillout, sendLadderDailyReward } from './ladderService'; import { LadderMatchRecModel } from '../db/LadderMatchRec'; import { LadderMatchModel } from '../db/LadderMatch'; +import { getGroupShopTimers, refundGroupShop, setGroupShopToSetSum } from './activity/groupShopService'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -99,6 +98,9 @@ export async function init() { // 名将擂台每日奖励 await ladderDailyReward(); + + // 团购定时器 + initGroupShopSchedule(); } // 每日刷新 @@ -798,4 +800,33 @@ async function ladderDailyReward() { } await LadderMatchRecModel.timeoutMany(battleCodes); } -// —————————————— 名将擂台 end —————————————— // \ No newline at end of file +// —————————————— 名将擂台 end —————————————— // + +// —————————————— 团购定时器 start —————————————— // +async function initGroupShopSchedule() { + + let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP); + let scheduleMap = new Map(); // 时间 => data + for(let activity of activities) { + let timers = await getGroupShopTimers(activity); + for(let { time, itemId, sum } of timers) { + if(!scheduleMap.has(time)) { + scheduleMap.set(time, []); + } + scheduleMap.get(time).push({ activityId: activity.activityId, itemId, sum }); + } + } + + for(let [time, arr] of scheduleMap) { + if(scheduledJobs[`groupShopSetSum${time}`]) { + scheduledJobs[`groupShopSetSum${time}`].cancel(); + } + scheduleJob(`groupShopSetSum${time}`, time, async () => { + await setGroupShopToSetSum(arr); + }); + } + + scheduleJob('groupShopRefund', '0 30 5 * * ?', refundGroupShop); +} + +// —————————————— 团购定时器 end —————————————— // \ No newline at end of file diff --git a/shared/db/ActivityGroupShopRec.ts b/shared/db/ActivityGroupShopRec.ts index edc309445..5a60d3120 100644 --- a/shared/db/ActivityGroupShopRec.ts +++ b/shared/db/ActivityGroupShopRec.ts @@ -72,6 +72,13 @@ export default class Activity_Group_Shop_Rec extends BaseModel { ).lean(); return result; } + + public static async setSum(activityId: number, id: number, sum: number) { + let result: ActivityGroupShopRecType = await ActivityGroupShopRecModel.findOneAndUpdate( + { activityId, id, sum: { $lt: sum } }, { $set: { sum } }, { new: true, upsert: true } + ).lean(); + return result; + } } export const ActivityGroupShopRecModel = getModelForClass(Activity_Group_Shop_Rec); diff --git a/shared/db/ActivityGroupShopUserRec.ts b/shared/db/ActivityGroupShopUserRec.ts index 8d0d42227..375631eda 100644 --- a/shared/db/ActivityGroupShopUserRec.ts +++ b/shared/db/ActivityGroupShopUserRec.ts @@ -8,7 +8,7 @@ import { GroupShopDiscount } from '../domain/activityField/groupShopField'; */ @index({ activityId: 1 }) @index({ activityId: 1, roleId: 1 }) -@index({ activityId: 1, roleId: 1, id: 1, discountId: 1 }) +@index({ activityId: 1, id: 1, 'records.price': 1 }) export class GroupShopBuyRecord { @@ -78,6 +78,10 @@ export default class Activity_Group_Shop_User_Rec extends BaseModel { return result; } + public static async findByPrice(activityId: number, id: number, price: number) { + let result: ActivityGroupShopUserRecType[] = await ActivityGroupShopUserRecModel.find({ activityId, id, 'records.price': { $lt: price } }).lean(); + return result; + } } export const ActivityGroupShopUserRecModel = getModelForClass(Activity_Group_Shop_User_Rec); diff --git a/shared/db/Role.ts b/shared/db/Role.ts index d077a35b6..45b5fbe97 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -111,7 +111,8 @@ export class Teraph { @index({ towerLv: -1, towerUpTime: 1 }) @index({ topLineupCe: 1, updatedAt: 1 }) @index({ ce: -1 }) -// @index({ userInfo.uid: 1, serverId: 1 }) +@index({ 'userInfo.uid': 1, serverId: 1 }) + export default class Role extends BaseModel { @prop({ required: true }) diff --git a/shared/domain/activityField/groupShopField.ts b/shared/domain/activityField/groupShopField.ts index 894141c3e..30b9068b6 100644 --- a/shared/domain/activityField/groupShopField.ts +++ b/shared/domain/activityField/groupShopField.ts @@ -32,12 +32,12 @@ interface GroupShopInDb { // 数据 class GroupShopTimer { - time: number; // 活动开始之后的时间 + time: number; // 时间戳 itemId: number; // items唯一id sum: number; // 如果次数不足sum次则强行设成sum次 - constructor(id: number, data: GroupShopTimerInDb) { - this.time = data.time; + constructor(beginTime: number, id: number, data: GroupShopTimerInDb) { + this.time = beginTime + data.time * 60 * 1000; this.sum = data.sum; this.itemId = id; } @@ -130,7 +130,7 @@ export class GroupShopData extends ActivityBase { this.itemMap.set(item.id, this.items.length - 1); if(item.timers && item.timers.length > 0) { for(let timer of item.timers) { - this.timer.push(new GroupShopTimer(item.id, timer)); + this.timer.push(new GroupShopTimer(this.beginTime, item.id, timer)); } } }