Files
ZYZ/shared/db/Activity.ts
2022-07-30 17:21:58 +08:00

205 lines
8.3 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, ReturnModelType, mongoose } from '@typegoose/typegoose';
import { CounterAllModal } from './CounterAll';
import { COUNTER } from '../consts';
import { ActivityGroupModel } from './ActivityGroup';
import { UpdateActivityParam } from '../domain/backEndField/params';
/**
* 活动系统
*/
@index({ activityId: 1 })
export default class Activity extends BaseModel {
@prop({ required: true })
groupId: number; // 组Id
@prop({ required: true })
activityId: number; // 活动Id
@prop({ required: true })
beginTime: Date; // 开启时间 timeType=3
@prop({ required: true })
endTime: Date; // 结束时间 timeType=3
@prop({ required: true })
type: number; // 活动类型
@prop({ required: true })
data: string; // 活动表中的数据
@prop({ required: true })
name: string; // 活动名
@prop({ required: true })
timeType: number; // 活动时间类型 ACTIVITY_TIME_TYPE 1.服务器开启时间 2.角色创建时间 3.指定开启时间(beginTime,endTime)
@prop({ required: true })
days: number; // 活动持续天数 timeType=1、2
@prop({ required: true })
effectDay: number; // 循环中显示的天数
@prop({ required: true })
delayDay: number; // 迟几天开启活动0表示按照规定时间开启
@prop({ required: true })
interval: number; // 周期性活动时间间隔,天
@prop({ required: true })
hideDayByServer: number; // 开服后几天内该活动不可见
@prop({ required: true })
isEnable: boolean; // 该活动是否有效
// 获取正在开启和即将到来的活动列表
public static async findOpenAndComingActivityes() {
let result: ActivityModelType[] = await ActivityModel.find({ isEnable: true }).lean();
return result;
}
//根据活动类型查询开启的活动数据
public static async findOpenActivityByType(activityGroupId: number[], type: number) {
let result: ActivityModelType[] = await ActivityModel.find(
{ groupId: { $in: activityGroupId }, type, isEnable: true }
).sort({ activityId: -1 }).lean(true);
return result;
}
//根据活动类型查询开启的活动数据
public static async findOpenActivityByTypes(activityGroupId: number[], types: number[]) {
let result: ActivityModelType[] = await ActivityModel.find(
{ groupId: { $in: activityGroupId }, type: { $in: types }, isEnable: true }
).sort({ activityId: -1 }).lean(true);
return result;
}
public static async findOpenActivityByGroupId(activityGroupId: number[]) {
let result: ActivityModelType[] = await ActivityModel.find(
{ groupId: { $in: activityGroupId }, isEnable: true }
).sort({ activityId: -1 }).lean(true);
return result;
}
//根据活动类型查询活动数据
public static async findActivityByType(type: number) {
let result: ActivityModelType[] = await ActivityModel.find({ type }).lean(true);
return result;
}
//debug测试用接口
public static async debugFindActivityByType(type: number) {
let result: ActivityModelType[] = await ActivityModel.findOne({ type }).lean(true);
return result;
}
//根据活动id查询活动数据
public static async findActivity(activityId: number) {
let result: ActivityModelType = await ActivityModel.findOne({ activityId }).lean(true);
return result;
}
//新增活动
public static async updateActivity(aids: number[], param: UpdateActivityParam, uid = 1) {
let result: ActivityModelType[] = [];
let newAids = [];
for (let activityId of aids) {
if (!activityId) activityId = await CounterAllModal.getNewCounter(COUNTER.ACTIVITY);
newAids.push(activityId);
if (!param.beginTime) {
delete param["beginTime"];
}
if (!param.endTime) {
delete param["endTime"];
}
let rec: ActivityModelType = await ActivityModel.findOneAndUpdate({ activityId }, { $set: { ...param, updatedBy: uid }, $setOnInsert: { isEnable: true, createdBy: uid } },
{ new: true, upsert: true }).lean(true);
result.push(rec);
}
if (param.groupId != undefined) {
let groupId = param.groupId;
if (param.groupId == 0) {
let newGroup = await ActivityGroupModel.createGroup(uid);
groupId = newGroup.groupId;
}
await ActivityGroupModel.addActivitiesToGroupData(groupId, newAids, uid);
}
return result;
}
public static async setEnable(activityId: number, isEnable: boolean, uid = 1) {
let result = await ActivityModel.findOneAndUpdate({ activityId }, { $set: { isEnable, uid } }, { new: true }).lean();
return result;
}
//删除活动
public static async deleteActivity(activityId: number, uid = 1) {
let result = await ActivityModel.deleteMany({ activityId });
await ActivityGroupModel.pullByActivityIds([activityId], uid);
return result;
}
public static async findAllActivities() {
let all: ActivityModelType[] = [];
let createdAt;
for(let i = 0; i < 9999; i++) { // 防死循环
let condition = {};
if(createdAt) condition['createdAt'] = { $gt: createdAt }
let cur: ActivityModelType[] = await ActivityModel.find(condition).limit(1000).sort({ createdAt: 1 }).lean();
if(cur.length == 0) break;
createdAt = cur[cur.length - 1].createdAt;
all.push(...cur);
}
return all;
}
//查询
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', type: number = 0, groupId: number = 0, current: boolean = false, activityId: number = 0) {
let searchObj = {};
if (type != 0) searchObj['type'] = type;
if (groupId != 0) searchObj['groupId'] = groupId;
if (activityId != 0) searchObj['activityId'] = activityId;
if (current) {
searchObj['beginTime'] = { $lte: new Date };
searchObj['endTime'] = { $gte: new Date };
}
let sort = {};
if (sortField && sortOrder) {
if (sortOrder == 'ascend') {
sort[sortField] = 1;
} else if (sortOrder == 'descend') {
sort[sortField] = -1;
}
}
const result: ActivityModelType[] = await ActivityModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean();
return result;
}
// 获得活动数量
public static async countByCondition(type: number = 0, groupId: number = 0, current: boolean = false, activityId: number = 0) {
let searchObj = {};
if (type != 0) searchObj['type'] = type;
if (groupId != 0) searchObj['groupId'] = groupId;
if (activityId != 0) searchObj['activityId'] = activityId;
if (current) {
searchObj['beginTime'] = { $lte: new Date };
searchObj['endTime'] = { $gte: new Date };
}
const result = await ActivityModel.count(searchObj);
return result;
}
//根据多个活动id查询活动数据
public static async findActivityByIds(activityIds: number[]) {
let result: ActivityModelType[] = await ActivityModel.find({ activityId: { $in: activityIds } }).lean();
return result;
}
public static async updateGroupId(activityIds: number[], groupId: number, uid = 1) {
let result = await ActivityModel.updateMany({ activityId: { $in: activityIds } }, { $set: { groupId, updatedBy: uid }, $setOnInsert: { createdBy: uid } });
return result;
}
}
export let ActivityModel: ReturnModelType<typeof Activity, {}>;
export function loadActivity(connect: mongoose.Connection) {
ActivityModel = getModelForClass(Activity, {
existingConnection: connect
});
}
export interface ActivityModelType extends Pick<DocumentType<Activity>, keyof Activity> { }
export type ActivityModelTypeParam = Partial<ActivityModelType>; // 将所有字段变成可选项