|
|
|
|
@@ -1,36 +1,74 @@
|
|
|
|
|
import BaseModel from './BaseModel';
|
|
|
|
|
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
|
|
|
|
|
import { MARQUEE_TYPE } from '../consts';
|
|
|
|
|
import { index, getModelForClass, prop, DocumentType, modelOptions, ReturnModelType, mongoose } from '@typegoose/typegoose';
|
|
|
|
|
import { MARQUEE_SHOW_TYPE, MARQUEE_TIME_TYPE } from '../consts';
|
|
|
|
|
import { genCode } from '../pubUtils/util';
|
|
|
|
|
import { SearchMarqueeParam } from '../domain/backEndField/search';
|
|
|
|
|
import { nowSeconds } from '../pubUtils/timeUtil';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 跑马灯
|
|
|
|
|
**/
|
|
|
|
|
class Receiver {
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
regionId: number;
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
env: string;
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
serverId: number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@modelOptions({ schemaOptions: { id: false } })
|
|
|
|
|
@index({ code: 1 })
|
|
|
|
|
export default class Marquee extends BaseModel {
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
code: string; // 跑马灯唯一标识
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, type: Number })
|
|
|
|
|
serverIds: number[]; // 推送服务器
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, enum: MARQUEE_TYPE })
|
|
|
|
|
type: MARQUEE_TYPE; // 推送类型
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
startTime: Date; // 活动开始时间
|
|
|
|
|
receiverType: number; // 推送目标
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
endTime: Date; // 活动结束时间
|
|
|
|
|
@prop({ required: true, type: Receiver, _id: false })
|
|
|
|
|
receivers: Receiver[]; // 推送服务器
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
interval: number; // 活动结束时间
|
|
|
|
|
@prop({ required: true, enum: MARQUEE_TIME_TYPE })
|
|
|
|
|
timeType: MARQUEE_TIME_TYPE; // 推送时间类型,立刻/定时
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, enum: MARQUEE_SHOW_TYPE })
|
|
|
|
|
showType: MARQUEE_SHOW_TYPE; // 推送显示类型,一次性/循环
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, default: 0 })
|
|
|
|
|
startTime: number; // 循环开始时间/定时开始时间
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, default: 0 })
|
|
|
|
|
endTime: number; // 循环结束时间
|
|
|
|
|
|
|
|
|
|
@prop({ required: true, default: 0 })
|
|
|
|
|
interval: number; // 推送间隔
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
content: string; // 广播内容
|
|
|
|
|
|
|
|
|
|
@prop({ required: true })
|
|
|
|
|
isRunning: boolean; // 当前正在发布
|
|
|
|
|
@prop({ required: true, default: true })
|
|
|
|
|
isEnable: boolean; // 当前正在发布
|
|
|
|
|
|
|
|
|
|
setByForm(obj: any) {
|
|
|
|
|
this.code = obj.code;
|
|
|
|
|
this.receiverType = obj.receiverType;
|
|
|
|
|
this.receivers = obj.receivers;
|
|
|
|
|
this.timeType = obj.timeType;
|
|
|
|
|
this.showType = obj.showType;
|
|
|
|
|
if(this.timeType == MARQUEE_TIME_TYPE.INSTANT) {
|
|
|
|
|
this.startTime = nowSeconds();
|
|
|
|
|
} else {
|
|
|
|
|
this.startTime = obj.startTime;
|
|
|
|
|
}
|
|
|
|
|
if(this.showType == MARQUEE_SHOW_TYPE.CIRCLE) {
|
|
|
|
|
this.endTime = this.startTime + obj.continueMinute * 60;
|
|
|
|
|
this.interval = obj.interval;
|
|
|
|
|
}
|
|
|
|
|
this.content = obj.content;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建跑马灯
|
|
|
|
|
@@ -38,7 +76,7 @@ export default class Marquee extends BaseModel {
|
|
|
|
|
* @param uid 后台操作人
|
|
|
|
|
*/
|
|
|
|
|
public static async createData(params: MarqueeParam, uid = 1) {
|
|
|
|
|
const code = genCode(10);
|
|
|
|
|
const code = genCode(6);
|
|
|
|
|
const doc = new MarqueeModel();
|
|
|
|
|
const update = Object.assign(doc.toJSON(), params, { code, createdBy: uid, updatedBy: uid });
|
|
|
|
|
const result: MarqueeType = await MarqueeModel.findOneAndUpdate({ code }, { $setOnInsert: update }, { new: true, upsert: true }).lean();
|
|
|
|
|
@@ -69,21 +107,33 @@ export default class Marquee extends BaseModel {
|
|
|
|
|
/**
|
|
|
|
|
* 查询所有生效中的跑马灯
|
|
|
|
|
*/
|
|
|
|
|
public static async findEffectiveMarque() {
|
|
|
|
|
const result: MarqueeType[] = await MarqueeModel.find({ type: MARQUEE_TYPE.SCHEDULE, startTime: { $lte: new Date() }, endTime: { $gte: new Date() } }).lean();
|
|
|
|
|
public static async findEffectiveMarque(env: string) {
|
|
|
|
|
const result: MarqueeType[] = await MarqueeModel.find({
|
|
|
|
|
$or: [
|
|
|
|
|
{ showType: MARQUEE_SHOW_TYPE.CIRCLE, startTime: { $lte: nowSeconds() }, endTime: { $gte: nowSeconds() }},
|
|
|
|
|
{ showType: MARQUEE_SHOW_TYPE.ONCE, startTime: { $lte: nowSeconds() }}
|
|
|
|
|
],
|
|
|
|
|
isEnable: true,
|
|
|
|
|
'receivers.env': env
|
|
|
|
|
}).lean();
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static getSearchObj(form: { type?: number, current?: boolean, content?: string }) {
|
|
|
|
|
private static getSearchObj(form: SearchMarqueeParam) {
|
|
|
|
|
let searchObj = {};
|
|
|
|
|
if(form['type']) searchObj['type'] = form.type;
|
|
|
|
|
if(form['current']) searchObj['isRunning'] = form.current
|
|
|
|
|
if(form['content']) searchObj['content'] = { $regex: new RegExp(form.content.toString(), 'i') };
|
|
|
|
|
if(form.code) searchObj['code'] = form.code;
|
|
|
|
|
if(form.createdBy) searchObj['createdBy'] = form.createdBy
|
|
|
|
|
if(form.createTimeStart && form.createTimeEnd) {
|
|
|
|
|
searchObj['createdAt'] = { $gt: new Date(form.createTimeStart * 1000), $lt: new Date(form.createTimeEnd * 1000) };
|
|
|
|
|
}
|
|
|
|
|
if(form.sendTimeStart && form.sendTimeEnd) {
|
|
|
|
|
searchObj['startTime'] = { $gt: form.sendTimeStart, $lt: form.sendTimeEnd }
|
|
|
|
|
}
|
|
|
|
|
return searchObj
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: { type?: number, current?: boolean, content?: string } = {}) {
|
|
|
|
|
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchMarqueeParam = {}) {
|
|
|
|
|
|
|
|
|
|
let searchObj = this.getSearchObj(form);
|
|
|
|
|
let sort = {};
|
|
|
|
|
@@ -94,12 +144,12 @@ export default class Marquee extends BaseModel {
|
|
|
|
|
sort[sortField] = -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const result: MarqueeType[] = await MarqueeModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).select('+sort +showStartTime +showEndTime +serverType +isEnable').lean({ getters: true, virtuals: true });
|
|
|
|
|
const result: MarqueeType[] = await MarqueeModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static async countByCondition(form: { type?: number, current?: boolean, content?: string } = {}) {
|
|
|
|
|
public static async countByCondition(form: SearchMarqueeParam = {}) {
|
|
|
|
|
|
|
|
|
|
let searchObj = this.getSearchObj(form);
|
|
|
|
|
const result = await MarqueeModel.count(searchObj);
|
|
|
|
|
@@ -108,7 +158,12 @@ export default class Marquee extends BaseModel {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const MarqueeModel = getModelForClass(Marquee);
|
|
|
|
|
export let MarqueeModel: ReturnModelType<typeof Marquee, {}>;
|
|
|
|
|
export function loadMarqueeModel(connect: mongoose.Connection) {
|
|
|
|
|
MarqueeModel = getModelForClass(Marquee, {
|
|
|
|
|
existingConnection: connect
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface MarqueeType extends Pick<DocumentType<Marquee>, keyof Marquee> {};
|
|
|
|
|
export type MarqueeParam = Partial<MarqueeType>;
|
|
|
|
|
|