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, keyof GVGLeaguePrepare> { id: number; }; export type GVGLeaguePrepareUpdate = Partial; // 将所有字段变成可选项