indicators.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package backend
  2. import (
  3. "context"
  4. "kpt-pasture/model"
  5. "kpt-pasture/util"
  6. "net/http"
  7. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  8. "gitee.com/xuyiping_admin/pkg/xerr"
  9. )
  10. func (s *StoreEntry) IndicatorsComparison(ctx context.Context, req *pasturePb.IndicatorsComparisonRequest) (*model.IndicatorsComparisonResponse, error) {
  11. userModel, err := s.GetUserModel(ctx)
  12. if err != nil {
  13. return nil, xerr.WithStack(err)
  14. }
  15. indicatorsDataList := make([]*model.IndicatorsData, 0)
  16. pref := s.DB.Model(new(model.IndicatorsData)).
  17. Where("pasture_id = ?", userModel.AppPasture.Id)
  18. dataRange, err := util.GetMonthsBetween(req.DateList[0], req.DateList[1])
  19. if err != nil {
  20. return nil, xerr.WithStack(err)
  21. }
  22. pref.Where("date IN (?)", dataRange)
  23. if req.CategoryKind > 0 {
  24. pref.Where("category_type = ?", req.CategoryKind)
  25. }
  26. if len(req.KindList) > 0 {
  27. pref.Where("kind IN (?)", req.KindList)
  28. }
  29. if err = pref.Order("date,kind").Find(&indicatorsDataList).Error; err != nil {
  30. return nil, xerr.WithStack(err)
  31. }
  32. indicatorsDetailsMap, kinds, err := s.GetIndicatorsDetailsMap(ctx)
  33. if req.CategoryKind > 0 {
  34. if len(req.KindList) <= 0 {
  35. kinds = kinds[:0]
  36. }
  37. for _, v := range indicatorsDetailsMap {
  38. if v.CategoryType != req.CategoryKind {
  39. delete(indicatorsDetailsMap, v.Kind)
  40. } else {
  41. kinds = append(kinds, v.Kind)
  42. }
  43. }
  44. }
  45. if len(req.KindList) > 0 {
  46. kinds = req.KindList
  47. }
  48. if err != nil {
  49. return nil, xerr.WithStack(err)
  50. }
  51. return &model.IndicatorsComparisonResponse{
  52. Code: http.StatusOK,
  53. Msg: "ok",
  54. Data: model.IndicatorsDataSlice(indicatorsDataList).ToPB(dataRange, kinds, indicatorsDetailsMap),
  55. }, nil
  56. }
  57. func (s *StoreEntry) GetIndicatorsDetailsMap(ctx context.Context) (map[string]*model.IndicatorsDetails, []string, error) {
  58. indicatorsDetails := make(map[string]*model.IndicatorsDetails)
  59. indicatorsDetailsList, err := s.FindIndicatorsDetailsList(ctx)
  60. if err != nil {
  61. return nil, nil, xerr.WithStack(err)
  62. }
  63. kinds := make([]string, 0)
  64. for _, v := range indicatorsDetailsList {
  65. indicatorsDetails[v.Kind] = v
  66. kinds = append(kinds, v.Kind)
  67. }
  68. return indicatorsDetails, kinds, err
  69. }
  70. func (s *StoreEntry) GetIndicatorsDataByDate(pastureId int64, Kind, date string) (*model.IndicatorsData, error) {
  71. res := &model.IndicatorsData{}
  72. if err := s.DB.Model(new(model.IndicatorsData)).
  73. Where("pasture_id = ?", pastureId).
  74. Where("kind = ?", Kind).
  75. Where("date = ?", date).
  76. First(&res).Error; err != nil {
  77. return nil, xerr.WithStack(err)
  78. }
  79. return res, nil
  80. }