Files
ZYZ/shared/db/UserTaskRec.ts
2021-04-20 17:52:50 +08:00

110 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
import { TASK_FUN_TYPE } from '../consts';
import { genCode } from '../pubUtils/util';
import { getTodayZeroDate } from '../pubUtils/timeUtil';
/**
* 玩家购买商店记录表,每个商品一条,每次刷新新建一条
**/
@modelOptions({ schemaOptions: { id: false } })
@index({ roleId: 1, itemId: 1 })
export default class UserTaskRec extends BaseModel {
@prop({ required: true })
code: string; // 该记录唯一标识
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true, enum: TASK_FUN_TYPE })
type: number; // 任务类型
@prop({ required: true })
id: number; // 任务id任务表内id
@prop({ required: true })
taskType: number; // 行为类型
@prop({ required: true })
group: number; // 行为类型下的分组
@prop({ required: true })
count: number; // 达成次数
@prop({ required: true, type: Number, default: [] })
received: number[]; // 是否已领取
private static getRefreshCondition(type: number) {
let today = getTodayZeroDate(5);
if(type == TASK_FUN_TYPE.DAILY) {
return { type, createdAt: { $gte: today } };
} else {
return { type };
}
}
public static async setTaskRec(roleId: string, type: number, taskType: number, group: number, count: number) {
let condition = this.getRefreshCondition(type);
let rec: UserTaskRecType = await UserTaskRecModel.findOneAndUpdate({ roleId, group, taskType, ...condition }, { $setOnInsert: { code: genCode(8), received: [] }, $set: { count } }, { new: true, upsert: true }).lean();
return rec;
}
public static async incTaskRec(roleId: string, type: number, taskType: number, group: number, count: number) {
let condition = this.getRefreshCondition(type);
let rec: UserTaskRecType = await UserTaskRecModel.findOneAndUpdate({ roleId, group, taskType, ...condition }, { $setOnInsert: { code: genCode(8), received: [] }, $inc: { count } }, { new: true, upsert: true }).lean();
return rec;
}
public static async checkHistoryAndSetTaskRec(roleId: string, type: number, taskType: number, group: number, count: number) {
let rec: UserTaskRecType = await UserTaskRecModel.findByRoleAndGroup(roleId, type, group, taskType);
if(rec) {
if(rec.count < count) {
rec = await UserTaskRecModel.setTaskRec(roleId, type, taskType, group, count);
}
} else {
rec = await UserTaskRecModel.setTaskRec(roleId, type, taskType, group, count);
}
return rec;
}
public static async findByRoleAndType(roleId: string, type: number) {
let condition = this.getRefreshCondition(type);
let rec: UserTaskRecType[] = await UserTaskRecModel.find({ roleId, ...condition }).lean();
let map = new Map<number, Map<number, UserTaskRecType>>(); // taskType => group => userTask
for(let userTaskRec of rec) {
let { taskType, group } = userTaskRec;
if(!map.has(taskType)) {
map.set(taskType, new Map<number, UserTaskRecType>());
}
map.get(taskType).set(group, userTaskRec);
}
return map;
}
public static async findByRoleAndGroup(roleId: string, type: number, taskType: number, group: number) {
let condition = this.getRefreshCondition(type);
let rec: UserTaskRecType = await UserTaskRecModel.findOne({ roleId, taskType, group, ...condition }).lean();
return rec;
}
public static async receiveTask(roleId: string, type: number, taskType: number, group: number, id: number) {
let condition = this.getRefreshCondition(type);
let rec: UserTaskRecType = await UserTaskRecModel.findOneAndUpdate({ roleId, taskType, group, ...condition }, { $push: { received: id } }, { new: true }).lean();
return rec;
}
public static async getReceiveRec(roleId: string, type: number) {
let condition = this.getRefreshCondition(type);
let rec = await UserTaskRecModel.find({ roleId, ...condition }).lean();
console.log(JSON.stringify(rec))
return rec
}
}
export const UserTaskRecModel = getModelForClass(UserTaskRec);
export interface UserTaskRecType extends Pick<DocumentType<UserTaskRec>, keyof UserTaskRec> { }
export type UserTaskRecParam = Partial<UserTaskRecType>;