package model import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" type PenBehaviorDay struct { Id int64 `json:"id"` PastureId int64 `json:"pastureId"` HeatDate string `json:"heatDate"` PenId int32 `json:"penId"` PenName string `json:"penName"` CowCount int32 `json:"cowCount"` DayMilk float32 `json:"dayMilk"` DayHigh int32 `json:"dayHigh"` DayRumina int32 `json:"dayRumina"` DayIntake int32 `json:"dayIntake"` DayInactive int32 `json:"dayInactive"` DayGasp int32 `json:"dayGasp"` DayActive int32 `json:"dayActive"` WeekMilk float32 `json:"weekMilk"` RuminaStd float64 `json:"ruminaStd"` CreatedAt int64 `json:"createdAt"` UpdatedAt int64 `json:"updatedAt"` } func (p *PenBehaviorDay) TableName() string { return "pen_behavior_day" } func NewPenBehaviorDay(pastureId int64, heatDate string, penId int32, penName string, cowCount int32, dayAvgMilk float32, dayHigh int32, dayRumina int32, dayIntake int32, dayInactive int32, dayGasp int32, dayActive int32, weekAvgMilk float32, ruminaStd float64) *PenBehaviorDay { return &PenBehaviorDay{ PastureId: pastureId, HeatDate: heatDate, PenId: penId, PenName: penName, CowCount: cowCount, DayMilk: dayAvgMilk, DayHigh: dayHigh, DayRumina: dayRumina, DayIntake: dayIntake, DayInactive: dayInactive, DayGasp: dayGasp, DayActive: dayActive, WeekMilk: weekAvgMilk, RuminaStd: ruminaStd, } } type PenBehaviorDaySlice []*PenBehaviorDay type PenBehaviorDayModel struct { HeatDate string `json:"heatDate"` PenId int32 `json:"penId"` PenName string `json:"penName"` CowCount int32 `json:"cowCount"` DayMilk float32 `json:"dayMilk"` DayHigh int32 `json:"dayHigh"` DayRumina int32 `json:"dayRumina"` DayIntake int32 `json:"dayIntake"` DayInactive int32 `json:"dayInactive"` DayChew int32 `json:"dayChew"` DayActive int32 `json:"dayActive"` DayImmobility int32 `json:"dayImmobility"` RuminaStd float64 `json:"ruminaStd"` } type PenBehaviorDayModelSlice []*PenBehaviorDayModel func (p PenBehaviorDayModelSlice) ToPB(dataTimeRange, headers []string, behaviorKind pasturePb.Behavior_Kind) *BarnMonitorItem { res := &BarnMonitorItem{ Headers: headers, DateTime: dataTimeRange, DataList: make([][]int32, len(headers)), } // 预分配内存 for i := range res.DataList { res.DataList[i] = make([]int32, len(dataTimeRange)) } // 创建日期到索引的映射,避免重复查找 dateIndexMap := make(map[string]int, len(dataTimeRange)) for i, dt := range dataTimeRange { dateIndexMap[dt] = i } // 创建牛舍名称到索引的映射 headerIndexMap := make(map[string]int, len(headers)) for i, h := range headers { headerIndexMap[h] = i } if behaviorKind == pasturePb.Behavior_Invalid { // 使用映射优化查找 for _, v := range p { if dateIdx, exists := dateIndexMap[v.HeatDate]; exists { for i, header := range headers { switch header { case "反刍": res.DataList[i][dateIdx] = v.DayRumina case "采食": res.DataList[i][dateIdx] = v.DayIntake case "休息": res.DataList[i][dateIdx] = v.DayInactive case "咀嚼": res.DataList[i][dateIdx] = v.DayChew case "静止": res.DataList[i][dateIdx] = v.DayImmobility case "方差": res.DataList[i][dateIdx] = int32(v.RuminaStd) } } } } } else { // 使用映射优化查找 for _, v := range p { if dateIdx, exists := dateIndexMap[v.HeatDate]; exists { if headerIdx, exists := headerIndexMap[v.PenName]; exists { switch behaviorKind { case pasturePb.Behavior_Rumina: res.DataList[headerIdx][dateIdx] = v.DayRumina case pasturePb.Behavior_Intake: res.DataList[headerIdx][dateIdx] = v.DayIntake case pasturePb.Behavior_Reset: res.DataList[headerIdx][dateIdx] = v.DayInactive case pasturePb.Behavior_Immobility: res.DataList[headerIdx][dateIdx] = v.DayImmobility case pasturePb.Behavior_Chew: res.DataList[headerIdx][dateIdx] = v.DayChew } } } } } return res } type BarnMonitorResponse struct { Code int32 `json:"code"` Msg string `json:"msg"` Data *BarnMonitorItem `json:"data"` } type BarnMonitorItem struct { DateTime []string `json:"dateTime"` Headers []string `json:"headers"` DataList [][]int32 `json:"dataList"` }