service_modify.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package cron
  2. import (
  3. "github.com/xinliangnote/go-gin-api/internal/pkg/core"
  4. "github.com/xinliangnote/go-gin-api/internal/repository/mysql"
  5. "github.com/xinliangnote/go-gin-api/internal/repository/mysql/cron_task"
  6. "github.com/spf13/cast"
  7. )
  8. type ModifyCronTaskData struct {
  9. Name string // 任务名称
  10. Spec string // crontab 表达式
  11. Command string // 执行命令
  12. Protocol int32 // 执行方式 1:shell 2:http
  13. HttpMethod int32 // http 请求方式 1:get 2:post
  14. Timeout int32 // 超时时间(单位:秒)
  15. RetryTimes int32 // 重试次数
  16. RetryInterval int32 // 重试间隔(单位:秒)
  17. NotifyStatus int32 // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知
  18. NotifyType int32 // 通知类型 1:邮件 2:webhook
  19. NotifyReceiverEmail string // 通知者邮箱地址(多个用,分割)
  20. NotifyKeyword string // 通知匹配关键字(多个用,分割)
  21. Remark string // 备注
  22. IsUsed int32 // 是否启用 1:是 -1:否
  23. }
  24. func (s *service) Modify(ctx core.Context, id int32, modifyData *ModifyCronTaskData) (err error) {
  25. data := map[string]interface{}{
  26. "name": modifyData.Name,
  27. "spec": modifyData.Spec,
  28. "command": modifyData.Command,
  29. "protocol": modifyData.Protocol,
  30. "http_method": modifyData.HttpMethod,
  31. "timeout": modifyData.Timeout,
  32. "retry_times": modifyData.RetryTimes,
  33. "retry_interval": modifyData.RetryInterval,
  34. "notify_status": modifyData.NotifyStatus,
  35. "notify_type": modifyData.NotifyType,
  36. "notify_receiver_email": modifyData.NotifyReceiverEmail,
  37. "notify_keyword": modifyData.NotifyKeyword,
  38. "remark": modifyData.Remark,
  39. "is_used": modifyData.IsUsed,
  40. "updated_user": ctx.SessionUserInfo().UserName,
  41. }
  42. qb := cron_task.NewQueryBuilder()
  43. qb.WhereId(mysql.EqualPredicate, id)
  44. err = qb.Updates(s.db.GetDbW().WithContext(ctx.RequestContext()), data)
  45. if err != nil {
  46. return err
  47. }
  48. // region 操作定时任务 避免主从同步延迟,在这需要查询主库
  49. if modifyData.IsUsed == cron_task.IsUsedNo {
  50. s.cronServer.RemoveTask(cast.ToInt(id))
  51. } else {
  52. qb = cron_task.NewQueryBuilder()
  53. qb.WhereId(mysql.EqualPredicate, id)
  54. info, err := qb.QueryOne(s.db.GetDbW().WithContext(ctx.RequestContext()))
  55. if err != nil {
  56. return err
  57. }
  58. s.cronServer.RemoveTask(cast.ToInt(id))
  59. s.cronServer.AddTask(info)
  60. }
  61. // endregion
  62. return
  63. }