Files
ZYZ/shared/db/FriendPoint.ts
2021-05-08 19:13:44 +08:00

64 lines
2.9 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 } from '@typegoose/typegoose';
import { getZeroPointD } from '../pubUtils/timeUtil';
/**
* 情谊点记录
*/
@index({ roleId: 1, createdAt: -1 })
export default class FriendPoint extends BaseModel {
@prop({ required: true, default: '' })
roleId: string; // 角色 id
@prop({ required: true, default: '' })
roleName: string; // 角色名称
@prop({ required: true, default: 0 })
cnt: number; // 当天获取的点数
@prop({ required: true, default: 0 })
sendCnt: number; // 当天赠送的点数
@prop({ required: true, default: 0 })
type: number; // 情谊点统计的类型,不同功能都可能有每日获取上限
/**
* @description 更新每天的情谊点获取情况cnt 有可能超过当日最大值,可根据返回值判断
* @static
* @param {string} roleId 用户 Id
* @param {string} roleName 用户名
* @param {number} cntInc 增长数量
* @param {number} maxPerDay 每日最大数量
* @param {boolean} [lean=true]
* @memberof FriendPoint
*/
public static async updatePointToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, type: number, lean = true) {
const curTime = getZeroPointD();
// 当 oldCnt + cntInc > maxPerDay 时需计算实际可以获得的点数cntInc - (newCnt - maxPerDay)
const rec: FriendPointType = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, cnt: {$lt: maxPerDay}, type}, {$inc: {cnt: cntInc, sendCnt: 0}}, {upsert: true, new: true}).lean(lean);
return rec;
}
public static async updateSendCntToday(roleId: string, roleName: string, cntInc: number, maxPerDay: number, type: number, lean = true) {
const curTime = getZeroPointD();
// 当 oldCnt + cntInc > maxPerDay 时需计算实际可以获得的点数cntInc - (newCnt - maxPerDay)
const rec: FriendPointType = await FriendPointModel.findOneAndUpdate({roleId, roleName, createdAt: {$gte: curTime}, sendCnt: {$lt: maxPerDay}, type}, {$inc: {sendCnt: cntInc, cnt: 0}}, {upsert: true, new: true}).lean(lean);
return rec;
}
/**
* @description 某个类型当天情谊点获取情况
* @static
* @param {string} roleId 用户 Id
* @param {number} type 掉落情谊点的功能类型 FRIEND_DROP_TYPE
* @param {boolean} [lean=true]
* @returns
* @memberof FriendPoint
*/
public static async getFrdPointRecToday(roleId: string, type: number, lean = true) {
const curTime = getZeroPointD();
const rec: FriendPointType = await FriendPointModel.findOne({roleId, createdAt: {$gte: curTime}, type}).lean(lean);
return rec;
}
}
export const FriendPointModel = getModelForClass(FriendPoint);
export interface FriendPointType extends Pick<DocumentType<FriendPoint>, keyof FriendPoint>{};