urgent_task_conf.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package task
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "log-server/global"
  9. "log-server/model/common/request"
  10. "log-server/model/task"
  11. "log-server/service/cache"
  12. "strings"
  13. "time"
  14. )
  15. type UrgentTaskService struct {
  16. }
  17. func (s *UrgentTaskService) CreateUrgentTask(task1 task.UrgentTaskConf) (err error) {
  18. //根据平均期望,将故障较大的放前面可以减少查询次数。那么需要先查是否有task_id以及create_date相等的
  19. var urgentEntity task.UrgentTaskConf
  20. var centralEntity task.CentralControlConf
  21. date := time.Now().Format("2006-01-02")
  22. task1.CreateDate = date
  23. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("task_id = ? and create_date = ?", task1.TaskId, date).First(&urgentEntity).Error
  24. if !errors.Is(err, gorm.ErrRecordNotFound) {
  25. return errors.New("任务已存在,请勿重复添加")
  26. }
  27. //查找中控配置是否存在
  28. err = global.GVA_DB.Model(&task.CentralControlConf{}).Where("task_id", task1.TaskId).First(&centralEntity).Error
  29. //若记录不存在,则报错返回
  30. if errors.Is(err, gorm.ErrRecordNotFound) {
  31. return errors.New("请先添加此任务中控配置")
  32. }
  33. //创建紧急任务
  34. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Omit("create_time", "update_time").Create(&task1).Error
  35. if err != nil {
  36. return err
  37. }
  38. codeSplit := strings.Split(task1.PcCode, ",")
  39. ctx := context.Background()
  40. for _, code := range codeSplit {
  41. key := fmt.Sprintf(cache.TemporaryTaskPcCode, date, code)
  42. global.GVA_REDIS.Set(ctx, key, task1.TaskId, time.Hour*6)
  43. }
  44. return
  45. }
  46. func (s *UrgentTaskService) DeleteUrgentTask(task1 task.UrgentTaskConf) (err error) {
  47. //查找此任务是否存在
  48. var entity task.UrgentTaskConf
  49. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", task1.Id).First(&entity).Error
  50. if errors.Is(err, gorm.ErrRecordNotFound) {
  51. return errors.New("此任务不存在")
  52. }
  53. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Delete(&entity).Error
  54. if err != nil {
  55. return err
  56. }
  57. codeSplit := strings.Split(entity.PcCode, ",")
  58. date := entity.CreateDate[:10]
  59. ctx := context.Background()
  60. for _, code := range codeSplit {
  61. key := fmt.Sprintf(cache.TemporaryTaskPcCode, date, code)
  62. global.GVA_REDIS.Del(ctx, key)
  63. }
  64. return
  65. }
  66. //批量删除
  67. func (s *UrgentTaskService) DeleteUrgentTaskByIds(ids []int) (err error) {
  68. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Delete("id in ?", ids).Error
  69. return err
  70. }
  71. func (s *UrgentTaskService) UpdateUrgentTask(task1 task.UrgentTaskConf) (err error) {
  72. //查找此task_id是否存在,如果存在不更新,否则更新
  73. var entity task.UrgentTaskConf
  74. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("task_id = ? and id != ? and create_date = ?", task1.TaskId, task1.Id, task1.CreateDate).First(&entity).Error
  75. if !errors.Is(err, gorm.ErrRecordNotFound) {
  76. return errors.New("已存在此task_id的任务,更新失败")
  77. }
  78. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", task1.Id).Updates(&task1).Error
  79. if err != nil {
  80. return err
  81. }
  82. date := entity.CreateDate[:10]
  83. if entity.PcCode != task1.PcCode {
  84. codeSplit := strings.Split(entity.PcCode, ",")
  85. ctx := context.Background()
  86. for _, code := range codeSplit {
  87. key := fmt.Sprintf(cache.TemporaryTaskPcCode, date, code)
  88. global.GVA_REDIS.Del(ctx, key)
  89. }
  90. upCodeSplit := strings.Split(task1.PcCode, ",")
  91. for _, upCode := range upCodeSplit {
  92. key := fmt.Sprintf(cache.TemporaryTaskPcCode, date, upCode)
  93. global.GVA_REDIS.Set(ctx, key, task1.TaskId, time.Hour*6)
  94. }
  95. }
  96. return
  97. }
  98. func (s *UrgentTaskService) GetUrgentTaskById(id int) (task1 task.UrgentTaskConf, err error) {
  99. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", id).First(&task1).Error
  100. return task1, err
  101. }
  102. //查询空闲租机
  103. func (s *UrgentTaskService) GetUnusedPc() (unusedPcList []task.UnusedPc, err error) {
  104. //获取当日日期
  105. date := time.Now().Format("2006-01-02")
  106. db := global.GVA_DB.Table("computer_status").Where("status = ? and create_date = ?", -1, date)
  107. pcCodes, err := s.GetTemporaryTaskId(date)
  108. if pcCodes != "" {
  109. db.Not("pc_code", strings.Split(pcCodes, ","))
  110. }
  111. err = db.Order("pc_code").Find(&unusedPcList).Error
  112. return unusedPcList, err
  113. }
  114. func (s *UrgentTaskService) GetTemporaryTaskId(date string) (pcCodes string, err error) {
  115. var urgentTaskConf []task.UrgentTaskConf
  116. err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("create_date = ?", date).Find(&urgentTaskConf).Error
  117. if len(urgentTaskConf) == 0 {
  118. return pcCodes, errors.New("没有任务数据")
  119. }
  120. for _, conf := range urgentTaskConf {
  121. pcCodes += conf.PcCode + ","
  122. }
  123. pcCodes = strings.Trim(pcCodes, ",")
  124. return
  125. }
  126. //获取紧急任务列表
  127. func (s *UrgentTaskService) GetUrgentTaskList(conf task.UrgentTaskConfRequest, info request.PageInfo, order string, desc bool) (confList []task.UrgentTaskConf, total int64, err error) {
  128. limit := info.PageSize
  129. offset := info.PageSize * (info.Page - 1)
  130. db := global.GVA_DB.Model(&task.UrgentTaskConf{})
  131. startDate := time.Now().Format("2006-01-02")
  132. endDate := time.Now().Format("2006-01-02")
  133. if len(conf.Date) == 2 {
  134. startDate = conf.Date[0]
  135. endDate = conf.Date[1]
  136. }
  137. //筛选日期
  138. db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
  139. if conf.TaskId != 0 {
  140. db = db.Where("task_id = ?", conf.TaskId)
  141. }
  142. err = db.Count(&total).Error
  143. if err != nil {
  144. return confList, total, err
  145. } else {
  146. db = db.Limit(limit).Offset(offset)
  147. if order != "" {
  148. var OrderStr string
  149. // 设置有效排序key 防止sql注入
  150. // 感谢 Tom4t0 提交漏洞信息
  151. orderMap := make(map[string]bool, 4)
  152. orderMap["task_id"] = true
  153. orderMap["create_date"] = true
  154. orderMap["create_time"] = true
  155. orderMap["update_time"] = true
  156. if orderMap[order] {
  157. if desc {
  158. OrderStr = order + " desc"
  159. } else {
  160. OrderStr = order
  161. }
  162. } else { // didn't matched any order key in `orderMap`
  163. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  164. return confList, total, err
  165. }
  166. err = db.Order(OrderStr).Find(&confList).Error
  167. } else {
  168. err = db.Order("id desc").Find(&confList).Error
  169. }
  170. }
  171. //遍历更改日期格式
  172. for i, _ := range confList {
  173. confList[i].CreateDate = confList[i].CreateDate[:10]
  174. }
  175. return confList, total, err
  176. }