后台:服务器列表编辑
This commit is contained in:
@@ -29,11 +29,6 @@ export default class Activity extends BaseModel {
|
||||
@prop({ required: true })
|
||||
days: number; // 活动持续天数 timeType=1、2
|
||||
|
||||
@prop({ required: true })
|
||||
createdBy: number; // 后台创建人
|
||||
@prop({ required: true })
|
||||
updatedBy: number; // 最近更新人
|
||||
|
||||
|
||||
//根据活动类型查询开启的活动数据
|
||||
public static async findOpenActivityByType(activityGroupId: number[], type: number, date: Date) {
|
||||
|
||||
@@ -28,4 +28,10 @@ export default class BaseModel extends TimeStamps {
|
||||
|
||||
@prop()
|
||||
updatedAt: Date
|
||||
|
||||
@prop()
|
||||
createdBy: number; // 后台创建人
|
||||
|
||||
@prop()
|
||||
updatedBy: number; // 最近更新人
|
||||
}
|
||||
|
||||
@@ -22,6 +22,12 @@ export default class Counter extends BaseModel {
|
||||
return counter?.seq;
|
||||
}
|
||||
|
||||
public static async getCounter(param:{name: string, def: number}, lean = true) {
|
||||
let {name, def:defaultVal} = param;
|
||||
let counter: CounterType = await CounterModel.findOne({ name }).lean(lean);
|
||||
return counter?.seq||defaultVal;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const CounterModel = getModelForClass(Counter);
|
||||
|
||||
91
shared/db/ServerStategy.ts
Normal file
91
shared/db/ServerStategy.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { CounterModel } from './Counter';
|
||||
import { COUNTER } from '../consts';
|
||||
|
||||
/**
|
||||
* 开服策略
|
||||
*/
|
||||
@index({ id: 1 })
|
||||
|
||||
export default class ServerStategy extends BaseModel {
|
||||
@prop({ required: true })
|
||||
id: number; // 策略唯一id
|
||||
@prop({ required: true })
|
||||
name: string; // 策略名
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
isDefault: boolean; // 是否是自动开服默认使用的策略
|
||||
@prop({ required: true, default: 0 })
|
||||
maxPlayerCnt: number; // 人数上限
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
activityGroupId: number[]; // 选择活动组
|
||||
@prop({ required: true, type: Number })
|
||||
mails: number[]; // 选择邮件模板
|
||||
@prop({ required: true, type: Number })
|
||||
marquees: number[]; // 选择跑马灯
|
||||
@prop({ required: true, type: Number })
|
||||
notices: number[]; // 选择公告
|
||||
|
||||
public static async findBySId(id: number) {
|
||||
const result: ServerStategyType = await ServerStategyModel.findOne({ id }, { _id: 0 }).lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
private static getSearchObj(form: { id?: number, name?: string, isDefault?: boolean }) {
|
||||
let searchObj = {};
|
||||
if (form.id != undefined) searchObj['id'] = form.id;
|
||||
if (form.name != undefined) searchObj['name'] = { $regex: new RegExp(form.name.toString(), 'i') };
|
||||
if (form.isDefault != undefined) searchObj['isDefault'] = form.isDefault;
|
||||
return searchObj
|
||||
}
|
||||
|
||||
public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, name?: string, isDefault?: boolean } = {}) {
|
||||
|
||||
let searchObj = ServerStategyModel.getSearchObj(form);
|
||||
let sort = {};
|
||||
if (sortField && sortOrder) {
|
||||
if (sortOrder == 'ascend') {
|
||||
sort[sortField] = 1;
|
||||
} else if (sortOrder == 'descend') {
|
||||
sort[sortField] = -1;
|
||||
}
|
||||
}
|
||||
const result: ServerStategyType[] = await ServerStategyModel.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, name?: string, isDefault?: boolean } = {}) {
|
||||
|
||||
let searchObj = ServerStategyModel.getSearchObj(form);
|
||||
const result = await ServerStategyModel.count(searchObj);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static async unsetDefault() {
|
||||
const rec = await ServerStategyModel.updateMany({ isDefault: true }, { $set: { isDefault: false } });
|
||||
return rec;
|
||||
}
|
||||
|
||||
public static async updateServerStategy(values: ServerStategyTypeParam & {id: string|number}, uid = 1) {
|
||||
let id = values.id;
|
||||
if(id == 'new') {
|
||||
id = await CounterModel.getNewCounter(COUNTER.SERVER_STATEGY);
|
||||
}
|
||||
if(values.isDefault) {
|
||||
await ServerStategyModel.unsetDefault();
|
||||
}
|
||||
delete values.id;
|
||||
let rec: ServerStategyType = await ServerStategyModel.findOneAndUpdate({ id }, { $set: {...values, updatedBy: uid}, $setOnInsert: { createdBy: uid } },
|
||||
{ new: true, upsert: true }).lean(true);
|
||||
return rec;
|
||||
}
|
||||
}
|
||||
|
||||
export const ServerStategyModel = getModelForClass(ServerStategy);
|
||||
|
||||
export interface ServerStategyType extends Pick<DocumentType<ServerStategy>, keyof ServerStategy> { }
|
||||
export type ServerStategyTypeParam = Partial<ServerStategyType>; // 将所有字段变成可选项
|
||||
@@ -1,5 +1,9 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
||||
import { GameModel } from './Game';
|
||||
import { CounterModel } from './Counter';
|
||||
import { COUNTER } from '../consts';
|
||||
import { ServerStategyTypeParam } from './ServerStategy';
|
||||
|
||||
// 暂时服务器列表是从game表取的,之后会转移到使用这张表,目前用作查询该服战力中位数
|
||||
|
||||
@@ -31,10 +35,10 @@ export default class Serverlist extends BaseModel {
|
||||
@prop({ required: true })
|
||||
host: string; // pinus连接地址
|
||||
|
||||
@prop({ required: false })
|
||||
@prop({ required: false, default: 3014 })
|
||||
port: number; // pinus端口
|
||||
|
||||
@prop({ required: true })
|
||||
@prop({ required: true, default: 1 })
|
||||
serverStatus: number; // 服务器状态
|
||||
|
||||
@prop({ required: true, type: Number })
|
||||
@@ -52,12 +56,12 @@ export default class Serverlist extends BaseModel {
|
||||
@prop({ required: true })
|
||||
openTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
createTime: Date;
|
||||
|
||||
@prop({ required: true })
|
||||
serverType: string;
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
maxPlayerCnt: number; // 最大玩家人数
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
medianCe: number; // 中位数武将战力、缩小10000倍后的结果
|
||||
|
||||
@@ -76,10 +80,35 @@ export default class Serverlist extends BaseModel {
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async newServer(serverId: number, serverType: string, params: ServerlistUpdate) {
|
||||
public static async updateGroupName(groupId: number, groupName: string) {
|
||||
let server = await ServerlistModel.updateMany({ groupId }, { $set: { groupName } });
|
||||
return server;
|
||||
}
|
||||
|
||||
public static async newServer(params: { serverType: string, openTime: Date, name?: string }, stategy: ServerStategyTypeParam, uid = 1 ) {
|
||||
let { serverType, name } = params;
|
||||
|
||||
let serverEnvs = await GameModel.getServerEnvList();
|
||||
let curEnv = serverEnvs.find(cur => cur.serverType == serverType);
|
||||
if(!curEnv) return false;
|
||||
let { gameHost: host } = curEnv;
|
||||
|
||||
// 分大区
|
||||
let groupId = await CounterModel.getCounter(COUNTER.SERVER_GROUP);
|
||||
let groupServerCount = await ServerlistModel.countByCondition({ serverType, groupId });
|
||||
if(groupServerCount > 10) {
|
||||
groupId = await CounterModel.getNewCounter(COUNTER.SERVER_GROUP);
|
||||
}
|
||||
let groupName = '逍遥津' + groupId;
|
||||
|
||||
let serverId = await CounterModel.getNewCounter({ name: `${COUNTER.SERVER_BY_TYPE.name}_${serverType}`, def: COUNTER.SERVER_BY_TYPE.def });
|
||||
let id = await CounterModel.getNewCounter(COUNTER.SERVER);
|
||||
if(!name) name = '出师表' + id
|
||||
|
||||
const doc = new ServerlistModel();
|
||||
const update = Object.assign(doc.toJSON(), { id: serverId, serverType }, params);
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId, serverType }, { $setOnInsert: update }, { new: true, upsert: true }).lean({ getters: true, virtuals: true });
|
||||
const update = Object.assign(doc.toJSON(), params, { id, serverId, host, groupId, groupName, name, createdBy: uid, updatedBy: uid }, { activityGroupId: stategy.activityGroupId, maxPlayerCnt: stategy.maxPlayerCnt});
|
||||
|
||||
let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id }, { $setOnInsert: update }, { new: true, upsert: true }).lean({ getters: true, virtuals: true });
|
||||
return server;
|
||||
}
|
||||
|
||||
@@ -95,7 +124,8 @@ export default class Serverlist extends BaseModel {
|
||||
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['groupId'] = form.groupId;
|
||||
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;
|
||||
@@ -105,7 +135,6 @@ export default class Serverlist extends BaseModel {
|
||||
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 = ServerlistModel.getSearchObj(form);
|
||||
console.log(searchObj, form)
|
||||
let sort = {};
|
||||
if(sortField && sortOrder) {
|
||||
if(sortOrder == 'ascend') {
|
||||
@@ -114,7 +143,7 @@ export default class Serverlist extends BaseModel {
|
||||
sort[sortField] = -1;
|
||||
}
|
||||
}
|
||||
const result: ServerlistType[] = await ServerlistModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean();
|
||||
const result: ServerlistType[] = await ServerlistModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user