89 lines
3.5 KiB
TypeScript
89 lines
3.5 KiB
TypeScript
import BaseModel from './BaseModel';
|
||
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
|
||
|
||
|
||
|
||
/**
|
||
* 每场获得的圣物&特性卡
|
||
*/
|
||
@index({ roleId: 1 })
|
||
@index({ gameCode: 1 })
|
||
@index({ gameCode: 1, cardCode: 1 })
|
||
@index({ gameCode: 1, type: 1 })
|
||
|
||
|
||
export default class RougelikeCard extends BaseModel {
|
||
@prop({ required: true })
|
||
roleId: string; // 角色id
|
||
|
||
@prop({ required: true, default: '' })
|
||
gameCode: string; // 场次唯一code
|
||
|
||
@prop({ required: true, default: '' })
|
||
cardCode: string; // 卡唯一code
|
||
|
||
@prop({ required: true, default: 0 })
|
||
cardId: number; // 卡id
|
||
|
||
@prop({ required: true, default: 0 })
|
||
type: number; // 卡类型
|
||
|
||
@prop({ required: true, default: 0 })
|
||
charaId: number; // 装备在哪个角色上,没有装备为0
|
||
|
||
@prop({ required: true, default: 0 })
|
||
lv: number; // 特性卡的等级
|
||
|
||
@prop({ required: true, default: 0 })
|
||
getLayer: number; // 在哪一层获得的
|
||
|
||
@prop({ required: true, default: 0 })
|
||
getWay: number; // 在做什么的时候获得的
|
||
|
||
@prop({ required: true, default: 0 })
|
||
useCount?: number // 可使用次数
|
||
|
||
|
||
public static async updateByCode(gameCode: string, cardCode: string, params: { $set?: RougelikeCardPara, $inc?: { lv?: number, useCount?: number } }, lean = true) {
|
||
const result: RougelikeCardType = await RougelikeCardModel.findOneAndUpdate({ gameCode, cardCode }, params, { new: true, upsert: true }).lean(lean);
|
||
return result;
|
||
}
|
||
|
||
public static async findByGameCode(gameCode: string, lean = true) {
|
||
const result: RougelikeCardType[] = await RougelikeCardModel.find({ gameCode }).lean(lean);
|
||
return result;
|
||
}
|
||
|
||
public static async findByCode(gameCode: string, cardCode: string, lean = true) {
|
||
const result: RougelikeCardType = await RougelikeCardModel.findOne({ gameCode, cardCode }).lean(lean);
|
||
return result;
|
||
}
|
||
|
||
public static async findByGameCodeAndType(gameCode: string, type: number, lean = true) {
|
||
const result: RougelikeCardType[] = await RougelikeCardModel.find({ gameCode, type: { $eq: type }, }).lean(lean);
|
||
return result;
|
||
|
||
}
|
||
|
||
public static async findByGameCodeAndCardCodes(gameCode: string, cardCodes: string[], lean = true) {
|
||
const result: RougelikeCardType[] = await RougelikeCardModel.find({ gameCode, cardCode: { $in: cardCodes } }).lean(lean);
|
||
return result;
|
||
}
|
||
|
||
// public static async bulkWriteUpdate(updateArr: { gameCode: string, cardCode: string, charaId: number }[]) {
|
||
// if (updateArr.length == 0) return;
|
||
// await RougelikeCardModel.bulkWrite(updateArr.map(({ gameCode, cardCode, charaId }) => {
|
||
// return { updateOne: { filter: { gameCode, cardCode }, update: { $set: { charaId } }, upsert: true } }
|
||
// }))
|
||
// }
|
||
public static async bulkWriteUpdate(updateArr: RougelikeCardPara[]) {
|
||
if (updateArr.length == 0) return;
|
||
await RougelikeCardModel.bulkWrite(updateArr.map((param) => {
|
||
const { gameCode, cardCode } = param
|
||
return { updateOne: { filter: { gameCode, cardCode }, update: { $set: { ...param } }, upsert: true } }
|
||
}))
|
||
}
|
||
};
|
||
export const RougelikeCardModel = getModelForClass(RougelikeCard);
|
||
export interface RougelikeCardType extends Pick<DocumentType<RougelikeCard>, keyof RougelikeCard> { };
|
||
export type RougelikeCardPara = Partial<RougelikeCardType>; // 将所有字段变成可选项
|