pen_behavior_day.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package model
  2. import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  3. type PenBehaviorDay struct {
  4. Id int64 `json:"id"`
  5. PastureId int64 `json:"pastureId"`
  6. HeatDate string `json:"heatDate"`
  7. PenId int32 `json:"penId"`
  8. PenName string `json:"penName"`
  9. CowCount int32 `json:"cowCount"`
  10. DayMilk float32 `json:"dayMilk"`
  11. DayHigh int32 `json:"dayHigh"`
  12. DayRumina int32 `json:"dayRumina"`
  13. DayIntake int32 `json:"dayIntake"`
  14. DayInactive int32 `json:"dayInactive"`
  15. DayGasp int32 `json:"dayGasp"`
  16. DayActive int32 `json:"dayActive"`
  17. WeekMilk float32 `json:"weekMilk"`
  18. RuminaStd float64 `json:"ruminaStd"`
  19. CreatedAt int64 `json:"createdAt"`
  20. UpdatedAt int64 `json:"updatedAt"`
  21. }
  22. func (p *PenBehaviorDay) TableName() string {
  23. return "pen_behavior_day"
  24. }
  25. func NewPenBehaviorDay(pastureId int64, heatDate string, penId int32, penName string, cowCount int32, dayAvgMilk float32,
  26. dayHigh int32, dayRumina int32, dayIntake int32, dayInactive int32, dayGasp int32, dayActive int32, weekAvgMilk float32,
  27. ruminaStd float64) *PenBehaviorDay {
  28. return &PenBehaviorDay{
  29. PastureId: pastureId,
  30. HeatDate: heatDate,
  31. PenId: penId,
  32. PenName: penName,
  33. CowCount: cowCount,
  34. DayMilk: dayAvgMilk,
  35. DayHigh: dayHigh,
  36. DayRumina: dayRumina,
  37. DayIntake: dayIntake,
  38. DayInactive: dayInactive,
  39. DayGasp: dayGasp,
  40. DayActive: dayActive,
  41. WeekMilk: weekAvgMilk,
  42. RuminaStd: ruminaStd,
  43. }
  44. }
  45. type PenBehaviorDaySlice []*PenBehaviorDay
  46. type PenBehaviorDayModel struct {
  47. HeatDate string `json:"heatDate"`
  48. PenId int32 `json:"penId"`
  49. PenName string `json:"penName"`
  50. CowCount int32 `json:"cowCount"`
  51. DayMilk float32 `json:"dayMilk"`
  52. DayHigh int32 `json:"dayHigh"`
  53. DayRumina int32 `json:"dayRumina"`
  54. DayIntake int32 `json:"dayIntake"`
  55. DayInactive int32 `json:"dayInactive"`
  56. DayChew int32 `json:"dayChew"`
  57. DayActive int32 `json:"dayActive"`
  58. DayImmobility int32 `json:"dayImmobility"`
  59. RuminaStd float64 `json:"ruminaStd"`
  60. }
  61. type PenBehaviorDayModelSlice []*PenBehaviorDayModel
  62. func (p PenBehaviorDayModelSlice) ToPB(dataTimeRange, headers []string, behaviorKind pasturePb.Behavior_Kind) *BarnMonitorItem {
  63. res := &BarnMonitorItem{
  64. Headers: headers,
  65. DateTime: dataTimeRange,
  66. DataList: make([][]int32, len(headers)),
  67. }
  68. // 预分配内存
  69. for i := range res.DataList {
  70. res.DataList[i] = make([]int32, len(dataTimeRange))
  71. }
  72. // 创建日期到索引的映射,避免重复查找
  73. dateIndexMap := make(map[string]int, len(dataTimeRange))
  74. for i, dt := range dataTimeRange {
  75. dateIndexMap[dt] = i
  76. }
  77. // 创建牛舍名称到索引的映射
  78. headerIndexMap := make(map[string]int, len(headers))
  79. for i, h := range headers {
  80. headerIndexMap[h] = i
  81. }
  82. if behaviorKind == pasturePb.Behavior_Invalid {
  83. // 使用映射优化查找
  84. for _, v := range p {
  85. if dateIdx, exists := dateIndexMap[v.HeatDate]; exists {
  86. for i, header := range headers {
  87. switch header {
  88. case "反刍":
  89. res.DataList[i][dateIdx] = v.DayRumina
  90. case "采食":
  91. res.DataList[i][dateIdx] = v.DayIntake
  92. case "休息":
  93. res.DataList[i][dateIdx] = v.DayInactive
  94. case "咀嚼":
  95. res.DataList[i][dateIdx] = v.DayChew
  96. case "静止":
  97. res.DataList[i][dateIdx] = v.DayImmobility
  98. case "方差":
  99. res.DataList[i][dateIdx] = int32(v.RuminaStd)
  100. }
  101. }
  102. }
  103. }
  104. } else {
  105. // 使用映射优化查找
  106. for _, v := range p {
  107. if dateIdx, exists := dateIndexMap[v.HeatDate]; exists {
  108. if headerIdx, exists := headerIndexMap[v.PenName]; exists {
  109. switch behaviorKind {
  110. case pasturePb.Behavior_Rumina:
  111. res.DataList[headerIdx][dateIdx] = v.DayRumina
  112. case pasturePb.Behavior_Intake:
  113. res.DataList[headerIdx][dateIdx] = v.DayIntake
  114. case pasturePb.Behavior_Reset:
  115. res.DataList[headerIdx][dateIdx] = v.DayInactive
  116. case pasturePb.Behavior_Immobility:
  117. res.DataList[headerIdx][dateIdx] = v.DayImmobility
  118. case pasturePb.Behavior_Chew:
  119. res.DataList[headerIdx][dateIdx] = v.DayChew
  120. }
  121. }
  122. }
  123. }
  124. }
  125. return res
  126. }
  127. type BarnMonitorResponse struct {
  128. Code int32 `json:"code"`
  129. Msg string `json:"msg"`
  130. Data *BarnMonitorItem `json:"data"`
  131. }
  132. type BarnMonitorItem struct {
  133. DateTime []string `json:"dateTime"`
  134. Headers []string `json:"headers"`
  135. DataList [][]int32 `json:"dataList"`
  136. }