import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose'; import { gameData } from '../pubUtils/data'; @index({ roleId: 1, id: 1 }) @index({ seqId: 1 }) @modelOptions({ schemaOptions: { id: false } }) export default class Skin extends BaseModel { @prop({ required: true, default: '' }) roleId: string; // 角色 id @prop({ required: true, default: '' }) roleName: string; // 角色名称 @prop({ required: true, default: '' }) id: number; // 皮肤id,fashions表的goodId字段 @prop({ required: true, default: '' }) skinId: number; // fashions表的heroId字段 @prop({ required: true, default: '', select: false}) skinName: string; // 皮肤名称 @prop({ required: true, default: 0 }) hid: number; // 原始武将id public static async findbyRole(roleId: string, select = '') { const rec: SkinType[] = await SkinModel.find({ roleId }).select(select).lean(); return rec; } public static async findbyRoleAndHid(roleId: string, hid: number) { const rec: SkinType[] = await SkinModel.find({ roleId, hid }).select('id skinId').lean(); return rec; } public static getInitInfo(hid: number): SkinUpdate { let dicHero = gameData.hero.get(hid); let dicFashion = gameData.fashion.get(dicHero.initialSkin) const doc = new SkinModel(); const update = { ...doc.toJSON(), id: dicFashion.id, skinId: dicFashion.heroId, skinName: dicFashion.name, hid}; delete update._id; return update } public static async insertSkins(roleId: string, roleName: string, skinInfos: SkinUpdate[]) { let insertInfos: SkinUpdate[] = []; for(let skinInfo of skinInfos) { insertInfos.push({ ...skinInfo, roleId, roleName }); } const items: SkinType[] = await SkinModel.insertMany(insertInfos); return items; } public static async increaseSkin(roleId: string, id: number, info: { roleId: string, roleName: string, id: number, skinName: string, hid: number, skinId: number }, lean = true) { const doc = new SkinModel(); const setOnInsert = Object.assign(doc.toJSON(), info); const items: SkinType = await SkinModel.findOneAndUpdate({ roleId, id }, { $setOnInsert: setOnInsert }, { new: true, upsert: true }).lean(lean); return items; } public static async deleteByHero(roleId: string, hid: number) { const rec: SkinType[] = await SkinModel.deleteMany({ roleId, hid }).lean(); return rec; } } export const SkinModel = getModelForClass(Skin); export interface SkinType extends Pick, keyof Skin> { id: number; }; export type SkinUpdate = Partial; // 将所有字段变成可选项