package model import ( "fmt" "sort" 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(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison { res := &IndicatorComparison{ Headers: header, List: make([]map[string]string, 0), } if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 { return res } sort.Strings(res.Headers) // 确保日期顺序一致 indicatorsDataMap := make(map[string]*IndicatorsData) for _, v := range i { indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v } dataMap := make(map[string]map[string]string) for _, kind := range kinds { if dataMap[kind] == nil { dataMap[kind] = make(map[string]string) } details := detailsMap[kind] dataMap[kind] = map[string]string{ "name": details.Name, "kind": details.Kind, "unit": details.Unit, "categoryType": fmt.Sprintf("%d", details.CategoryType), "categoryName": details.CategoryName, "zh": details.Zh, } for _, v := range header { pref := fmt.Sprintf("%s-%s", kind, v) indicators, ok := indicatorsDataMap[pref] if ok { dataMap[kind][v] = indicators.Value } else { dataMap[kind][v] = "" } } } 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"` }