pen_behavior.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/model"
  5. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  6. "go.uber.org/zap"
  7. )
  8. // PenBehavior 栏舍行为曲线
  9. func (e *Entry) PenBehavior(pastureId int64, processIds []int64) {
  10. neckRingOriginalList := make([]*model.NeckRingOriginal, 0)
  11. if err := e.DB.Model(new(model.NeckRingOriginal)).
  12. Where("id IN (?)", processIds).
  13. Where("pasture_id = ?", pastureId).
  14. Order("heat_date,neck_ring_number,frameid").
  15. Find(&neckRingOriginalList).Error; err != nil {
  16. zaplog.Error("PenBehavior", zap.Any("error", err), zap.Any("processIds", processIds))
  17. }
  18. cowIds := make([]int64, 0)
  19. for _, v := range neckRingOriginalList {
  20. cowIds = append(cowIds, v.Id)
  21. }
  22. cowInfoList, err := e.GetCowByIds(pastureId, cowIds)
  23. if err != nil {
  24. zaplog.Error("PenBehavior", zap.Any("error", err), zap.Any("cowIds", cowIds))
  25. return
  26. }
  27. cowMap := make(map[string]*model.Cow)
  28. for _, v := range cowInfoList {
  29. if v.NeckRingNumber == "" {
  30. continue
  31. }
  32. cowMap[v.NeckRingNumber] = v
  33. }
  34. penData := make(map[string]*model.PenBehaviorData)
  35. for _, v := range neckRingOriginalList {
  36. cowInfo, ok := cowMap[v.NeckRingNumber]
  37. if !ok {
  38. zaplog.Error("PenBehavior", zap.Any("error", err), zap.Any("neckRingNumber", v.NeckRingNumber))
  39. continue
  40. }
  41. key := fmt.Sprintf("%s_%d_%d", v.ActiveDate, cowInfo.PenId, v.Frameid)
  42. if penData[key] == nil {
  43. penData[key] = &model.PenBehaviorData{
  44. PastureId: pastureId,
  45. PenId: cowInfo.PenId,
  46. PenName: cowInfo.PenName,
  47. HeatDate: v.ActiveDate,
  48. Frameid: v.Frameid,
  49. CowCount: 1,
  50. AvgHigh: v.High,
  51. }
  52. } else {
  53. penData[key].CowCount++
  54. penData[key].AvgHigh += v.High
  55. penData[key].SumRumina += ifThenElse(v.Rumina >= 8, 1, 0)
  56. penData[key].SumIntake += ifThenElse(v.Intake >= 8, 1, 0)
  57. penData[key].SumRest += ifThenElse(v.Inactive >= 8, 1, 0)
  58. penData[key].SumGasp += ifThenElse(v.Gasp >= 8, 1, 0)
  59. }
  60. }
  61. // 计算平均值
  62. for _, data := range penData {
  63. data.AvgHigh = data.AvgHigh / data.CowCount
  64. }
  65. }
  66. func ifThenElse(condition bool, a, b int32) int32 {
  67. if condition {
  68. return a
  69. }
  70. return b
  71. }