work_cron.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package crontab
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "kpt-pasture/model"
  7. "kpt-pasture/module/backend"
  8. "kpt-pasture/util"
  9. "time"
  10. "gorm.io/gorm"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  13. "go.uber.org/zap"
  14. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  15. )
  16. // GenerateAsynqWorkOrder 异步生成工作单
  17. func (e *Entry) GenerateAsynqWorkOrder() error {
  18. workOrderList := make([]*model.WorkOrderMaster, 0)
  19. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&workOrderList).Error; err != nil {
  20. return err
  21. }
  22. for _, workOrder := range workOrderList {
  23. timeUnix, err := util.ConvertParseLocalUnix(workOrder.ExecTime)
  24. if timeUnix <= 0 || err != nil {
  25. zaplog.Error("crontab", zap.Any("GenerateWorkOrder", err), zap.Any("execTime", workOrder.ExecTime))
  26. continue
  27. }
  28. execTime := time.Now().Unix() - timeUnix
  29. if _, err = e.AsynqClient.CtxEnqueue(
  30. context.Background(),
  31. model.NewTaskWorkOrderPayload(workOrder.Id, time.Duration(execTime)*time.Second),
  32. ); err != nil {
  33. zaplog.Error("PushMessage CtxEnqueue", zap.Any("Err", err))
  34. }
  35. }
  36. return nil
  37. }
  38. // GenerateCalendarBySameTimePlan 生成同期计划工作单
  39. func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) error {
  40. if len(cowList) <= 0 {
  41. return nil
  42. }
  43. cowSameTimeList := make([]*model.SameTimeCow, 0)
  44. for _, cow := range cowList {
  45. newCowSameTime, err := e.createNewCowSameTime(cow, sameTime)
  46. if err != nil {
  47. zaplog.Error("crontab", zap.Any("GenerateCalendarBySameTimePlan", err), zap.Any("cow", cow))
  48. }
  49. cowSameTimeList = append(cowSameTimeList, newCowSameTime)
  50. }
  51. calendarName := backend.CalendarTypeMap()[pasturePb.CalendarType_Immunisation]
  52. workOrderCalendarList := make([]*model.WorkOrderCalendar, 0)
  53. if len(sameTime.CollateNodes) > 0 {
  54. collateNodes := make([]*pasturePb.CollateNode, 0)
  55. var _ = json.Unmarshal([]byte(sameTime.CollateNodes), &collateNodes)
  56. nowTime := time.Now()
  57. for i, collateNode := range collateNodes {
  58. showDay := nowTime.Format(model.LayoutDate2)
  59. if i > 0 {
  60. showDay = nowTime.Add(time.Hour * 24 * time.Duration(collateNode.NextNodeDay)).Format(model.LayoutDate2)
  61. }
  62. histCount := e.GetTowardSameTimeCowSum(sameTime.Id, showDay)
  63. workOrderCalendarList = append(workOrderCalendarList, &model.WorkOrderCalendar{
  64. Name: calendarName,
  65. CalendarType: pasturePb.CalendarType_Immunisation,
  66. Count: int32(len(cowSameTimeList)) + int32(histCount),
  67. ShowDay: showDay,
  68. IsShow: pasturePb.IsShow_Ok,
  69. })
  70. }
  71. }
  72. if err := e.DB.Transaction(func(tx *gorm.DB) error {
  73. // 创建新的牛只同期计划详情
  74. if err := tx.Create(cowSameTimeList).Error; err != nil {
  75. return xerr.WithStack(err)
  76. }
  77. for _, v := range workOrderCalendarList {
  78. if err := tx.Model(&model.WorkOrderCalendar{}).Where(map[string]interface{}{
  79. "calendar_type": v.CalendarType,
  80. "show_day": v.ShowDay,
  81. }).Assign(map[string]interface{}{
  82. "name": v.Name,
  83. "calendar_type": v.CalendarType,
  84. "count": v.Count,
  85. "show_day": v.ShowDay,
  86. "is_show": v.IsShow,
  87. }).FirstOrCreate(&model.Pen{}).Error; err != nil {
  88. return xerr.WithStack(err)
  89. }
  90. }
  91. return nil
  92. }); err != nil {
  93. return xerr.WithStack(err)
  94. }
  95. return nil
  96. }
  97. func (e *Entry) createNewCowSameTime(cow *model.Cow, sameTime *model.SameTime) (*model.SameTimeCow, error) {
  98. cowSameTime := &model.SameTimeCow{}
  99. if err := e.DB.Where("cow_id = ?", cow.Id).
  100. Where("lact = ?", cow.Lact).
  101. Where("same_time_id = ?", sameTime.Id).
  102. First(cowSameTime).Error; err != nil {
  103. if errors.Is(err, gorm.ErrRecordNotFound) {
  104. return &model.SameTimeCow{
  105. CowId: cow.Id,
  106. SameTimeId: sameTime.Id,
  107. Status: pasturePb.SameTimeStatus_No_Start,
  108. StartAt: time.Now().Unix(),
  109. EndAt: 0,
  110. }, nil
  111. } else {
  112. zaplog.Error("crontab", zap.Error(err), zap.Any("GenerateCalendarBySameTimePlan", "error"), zap.Any("cow", cow.Id), zap.Any("lact", cow.Lact))
  113. return nil, xerr.WithStack(err)
  114. }
  115. }
  116. return cowSameTime, nil
  117. }
  118. func (e *Entry) getWorkOrderCalendar(name string) []*model.WorkOrderCalendar {
  119. res := make([]*model.WorkOrderCalendar, 0)
  120. if err := e.DB.Where("name = ?", name).
  121. Where("is_show = ?", pasturePb.IsShow_Ok).
  122. Find(&res).Error; err != nil {
  123. zaplog.Error("getWorkOrderCalendar", zap.Any("err", err))
  124. }
  125. return res
  126. }
  127. // PregnancyCheck 妊娠期检查
  128. func (e *Entry) PregnancyCheck() error {
  129. return nil
  130. }