indicators_data.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. CalvingNumber = "calving_number"
  15. AdultAbortionRate = "adult_abortion_rate"
  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"
  41. Month20UnPregnancyRate = "month20_un_pregnancy_rate"
  42. Multiparty150DaysUnPregnancyRate = "multiparty_150_days_un_pregnancy_rate"
  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"
  49. Calving60OutRate = "calving60_out_rate"
  50. )
  51. type IndicatorsData struct {
  52. Id int64 `json:"id"`
  53. PastureId int64 `json:"pastureId"`
  54. CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
  55. CategoryName string `json:"categoryName"`
  56. Date string `json:"date"`
  57. Kind string `json:"kind"`
  58. Value string `json:"value"`
  59. CreatedAt int64 `json:"createdAt"`
  60. UpdatedAt int64 `json:"updatedAt"`
  61. }
  62. func (d *IndicatorsData) TableName() string {
  63. return "indicators_data"
  64. }
  65. type IndicatorsDataSlice []*IndicatorsData
  66. func (i IndicatorsDataSlice) ToPB(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  67. res := &IndicatorComparison{
  68. Headers: header,
  69. List: make([]map[string]string, 0),
  70. }
  71. if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 {
  72. return res
  73. }
  74. sort.Strings(res.Headers) // 确保日期顺序一致
  75. indicatorsDataMap := make(map[string]*IndicatorsData)
  76. for _, v := range i {
  77. indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
  78. }
  79. dataMap := make(map[string]map[string]string)
  80. for _, kind := range kinds {
  81. if dataMap[kind] == nil {
  82. dataMap[kind] = make(map[string]string)
  83. }
  84. details := detailsMap[kind]
  85. dataMap[kind] = map[string]string{
  86. "name": details.Name,
  87. "kind": details.Kind,
  88. "unit": details.Unit,
  89. "categoryType": fmt.Sprintf("%d", details.CategoryType),
  90. "categoryName": details.CategoryName,
  91. "zh": details.Zh,
  92. }
  93. for _, v := range header {
  94. pref := fmt.Sprintf("%s-%s", kind, v)
  95. indicators, ok := indicatorsDataMap[pref]
  96. if ok {
  97. dataMap[kind][v] = indicators.Value
  98. } else {
  99. dataMap[kind][v] = ""
  100. }
  101. }
  102. }
  103. for _, data := range dataMap {
  104. res.List = append(res.List, data)
  105. }
  106. return res
  107. }
  108. type IndicatorsComparisonResponse struct {
  109. Code int32 `json:"code"`
  110. Msg string `json:"msg"`
  111. Data *IndicatorComparison `json:"data"`
  112. }
  113. type IndicatorComparison struct {
  114. Headers []string `json:"headers"`
  115. List []map[string]string `json:"list"`
  116. }