Files
ZYZ/shared/db/RougelikeCard.ts
T

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>; // 将所有字段变成可选项