indicators_data.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package model
  2. import (
  3. "fmt"
  4. "sort"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. )
  7. type IndicatorsData struct {
  8. Id int64 `json:"id"`
  9. PastureId int64 `json:"pastureId"`
  10. CategoryType pasturePb.IndicatorType_Kind `json:"categoryType"`
  11. CategoryName string `json:"categoryName"`
  12. Date string `json:"date"`
  13. Kind string `json:"kind"`
  14. Value string `json:"value"`
  15. CreatedAt int64 `json:"createdAt"`
  16. UpdatedAt int64 `json:"updatedAt"`
  17. }
  18. func (d *IndicatorsData) TableName() string {
  19. return "indicators_data"
  20. }
  21. type IndicatorsDataSlice []*IndicatorsData
  22. func (i IndicatorsDataSlice) ToPB(header, kinds []string, detailsMap map[string]*IndicatorsDetails) *IndicatorComparison {
  23. res := &IndicatorComparison{
  24. Headers: header,
  25. List: make([]map[string]string, 0),
  26. }
  27. if len(header) <= 0 || len(detailsMap) <= 0 || len(kinds) <= 0 || len(i) <= 0 {
  28. return res
  29. }
  30. sort.Strings(res.Headers) // 确保日期顺序一致
  31. indicatorsDataMap := make(map[string]*IndicatorsData)
  32. for _, v := range i {
  33. indicatorsDataMap[fmt.Sprintf("%s-%s", v.Kind, v.Date)] = v
  34. }
  35. dataMap := make(map[string]map[string]string)
  36. for _, kind := range kinds {
  37. if dataMap[kind] == nil {
  38. dataMap[kind] = make(map[string]string)
  39. }
  40. details := detailsMap[kind]
  41. dataMap[kind] = map[string]string{
  42. "name": details.Name,
  43. "kind": details.Kind,
  44. "unit": details.Unit,
  45. "categoryType": fmt.Sprintf("%d", details.CategoryType),
  46. "categoryName": details.CategoryName,
  47. "zh": details.Zh,
  48. }
  49. for _, v := range header {
  50. pref := fmt.Sprintf("%s-%s", kind, v)
  51. indicators, ok := indicatorsDataMap[pref]
  52. if ok {
  53. dataMap[kind][v] = indicators.Value
  54. } else {
  55. dataMap[kind][v] = ""
  56. }
  57. }
  58. }
  59. for _, data := range dataMap {
  60. res.List = append(res.List, data)
  61. }
  62. return res
  63. }
  64. type IndicatorsComparisonResponse struct {
  65. Code int32 `json:"code"`
  66. Msg string `json:"msg"`
  67. Data *IndicatorComparison `json:"data"`
  68. }
  69. type IndicatorComparison struct {
  70. Headers []string `json:"headers"`
  71. List []map[string]string `json:"list"`
  72. }