crontab.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package crontab
  2. import (
  3. "context"
  4. "kpt-pasture/model"
  5. "kpt-pasture/util"
  6. "time"
  7. "gorm.io/gorm"
  8. "gitee.com/xuyiping_admin/pkg/xerr"
  9. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  10. "go.uber.org/zap"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. )
  13. // UpdateCowInfo 牛只基本信息维护
  14. func (e *Entry) UpdateCowInfo() error {
  15. cowList := make([]*model.Cow, 0)
  16. if err := e.DB.Where("is_remove = ?", pasturePb.IsShow_Ok).Find(&cowList).Error; err != nil {
  17. return err
  18. }
  19. for _, cow := range cowList {
  20. dayAge := cow.GetDayAge()
  21. calvingAge := cow.GetCalvingAge()
  22. pregnancyAge := cow.GetDaysPregnant()
  23. admissionAge := cow.GetAdmissionAge()
  24. if err := e.DB.Where("id = ?", cow.Id).Updates(map[string]interface{}{
  25. "day_age": dayAge,
  26. "calving_at": calvingAge,
  27. "pregnancy_age": pregnancyAge,
  28. "admission_age": admissionAge,
  29. }).Error; err != nil {
  30. zaplog.Error("Crontab", zap.Any("UpdateCowDayAge", err))
  31. }
  32. }
  33. return nil
  34. }
  35. // GenerateAsynqWorkOrder 异步生成工作单
  36. func (e *Entry) GenerateAsynqWorkOrder() error {
  37. workOrderList := make([]*model.WorkOrderMaster, 0)
  38. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&workOrderList).Error; err != nil {
  39. return err
  40. }
  41. for _, workOrder := range workOrderList {
  42. timeUnix, err := util.ConvertParseLocalUnix(workOrder.ExecTime)
  43. if timeUnix <= 0 || err != nil {
  44. zaplog.Error("crontab", zap.Any("GenerateWorkOrder", err), zap.Any("execTime", workOrder.ExecTime))
  45. continue
  46. }
  47. execTime := time.Now().Unix() - timeUnix
  48. if _, err := e.AsynqClient.CtxEnqueue(
  49. context.Background(),
  50. model.NewTaskWorkOrderPayload(e.Cfg.FarmName, workOrder.Id, time.Duration(execTime)*time.Second),
  51. ); err != nil {
  52. zaplog.Error("PushMessage CtxEnqueue", zap.Any("Err", err))
  53. }
  54. }
  55. return nil
  56. }
  57. // ImmunizationPlan 免疫计划,生成工作单
  58. func (e *Entry) ImmunizationPlan() error {
  59. planList := make([]*model.ImmunizationPlan, 0)
  60. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&planList).Error; err != nil {
  61. return xerr.WithStack(err)
  62. }
  63. for _, plan := range planList {
  64. cowList := make([]*model.Cow, 0)
  65. pref := e.DB.Select("id").Where("is_remove = ?", pasturePb.IsShow_Ok).
  66. Where("cow_type = ?", plan.CowType)
  67. switch plan.Conditions {
  68. case pasturePb.ImmunizationConditions_Days_Age:
  69. pref.Where("day_age >= ?", plan.Value).
  70. Where("day_age <= ?", plan.Value2)
  71. case pasturePb.ImmunizationConditions_Days_After_Delivery:
  72. pref.Where("calving_age >= ?", plan.Value).
  73. Where("calving_age <= ?", plan.Value2)
  74. case pasturePb.ImmunizationConditions_Days_Of_Pregnancy:
  75. pref.Where("pregnancy_age >= ?", plan.Value).
  76. Where("pregnancy_age <= ?", plan.Value2).
  77. Where("is_pregnant = ?", pasturePb.IsShow_Ok)
  78. case pasturePb.ImmunizationConditions_Month:
  79. // todo 待实现月份
  80. case pasturePb.ImmunizationConditions_Admission_Days:
  81. pref.Where("admission_age >= ?", plan.Value).
  82. Where("admission_age <= ?", plan.Value2)
  83. }
  84. if err := pref.Find(&cowList).Error; err != nil {
  85. return xerr.WithStack(err)
  86. }
  87. if len(cowList) <= 0 {
  88. continue
  89. }
  90. if err := e.GenerateCalendarByImmunization(cowList, plan.Name); err != nil {
  91. zaplog.Error("crontab", zap.Any("GenerateWorkOrderCalendar", err), zap.Any("cowList", cowList))
  92. }
  93. }
  94. return nil
  95. }
  96. // SameTimePlan 同期计划,生成工作单
  97. func (e *Entry) SameTimePlan() error {
  98. return nil
  99. }
  100. func (e *Entry) GenerateCalendarByImmunization(cowList []*model.Cow, name string) error {
  101. workOrderCalendarList := e.getWorkOrderCalendar(name)
  102. newCowList := make([]*model.Cow, 0)
  103. if len(workOrderCalendarList) > 0 {
  104. // 过滤已经存在的牛只数据,避免重复生成工作单
  105. calendarIds := make([]int64, 0)
  106. if err := e.DB.Model(&model.WorkOrderCalendar{}).Select("id").
  107. Where("name = ?", name).
  108. Where("is_show = ?", pasturePb.IsShow_Ok).
  109. Order("id DESC").
  110. Limit(100). // todo 默认取100条数据
  111. Find(&calendarIds).Error; err != nil {
  112. return xerr.WithStack(err)
  113. }
  114. workOrderList := make([]*model.WorkOrderList, 0)
  115. if err := e.DB.Where("calendar_id IN ?", calendarIds).
  116. Where("is_show = ?", pasturePb.IsShow_Ok).
  117. Where("is_completion = ?", pasturePb.IsShow_No).
  118. Find(&workOrderList).Error; err != nil {
  119. return xerr.WithStack(err)
  120. }
  121. if len(workOrderList) > 0 {
  122. for _, cow := range cowList {
  123. for _, workOrder := range workOrderList {
  124. if workOrder.CowId == cow.Id {
  125. continue
  126. }
  127. }
  128. newCowList = append(newCowList, cow)
  129. }
  130. }
  131. }
  132. count := len(newCowList)
  133. if err := e.DB.Transaction(func(tx *gorm.DB) error {
  134. newWorkOrderCalendar := model.NewWorkOrderCalendar(name, int32(count))
  135. if err := tx.Create(newWorkOrderCalendar).Error; err != nil {
  136. return xerr.WithStack(err)
  137. }
  138. newWorkOrderList := make([]*model.WorkOrderList, 0)
  139. for _, cow := range newCowList {
  140. newWorkOrderList = append(newWorkOrderList, model.NewWorkOrderList(name, newWorkOrderCalendar.Id, cow.Id))
  141. }
  142. if err := tx.Create(newWorkOrderList).Error; err != nil {
  143. return xerr.WithStack(err)
  144. }
  145. return nil
  146. }); err != nil {
  147. return xerr.WithStack(err)
  148. }
  149. return nil
  150. }
  151. func (e *Entry) getWorkOrderCalendar(name string) []*model.WorkOrderCalendar {
  152. res := make([]*model.WorkOrderCalendar, 0)
  153. if err := e.DB.Where("name = ?", name).
  154. Where("is_show = ?", pasturePb.IsShow_Ok).
  155. Find(&res).Error; err != nil {
  156. zaplog.Error("getWorkOrderCalendar", zap.Any("err", err))
  157. }
  158. return res
  159. }