indicators_data.go 2.8 KB

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