2025-04-09 16:15:16 +08:00

120 lines
3.2 KiB
Go
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.

package tasks
import (
"gitee.ltd/lxh/wechat-robot/internal/model"
"github.com/go-co-op/gocron/v2"
"github.com/google/uuid"
"log"
"sync"
)
// 定时任务调度器
var scheduler gocron.Scheduler
// 已启动定时任务的微信机器人
var enabledSyncMessageMap = sync.Map{}
var enabledSyncContactMap = sync.Map{}
// Start
// @description: 启动任务
func Start() {
var err error
scheduler, err = gocron.NewScheduler()
if err != nil {
log.Panicf("定时任务启动失败: %v", err)
}
// 预添加已经确定的任务
db := model.GetDB()
// 查询数据库,获取在线的机器人
var robots []model.Robot
if err = db.Where("status = 'online'").Find(&robots).Error; err != nil {
log.Panicf("查询机器人失败: %v", err)
}
// 遍历机器人,添加任务
for _, robot := range robots {
var job gocron.Job
job, err = scheduler.NewJob(
gocron.CronJob("*/5 * * * * *", true), // 五秒钟同步一次
gocron.NewTask(syncMessage, robot.ContainerHost, robot.WechatID, robot.ID),
)
if err != nil {
log.Panicf("添加定时任务失败: %v", err)
}
// 添加到已启动的任务列表
enabledSyncMessageMap.Store(robot.ID, job.ID())
// 添加联系人同步任务
job, err = scheduler.NewJob(
gocron.CronJob("0 */1 * * *", true), // 每小时同步一次
gocron.NewTask(syncContact, robot.ContainerHost, robot.WechatID, robot.ID),
)
if err != nil {
log.Panicf("添加联系人同步任务失败: %v", err)
}
// 添加到已启动的任务列表
enabledSyncContactMap.Store(robot.ID, job.ID())
}
// 启动定时任务
scheduler.Start()
log.Println("定时任务已启动")
}
// AddJob
// @description: 添加任务
func AddJob(robot model.Robot) {
job, err := scheduler.NewJob(
gocron.CronJob("*/5 * * * * *", true), // 五秒钟同步一次
gocron.NewTask(syncMessage, robot.ContainerHost, robot.WechatID, robot.ID),
)
if err != nil {
log.Printf("添加定时任务失败: %v", err)
return
}
// 添加到已启动的任务列表
enabledSyncMessageMap.Store(robot.ID, job.ID())
// 添加联系人同步任务
job, err = scheduler.NewJob(
gocron.CronJob("0 */1 * * *", true), // 每小时同步一次
gocron.NewTask(syncContact, robot.ContainerHost, robot.WechatID, robot.ID),
)
if err != nil {
log.Panicf("添加联系人同步任务失败: %v", err)
}
// 添加到已启动的任务列表
enabledSyncContactMap.Store(robot.ID, job.ID())
}
// DeleteJob
// @description: 删除定时任务
// @param robotId
func DeleteJob(robotId uint) {
// 先取出任务Id
jobId, ok := enabledSyncMessageMap.Load(robotId)
if !ok {
log.Printf("定时任务不存在robotId: %d", robotId)
return
}
if err := scheduler.RemoveJob(jobId.(uuid.UUID)); err != nil {
log.Printf("删除定时任务失败: %v", err)
return
}
// 删除已启动的任务列表
enabledSyncMessageMap.Delete(robotId)
// 删除联系人同步任务
jobId, ok = enabledSyncContactMap.Load(robotId)
if !ok {
log.Printf("联系人同步任务不存在robotId: %d", robotId)
return
}
if err := scheduler.RemoveJob(jobId.(uuid.UUID)); err != nil {
log.Printf("删除联系人同步任务失败: %v", err)
return
}
// 删除已启动的任务列表
enabledSyncContactMap.Delete(robotId)
}