后台:服务器维护
This commit is contained in:
@@ -707,6 +707,7 @@ export enum SERVER_STATUS {
|
||||
HOT = 2, // 火爆
|
||||
WILL_OPEN = 3, // 即将开启
|
||||
MAINTENANCE = 4, // 维护中
|
||||
HIDE = 0, // 隐藏
|
||||
}
|
||||
|
||||
export enum WHITE_LIST_TYPE {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, ReturnModelType, mongoose } from '@typegoose/typegoose';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
|
||||
/**
|
||||
* 自增 ID
|
||||
|
||||
@@ -23,8 +23,6 @@ export class Receiver {
|
||||
roleId?: string;
|
||||
@prop({ required: true })
|
||||
roleName?: string;
|
||||
@prop({ required: true })
|
||||
hasSend?: boolean;
|
||||
}
|
||||
|
||||
export default class GMMail extends BaseModel {
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose';
|
||||
import Marquee, { MarqueeType } from './Marquee';
|
||||
import Notice, { NoticeType } from './Notice';
|
||||
import GMMail from './GMMail';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
import { GMMailType } from './GMMail';
|
||||
|
||||
/**
|
||||
* 开服策略
|
||||
*/
|
||||
@index({ id: 1 })
|
||||
|
||||
export default class Maintenance extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
code: string; // 策略唯一标志
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
serverIds: number[]; // 服务器类型
|
||||
|
||||
@prop({ required: true })
|
||||
isOpen: boolean; // 维护是否使用
|
||||
|
||||
@prop({ required: true })
|
||||
startTime: Date; // 维护开始时间
|
||||
|
||||
@prop({ ref: () => Marquee, type: mongoose.Schema.Types.ObjectId })
|
||||
marquee: Ref<Marquee>; // 跑马灯,连接到marquee表
|
||||
|
||||
@prop({ ref: () => Notice, type: mongoose.Schema.Types.ObjectId })
|
||||
notice: Ref<Notice>; // 维护公告
|
||||
|
||||
@prop({ ref: () => GMMail, type: mongoose.Schema.Types.ObjectId })
|
||||
mail: Ref<GMMail>; // 维护结束邮件
|
||||
|
||||
|
||||
public static async createData(values: MaintenanceTypeParam, marquee: MarqueeType, notice: NoticeType, mail: GMMailType, uid = 1) {
|
||||
const code = genCode(8);
|
||||
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, {
|
||||
$setOnInsert: {...values, code, isOpen: false, marquee: marquee._id, notice: notice._id, mail: mail._id, createdBy: uid}, $set: { updatedBy: uid }
|
||||
}, { new: true, upsert: true }).lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async updateData(code: string, values: MaintenanceTypeParam, uid = 1) {
|
||||
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { ...values, updatedBy: uid } }, { new: true, upsert: true })
|
||||
.populate('marquee', 'code')
|
||||
.populate('notice')
|
||||
.populate('mail')
|
||||
.lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async findOpenMaintenance() {
|
||||
const rec: MaintenanceType = await MaintenanceModel.findOne({ isOpen: true }, { _id: 0 }).populate('marquee').populate('notice').populate('mail').lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async findByCode(code: string) {
|
||||
const rec: MaintenanceType = await MaintenanceModel.findOne({ code }).populate('marquee').populate('notice').populate('mail').lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async updateStatusByCode(code: string, isOpen: boolean, uid = 1) {
|
||||
const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { isOpen, updatedBy: uid } }).populate('marquee').populate('notice').populate('mail').lean();
|
||||
return rec;
|
||||
}
|
||||
|
||||
private static getSearchObj(form: { isOpen?: boolean }) {
|
||||
let searchObj = {};
|
||||
if (form.isOpen) searchObj['isOpen'] = form.isOpen;
|
||||
return searchObj
|
||||
}
|
||||
|
||||
public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { isOpen?: boolean } = {}) {
|
||||
|
||||
let searchObj = this.getSearchObj(form);
|
||||
let sort = {};
|
||||
if (sortField && sortOrder) {
|
||||
if (sortOrder == 'ascend') {
|
||||
sort[sortField] = 1;
|
||||
} else if (sortOrder == 'descend') {
|
||||
sort[sortField] = -1;
|
||||
}
|
||||
}
|
||||
const result: MaintenanceType[] = await MaintenanceModel.find(searchObj, { _id: 0 })
|
||||
.populate('marquee').populate('notice', '+showStartTime +showEndTime').populate('mail')
|
||||
.limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public static async countByCondition(form: { isOpen?: boolean } = {}) {
|
||||
|
||||
let searchObj = this.getSearchObj(form);
|
||||
const result = await MaintenanceModel.count(searchObj);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export const MaintenanceModel = getModelForClass(Maintenance);
|
||||
|
||||
export interface MaintenanceType extends Pick<DocumentType<Maintenance>, keyof Maintenance> { }
|
||||
export type MaintenanceTypeParam = Partial<MaintenanceType>; // 将所有字段变成可选项
|
||||
@@ -3,6 +3,7 @@ import { CounterModel } from './Counter';
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose';
|
||||
import ServerStategy from './ServerStategy';
|
||||
import { ServerlistType } from './Serverlist';
|
||||
|
||||
|
||||
/**
|
||||
@@ -35,6 +36,9 @@ export default class Region extends BaseModel {
|
||||
@prop({ required: true })
|
||||
latestServer: number; // 最新服
|
||||
|
||||
@prop({ required: true })
|
||||
latestServerUniqId: number; // 最新服唯一id
|
||||
|
||||
@prop({ required: true })
|
||||
serverCount: number; // 总数
|
||||
|
||||
@@ -56,6 +60,13 @@ export default class Region extends BaseModel {
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async newServer(id: number, newServer: ServerlistType, uid = 1) {
|
||||
const rec: RegionType = await RegionModel.findOneAndUpdate({ id }, {
|
||||
$set: { latestServer: newServer.serverId, latestServerUniqId: newServer.id, updatedBy: uid },
|
||||
$inc: { serverCount: 1 }
|
||||
}, { new: true }).lean();
|
||||
return rec;
|
||||
}
|
||||
public static async getAllRegion() {
|
||||
const rec: RegionType[] = await RegionModel.find().select('-_id -stategy').lean();
|
||||
return rec;
|
||||
|
||||
@@ -5,11 +5,31 @@ import { COUNTER, SERVER_STATUS } from '../consts';
|
||||
import { CreateServerParam } from '../domain/backEndField/params';
|
||||
import { RegionType } from './Region';
|
||||
import { DicServerName } from '../pubUtils/dictionary/DicServerName';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
|
||||
export class Maintenance {
|
||||
|
||||
@prop({ required: true })
|
||||
batchCode: string; // 批次,如果是从大区列表维护就是一批的,小区列表上就是一服一个
|
||||
|
||||
@prop({ required: true })
|
||||
isOpen: boolean; // 维护是否使用
|
||||
|
||||
@prop({ required: true })
|
||||
startTime: number; // 维护开始时间
|
||||
|
||||
@prop({ required: true })
|
||||
endTime: number; // 维护结束时间
|
||||
|
||||
@prop({ required: true })
|
||||
hasNotify: boolean; // 是否有维护通知
|
||||
|
||||
}
|
||||
/**
|
||||
* 游戏字段接口
|
||||
*/
|
||||
@index({ id: 1 })
|
||||
@index({ env: 1 })
|
||||
@modelOptions({ schemaOptions: { id: false } })
|
||||
export default class Serverlist extends BaseModel {
|
||||
|
||||
@@ -23,7 +43,7 @@ export default class Serverlist extends BaseModel {
|
||||
prefix: string; // 前缀
|
||||
|
||||
@prop({ required: true })
|
||||
id: number; // 小区id 自增
|
||||
id: number; // 小区id 自增,全大区共用自增counter,玩家role表中存的就是这个serverId
|
||||
|
||||
@prop({ required: true })
|
||||
serverId: number; // 相同serverType下的id,不同serverType下id一定不同,但是serverId可能相同
|
||||
@@ -44,8 +64,7 @@ export default class Serverlist extends BaseModel {
|
||||
activityGroupId: number[]; // 活动组
|
||||
|
||||
public get status() {
|
||||
let now = new Date();
|
||||
if (now > this.openTime) {
|
||||
if (nowSeconds() > this.openTime) {
|
||||
return this.serverStatus;
|
||||
} else {
|
||||
return SERVER_STATUS.WILL_OPEN; // 未开服
|
||||
@@ -53,10 +72,10 @@ export default class Serverlist extends BaseModel {
|
||||
}
|
||||
|
||||
@prop({ required: true })
|
||||
openTime: Date;
|
||||
openTime: number;
|
||||
|
||||
@prop({ required: true })
|
||||
stopRegisterTime: Date;
|
||||
stopRegisterTime: number;
|
||||
|
||||
@prop({ required: true, default: true })
|
||||
canRegister: boolean;
|
||||
@@ -67,6 +86,9 @@ export default class Serverlist extends BaseModel {
|
||||
@prop({ required: true, default: 0 })
|
||||
medianCe: number; // 中位数武将战力、缩小10000倍后的结果
|
||||
|
||||
@prop({ required: true, type: Maintenance, _id: false })
|
||||
maintenance: Maintenance
|
||||
|
||||
public static async getAllServerList() {
|
||||
let id = await CounterAllModal.getCounter(COUNTER.SERVER);
|
||||
let result: ServerlistType[] = [];
|
||||
@@ -79,7 +101,7 @@ export default class Serverlist extends BaseModel {
|
||||
}
|
||||
|
||||
public static async findByServerId(serverId: number) {
|
||||
let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).select('medianCe activityGroupId').lean({ getters: true, virtuals: true });
|
||||
let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
@@ -89,7 +111,7 @@ export default class Serverlist extends BaseModel {
|
||||
}
|
||||
|
||||
public static async updateByServerId(serverId: number, update: ServerlistUpdate) {
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }).lean({ getters: true, virtuals: true });
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }, {new: true}).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
@@ -98,19 +120,13 @@ export default class Serverlist extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async updateGroupName(groupId: number, groupName: string) {
|
||||
let server = await ServerlistModel.updateMany({ groupId }, { $set: { groupName } });
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async newServer(params: CreateServerParam, region: RegionType, dicServerName: DicServerName, uid = 1 ) {
|
||||
let { prefix, id: regionId, env } = region;
|
||||
// 分大区
|
||||
let id = await CounterAllModal.getNewCounter(COUNTER.SERVER);
|
||||
let { openTime: openTimeNum, stopRegisterTime: hour, activityGroupId } = params;
|
||||
let { openTime, stopRegisterTime: hour, activityGroupId } = params;
|
||||
let { id: serverId, sname: name, groupId, groupName } = dicServerName;
|
||||
let openTime = new Date(openTimeNum * 1000);
|
||||
let stopRegisterTime = new Date(openTimeNum + hour * 60 * 60);
|
||||
let stopRegisterTime = openTime + hour * 60 * 60;
|
||||
|
||||
const doc = new ServerlistModel();
|
||||
const update = Object.assign(doc.toJSON(), {
|
||||
@@ -124,49 +140,11 @@ export default class Serverlist extends BaseModel {
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async findByServerType(serverType?: string) {
|
||||
let condition = {};
|
||||
if(serverType) {
|
||||
condition['serverType'] = serverType;
|
||||
}
|
||||
let server: ServerlistType[] = await ServerlistModel.find(condition).sort({ id: -1 }).lean({ getters: true, virtuals: true });
|
||||
public static async findByEnv(env?: string) {
|
||||
let server: ServerlistType[] = await ServerlistModel.find({ env, serverStatus: { $gt: 0 } }).sort({ id: -1 }).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
private static getSearchObj(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string }) {
|
||||
let searchObj = {};
|
||||
if (form.id != undefined) searchObj['id'] = form.id;
|
||||
if (form.serverId != undefined) searchObj['serverId'] = form.serverId;
|
||||
if (form.groupId != undefined) searchObj['groupId'] = form.groupId;
|
||||
if (form.name != undefined) searchObj['name'] = { $regex: new RegExp(form.name.toString(), 'i') };
|
||||
if (form.groupName != undefined) searchObj['groupName'] = { $regex: new RegExp(form.groupName.toString(), 'i') };
|
||||
if (form.serverType != undefined) searchObj['serverType'] = form.serverType;
|
||||
return searchObj
|
||||
}
|
||||
|
||||
public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) {
|
||||
|
||||
let searchObj = this.getSearchObj(form);
|
||||
let sort = {};
|
||||
if(sortField && sortOrder) {
|
||||
if(sortOrder == 'ascend') {
|
||||
sort[sortField] = 1;
|
||||
} else if (sortOrder == 'descend') {
|
||||
sort[sortField] = -1;
|
||||
}
|
||||
}
|
||||
const result: ServerlistType[] = await ServerlistModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public static async countByCondition(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) {
|
||||
|
||||
let searchObj = this.getSearchObj(form);
|
||||
const result = await ServerlistModel.count(searchObj);
|
||||
return result;
|
||||
}
|
||||
|
||||
//根据多个活动id查询活动数据
|
||||
public static async findServerByIds(ids: number[]) {
|
||||
let result: ServerlistType[] = await ServerlistModel.find({ id: { $in: ids } }).lean();
|
||||
|
||||
@@ -10,6 +10,7 @@ import { loadGMMailModel } from './GMMail';
|
||||
import { loadCounterModal } from "./CounterAll";
|
||||
|
||||
export function loadGmDb(connect: mongoose.Connection) {
|
||||
// console.log('************')
|
||||
loadApiModel(connect);
|
||||
loadGMGroupModel(connect);
|
||||
loadGMUserModel(connect);
|
||||
|
||||
@@ -121,7 +121,9 @@ export class CreateServerParam {
|
||||
env: string = '';
|
||||
openTime: number = 0;
|
||||
activityGroupId: number[] = [];
|
||||
hasOpenMail: boolean = false;
|
||||
openMail?: GMMail;
|
||||
hasCircleMail: boolean = false;
|
||||
circleMail?: GMMail;
|
||||
stopRegisterTime: number = 0;
|
||||
|
||||
@@ -135,6 +137,8 @@ export class CreateServerParam {
|
||||
if(!this.env || !this.openTime || !this.stopRegisterTime || !isArray(this.activityGroupId) || this.activityGroupId.length <= 0 ) {
|
||||
return false
|
||||
}
|
||||
if(this.hasOpenMail && !this.openMail) return false;
|
||||
if(this.hasCircleMail && !this.circleMail) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
import { RoleType } from '../../db/Role';
|
||||
import { getSeconds } from '../../pubUtils/timeUtil';
|
||||
import { ServerlistType } from '../../db/Serverlist';
|
||||
|
||||
export class ServerParam {
|
||||
@@ -15,10 +14,10 @@ export class ServerParam {
|
||||
constructor(server: ServerlistType) {
|
||||
this.id = server.id;
|
||||
this.serverId = server.serverId;
|
||||
this.serverStr = `S${server.serverId}`;
|
||||
this.serverStr = `${server.prefix}${server.serverId}`;
|
||||
this.name = server.name;
|
||||
this.status = server.status;
|
||||
this.openTime = getSeconds(server.openTime);
|
||||
this.openTime = server.openTime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,15 +30,17 @@ export class GroupParam {
|
||||
constructor(server: ServerlistType) {
|
||||
this.groupId = server.groupId;
|
||||
this.groupName = server.groupName;
|
||||
this.groupStr = `S${server.serverId}-S${server.serverId + 9}`;
|
||||
this.groupStr = `${server.prefix}${server.serverId}`;
|
||||
this.servers = new Array<ServerParam>();
|
||||
}
|
||||
|
||||
public pushServer(server: ServerlistType) {
|
||||
let srv = new ServerParam(server);
|
||||
this.servers.push(srv);
|
||||
let min = this.servers.reduce((pre, cur) => pre < cur? pre: cur);
|
||||
this.groupStr = `${min.serverId}-${min.serverId + 9}`
|
||||
this.servers.sort((a, b) => b.serverId - a.serverId);
|
||||
let min = this.servers[this.servers.length - 1];
|
||||
let max = this.servers[0];
|
||||
this.groupStr = `${min.serverStr}-${max.serverStr}`
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user