Files
ZYZ/shared/db/GiftCodeDetail.ts
2021-12-10 17:36:01 +08:00

93 lines
3.2 KiB
TypeScript

import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
import { GIFT_GENERATE_TYPE } from '../consts';
import { GiftCodeModel, GiftCodeType } from './GiftCode';
import { nowSeconds } from '../pubUtils/timeUtil';
import { genCode } from '@pubUtils/util';
class RoleRecord {
@prop({ required: true, default: '' })
roleId: string;
@prop({ required: true, default: '' })
roleName: string;
@prop({ required: true, default: 0 })
serverId: number;
@prop({ required: true, default: 0 })
time: number;
}
/**
* 举报记录
**/
@modelOptions({ schemaOptions: { id: false } })
@index({ code: 1 })
export default class GiftCodeDetail extends BaseModel {
@prop({ required: true, default: '' })
giftId: number; // giftCode表的id
@prop({ required: true, default: '' })
giftName: string; // giftCode表的name
@prop({ required: true, default: 0, enum: GIFT_GENERATE_TYPE })
generateType: GIFT_GENERATE_TYPE; // 一人一码or通码
@prop({ required: true, default: '' })
code: string; // 兑换码
@prop({ required: true, default: '' })
usedNum: number; // 该码使用次数
@prop({ required: true, type: String })
roleIds: string[];
@prop({ required: true, type: RoleRecord, _id: false })
record: RoleRecord[];
// 根据code
public static async findByCode(code: string) {
let result: GiftCodeDetailType = await GiftCodeDetailModel.findOne({ code }).populate('giftCode').lean(true);
return result;
}
public static async findAllCodeByGiftId(id: number, cnt: number) {
let n = Math.ceil(cnt/1000);
let result: GiftCodeDetailType[] = [];
for(let i = 0; i < n; i++) {
let codes = await GiftCodeDetailModel.find({ giftId: id }).limit(1000).skip(i * 1000).sort({ _id: 1 }).lean();
result.push(...codes);
}
return result;
}
public static async increaseUsedNum(code: string, roleId: string, roleName: string, serverId: number) {
let result: GiftCodeDetailType = await GiftCodeDetailModel.findOneAndUpdate({ code }, {
$inc: { usedNum: 1 }, $push: { roleIds: roleId, record: { roleId, roleName, serverId, time: nowSeconds() } }
}, { new: true }).lean();
return result;
}
public static async generateMany(giftCode: GiftCodeType, count = 1, uid = 1) {
let insertArr: GiftCodeDetailParam[] = [];
for(let i = 0; i < count; i++) {
insertArr.push({
giftId: giftCode.id, giftName: giftCode.name, generateType: giftCode.generateType,
code: genCode(giftCode.codeLen), usedNum: 0, createdBy: uid, updatedBy: uid
});
}
let result = await GiftCodeDetailModel.insertMany(insertArr);
await GiftCodeModel.increateGenerateNum(giftCode.id, count);
return result;
}
}
export const GiftCodeDetailModel = getModelForClass(GiftCodeDetail);
export interface GiftCodeDetailType extends Pick<DocumentType<GiftCodeDetail>, keyof GiftCodeDetail> { }
export type GiftCodeDetailParam = Partial<GiftCodeDetailType>;