indicators_data.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package model
  2. import (
  3. "fmt"
  4. "sort"
  5. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  6. "go.uber.org/zap"
  7. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  8. )
  9. type IndicatorsData struct {
  10. Id int64 `json:"id"`
  11. PastureId int64 `json:"pastureId"`
  12. CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
  13. CategoryName string `json:"categoryName"`
  14. Date string `json:"date"`
  15. Kind string `json:"kind"`
  16. Value string `json:"value"`
  17. CreatedAt int64 `json:"createdAt"`
  18. UpdatedAt int64 `json:"updatedAt"`
  19. }
  20. func (d *IndicatorsData) TableName() string {
  21. return "indicators_data"
  22. }
  23. type IndicatorsDataSlice []*IndicatorsData
  24. func (i IndicatorsDataSlice) ToPB(detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  25. res := &IndicatorComparison{
  26. Headers: make([]string, 0),
  27. List: make([]map[string]string, 0),
  28. }
  29. dateSet := make(map[string]struct{}) // 使用空结构体节省内存
  30. for _, v := range i {
  31. dateSet[v.Date] = struct{}{}
  32. }
  33. for date := range dateSet {
  34. res.Headers = append(res.Headers, date)
  35. }
  36. sort.Strings(res.Headers) // 确保日期顺序一致
  37. dataMap := make(map[string]map[string]string)
  38. for _, v := range i {
  39. details, ok := detailsMap[v.Kind]
  40. if !ok {
  41. zaplog.Error("detailsMap", zap.Any("Kind", v.Kind))
  42. continue
  43. }
  44. if data, exists := dataMap[details.Kind]; exists {
  45. data[v.Date] = v.Value
  46. } else {
  47. data = make(map[string]string)
  48. for _, date := range res.Headers {
  49. data[date] = "" // 初始化所有日期为空字符串
  50. }
  51. data[v.Date] = v.Value
  52. data["name"] = details.Name
  53. data["kind"] = details.Kind
  54. data["unit"] = details.Unit
  55. data["categoryType"] = fmt.Sprintf("%d", details.CategoryType)
  56. data["categoryName"] = details.CategoryName
  57. data["zh"] = details.Zh
  58. dataMap[details.Kind] = data
  59. }
  60. }
  61. for _, data := range dataMap {
  62. res.List = append(res.List, data)
  63. }
  64. return res
  65. }
  66. type IndicatorsComparisonResponse struct {
  67. Code int32 `json:"code"`
  68. Msg string `json:"msg"`
  69. Data *IndicatorComparison `json:"data"`
  70. }
  71. type IndicatorComparison struct {
  72. Headers []string `json:"headers"`
  73. List []map[string]string `json:"list"`
  74. }