123 lines
2.9 KiB
Go
123 lines
2.9 KiB
Go
// Package services/cron_service.go
|
|
package services
|
|
|
|
import (
|
|
"Quincy_admin/crontask"
|
|
"Quincy_admin/repositories"
|
|
"Quincy_admin/schemas"
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
type CronService struct {
|
|
cronRepo *repositories.CronRepository
|
|
cronManager *crontask.CronManager
|
|
}
|
|
|
|
func NewCronService(cronRepo *repositories.CronRepository, cronManager *crontask.CronManager) *CronService {
|
|
return &CronService{
|
|
cronRepo: cronRepo,
|
|
cronManager: cronManager,
|
|
}
|
|
}
|
|
|
|
// GetCronList 获取定时任务列表
|
|
func (s *CronService) GetCronList(req *schemas.CronListRequest) ([]*schemas.CronJob, int64, error) {
|
|
return s.cronRepo.GetCronList(req)
|
|
}
|
|
|
|
// AddCron 添加定时任务
|
|
func (s *CronService) AddCron(req *schemas.CronJobUpdateRequest) (int64, error) {
|
|
return s.cronRepo.AddCron(req)
|
|
}
|
|
|
|
// UpdateCron 修改定时任务
|
|
func (s *CronService) UpdateCron(req *schemas.CronJobUpdateRequest) error {
|
|
// 更新数据库
|
|
err := s.cronRepo.UpdateCron(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 先移除现有的任务
|
|
err = s.cronManager.RemoveJob(int(req.ID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = s.cronManager.AddJobByID(int(req.ID))
|
|
return nil
|
|
}
|
|
|
|
// UpdateCronStatus 启用/停用定时任务
|
|
func (s *CronService) UpdateCronStatus(id int, enable int) error {
|
|
// 先更新数据库状态
|
|
err := s.cronRepo.UpdateCronStatus(id, enable)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 根据 enabled 状态决定是否移除或添加任务
|
|
// 数据库更新成功后再处理任务管理器
|
|
var jobErr error
|
|
if enable == 0 {
|
|
// 停用:移除任务
|
|
jobErr = s.cronManager.RemoveJob(id)
|
|
} else if enable == 1 {
|
|
// 启用:添加任务
|
|
jobErr = s.cronManager.AddJobByID(id)
|
|
}
|
|
|
|
// 如果任务管理器操作失败,回滚数据库状态
|
|
if jobErr != nil {
|
|
rollbackEnable := 1 - enable
|
|
rollbackErr := s.cronRepo.UpdateCronStatus(id, rollbackEnable)
|
|
if rollbackErr != nil {
|
|
log.Printf("failed to rollback job status: %v\n", rollbackErr)
|
|
}
|
|
return fmt.Errorf("failed to update job status: %v", jobErr)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DeleteCron 删除定时任务
|
|
func (s *CronService) DeleteCron(id int) error {
|
|
// 删除数据库记录
|
|
err := s.cronRepo.DeleteCron(id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 触发任务刷新(需传入 CronManager 实例)
|
|
go func() {
|
|
err := s.cronManager.RemoveJob(id)
|
|
if err != nil {
|
|
}
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
// RestartCron 重启定时任务
|
|
func (s *CronService) RestartCron() error {
|
|
err := s.cronRepo.UpdateAllCronStatus(1)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.cronManager.Restart()
|
|
}
|
|
|
|
// StopCron 停止定时任务
|
|
func (s *CronService) StopCron() error {
|
|
err := s.cronRepo.UpdateAllCronStatus(0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.cronManager.Stop()
|
|
}
|
|
|
|
// GetCronLogList 获取定时任务日志列表
|
|
func (s *CronService) GetCronLogList(req *schemas.CronJobLogListRequest) ([]*schemas.CronJobLog, int64, error) {
|
|
return s.cronRepo.GetCronLogList(req)
|
|
}
|