import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; /** * 小游戏记录 */ @index({ roleId: 1, activityId: 1 }) @index({ score: -1 }) export default class Activity_MiniGame extends BaseModel { @prop({ required: true }) serverId: number; // 服Id @prop({ required: true }) activityId: number; // 活动Id @prop({ required: true }) roundIndex: number; // 第几轮 @prop({ required: true }) nextRefreshTime: number; // 活动结束时间 @prop({ required: true }) roleId: string; // 用户Id @prop({ required: true }) buyCnt: number; // 小游戏购买次数 @prop({ required: true, type: Number }) receivedBox: number[]; // 领取宝箱 @prop({ required: true }) score: number; // 积分 public static async findData(serverId: number, activityId: number, roundIndex: number, roleId: string) { let result: ActivityMiniGameModelType = await ActivityMiniGameModel.findOne({ serverId, roleId, activityId, roundIndex }).lean(); return result; } public static async incScore(serverId: number, activityId: number, roundIndex: number, roleId: string, score: number, nextRefreshTime: number) { let result: ActivityMiniGameModelType = await ActivityMiniGameModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $inc: { score }, $setOnInsert: { buyCnt: 0, receivedBox: [] }, $set: { nextRefreshTime } }, { new: true, upsert: true }).lean(); return result; } public static async buyCnt(serverId: number, activityId: number, roundIndex: number, roleId: string, count: number, nextRefreshTime: number) { let result: ActivityMiniGameModelType = await ActivityMiniGameModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex }, { $inc: { buyCnt: count }, $setOnInsert: { score: 0, receivedBox: [] }, $set: { nextRefreshTime } }, { new: true, upsert: true }).lean(); return result; } public static async receiveBox(serverId: number, activityId: number, roundIndex: number, roleId: string, boxId: number) { let result: ActivityMiniGameModelType = await ActivityMiniGameModel.findOneAndUpdate({ serverId, roleId, activityId, roundIndex, receivedBox: { $ne: boxId } }, { $push: { receivedBox: boxId } }, { new: true }).lean(); return result; } public static async findRank() { let result: { _id: { activityId: number, roundIndex: number }, roleIds: string[], arr: { roleId: string, score: number, updatedAt: Date }[] }[] = await ActivityMiniGameModel.aggregate([ { $match: { nextRefreshTime: { $gt: Date.now() } } }, { $group: { _id: { activityId: '$activityId', roundIndex: '$roundIndex' }, roleIds: { $push: '$roleId' }, arr: { $push: { roleId: '$roleId', score: '$score', updatedAt: '$updatedAt' } } } } ]); return result } } export const ActivityMiniGameModel = getModelForClass(Activity_MiniGame); export interface ActivityMiniGameModelType extends Pick, keyof Activity_MiniGame> { } export type ActivityMiniGameModelTypeParam = Partial; // 将所有字段变成可选项