巅峰演武:赛季优化修改
This commit is contained in:
115
shared/db/PvpConfig.ts
Normal file
115
shared/db/PvpConfig.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { CounterModel } from './Counter';
|
||||
import { COUNTER } from '../consts';
|
||||
|
||||
@index({ isCurrent: 1 })
|
||||
@index({ seasonNum: 1 })
|
||||
export default class PVPConfig extends BaseModel {
|
||||
|
||||
@prop({ required: true, default: 1 })
|
||||
seasonNum: number; // 赛季
|
||||
|
||||
@prop({ required: true })
|
||||
seasonStartTime: number; // 赛季开始时间
|
||||
|
||||
@prop({ required: true })
|
||||
seasonRewardTime: number; // 结算奖励时间
|
||||
|
||||
@prop({ required: true })
|
||||
seasonEndTime: number; // 赛季结束的时间
|
||||
|
||||
@prop({ required: true })
|
||||
hasSettleReward: boolean; // 是否发放奖励
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
warIds: number[]; // 关卡id
|
||||
|
||||
@prop({ required: true })
|
||||
isCurrent: boolean; // 是否是当前赛季
|
||||
|
||||
public static async findCurPVPConfig() {
|
||||
let result: PVPConfigType = await PVPConfigModel.findOne({ isCurrent: true }).lean();
|
||||
if(!result) {
|
||||
result = await PVPConfigModel.findOneAndUpdate({ seasonStartTime: { $lte: nowSeconds() } }, { $set: { isCurrent: true }}, { new: true }).sort({ seasonStartTime: -1 }).lean();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findPVPConfig(seasonNum: number) {
|
||||
const result: PVPConfigType = await PVPConfigModel.findOne({ seasonNum }).lean(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async createPVPConfig(seasonNum: number|'new', params: PVPConfigUpdate, uid: number) {
|
||||
if(seasonNum == 'new') {
|
||||
seasonNum = await CounterModel.getNewCounter(COUNTER.PVP_SEASON_NUM);
|
||||
}
|
||||
const result: PVPConfigType = await PVPConfigModel.findOneAndUpdate({ seasonNum }, { $set: { ...params, updatedBy: uid }, $setOnInsert: { hasSettleReward: false, isCurrent: false, createdBy: uid } }, { upsert: true, new: true }).lean(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async getSettledConfig() {
|
||||
const result: PVPConfigType = await PVPConfigModel.findOne({ hasSettleReward: true }).sort({ seasonNum: -1}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async checkTime(seasonNum: number|'new', seasonStartTime: number, seasonRewardTime: number) {
|
||||
if(seasonNum == 'new') {
|
||||
return await PVPConfigModel.exists({ seasonRewardTime: { $gt: seasonStartTime } })
|
||||
} else {
|
||||
return await PVPConfigModel.exists({
|
||||
seasonNum: { $ne: seasonNum },
|
||||
$or: [
|
||||
{ seasonNum: { $lt: seasonNum }, seasonRewardTime: { $gt: seasonStartTime } },
|
||||
{ seasonNum: { $gt: seasonNum }, seasonStartTime: { $lt: seasonRewardTime } }
|
||||
]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
public static async setReward(seasonNum: number) {
|
||||
const result: PVPConfigType = await PVPConfigModel.findOneAndUpdate({ seasonNum }, { hasSettleReward: true }, { new: true }).lean(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async setCurrentPvp() {
|
||||
await PVPConfigModel.updateMany({ isCurrent: true }, { $set: { isCurrent: false } });
|
||||
const result: PVPConfigType = await PVPConfigModel.findOneAndUpdate({ seasonStartTime: { $lte: nowSeconds() } }, { $set: { isCurrent: true }}, {new: true}).sort({ seasonStartTime: -1 }).lean(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async setNextPvp(seasonNum: number) {
|
||||
await PVPConfigModel.updateMany({ isCurrent: true }, { $set: { isCurrent: false } });
|
||||
const result: PVPConfigType = await PVPConfigModel.findOneAndUpdate({ seasonNum }, { $set: { isCurrent: true }}, {new: true}).sort({ seasonStartTime: -1 }).lean(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByCondition(page: number, pageSize: number, sortField: string = 'seasonNum', sortOrder: string = 'descend') {
|
||||
let sort = {};
|
||||
if (sortField && sortOrder) {
|
||||
if (sortOrder == 'ascend') {
|
||||
sort[sortField] = 1;
|
||||
} else if (sortOrder == 'descend') {
|
||||
sort[sortField] = -1;
|
||||
}
|
||||
}
|
||||
const result: PVPConfigType[] = await PVPConfigModel.find().limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public static async countByCondition() {
|
||||
|
||||
const result = await PVPConfigModel.count({});
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const PVPConfigModel = getModelForClass(PVPConfig);
|
||||
|
||||
export interface PVPConfigType extends Pick<DocumentType<PVPConfig>, keyof PVPConfig> {
|
||||
id: number;
|
||||
};
|
||||
export type PVPConfigUpdate = Partial<PVPConfigType>; // 将所有字段变成可选项
|
||||
Reference in New Issue
Block a user