indicators_data.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package model
  2. import (
  3. "fmt"
  4. "sort"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. )
  7. const (
  8. AllCow = "all_cow" // 全群牛头数
  9. AdultCow = "adult_cow" // 成母牛头数
  10. AvgCalvingInterval = "avg_calving_interval" // 产犊间隔
  11. OutputNumber = "output_number" // 出栏量(销售)
  12. InputNumber = "input_number" // 入栏量(购入)
  13. SalesVolume = "sales_volume" // 销售额
  14. FattenCattleNumber = "fatten_cattle_number" // 育肥牛头数
  15. CalvingNumber = "calving_number" // 产犊事件总数
  16. YouthAbortionRate = "youth_abortion_rate" // 青年年流产率(全)
  17. AllDieNumber = "all_die_number" // 全群牛死亡数
  18. DiseaseNumber = "disease_number" // 发病头数
  19. CureNumber = "cure_number" // 治愈头数
  20. OutNumber = "out_number" // 淘汰头数
  21. CalfDieNumber = "calf_die_number" // 犊牛死亡头数
  22. LactationCow = "lactation_cow" // 泌乳牛头数
  23. DryMilkCow = "dry_milk_cow" // 干奶牛头数
  24. ReserveCow = "reserve_cow" // 后备牛头数
  25. FirstBornSurvivalRate = "first_born_survival_rate" // 头胎牛接产成活率
  26. FirstBornDeathRate = "first_born_death_rate" // 头胎牛接产死亡率
  27. MultiparitySurvivalRate = "multiparity_survival_rate" // 成母牛接产成活率
  28. MultiparityDeathRate = "multiparity_death_rate" // 成母牛接产死亡率
  29. AvgAgeFirstMate = "avg_age_first_mate" // 平均首配日龄
  30. YouthPregnantRate = "youth_pregnant_rate" // 后备牛怀孕率
  31. MultiparityPregnantRate = "multiparity_pregnant_rate" // 成母牛怀孕率
  32. MultipartyFirstCheckRate = "multiparty_first_check_rate" //成母牛初检有胎率
  33. MultipartySecondCheckRate = "multiparty_second_check_rate" // 成母牛复检有胎率
  34. YouthFirstCheckRate = "youth_first_check_rate" // 后备牛初检有胎率
  35. YouthSecondCheckRate = "youth_second_check_rate" // 后备牛复检有胎率
  36. ForbiddenCowNumber = "forbidden_cow_number" // 禁配牛总数
  37. AvgRegistrationDays = "avg_registration_days" // 平均配准天数
  38. AvgPregnancyDays = "avg_pregnancy_days" // 平均怀孕天数
  39. AvgGestationalAge = "avg_gestational_age" // 平均受孕日龄
  40. Month17UnPregnancyRate = "month17_un_pregnancy_rate" // 17月未孕比例
  41. Month20UnPregnancyRate = "month20_un_pregnancy_rate" // 20月未孕比例
  42. Multiparty150DaysUnPregnancyRate = "multiparty_150_days_un_pregnancy_rate" // 成母牛150天未孕比例
  43. MultipartyAbortionNumber = "multiparty_abortion_number" // 成母牛流产头数
  44. MultipartyAbortionRate = "multiparty_abortion_rate" // 成母牛流产率(全)
  45. MultipartyPregnancyNumber = "multiparty_pregnancy_number" // 成母牛怀孕头数
  46. MultipartyOutNumber = "multiparty_out_number" // 成母牛淘汰头数
  47. MultipartyDieNumber = "multiparty_die_number" // 成母牛死亡头数
  48. Calving60DieRate = "calving60_die_rate" // 产后60天死亡率
  49. Calving60OutRate = "calving60_out_rate" // 产后60天淘汰率
  50. AvgDepartureWeight = "avg_departure_weight" // 出栏均重
  51. AvgSlaughterCycle = "avg_slaughter_cycle" // 平均出栏周期
  52. SurvivalLiveRate = "survival_live_rate" // 接产成活率
  53. StillbirthRate = "stillbirth_rate" // 死胎率
  54. FemaleCalfRate = "female_calf_rate" // 母犊率
  55. WeaningDailyWeight = "weaning_daily_weight" // 断奶日增重
  56. Day60DieRate = "day60_die_rate" // 60日龄死亡率
  57. AdultPrematureBirthRate = "adult_premature_birth_rate" // 成母牛早产率
  58. YouthPrematureBirthRate = "youth_premature_birth_rate" // 青年牛早产率
  59. LessThan6monthCalfNumber = "less_than_6month_calf_number" // <6月龄犊牛头数
  60. AdultCowsPregnancyRate = "adult_cows_pregnancy_rate" // 成母牛受胎率
  61. Lact1PregnancyRate = "lact1_pregnancy_rate" // 1胎受胎率
  62. Lact2PregnancyRate = "lact2_pregnancy_rate" // 2胎受孕率
  63. Lact3PregnancyRate = "lact3_pregnancy_rate" // >=3胎受孕率
  64. FirstMatingPregnancyRate = "first_mating_pregnancy_rate" // 第1次配种受胎率
  65. SecondMatingPregnancyRate = "second_mating_pregnancy_rate" // 第2次配种受胎率
  66. Day75DayMatingRate = "day75_day_mating_rate" // 75天配种率(在群)
  67. Day75DMonthMatingRate = "day75_month_mating_rate" // 75天配种率(月度)
  68. AvgAdultCowEmptyNumber = "avg_adult_cow_empty_number" // 成母牛平均空怀天数
  69. AdultCowPregnantCheckOkRate = "adult_cow_pregnant_check_ok_rate" // 成母牛孕检怀孕比
  70. YouthCowPregnantCheckOkRate = "youth_cow_pregnant_check_ok_rate" // 后备牛孕检怀孕比
  71. AdultCowForbiddenMatingRate = "adult_cow_forbidden_mating_rate" // 成母牛禁配占比
  72. YouthCowForbiddenMatingRate = "youth_cow_forbidden_mating_rate" // 青年牛禁配占比
  73. AdultCowForbiddenMatingNumber = "adult_cow_forbidden_mating_number" // 成母牛禁配事件数
  74. YouthCowForbiddenMatingNumber = "youth_cow_forbidden_mating_number" // 后备牛禁配事件数
  75. NoPregnant110SecondMatingRate = "no_pregnant110_second_mating_rate" // 110天未孕成母牛二次参配率
  76. )
  77. type IndicatorsData struct {
  78. Id int64 `json:"id"`
  79. PastureId int64 `json:"pastureId"`
  80. CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
  81. CategoryName string `json:"categoryName"`
  82. Date string `json:"date"`
  83. Kind string `json:"kind"`
  84. Value string `json:"value"`
  85. CreatedAt int64 `json:"createdAt"`
  86. UpdatedAt int64 `json:"updatedAt"`
  87. }
  88. func (d *IndicatorsData) TableName() string {
  89. return "indicators_data"
  90. }
  91. type IndicatorsDataSlice []*IndicatorsData
  92. func (i IndicatorsDataSlice) ToPB(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  93. res := &IndicatorComparison{
  94. Headers: header,
  95. List: make([]map[string]string, 0),
  96. }
  97. if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 {
  98. return res
  99. }
  100. sort.Strings(res.Headers) // 确保日期顺序一致
  101. indicatorsDataMap := make(map[string]*IndicatorsData)
  102. for _, v := range i {
  103. indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
  104. }
  105. dataMap := make(map[string]map[string]string)
  106. for _, kind := range kinds {
  107. if dataMap[kind] == nil {
  108. dataMap[kind] = make(map[string]string)
  109. }
  110. details := detailsMap[kind]
  111. dataMap[kind] = map[string]string{
  112. "name": details.Name,
  113. "kind": details.Kind,
  114. "unit": details.Unit,
  115. "categoryType": fmt.Sprintf("%d", details.CategoryType),
  116. "categoryName": details.CategoryName,
  117. "zh": details.Zh,
  118. }
  119. for _, v := range header {
  120. pref := fmt.Sprintf("%s-%s", kind, v)
  121. indicators, ok := indicatorsDataMap[pref]
  122. if ok {
  123. dataMap[kind][v] = indicators.Value
  124. } else {
  125. dataMap[kind][v] = ""
  126. }
  127. }
  128. }
  129. for _, data := range dataMap {
  130. res.List = append(res.List, data)
  131. }
  132. return res
  133. }
  134. type IndicatorsComparisonResponse struct {
  135. Code int32 `json:"code"`
  136. Msg string `json:"msg"`
  137. Data *IndicatorComparison `json:"data"`
  138. }
  139. type IndicatorComparison struct {
  140. Headers []string `json:"headers"`
  141. List []map[string]string `json:"list"`
  142. }