package service import ( "errors" "time" "IotAdmin/app/schedule/models" "IotAdmin/app/schedule/service/dto" cDto "IotAdmin/common/dto" cJobs "IotAdmin/common/jobs" "IotAdmin/common/permission" "IotAdmin/core/sdk/service" "github.com/robfig/cron/v3" "gorm.io/gorm" ) // SysJobService 定时任务服务 type SysJobService struct { service.Service Cron *cron.Cron } // GetPage 获取定时任务列表 func (e *SysJobService) GetPage(c *dto.SysJobGetPageReq, p *permission.DataPermission, list *[]models.SysJob, count *int64) error { var err error var data models.SysJob err = e.Orm.Model(&data). Scopes( cDto.MakeCondition(c.GetNeedSearch()), cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), permission.Permission(data.TableName(), p), ). Find(list).Limit(-1).Offset(-1). Count(count).Error if err != nil { e.Log.Errorf("SysJobService GetPage error:%s \r\n", err) return err } return nil } // Get 获取定时任务对象 func (e *SysJobService) Get(d *dto.SysJobGetReq, p *permission.DataPermission, model *models.SysJob) error { var data models.SysJob err := e.Orm.Model(&data). Scopes( permission.Permission(data.TableName(), p), ). First(model, d.GetId()).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { err = errors.New("查看对象不存在或无权查看") e.Log.Errorf("Service GetSysJob error:%s \r\n", err) return err } if err != nil { e.Log.Errorf("db error:%s", err) return err } return nil } // Insert 添加定时任务对象 func (e *SysJobService) Insert(c *dto.SysJobInsertReq) error { var err error var data models.SysJob c.Generate(&data) err = e.Orm.Create(&data).Error if err != nil { e.Log.Errorf("SysJobService Insert error:%s \r\n", err) return err } return nil } // Update 修改定时任务对象 func (e *SysJobService) Update(c *dto.SysJobUpdateReq, p *permission.DataPermission) error { var err error var data = models.SysJob{} e.Orm.Scopes( permission.Permission(data.TableName(), p), ).First(&data, c.GetId()) c.Generate(&data) db := e.Orm.Save(&data) if err = db.Error; err != nil { e.Log.Errorf("SysJobService Save error:%s \r\n", err) return err } if db.RowsAffected == 0 { return errors.New("无权更新该数据") } return nil } // Remove 删除定时任务 func (e *SysJobService) Remove(d *dto.SysJobDeleteReq, p *permission.DataPermission) error { var data models.SysJob db := e.Orm.Model(&data). Scopes( permission.Permission(data.TableName(), p), ).Delete(&data, d.GetId()) if err := db.Error; err != nil { e.Log.Errorf("Service RemoveSysJob error:%s \r\n", err) return err } if db.RowsAffected == 0 { return errors.New("无权删除该数据") } return nil } // StartJob 启动任务 func (e *SysJobService) StartJob(c *dto.SysJobGetReq) error { var data models.SysJob var err error err = e.Orm.Table(data.TableName()).First(&data, c.GetId()).Error if err != nil { e.Log.Errorf("db error: %s", err) return err } if data.Status == 2 { err = errors.New("当前Job是已启用。") return err } if data.JobType == 1 { var j = &cJobs.HttpJob{} j.InvokeTarget = data.InvokeTarget j.CronExpression = data.CronExpression j.JobId = data.JobId j.Name = data.JobName j.Logger = cJobs.GetJobLogger() j.DbKey = "*" data.EntryId, err = cJobs.AddJob(e.Cron, j) if err != nil { e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err) } } else { var j = &cJobs.ExecJob{} j.InvokeTarget = data.InvokeTarget j.CronExpression = data.CronExpression j.JobId = data.JobId j.Name = data.JobName j.Args = data.Args j.Logger = cJobs.GetJobLogger() j.DbKey = "*" data.EntryId, err = cJobs.AddJob(e.Cron, j) if err != nil { e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err) } } if err != nil { return err } data.Status = 2 err = e.Orm.Table(data.TableName()).Where(c.GetId()).Updates(&data).Error if err != nil { e.Log.Errorf("db error: %s", err) } return err } // StopJob 删除job func (e *SysJobService) StopJob(c *dto.SysJobGetReq) error { var err error var data models.SysJob err = e.Orm.Table(data.TableName()).First(&data, c.GetId()).Error if err != nil { e.Log.Errorf("db error: %s", err) return err } if data.Status == 1 { err = errors.New("当前Job是已停用。") return err } cn := cJobs.Remove(e.Cron, data.EntryId) select { case res := <-cn: if res { err = e.Orm.Table(data.TableName()).Where("entry_id = ?", data.EntryId).Update("status", 1).Update("entry_id", 0).Error if err != nil { e.Log.Errorf("db error: %s", err) } return err } case <-time.After(time.Second * 1): e.Msg = "操作超时!" return nil } return nil }