work.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "kpt-pasture/util"
  8. "net/http"
  9. "strings"
  10. "time"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  13. "gitee.com/xuyiping_admin/pkg/xerr"
  14. "go.uber.org/zap"
  15. "gorm.io/gorm"
  16. )
  17. func (s *StoreEntry) OrderList(ctx context.Context, req *pasturePb.SearchWorkOrderRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchWorkOrderResponse, error) {
  18. workOrderList := make([]*model.WorkOrder, 0)
  19. var count int64 = 0
  20. pref := s.DB.Model(new(model.WorkOrder))
  21. if req.Name != "" {
  22. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  23. }
  24. if req.Frequency > 0 {
  25. pref.Where("frequency = ?", req.Frequency)
  26. }
  27. if req.Priority > 0 {
  28. pref.Where("priority = ?", req.Priority)
  29. }
  30. if req.IsShow > 0 {
  31. pref.Where("is_show = ?", req.IsShow)
  32. }
  33. if req.SubscribeUnit > 0 {
  34. pref.Where("subscribe_unit = ?", req.SubscribeUnit)
  35. }
  36. if req.CategoryId > 0 {
  37. pref.Where("category_id = ?", req.CategoryId)
  38. }
  39. if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
  40. Find(&workOrderList).Error; err != nil {
  41. return nil, xerr.WithStack(err)
  42. }
  43. priorityMap := s.WorkOrderPriorityMap()
  44. frequencyMap := s.WorkOrderFrequencyMap()
  45. subscribeUnitMap := s.WorkOrderSubUnitMap()
  46. weekMap := s.WeekMap()
  47. monthMap := s.MonthMap()
  48. return &pasturePb.SearchWorkOrderResponse{
  49. Code: http.StatusOK,
  50. Message: "ok",
  51. Data: &pasturePb.SearchWorkOrderData{
  52. List: model.WorkOrderSlice(workOrderList).ToPB(priorityMap, frequencyMap, subscribeUnitMap, weekMap, monthMap),
  53. Total: int32(count),
  54. PageSize: pagination.PageSize,
  55. Page: pagination.Page,
  56. },
  57. }, nil
  58. }
  59. func (s *StoreEntry) OrderCreateOrUpdate(ctx context.Context, req *pasturePb.WorkOrderList) error {
  60. currentUser, _ := s.GetCurrentSystemUser(ctx)
  61. workOrderCategoryMap := s.WorkOrderCategoryMap()
  62. systemUserList, _ := s.SystemUserList(ctx)
  63. deptList, _ := s.SystemDeptList(ctx)
  64. newWorkOrder := model.NewWorkOrder(req, currentUser, systemUserList, deptList, workOrderCategoryMap)
  65. if req.Id <= 0 {
  66. if err := s.DB.Create(newWorkOrder).Error; err != nil {
  67. return xerr.WithStack(err)
  68. }
  69. // 发送异步数据
  70. defer func() {
  71. s.SendAsynqWorkOrder(ctx, newWorkOrder)
  72. }()
  73. } else {
  74. if err := s.DB.Where("id = ?", req.Id).Updates(newWorkOrder).Error; err != nil {
  75. return xerr.WithStack(err)
  76. }
  77. }
  78. return nil
  79. }
  80. func (s *StoreEntry) OrderIsShow(ctx context.Context, id int64) error {
  81. workOrder := &model.WorkOrder{Id: id}
  82. if err := s.DB.First(workOrder).Error; err != nil {
  83. if errors.Is(err, gorm.ErrRecordNotFound) {
  84. return xerr.Custom("该工单不存在")
  85. }
  86. return xerr.WithStack(err)
  87. }
  88. // 开启发送消息任务,需要判断今天工单任务是否已经生成过了
  89. defer func() {
  90. s.SendAsynqWorkOrder(ctx, workOrder)
  91. }()
  92. isShow := pasturePb.IsShow_No
  93. if workOrder.IsShow == pasturePb.IsShow_No {
  94. isShow = pasturePb.IsShow_Ok
  95. }
  96. if err := s.DB.Model(workOrder).Update("is_show", isShow).Error; err != nil {
  97. return xerr.WithStack(err)
  98. }
  99. return nil
  100. }
  101. func (s *StoreEntry) SendAsynqWorkOrder(ctx context.Context, workOrder *model.WorkOrder) {
  102. if workOrder.IsShow == pasturePb.IsShow_No {
  103. return
  104. }
  105. timeUnix, _ := util.ConvertParseLocalUnix(workOrder.ExecTime)
  106. nowTime := time.Now()
  107. // 过滤掉10秒内要执行的任务
  108. if timeUnix <= nowTime.Unix()+10 {
  109. return
  110. }
  111. // 判断是否是周任务,并且当前周不在执行周期内,则不执行任务
  112. if workOrder.WeekMonthValue != "" {
  113. execWeekMonth := strings.Split(workOrder.WeekMonthValue, ",")
  114. currentWeekMonth := ""
  115. if workOrder.Frequency == pasturePb.WorkOrderFrequency_Weekly {
  116. currentWeekMonth = fmt.Sprintf("%d", nowTime.Weekday())
  117. }
  118. if workOrder.Frequency == pasturePb.WorkOrderFrequency_Monthly {
  119. currentWeekMonth = fmt.Sprintf("%d", nowTime.Day())
  120. }
  121. var info bool
  122. for _, weekMonth := range execWeekMonth {
  123. if currentWeekMonth == weekMonth {
  124. info = true
  125. break
  126. }
  127. }
  128. // 如果有,则不执行任务
  129. if info {
  130. return
  131. }
  132. }
  133. execTime := time.Now().Unix() - timeUnix
  134. if _, err := s.AsynqClient.CtxEnqueue(ctx, model.NewTaskWorkOrderPayload(workOrder.Id, time.Duration(execTime)*time.Second)); err != nil {
  135. zaplog.Error("PushMessage CtxEnqueue", zap.Any("Err", err))
  136. }
  137. }