package model import ( "fmt" "sort" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" ) type IndicatorsData struct { Id int64 `json:"id"` PastureId int64 `json:"pastureId"` CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"` CategoryName string `json:"categoryName"` Date string `json:"date"` Kind string `json:"kind"` Value string `json:"value"` CreatedAt int64 `json:"createdAt"` UpdatedAt int64 `json:"updatedAt"` } func (d *IndicatorsData) TableName() string { return "indicators_data" } type IndicatorsDataSlice []*IndicatorsData func (i IndicatorsDataSlice) ToPB(detailsMap map[string]*IndicatorsDetails) *IndicatorComparison { res := &IndicatorComparison{ Headers: make([]string, 0), List: make([]map[string]string, 0), } dateSet := make(map[string]struct{}) // 使用空结构体节省内存 for _, v := range i { dateSet[v.Date] = struct{}{} } for date := range dateSet { res.Headers = append(res.Headers, date) } sort.Strings(res.Headers) // 确保日期顺序一致 dataMap := make(map[string]map[string]string) for _, v := range i { details, ok := detailsMap[v.Kind] if !ok { zaplog.Error("detailsMap", zap.Any("Kind", v.Kind)) continue } if data, exists := dataMap[details.Kind]; exists { data[v.Date] = v.Value } else { data = make(map[string]string) for _, date := range res.Headers { data[date] = "" // 初始化所有日期为空字符串 } data[v.Date] = v.Value data["name"] = details.Name data["kind"] = details.Kind data["unit"] = details.Unit data["categoryType"] = fmt.Sprintf("%d", details.CategoryType) data["categoryName"] = details.CategoryName data["zh"] = details.Zh dataMap[details.Kind] = data } } for _, data := range dataMap { res.List = append(res.List, data) } return res } type IndicatorsComparisonResponse struct { Code int32 `json:"code"` Msg string `json:"msg"` Data *IndicatorComparison `json:"data"` } type IndicatorComparison struct { Headers []string `json:"headers"` List []map[string]string `json:"list"` }