cow_weekly.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/model"
  5. "math"
  6. "sort"
  7. "time"
  8. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  9. "go.uber.org/zap"
  10. )
  11. // UpdateCowWeeklyHigh 更新牛只周活动量
  12. func (e *Entry) UpdateCowWeeklyHigh(pastureId int64, cow *model.Cow) int32 {
  13. highData, err := e.GetSystemNeckRingConfigure(pastureId, model.High)
  14. if err != nil || highData == nil || highData.Value <= 0 {
  15. return 0
  16. }
  17. minWeeklyActive, er := e.GetSystemNeckRingConfigure(pastureId, model.MinWeeklyActive)
  18. if er != nil || minWeeklyActive == nil || minWeeklyActive.Value <= 0 {
  19. return 0
  20. }
  21. weeklyActiveModelList := make([]*model.WeeklyActiveModel, 0)
  22. nowTime := time.Now().Local()
  23. startTime := nowTime.AddDate(0, 0, -7).Format(model.LayoutDate2)
  24. endTime := nowTime.AddDate(0, 0, -1).Format(model.LayoutDate2)
  25. selectStr := fmt.Sprintf(`cow_id,heat_date,count(1) AS nb,IF(ROUND(AVG(high))>%d, ROUND(AVG(high)), %d) AS high`, minWeeklyActive.Value, minWeeklyActive.Value)
  26. if err = e.DB.Model(new(model.NeckActiveHabit)).
  27. Select(selectStr).
  28. Where("pasture_id = ?", pastureId).
  29. Where("cow_id = ?", cow.Id).
  30. Where("heat_date BETWEEN ? AND ?", startTime, endTime).
  31. Where("high > ?", highData.Value).
  32. Having("nb > ?", 8).
  33. Order("high").
  34. Group("heat_date").
  35. Find(&weeklyActiveModelList).Error; err != nil {
  36. zaplog.Error("crontab", zap.Any("UpdateCowWeeklyHigh", err))
  37. return 0
  38. }
  39. if len(weeklyActiveModelList) < 3 {
  40. return 0
  41. }
  42. // 1. 先按High值排序
  43. sort.Slice(weeklyActiveModelList, func(i, j int) bool {
  44. return weeklyActiveModelList[i].High < weeklyActiveModelList[j].High
  45. })
  46. countHigh := len(weeklyActiveModelList)
  47. sumHigh := int32(0)
  48. minHigh := weeklyActiveModelList[0].High
  49. maxHigh := weeklyActiveModelList[countHigh-1].High
  50. for _, v := range weeklyActiveModelList {
  51. sumHigh += v.High
  52. }
  53. diff := 0
  54. x := int32(0)
  55. if countHigh > 3 {
  56. diff = 3
  57. x = weeklyActiveModelList[1].High
  58. } else if countHigh == 3 {
  59. diff = 2
  60. } else {
  61. return 0
  62. }
  63. avgHigh := float64(sumHigh-minHigh-maxHigh-x) / float64(countHigh-diff)
  64. return int32(math.Round(avgHigh))
  65. }