78 lines
2.9 KiB
TypeScript
78 lines
2.9 KiB
TypeScript
import BaseModel from "./BaseModel";
|
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
|
|
|
class Player {
|
|
@prop({ required: true })
|
|
leagueCode: string;
|
|
@prop({ required: true })
|
|
roleId: string;
|
|
}
|
|
|
|
|
|
@index({ configId: 1, cityId: 1, groupId: 1, serverType: 1 })
|
|
// GVGCity 类,继承自 BaseModel
|
|
export default class GVGCity extends BaseModel {
|
|
@prop({ required: true, default: 1 })
|
|
configId: number; // config唯一id
|
|
|
|
@prop({ required: true, default: 1 })
|
|
groupId: number; // 战区
|
|
|
|
@prop({ required: true, default: 1 })
|
|
serverType: number; // 1-单服 2-跨服
|
|
|
|
@prop({ required: true })
|
|
cityId: number; // 城池id
|
|
|
|
@prop({ required: true, default: [], type: Player, _id: false })
|
|
players: Player[]; // 联军
|
|
|
|
@prop({ required: false })
|
|
guardLeague: string; // 占领的联军
|
|
|
|
@prop({ required: false })
|
|
guardLeagueName: string; // 占领的联军
|
|
|
|
@prop({ required: false })
|
|
guardLeagueIcon: number; // 占领的联军
|
|
|
|
@prop({ required: true, default: 0 })
|
|
userCnt: number; // 城池人数
|
|
|
|
// 创建城市
|
|
public static async createCity(configId: number, groupId: number, serverType: number, cityId: number) {
|
|
let doc = new GVGCityModel();
|
|
let update = Object.assign(doc.toJSON(), { configId, cityId});
|
|
const city: GVGCityType = await GVGCityModel.findOneAndUpdate({ configId, cityId, groupId, serverType }, { $setOnInsert: update }, { upsert: true, new: true }).lean();
|
|
return city;
|
|
}
|
|
|
|
// 通过 cityId 获取城市
|
|
public static async findByCityId(configId: number, groupId: number, serverType: number, cityId: number) {
|
|
const city: GVGCityType = await GVGCityModel.findOne({ configId, groupId, serverType, cityId }).lean();
|
|
return city;
|
|
}
|
|
|
|
// 添加人数
|
|
public static async increasePlayer(configId: number, groupId: number, serverType: number, cityId: number, roleId: string, leagueCode: string) {
|
|
const city: GVGCityType = await GVGCityModel.findOneAndUpdate({ configId, groupId, serverType, cityId, userCnt: { $lt: 200 } }, { $inc: { userCnt: 1 }, $push: { players: { roleId, leagueCode } }}, { new: true, upsert: true }).lean();
|
|
return city;
|
|
}
|
|
|
|
// 减少人数
|
|
public static async decreasePlayer(configId: number, groupId: number, serverType: number, cityId: number, roleId: string) {
|
|
const city: GVGCityType = await GVGCityModel.findOneAndUpdate({ configId, groupId, serverType, cityId, 'players.roleId': roleId }, { $inc: { userCnt: -1 }, $pull: { players: { roleId } }}, { new: true, upsert: true }).lean();
|
|
return city;
|
|
}
|
|
}
|
|
|
|
|
|
export const GVGCityModel = getModelForClass(GVGCity);
|
|
|
|
export interface GVGCityType extends Pick<DocumentType<GVGCity>, keyof GVGCity> {
|
|
id: number;
|
|
};
|
|
|
|
export type GVGCityUpdate = Partial<GVGCityType>; // 将所有字段变成可选项
|
|
|