neck_ring_estrus_warning.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package model
  2. import (
  3. "kpt-pasture/util"
  4. "time"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. )
  7. type NeckRingEstrusWarning struct {
  8. Id int64 `json:"id"`
  9. NeckRingEstrusId int64 `json:"neckRingEstrusId"`
  10. PastureId int64 `json:"pastureId"`
  11. CowId int64 `json:"cowId"`
  12. EarNumber string `json:"earNumber"`
  13. NeckRingNumber string `json:"neckRingNumber"`
  14. FirstTime string `json:"firstTime"`
  15. DateTime string `json:"dateTime"`
  16. LastTime string `json:"lastTime"`
  17. IsPeak pasturePb.IsShow_Kind `json:"isPeak"`
  18. WarningKind pasturePb.Warning_Kind `json:"warningKind"`
  19. Level pasturePb.EstrusLevel_Kind `json:"level"`
  20. HighChange string `json:"highChange"`
  21. IsShow pasturePb.IsShow_Kind `json:"isShow"`
  22. CreatedAt int64 `json:"createdAt"`
  23. UpdatedAt int64 `json:"updatedAt"`
  24. }
  25. func (n *NeckRingEstrusWarning) TableName() string {
  26. return "neck_ring_estrus_warning"
  27. }
  28. func NewNeckRingEstrusWarning(
  29. neckRingEstrusId, pastureId, cowId int64,
  30. earNumber, neckRingNumber, firstTime, dateTime, lastTime string,
  31. warningKind pasturePb.Warning_Kind,
  32. level pasturePb.EstrusLevel_Kind,
  33. ) *NeckRingEstrusWarning {
  34. return &NeckRingEstrusWarning{
  35. NeckRingEstrusId: neckRingEstrusId,
  36. PastureId: pastureId,
  37. CowId: cowId,
  38. EarNumber: earNumber,
  39. NeckRingNumber: neckRingNumber,
  40. FirstTime: firstTime,
  41. DateTime: dateTime,
  42. LastTime: lastTime,
  43. WarningKind: warningKind,
  44. Level: level,
  45. IsShow: pasturePb.IsShow_Ok,
  46. }
  47. }
  48. // calculatePzHour 计算最佳配置时间
  49. func (n *NeckRingEstrusWarning) calculatePzHour(lact int32) time.Time {
  50. var pzHour time.Time
  51. dateTime, _ := util.TimeParseLocal(LayoutTime, n.DateTime)
  52. firstTime, _ := util.TimeParseLocal(LayoutTime, n.FirstTime)
  53. // 条件判断
  54. if n.IsPeak == pasturePb.IsShow_Ok || dateTime.Sub(firstTime).Hours() >= 8 {
  55. pzHour = dateTime.Add(8 * time.Hour) // v.datetime + INTERVAL 8 HOUR
  56. } else {
  57. pzHour = firstTime.Add(16 * time.Hour) // v.firsttime + INTERVAL 16 HOUR
  58. }
  59. // 胎次调整
  60. if lact >= 3 {
  61. pzHour = pzHour.Add(-1 * time.Hour) // 减去 1 小时
  62. }
  63. return pzHour
  64. }
  65. type NeckRingEstrusWarningSlice []*NeckRingEstrusWarning
  66. func (n NeckRingEstrusWarningSlice) ToPB(cowMap map[int64]*Cow, eventLogMap map[int64]string) []*pasturePb.EstrusItem {
  67. res := make([]*pasturePb.EstrusItem, len(n))
  68. for i, v := range n {
  69. cow, ok := cowMap[v.CowId]
  70. if !ok {
  71. cow = &Cow{Id: v.CowId}
  72. }
  73. lastBreedEventDetails := ""
  74. desc, ok := eventLogMap[cow.Id]
  75. if ok {
  76. lastBreedEventDetails = desc
  77. }
  78. pzHour := v.calculatePzHour(cow.Lact)
  79. estrusInterval := int32(0)
  80. if v.LastTime != "" {
  81. lastTime, _ := util.TimeParseLocal(LayoutTime, v.LastTime)
  82. diff := pzHour.Sub(lastTime)
  83. estrusInterval = int32(diff.Hours() / 24)
  84. }
  85. res[i] = &pasturePb.EstrusItem{
  86. Id: int32(v.Id),
  87. CowId: int32(v.CowId),
  88. EarNumber: v.EarNumber,
  89. PenId: cow.PenId,
  90. PenName: cow.PenName,
  91. MatingTimes: cow.MatingTimes,
  92. Lact: cow.Lact,
  93. CalvingAge: cow.CalvingAge,
  94. AbortionAge: cow.AbortionAge,
  95. OptimumMatingStartTime: pzHour.Add(-4 * time.Hour).Format(LayoutTime),
  96. OptimumMatingEndTime: pzHour.Add(4 * time.Hour).Format(LayoutTime),
  97. LastBreedEventDetails: lastBreedEventDetails,
  98. Level: v.Level,
  99. EstrusInterval: estrusInterval,
  100. BestMatingTime: pzHour.Format(LayoutTime),
  101. EstrusStartTime: pzHour.Add(-8 * time.Hour).Format(LayoutTime),
  102. EstrusEndTime: pzHour.Add(8 * time.Hour).Format(LayoutTime),
  103. }
  104. }
  105. return res
  106. }
  107. const (
  108. Nb1 = 12
  109. Nb2 = 8
  110. MinNb1 = 10
  111. )
  112. type EstrusWarning struct {
  113. NeckRingEstrusId int64 `json:"neckRingEstrusId"`
  114. HighChange string `json:"highChange"`
  115. CowId int64 `json:"cowId"`
  116. DateTime string `json:"dateTime"`
  117. Nb1 int32 `json:"nb1"`
  118. Nb2 int32 `json:"nb2"`
  119. }
  120. type DashboardNeckRingEstrusWarning struct {
  121. Level pasturePb.EstrusLevel_Kind
  122. Count int32
  123. }