94 lines
3.4 KiB
TypeScript
94 lines
3.4 KiB
TypeScript
import BaseModel from './BaseModel';
|
|
import { index, getModelForClass, prop, DocumentType, } from '@typegoose/typegoose';
|
|
import { LEAGUE_JOB } from '../consts';
|
|
|
|
class Tech {
|
|
@prop({ required: true, default: 0 })
|
|
id: number;
|
|
@prop({ required: true, default: 0 })
|
|
progress: number; // 贡献
|
|
@prop({ required: true, default: 0 })
|
|
status: number; // 0-已解锁 1-已激活
|
|
}
|
|
|
|
class DonateRec {
|
|
@prop({ required: true, default: 0 })
|
|
roleId: string;
|
|
@prop({ required: true, default: 0 })
|
|
time: number;
|
|
@prop({ required: true, default: 0 })
|
|
count: number;
|
|
}
|
|
|
|
class Resource {
|
|
@prop({ required: true, default: 0 })
|
|
food: number; // 粮食
|
|
@prop({ required: true, default: 0 })
|
|
mineral: number; // 矿物
|
|
@prop({ required: true, default: 0 })
|
|
wood: number; // 木堆
|
|
}
|
|
|
|
@index({ leagueCode: 1, configId: 1 })
|
|
export default class GVGLeaguePrepare extends BaseModel {
|
|
|
|
@prop({ required: true })
|
|
configId: number; // 赛期配置id
|
|
|
|
@prop({ required: true })
|
|
leagueCode: string; // 联军
|
|
|
|
@prop({ required: true, default: 1 })
|
|
lv: number; // 等级
|
|
|
|
@prop({ required: true, default: 0 })
|
|
maxMemberCnt: number; // 进入备战期初始玩家人数
|
|
|
|
@prop({ required: true, default: 0 })
|
|
producerCnt: number; // 选择内政人数
|
|
|
|
@prop({ required: true, default: 0 })
|
|
fighterCnt: number; // 选择外政人数
|
|
|
|
@prop({ required: true, default: [], type: Tech, _id: false })
|
|
tech: Tech[]; // 千机阁
|
|
|
|
@prop({ required: true, default: [], type: DonateRec, _id: false })
|
|
donateRec: DonateRec[]; // 捐献记录
|
|
|
|
@prop({ required: true, default: {food: 0, mineral: 0, wood: 0}, type: Resource, _id: false })
|
|
resources: Resource
|
|
|
|
public static async initData(configId: number, leagueCode: string, maxMemberCnt: number) {
|
|
const doc = new GVGLeaguePrepareModel();
|
|
const update = Object.assign(doc.toJSON(), { maxMemberCnt });
|
|
delete update._id;
|
|
|
|
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $setOnInsert: update }, { upsert: true, new: true })
|
|
.select({ _id: 0, __v: 0, createdAt: 0, updatedAt: 0 }).lean();
|
|
return result;
|
|
}
|
|
|
|
public static async findByLeague(configId: number, leagueCode: string) {
|
|
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOne({ configId, leagueCode }).lean();
|
|
return result;
|
|
}
|
|
|
|
public static async chooseJob(configId: number, leagueCode: string, job: LEAGUE_JOB) {
|
|
if(job == LEAGUE_JOB.FIGHTER) {
|
|
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $inc: { fighterCnt: 1 } }, { new: true }).lean();
|
|
return result;
|
|
} else {
|
|
const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $inc: { producerCnt: 1 } }, { new: true }).lean();
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|
|
export const GVGLeaguePrepareModel = getModelForClass(GVGLeaguePrepare);
|
|
|
|
export interface GVGLeaguePrepareType extends Pick<DocumentType<GVGLeaguePrepare>, keyof GVGLeaguePrepare> {
|
|
id: number;
|
|
};
|
|
export type GVGLeaguePrepareUpdate = Partial<GVGLeaguePrepareType>; // 将所有字段变成可选项
|