| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | package modelimport 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 []*PenBehaviorDaytype 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 []*PenBehaviorDayModelfunc (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"`}
 |