package model import ( "fmt" "sort" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" ) const ( AllCow = "all_cow" // 全群牛头数 AdultCow = "adult_cow" // 成母牛头数 AvgCalvingInterval = "avg_calving_interval" // 产犊间隔 OutputNumber = "output_number" // 出栏量(销售) InputNumber = "input_number" // 入栏量(购入) SalesVolume = "sales_volume" // 销售额 FattenCattleNumber = "fatten_cattle_number" // 育肥牛头数 CalvingNumber = "calving_number" // 产犊事件总数 AdultAbortionRate = "adult_abortion_rate" //成母牛流产率(全) YouthAbortionRate = "youth_abortion_rate" //青年年流产率(全) AllDieNumber = "all_die_number" DiseaseNumber = "disease_number" CureNumber = "cure_number" OutNumber = "out_number" CalfDieNumber = "calf_die_number" LactationCow = "lactation_cow" DryMilkCow = "dry_milk_cow" // 干奶牛头数 ReserveCow = "reserve_cow" // 后备牛头数 FirstBornSurvivalRate = "first_born_survival_rate" // 头胎牛接产成活率 FirstBornDeathRate = "first_born_death_rate" // 头胎牛接产死亡率 MultiparitySurvivalRate = "multiparity_survival_rate" // 成母牛接产成活率 MultiparityDeathRate = "multiparity_death_rate" // 成母牛接产死亡率 AvgAgeFirstMate = "avg_age_first_mate" // 平均首配日龄 YouthPregnantRate = "youth_pregnant_rate" // 后备牛怀孕率 MultiparityPregnantRate = "multiparity_pregnant_rate" // 成母牛怀孕率 MultipartyFirstCheckRate = "multiparty_first_check_rate" //成母牛初检有胎率 MultipartySecondCheckRate = "multiparty_second_check_rate" // 成母牛复检有胎率 YouthFirstCheckRate = "youth_first_check_rate" // 后备牛初检有胎率 YouthSecondCheckRate = "youth_second_check_rate" // 后备牛复检有胎率 ForbiddenCowNumber = "forbidden_cow_number" // 禁配牛总数 AvgRegistrationDays = "avg_registration_days" // 平均配准天数 AvgPregnancyDays = "avg_pregnancy_days" // 平均怀孕天数 AvgGestationalAge = "avg_gestational_age" // 平均受孕日龄 Month17UnPregnancyRate = "month17_un_pregnancy_rate" // 17月未孕比例 Month20UnPregnancyRate = "month20_un_pregnancy_rate" // 20月未孕比例 Multiparty150DaysUnPregnancyRate = "multiparty_150_days_un_pregnancy_rate" // 成母牛150天未孕比例 MultipartyAbortionNumber = "multiparty_abortion_number" // 成母牛流产头数 MultipartyAbortionRate = "multiparty_abortion_rate" // 成母牛流产率(全) MultipartyPregnancyNumber = "multiparty_pregnancy_number" // 成母牛怀孕头数 MultipartyOutNumber = "multiparty_out_number" // 成母牛淘汰头数 MultipartyDieNumber = "multiparty_die_number" // 成母牛死亡头数 Calving60DieRate = "calving60_die_rate" // 产后60天死亡率 Calving60OutRate = "calving60_out_rate" // 产后60天淘汰率 AvgDepartureWeight = "avg_departure_weight" // 出栏均重 AvgSlaughterCycle = "avg_slaughter_cycle" // 平均出栏周期 SurvivalLiveRate = "survival_live_rate" // 接产成活率 StillbirthRate = "stillbirth_rate" // 死胎率 FemaleCalfRate = "female_calf_rate" // 母犊率 WeaningDailyWeight = "weaning_daily_weight" // 断奶日增重 Day60DieRate = "day60_die_rate" // 60日龄死亡率 AdultPrematureBirthRate = "adult_premature_birth_rate" // 成母牛早产率 YouthPrematureBirthRate = "youth_premature_birth_rate" // 青年牛早产率 ) 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"` }