119 lines
4.9 KiB
TypeScript
119 lines
4.9 KiB
TypeScript
import BaseModel from './BaseModel';
|
||
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
|
||
class Reward {
|
||
@prop({ required: true })
|
||
id: number;
|
||
@prop({ required: true })
|
||
count: number;
|
||
}
|
||
|
||
class TrainBox {
|
||
@prop({ required: true })
|
||
roleId: string;
|
||
@prop({ required: true, type: Reward })
|
||
good: Reward;
|
||
@prop({ required: true })
|
||
index: number;
|
||
}
|
||
|
||
class TrainScript {
|
||
@prop({ required: true })
|
||
hid: number;
|
||
@prop({ required: true })
|
||
progress: number;
|
||
@prop({ required: true })
|
||
time: number;
|
||
@prop({ required: true, default: [], type: TrainBox})
|
||
trainBoxs: Array<TrainBox>;
|
||
}
|
||
|
||
class Rank {
|
||
@prop({ required: true })
|
||
roleId: string;
|
||
@prop({ required: true })
|
||
score: number;
|
||
}
|
||
|
||
class Report {
|
||
@prop({ required: true })
|
||
roleId: string;
|
||
@prop({ required: true })
|
||
trainId: number;//挑战的试炼关
|
||
@prop({ required: true })
|
||
hid: number;//据点
|
||
@prop({ required: true })
|
||
score: number;
|
||
@prop({ required: true })
|
||
time: number;
|
||
@prop({ required: true })
|
||
isSuccessed: boolean;
|
||
@prop({ required: true })
|
||
type: number;//1表示普通战报, 2表示系统战报即:被成功压制
|
||
}
|
||
@index({guildCode:1, trainId:1})
|
||
export default class GuildTrain extends BaseModel {
|
||
@prop({ required: true })
|
||
guildCode: string;
|
||
@prop({ required: true })
|
||
trainId: number;
|
||
@prop({ required: true })
|
||
isComplete: boolean;
|
||
@prop({ required: true, default: [], type: TrainScript})
|
||
trainScripts: Array<TrainScript>;
|
||
@prop({ required: true, default: [], type: Rank })
|
||
ranks: Array<Rank>;
|
||
@prop({ required: true, default: [], type: Report })
|
||
reports: Array<Report>;
|
||
@prop({ required: true, default: false})
|
||
locked: boolean;
|
||
|
||
public static async findGuildTrain(guildCode: string, select?: string, locked = false, lean = true) {
|
||
const guildTrains: GuildTrainType[] = await GuildTrainModel.find({ guildCode, locked }).select(select).lean(lean);
|
||
return guildTrains;
|
||
}
|
||
|
||
public static async findGuildTrainByTrainIds(guildCode: string, trainIds:Array<number>, locked = false, lean = true) {
|
||
const guildTrains: GuildTrainType[] = await GuildTrainModel.find({ trainId:{ $in:trainIds}, guildCode, locked }).lean(lean);
|
||
return guildTrains;
|
||
}
|
||
|
||
public static async findTrainByTrainIdNotLock(guildCode: string, trainId: number, select?: string, locked = false, lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked }).select(select).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
|
||
public static async updateGuildTrain(guildCode: string, trainId: number, update: GuildTrainTypeParam, lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId}, { $set: update }).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
|
||
public static async updateGuildTrainProgress(guildCode: string, trainId: number, hid:number, progress: number, ranks:Array<Rank>, reports: Array<Report>, isComplete: boolean,lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, 'trainScripts.hid':hid},
|
||
{ $set: {'trainScripts.$.progress': progress, ranks, reports, isComplete} }).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
|
||
public static async openGuildTrain(guildCode: string, trainId: number, trainScripts: Array<TrainScript>, lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId },{ trainId, reports: [], locked: false, ranks: [], trainScripts, isComplete: false, guildCode}, {new: true, upsert: true}).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
|
||
public static async findTrainScriptBoxByIndex(guildCode: string, roleId: string, trainId: number, hid: number, index: number, progress: number, time, locked = false, lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked, 'trainScripts.hid': hid,
|
||
'trainScripts.index':{$ne:index },'trainScripts.roleId':{$ne:roleId }, progress: {$gte: progress}, time:{$gte: time}}).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
|
||
public static async receiveBoxByIndex(guildCode: string, roleId: string, trainId: number, hid: number, index: number, good: Reward, locked = false, lean = true) {
|
||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, locked, 'trainScripts.hid': hid, },
|
||
{ $push:{ 'trainScripts.$.trainBoxs': {roleId, index, good} }} ).lean(lean);
|
||
return guildTrain;
|
||
}
|
||
}
|
||
|
||
|
||
export const GuildTrainModel = getModelForClass(GuildTrain);
|
||
|
||
export interface GuildTrainType extends Pick<DocumentType<GuildTrain>, keyof GuildTrain> { };
|
||
export type GuildTrainTypeParam = Partial<GuildTrainType>; // 将所有字段变成可选项
|