indicators_data.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. CalvingInterval = "calving_interval"
  10. OutputNumber = "output_number"
  11. InputNumber = "input_number"
  12. SalesVolume = "sales_volume"
  13. CalvingNumber = "calving_number"
  14. AdultAbortionRate = "adult_abortion_rate"
  15. YouthAbortionRate = "youth_abortion_rate"
  16. AllDieNumber = "all_die_number"
  17. DiseaseNumber = "disease_number"
  18. CureNumber = "cure_number"
  19. OutNumber = "out_number"
  20. CalfDieNumber = "calf_die_number"
  21. LactationCow = "lactation_cow"
  22. DryMilkCow = "dry_milk_cow"
  23. ReserveCow = "reserve_cow"
  24. )
  25. type IndicatorsData struct {
  26. Id int64 `json:"id"`
  27. PastureId int64 `json:"pastureId"`
  28. CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
  29. CategoryName string `json:"categoryName"`
  30. Date string `json:"date"`
  31. Kind string `json:"kind"`
  32. Value string `json:"value"`
  33. CreatedAt int64 `json:"createdAt"`
  34. UpdatedAt int64 `json:"updatedAt"`
  35. }
  36. func (d *IndicatorsData) TableName() string {
  37. return "indicators_data"
  38. }
  39. type IndicatorsDataSlice []*IndicatorsData
  40. func (i IndicatorsDataSlice) ToPB(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  41. res := &IndicatorComparison{
  42. Headers: header,
  43. List: make([]map[string]string, 0),
  44. }
  45. if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 {
  46. return res
  47. }
  48. sort.Strings(res.Headers) // 确保日期顺序一致
  49. indicatorsDataMap := make(map[string]*IndicatorsData)
  50. for _, v := range i {
  51. indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
  52. }
  53. dataMap := make(map[string]map[string]string)
  54. for _, kind := range kinds {
  55. if dataMap[kind] == nil {
  56. dataMap[kind] = make(map[string]string)
  57. }
  58. details := detailsMap[kind]
  59. dataMap[kind] = map[string]string{
  60. "name": details.Name,
  61. "kind": details.Kind,
  62. "unit": details.Unit,
  63. "categoryType": fmt.Sprintf("%d", details.CategoryType),
  64. "categoryName": details.CategoryName,
  65. "zh": details.Zh,
  66. }
  67. for _, v := range header {
  68. pref := fmt.Sprintf("%s-%s", kind, v)
  69. indicators, ok := indicatorsDataMap[pref]
  70. if ok {
  71. dataMap[kind][v] = indicators.Value
  72. } else {
  73. dataMap[kind][v] = ""
  74. }
  75. }
  76. }
  77. for _, data := range dataMap {
  78. res.List = append(res.List, data)
  79. }
  80. return res
  81. }
  82. type IndicatorsComparisonResponse struct {
  83. Code int32 `json:"code"`
  84. Msg string `json:"msg"`
  85. Data *IndicatorComparison `json:"data"`
  86. }
  87. type IndicatorComparison struct {
  88. Headers []string `json:"headers"`
  89. List []map[string]string `json:"list"`
  90. }