Files
certd/packages/ui/certd-server/src/modules/auto/auto-c-register-cron.ts
T

203 lines
6.8 KiB
TypeScript
Raw Normal View History

2025-07-18 18:18:01 +08:00
import {Autoload, Config, Init, Inject, Scope, ScopeEnum} from '@midwayjs/core';
import {PipelineService} from '../pipeline/service/pipeline-service.js';
import {logger} from '@certd/basic';
2025-06-10 10:21:09 +08:00
import {SysSettingsService, SysSiteInfo} from '@certd/lib-server';
2025-07-18 18:18:01 +08:00
import {SiteInfoService} from '../monitor/index.js';
import {Cron} from '../cron/cron.js';
import {UserSettingsService} from "../mine/service/user-settings-service.js";
import {UserSiteMonitorSetting} from "../mine/service/models.js";
2025-06-10 10:21:09 +08:00
import {getPlusInfo} from "@certd/plus-core";
import dayjs from "dayjs";
import {NotificationService} from "../pipeline/service/notification-service.js";
import {UserService} from "../sys/authority/service/user-service.js";
2025-07-18 18:18:01 +08:00
import {Between} from "typeorm";
2023-01-29 13:44:19 +08:00
@Autoload()
@Scope(ScopeEnum.Request, { allowDowngrade: true })
2024-12-23 23:33:13 +08:00
export class AutoCRegisterCron {
2023-01-29 13:44:19 +08:00
@Inject()
pipelineService: PipelineService;
2024-08-13 20:30:42 +08:00
@Config('cron.onlyAdminUser')
private onlyAdminUser: boolean;
@Config('cron.immediateTriggerOnce')
private immediateTriggerOnce = false;
2023-01-29 13:44:19 +08:00
@Config('cron.immediateTriggerSiteMonitor')
private immediateTriggerSiteMonitor = false;
2024-09-20 15:15:24 +08:00
@Inject()
sysSettingsService: SysSettingsService;
@Inject()
userSettingsService: UserSettingsService;
2024-09-20 15:15:24 +08:00
@Inject()
siteInfoService: SiteInfoService;
@Inject()
cron: Cron;
2025-06-10 10:21:09 +08:00
@Inject()
notificationService: NotificationService;
@Inject()
userService: UserService;
2023-01-29 13:44:19 +08:00
@Init()
async init() {
logger.info('加载定时trigger开始');
2024-08-13 20:30:42 +08:00
await this.pipelineService.onStartup(this.immediateTriggerOnce, this.onlyAdminUser);
2024-09-19 17:38:51 +08:00
logger.info('加载定时trigger完成');
2023-01-29 13:44:19 +08:00
//
// const meta = getClassMetadata(CLASS_KEY, this.echoPlugin);
// console.log('meta', meta);
// const metas = listPropertyDataFromClass(CLASS_KEY, this.echoPlugin);
// console.log('metas', metas);
await this.registerSiteMonitorCron();
2025-06-10 10:21:09 +08:00
await this.registerPlusExpireCheckCron();
2025-07-18 18:18:01 +08:00
await this.registerUserExpireCheckCron()
}
async registerSiteMonitorCron() {
//先注册公共job
await this.siteInfoService.registerSiteMonitorJob()
//注册用户独立的检查时间
const monitorSettingList = await this.userSettingsService.list({
query:{
key: UserSiteMonitorSetting.__key__,
}
})
for (const item of monitorSettingList) {
const setting = item.setting ? JSON.parse(item.setting):{}
if(!setting?.cron){
continue
}
await this.siteInfoService.registerSiteMonitorJob(item.userId)
}
if (this.immediateTriggerSiteMonitor) {
logger.info(`立即触发一次站点证书检查任务`)
await this.siteInfoService.triggerJobOnce()
}
2023-01-29 13:44:19 +08:00
}
2025-06-10 10:21:09 +08:00
registerPlusExpireCheckCron(){
// 添加plus即将到期检查任务
this.cron.register({
name: 'plus-expire-check',
2025-06-10 10:52:58 +08:00
cron: `0 10 9 * * *`, // 一天只能检查一次,否则会重复发送通知
2025-06-10 10:21:09 +08:00
job: async () => {
const plusInfo = getPlusInfo()
if (!plusInfo.originVipType || plusInfo.originVipType==="free" ) {
return
}
let label ="专业版"
if( plusInfo.originVipType === 'comm'){
label = "商业版"
}
const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo)
const appTitle = siteInfo.title || "certd"
const expiresDate = dayjs(plusInfo.expireTime).format("YYYY-MM-DD")
// plusInfo.expireTime= dayjs("2025-06-10").valueOf()
let expiresDays =Math.floor((plusInfo.expireTime - new Date().getTime())/ 1000 / 60 / 60 / 24)
let title = ""
let content =""
if(expiresDays === 20 ||expiresDays === 10 || expiresDays === 3 || expiresDays === 1 || expiresDays === 0){
title = `vip(${label})即将到期`
content = `您的${appTitle} vip (${label})剩余${expiresDays}天(${expiresDate})到期,请及时续期,以免影响业务`
}else if (expiresDays === -1 || expiresDays === -3 || expiresDays === -7) {
title = `vip(${label})已过期`
content = `您的${appTitle} vip (${label})已过期${Math.abs(expiresDays)}天(${expiresDate}),请尽快续期,以免影响业务`
}
if(title){
logger.warn(title)
logger.warn(content)
const url = await this.notificationService.getBindUrl("");
const adminUsers = await this.userService.getAdmins()
for (const adminUser of adminUsers) {
logger.info(`发送vip到期通知给管理员:${adminUser.username}`)
await this.notificationService.send({
useDefault: true,
logger: logger,
body:{
title,
content,
errorMessage:title,
2025-12-14 01:36:20 +08:00
url,
notificationType: "vipExpireRemind",
2025-06-10 10:21:09 +08:00
}
},adminUser.id)
}
}
}
})
}
2025-07-18 18:18:01 +08:00
registerUserExpireCheckCron() {
// 添加plus即将到期检查任务
this.cron.register({
name: 'user-expire-check',
cron: `0 20 9 * * *`, // 一天只能检查一次,否则会重复发送通知
job: async () => {
const getExpiresDaysUsers = async (days: number) => {
const targetDate = dayjs().add(days, 'day')
const startTime = targetDate.startOf('day').valueOf()
const endTime = targetDate.endOf('day').valueOf()
return await this.userService.find({
where: {
validTime: Between(startTime, endTime),
status: 1
}
})
}
const notifyExpiresDaysUsers = async (days: number) => {
const list = await getExpiresDaysUsers(days)
if (list.length === 0) {
return
}
let title = `账号即将到期`
let content = `您的账号剩余${days}天到期,请及时续期,以免影响业务`
if (days <= 0) {
title = `账号已过期`
content = `您的账号已过期${Math.abs(days)}天,请尽快续期,以免影响业务`
}
const url = await this.notificationService.getBindUrl("");
for (const user of list) {
logger.info(`发送到期通知给用户:${user.username}`)
await this.notificationService.send({
useDefault: true,
logger: logger,
body: {
title,
content,
errorMessage: title,
2025-12-14 01:36:20 +08:00
url,
notificationType: "userExpireRemind",
2025-07-18 18:18:01 +08:00
}
}, user.id)
}
}
await notifyExpiresDaysUsers(7)
await notifyExpiresDaysUsers(3)
await notifyExpiresDaysUsers(1)
await notifyExpiresDaysUsers(0)
await notifyExpiresDaysUsers(-1)
await notifyExpiresDaysUsers(-3)
}
})
}
2023-01-29 13:44:19 +08:00
}