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