work_cron.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package crontab
  2. import (
  3. "encoding/json"
  4. "kpt-pasture/model"
  5. "kpt-pasture/util"
  6. "sort"
  7. "time"
  8. "gorm.io/gorm"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  11. "go.uber.org/zap"
  12. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  13. )
  14. // GenerateCalendarBySameTimePlan 生成同期计划的牛只
  15. func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) (err error) {
  16. if len(cowList) <= 0 {
  17. return nil
  18. }
  19. newCowList := make([]*model.Cow, 0)
  20. for _, cow := range cowList {
  21. if ok := e.IsExistSameTimeCow(cow, sameTime); ok {
  22. continue
  23. }
  24. newCowList = append(newCowList, cow)
  25. }
  26. if len(newCowList) <= 0 || len(sameTime.CollateNodes) <= 0 {
  27. return nil
  28. }
  29. collateNodes := make([]*pasturePb.CollateNode, 0)
  30. err = json.Unmarshal([]byte(sameTime.CollateNodes), &collateNodes)
  31. if err != nil {
  32. return xerr.WithStack(err)
  33. }
  34. // 排序
  35. sort.Slice(collateNodes, func(i, j int) bool {
  36. return collateNodes[i].Id < collateNodes[j].Id
  37. })
  38. showDay := time.Now().Local()
  39. nextDays := int32(0)
  40. newSameTimeCowDetailList := make([]*model.EventCowSameTime, 0)
  41. newEventMatingList := make([]*model.EventMating, 0)
  42. for i, collateNode := range collateNodes {
  43. nextDays = collateNode.NextNodeDay
  44. if i > 0 {
  45. showDay = showDay.AddDate(0, 0, int(nextDays))
  46. }
  47. calendarType := pasturePb.CalendarType_PG
  48. histCount := int64(0)
  49. // 获取当天的零点时间戳
  50. planTimeFormat := showDay.Format(model.LayoutDate2)
  51. planTimeZeroTime := util.TimeParseLocalUnix(planTimeFormat)
  52. if collateNode.SameTimeType == pasturePb.SameTimeType_TAI {
  53. calendarType = pasturePb.CalendarType_Mating
  54. histCount = e.GetTowardTaiCowSum(sameTime.PastureId)
  55. newEventMatingItems := model.NewEventMatingList(sameTime.PastureId, newCowList, planTimeZeroTime, pasturePb.ExposeEstrusType_Same_Time)
  56. newEventMatingList = append(newEventMatingList, newEventMatingItems...)
  57. } else {
  58. if collateNode.SameTimeType == pasturePb.SameTimeType_RnGH {
  59. calendarType = pasturePb.CalendarType_RnGH
  60. }
  61. histCount = e.GetTowardSameTimeCowSum(sameTime, collateNode.SameTimeType)
  62. newEventCowSameTimeList := model.NewEventCowSameTimeList(sameTime.PastureId, newCowList, sameTime, planTimeZeroTime, collateNode.SameTimeType)
  63. newSameTimeCowDetailList = append(newSameTimeCowDetailList, newEventCowSameTimeList...)
  64. }
  65. allCount := int32(len(newCowList)) + int32(histCount)
  66. e.CreatedCalendar(sameTime.PastureId, calendarType, showDay.Format(model.LayoutDate2), showDay.Format(model.LayoutDate2), allCount)
  67. }
  68. zaplog.Info("GenerateCalendarBySameTimePlan",
  69. zap.Any("cowList", cowList),
  70. zap.Any("newSameTimeCowDetailList", newSameTimeCowDetailList),
  71. zap.Any("newEventMatingList", newEventMatingList),
  72. )
  73. if err = e.DB.Transaction(func(tx *gorm.DB) error {
  74. // 创建牛只同期详情表
  75. if len(newSameTimeCowDetailList) > 0 {
  76. if err = tx.Create(newSameTimeCowDetailList).Error; err != nil {
  77. return xerr.WithStack(err)
  78. }
  79. }
  80. // 创建牛只配种表
  81. if len(newEventMatingList) > 0 {
  82. if err = tx.Create(newEventMatingList).Error; err != nil {
  83. return xerr.WithStack(err)
  84. }
  85. }
  86. return nil
  87. }); err != nil {
  88. return xerr.WithStack(err)
  89. }
  90. return nil
  91. }
  92. // GetTowardSameTimeCowSum 获取历史未打激素牛只总数量
  93. func (e *Entry) GetTowardSameTimeCowSum(sameTime *model.SameTime, sameTimeType pasturePb.SameTimeType_Kind) int64 {
  94. res := int64(0)
  95. if err := e.DB.Model(&model.EventCowSameTime{}).
  96. Where("status = ?", pasturePb.IsShow_No).
  97. Where("pasture_id = ?", sameTime.PastureId).
  98. Where("same_time_id = ?", sameTime.Id).
  99. Where("same_time_type = ?", sameTimeType).
  100. Count(&res).Error; err != nil {
  101. zaplog.Error("GetTowardSameTimeCowSum", zap.Any("err", err))
  102. }
  103. return res
  104. }
  105. // GetTowardTaiCowSum 获取历史未配种牛只总数量
  106. func (e *Entry) GetTowardTaiCowSum(pastureId int64) int64 {
  107. res := int64(0)
  108. if err := e.DB.Model(&model.EventMating{}).
  109. Where("pasture_id = ?", pastureId).
  110. Where("status = ?", pasturePb.IsShow_No).
  111. Count(&res).Error; err != nil {
  112. zaplog.Error("GetTowardTaiCowSum", zap.Any("err", err))
  113. }
  114. return res
  115. }