indicators_data.go 3.7 KB

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