定时器
This commit is contained in:
@@ -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 { ActivityGroupShopRecModel } from "../../db/ActivityGroupShopRec";
|
||||||
import { ActivityGroupShopUserRecModel } from "../../db/ActivityGroupShopUserRec";
|
import { ActivityGroupShopUserRecModel } from "../../db/ActivityGroupShopUserRec";
|
||||||
import { GroupShopData } from "../../domain/activityField/groupShopField";
|
import { GroupShopData } from "../../domain/activityField/groupShopField";
|
||||||
|
import { RewardInter } from "../../pubUtils/interface";
|
||||||
|
import { sendMessageToGroupShopWithSuc } from "../pushService";
|
||||||
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
|
import { getRoleCreateTime, getServerCreateTime } from "../redisService";
|
||||||
import { getActivityById } from "./activityService";
|
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.NORMAL;
|
||||||
if(clientPrice < price) return GROUP_SHOP_PRICE_STATUS.NOT_ENOUGH;
|
if(clientPrice < price) return GROUP_SHOP_PRICE_STATUS.NOT_ENOUGH;
|
||||||
return GROUP_SHOP_PRICE_STATUS.OVER;
|
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<string, { activityId: number, itemId: number, reward: RewardInter[] }[]>();
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,6 @@ import { LADDER, PVP } from '../pubUtils/dicParam';
|
|||||||
import { fetch37Words } from './sdkService';
|
import { fetch37Words } from './sdkService';
|
||||||
import { GMMailModel, GMMailType } from '../db/GMMail';
|
import { GMMailModel, GMMailType } from '../db/GMMail';
|
||||||
import { Maintenance, ServerlistModel, ServerlistType } from '../db/Serverlist';
|
import { Maintenance, ServerlistModel, ServerlistType } from '../db/Serverlist';
|
||||||
import { getWorldChannelSid } from './chatService';
|
|
||||||
import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
||||||
import { RegionModel, RegionType } from '../db/Region';
|
import { RegionModel, RegionType } from '../db/Region';
|
||||||
import { CreateServerParam } from '../domain/backEndField/params';
|
import { CreateServerParam } from '../domain/backEndField/params';
|
||||||
@@ -32,9 +31,8 @@ import { ServerMailModel, ServerMailType } from '../db/ServerMail';
|
|||||||
import { ActivityModel, ActivityModelType } from '../db/Activity';
|
import { ActivityModel, ActivityModelType } from '../db/Activity';
|
||||||
import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField';
|
import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField';
|
||||||
import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService';
|
import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService';
|
||||||
import { getActivitiesByType } from './activity/activityService';
|
|
||||||
import { ActivityGroupModel } from '../db/ActivityGroup';
|
import { ActivityGroupModel } from '../db/ActivityGroup';
|
||||||
import { sendMessageToServer } from './pushService';
|
import { sendMessageToGroupShopWithSuc, sendMessageToServer } from './pushService';
|
||||||
import { resResult } from '../pubUtils/util';
|
import { resResult } from '../pubUtils/util';
|
||||||
import { checkPopUpConditionWhenGuildActivityEnd } from './activity/popUpShopService';
|
import { checkPopUpConditionWhenGuildActivityEnd } from './activity/popUpShopService';
|
||||||
import { pushRefreshTime } from './connectorService';
|
import { pushRefreshTime } from './connectorService';
|
||||||
@@ -42,6 +40,7 @@ import { sendUnReceivedActivityDailyCoin } from './activity/dailyCoinService';
|
|||||||
import { ladderTimeout, ladderTimeWillout, sendLadderDailyReward } from './ladderService';
|
import { ladderTimeout, ladderTimeWillout, sendLadderDailyReward } from './ladderService';
|
||||||
import { LadderMatchRecModel } from '../db/LadderMatchRec';
|
import { LadderMatchRecModel } from '../db/LadderMatchRec';
|
||||||
import { LadderMatchModel } from '../db/LadderMatch';
|
import { LadderMatchModel } from '../db/LadderMatch';
|
||||||
|
import { getGroupShopTimers, refundGroupShop, setGroupShopToSetSum } from './activity/groupShopService';
|
||||||
|
|
||||||
const PER_SECOND = 1 * 1000;
|
const PER_SECOND = 1 * 1000;
|
||||||
const PER_DAY = 24 * 60 * 60;
|
const PER_DAY = 24 * 60 * 60;
|
||||||
@@ -99,6 +98,9 @@ export async function init() {
|
|||||||
|
|
||||||
// 名将擂台每日奖励
|
// 名将擂台每日奖励
|
||||||
await ladderDailyReward();
|
await ladderDailyReward();
|
||||||
|
|
||||||
|
// 团购定时器
|
||||||
|
initGroupShopSchedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 每日刷新
|
// 每日刷新
|
||||||
@@ -798,4 +800,33 @@ async function ladderDailyReward() {
|
|||||||
}
|
}
|
||||||
await LadderMatchRecModel.timeoutMany(battleCodes);
|
await LadderMatchRecModel.timeoutMany(battleCodes);
|
||||||
}
|
}
|
||||||
// —————————————— 名将擂台 end —————————————— //
|
// —————————————— 名将擂台 end —————————————— //
|
||||||
|
|
||||||
|
// —————————————— 团购定时器 start —————————————— //
|
||||||
|
async function initGroupShopSchedule() {
|
||||||
|
|
||||||
|
let activities = await ActivityModel.findActivityByType(ACTIVITY_TYPE.GROUP_SHOP);
|
||||||
|
let scheduleMap = new Map<number, { activityId: number, itemId: number, sum: number }[]>(); // 时间 => 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 —————————————— //
|
||||||
@@ -72,6 +72,13 @@ export default class Activity_Group_Shop_Rec extends BaseModel {
|
|||||||
).lean();
|
).lean();
|
||||||
return result;
|
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);
|
export const ActivityGroupShopRecModel = getModelForClass(Activity_Group_Shop_Rec);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { GroupShopDiscount } from '../domain/activityField/groupShopField';
|
|||||||
*/
|
*/
|
||||||
@index({ activityId: 1 })
|
@index({ activityId: 1 })
|
||||||
@index({ activityId: 1, roleId: 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 {
|
export class GroupShopBuyRecord {
|
||||||
|
|
||||||
@@ -78,6 +78,10 @@ export default class Activity_Group_Shop_User_Rec extends BaseModel {
|
|||||||
return result;
|
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);
|
export const ActivityGroupShopUserRecModel = getModelForClass(Activity_Group_Shop_User_Rec);
|
||||||
|
|||||||
+2
-1
@@ -111,7 +111,8 @@ export class Teraph {
|
|||||||
@index({ towerLv: -1, towerUpTime: 1 })
|
@index({ towerLv: -1, towerUpTime: 1 })
|
||||||
@index({ topLineupCe: 1, updatedAt: 1 })
|
@index({ topLineupCe: 1, updatedAt: 1 })
|
||||||
@index({ ce: -1 })
|
@index({ ce: -1 })
|
||||||
// @index({ userInfo.uid: 1, serverId: 1 })
|
@index({ 'userInfo.uid': 1, serverId: 1 })
|
||||||
|
|
||||||
export default class Role extends BaseModel {
|
export default class Role extends BaseModel {
|
||||||
|
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ interface GroupShopInDb {
|
|||||||
|
|
||||||
// 数据
|
// 数据
|
||||||
class GroupShopTimer {
|
class GroupShopTimer {
|
||||||
time: number; // 活动开始之后的时间
|
time: number; // 时间戳
|
||||||
itemId: number; // items唯一id
|
itemId: number; // items唯一id
|
||||||
sum: number; // 如果次数不足sum次则强行设成sum次
|
sum: number; // 如果次数不足sum次则强行设成sum次
|
||||||
|
|
||||||
constructor(id: number, data: GroupShopTimerInDb) {
|
constructor(beginTime: number, id: number, data: GroupShopTimerInDb) {
|
||||||
this.time = data.time;
|
this.time = beginTime + data.time * 60 * 1000;
|
||||||
this.sum = data.sum;
|
this.sum = data.sum;
|
||||||
this.itemId = id;
|
this.itemId = id;
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ export class GroupShopData extends ActivityBase {
|
|||||||
this.itemMap.set(item.id, this.items.length - 1);
|
this.itemMap.set(item.id, this.items.length - 1);
|
||||||
if(item.timers && item.timers.length > 0) {
|
if(item.timers && item.timers.length > 0) {
|
||||||
for(let timer of item.timers) {
|
for(let timer of item.timers) {
|
||||||
this.timer.push(new GroupShopTimer(item.id, timer));
|
this.timer.push(new GroupShopTimer(this.beginTime, item.id, timer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user