You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloubrain_deduct.go 3.0 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package reward
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/modules/setting"
  6. "fmt"
  7. "time"
  8. )
  9. var (
  10. ResourceSpecs *models.ResourceSpecs
  11. TrainResourceSpecs *models.ResourceSpecs
  12. )
  13. const RUN_CLOUDBRAIN_TASK_TITTLE = "运行云脑任务"
  14. func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.RewardPeriodicTask, error) {
  15. if !setting.CloudBrainPaySwitch {
  16. return nil, nil
  17. }
  18. unitPrice := models.GetCloudbrainTaskUnitPrice(task)
  19. if unitPrice == 0 {
  20. log.Debug("finish StartAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID)
  21. return nil, nil
  22. }
  23. return StartAndGetPeriodicTask(&models.StartPeriodicTaskOpts{
  24. SourceType: models.SourceTypeRunCloudbrainTask,
  25. SourceId: getCloudBrainPointTaskSourceId(task),
  26. TargetUserId: task.UserID,
  27. RequestId: getCloudBrainPointTaskSourceId(task),
  28. OperateType: models.OperateTypeDecrease,
  29. Delay: setting.CloudBrainPayDelay,
  30. Interval: setting.CloudBrainPayInterval,
  31. UnitAmount: unitPrice,
  32. RewardType: models.RewardTypePoint,
  33. StartTime: time.Unix(int64(task.StartTime), 0),
  34. Tittle: RUN_CLOUDBRAIN_TASK_TITTLE,
  35. })
  36. }
  37. func StopCloudBrainPointDeductTask(task models.Cloudbrain) {
  38. StopPeriodicTask(models.SourceTypeRunCloudbrainTask, getCloudBrainPointTaskSourceId(task), models.OperateTypeDecrease)
  39. }
  40. func getCloudBrainPointTaskSourceId(task models.Cloudbrain) string {
  41. return fmt.Sprint(task.ID)
  42. }
  43. var firstTimeFlag = true
  44. func StartCloudbrainPointDeductTask() {
  45. defer func() {
  46. if err := recover(); err != nil {
  47. combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
  48. log.Error("PANIC:%v", combinedErr)
  49. }
  50. }()
  51. log.Debug("try to run CloudbrainPointDeductTask")
  52. end := time.Now()
  53. start := end.Add(-30 * time.Minute)
  54. if firstTimeFlag {
  55. //When it is executed for the first time, it needs to process the tasks of the last 1 hours.
  56. //This is done to prevent the application from hanging for a long time
  57. start = end.Add(-3 * time.Hour)
  58. firstTimeFlag = false
  59. }
  60. taskList, err := models.GetStartedCloudbrainTaskByUpdatedUnix(start, end)
  61. if err != nil {
  62. log.Error("GetStartedCloudbrainTaskByUpdatedUnix error. %v", err)
  63. return
  64. }
  65. if taskList == nil || len(taskList) == 0 {
  66. log.Debug("No cloudbrain task need handled")
  67. return
  68. }
  69. for _, t := range taskList {
  70. DeductPoint4Cloudbrain(t, end)
  71. }
  72. }
  73. func DeductPoint4Cloudbrain(t models.Cloudbrain, now time.Time) error {
  74. if t.StartTime == 0 {
  75. return nil
  76. }
  77. task, err := StartAndGetCloudBrainPointDeductTask(t)
  78. if err != nil {
  79. log.Error("run cloudbrain point deduct task error,err=%v", err)
  80. return err
  81. }
  82. if task == nil {
  83. return nil
  84. }
  85. if task.Status == models.PeriodicTaskStatusFinished {
  86. log.Info("Periodic task is finished")
  87. return nil
  88. }
  89. if t.EndTime > 0 {
  90. endTime := time.Unix(int64(t.EndTime), 0)
  91. RunRewardTask(*task, endTime)
  92. models.StopPeriodicTask(task.ID, task.OperateSerialNo, endTime)
  93. } else {
  94. RunRewardTask(*task, now)
  95. }
  96. return nil
  97. }