job.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package service
  2. import (
  3. "errors"
  4. "time"
  5. "IotAdmin/app/schedule/models"
  6. "IotAdmin/app/schedule/service/dto"
  7. cDto "IotAdmin/common/dto"
  8. cJobs "IotAdmin/common/jobs"
  9. "IotAdmin/common/permission"
  10. "IotAdmin/core/sdk/service"
  11. "github.com/robfig/cron/v3"
  12. "gorm.io/gorm"
  13. )
  14. // SysJobService 定时任务服务
  15. type SysJobService struct {
  16. service.Service
  17. Cron *cron.Cron
  18. }
  19. // GetPage 获取定时任务列表
  20. func (e *SysJobService) GetPage(c *dto.SysJobGetPageReq, p *permission.DataPermission, list *[]models.SysJob, count *int64) error {
  21. var err error
  22. var data models.SysJob
  23. err = e.Orm.Model(&data).
  24. Scopes(
  25. cDto.MakeCondition(c.GetNeedSearch()),
  26. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  27. permission.Permission(data.TableName(), p),
  28. ).
  29. Find(list).Limit(-1).Offset(-1).
  30. Count(count).Error
  31. if err != nil {
  32. e.Log.Errorf("SysJobService GetPage error:%s \r\n", err)
  33. return err
  34. }
  35. return nil
  36. }
  37. // Get 获取定时任务对象
  38. func (e *SysJobService) Get(d *dto.SysJobGetReq, p *permission.DataPermission, model *models.SysJob) error {
  39. var data models.SysJob
  40. err := e.Orm.Model(&data).
  41. Scopes(
  42. permission.Permission(data.TableName(), p),
  43. ).
  44. First(model, d.GetId()).Error
  45. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  46. err = errors.New("查看对象不存在或无权查看")
  47. e.Log.Errorf("Service GetSysJob error:%s \r\n", err)
  48. return err
  49. }
  50. if err != nil {
  51. e.Log.Errorf("db error:%s", err)
  52. return err
  53. }
  54. return nil
  55. }
  56. // Insert 添加定时任务对象
  57. func (e *SysJobService) Insert(c *dto.SysJobInsertReq) error {
  58. var err error
  59. var data models.SysJob
  60. c.Generate(&data)
  61. err = e.Orm.Create(&data).Error
  62. if err != nil {
  63. e.Log.Errorf("SysJobService Insert error:%s \r\n", err)
  64. return err
  65. }
  66. return nil
  67. }
  68. // Update 修改定时任务对象
  69. func (e *SysJobService) Update(c *dto.SysJobUpdateReq, p *permission.DataPermission) error {
  70. var err error
  71. var data = models.SysJob{}
  72. e.Orm.Scopes(
  73. permission.Permission(data.TableName(), p),
  74. ).First(&data, c.GetId())
  75. c.Generate(&data)
  76. db := e.Orm.Save(&data)
  77. if err = db.Error; err != nil {
  78. e.Log.Errorf("SysJobService Save error:%s \r\n", err)
  79. return err
  80. }
  81. if db.RowsAffected == 0 {
  82. return errors.New("无权更新该数据")
  83. }
  84. return nil
  85. }
  86. // Remove 删除定时任务
  87. func (e *SysJobService) Remove(d *dto.SysJobDeleteReq, p *permission.DataPermission) error {
  88. var data models.SysJob
  89. db := e.Orm.Model(&data).
  90. Scopes(
  91. permission.Permission(data.TableName(), p),
  92. ).Delete(&data, d.GetId())
  93. if err := db.Error; err != nil {
  94. e.Log.Errorf("Service RemoveSysJob error:%s \r\n", err)
  95. return err
  96. }
  97. if db.RowsAffected == 0 {
  98. return errors.New("无权删除该数据")
  99. }
  100. return nil
  101. }
  102. // StartJob 启动任务
  103. func (e *SysJobService) StartJob(c *dto.SysJobGetReq) error {
  104. var data models.SysJob
  105. var err error
  106. err = e.Orm.Table(data.TableName()).First(&data, c.GetId()).Error
  107. if err != nil {
  108. e.Log.Errorf("db error: %s", err)
  109. return err
  110. }
  111. if data.Status == 2 {
  112. err = errors.New("当前Job是已启用。")
  113. return err
  114. }
  115. if data.JobType == 1 {
  116. var j = &cJobs.HttpJob{}
  117. j.InvokeTarget = data.InvokeTarget
  118. j.CronExpression = data.CronExpression
  119. j.JobId = data.JobId
  120. j.Name = data.JobName
  121. j.Logger = cJobs.GetJobLogger()
  122. j.DbKey = "*"
  123. data.EntryId, err = cJobs.AddJob(e.Cron, j)
  124. if err != nil {
  125. e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err)
  126. }
  127. } else {
  128. var j = &cJobs.ExecJob{}
  129. j.InvokeTarget = data.InvokeTarget
  130. j.CronExpression = data.CronExpression
  131. j.JobId = data.JobId
  132. j.Name = data.JobName
  133. j.Args = data.Args
  134. j.Logger = cJobs.GetJobLogger()
  135. j.DbKey = "*"
  136. data.EntryId, err = cJobs.AddJob(e.Cron, j)
  137. if err != nil {
  138. e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err)
  139. }
  140. }
  141. if err != nil {
  142. return err
  143. }
  144. data.Status = 2
  145. err = e.Orm.Table(data.TableName()).Where(c.GetId()).Updates(&data).Error
  146. if err != nil {
  147. e.Log.Errorf("db error: %s", err)
  148. }
  149. return err
  150. }
  151. // StopJob 删除job
  152. func (e *SysJobService) StopJob(c *dto.SysJobGetReq) error {
  153. var err error
  154. var data models.SysJob
  155. err = e.Orm.Table(data.TableName()).First(&data, c.GetId()).Error
  156. if err != nil {
  157. e.Log.Errorf("db error: %s", err)
  158. return err
  159. }
  160. if data.Status == 1 {
  161. err = errors.New("当前Job是已停用。")
  162. return err
  163. }
  164. cn := cJobs.Remove(e.Cron, data.EntryId)
  165. select {
  166. case res := <-cn:
  167. if res {
  168. err = e.Orm.Table(data.TableName()).Where("entry_id = ?", data.EntryId).Update("status", 1).Update("entry_id", 0).Error
  169. if err != nil {
  170. e.Log.Errorf("db error: %s", err)
  171. }
  172. return err
  173. }
  174. case <-time.After(time.Second * 1):
  175. e.Msg = "操作超时!"
  176. return nil
  177. }
  178. return nil
  179. }