indicators_data.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package model
  2. import (
  3. "fmt"
  4. "sort"
  5. "go.uber.org/zap"
  6. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  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(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  25. res := &IndicatorComparison{
  26. Headers: header,
  27. List: make([]map[string]string, 0),
  28. }
  29. if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 {
  30. return res
  31. }
  32. sort.Strings(res.Headers) // 确保日期顺序一致
  33. indicatorsDataMap := make(map[string]*IndicatorsData)
  34. for _, v := range i {
  35. indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
  36. }
  37. dataMap := make(map[string]map[string]string)
  38. for _, kind := range kinds {
  39. if dataMap[kind] == nil {
  40. dataMap[kind] = make(map[string]string)
  41. }
  42. details := detailsMap[kind]
  43. dataMap[kind] = map[string]string{
  44. "name": details.Name,
  45. "kind": details.Kind,
  46. "unit": details.Unit,
  47. "categoryType": fmt.Sprintf("%d", details.CategoryType),
  48. "categoryName": details.CategoryName,
  49. "zh": details.Zh,
  50. }
  51. for _, v := range header {
  52. pref := fmt.Sprintf("%s-%s", kind, v)
  53. indicators, ok := indicatorsDataMap[pref]
  54. if ok {
  55. dataMap[kind][v] = indicators.Value
  56. } else {
  57. dataMap[kind][v] = ""
  58. }
  59. }
  60. }
  61. zaplog.Info("dataMap", zap.Any("dataMap", dataMap), zap.Any("header", header), zap.Any("kinds", kinds))
  62. for _, data := range dataMap {
  63. res.List = append(res.List, data)
  64. }
  65. return res
  66. }
  67. type IndicatorsComparisonResponse struct {
  68. Code int32 `json:"code"`
  69. Msg string `json:"msg"`
  70. Data *IndicatorComparison `json:"data"`
  71. }
  72. type IndicatorComparison struct {
  73. Headers []string `json:"headers"`
  74. List []map[string]string `json:"list"`
  75. }