indicators.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. }
  81. func (s *StoreEntry) LongTermInfertility(ctx context.Context, req *pasturePb.LongTermInfertilityRequest, pagination *pasturePb.PaginationModel) (*pasturePb.LongTermInfertilityResponse, error) {
  82. userModel, err := s.GetUserModel(ctx)
  83. if err != nil {
  84. return nil, xerr.WithStack(err)
  85. }
  86. cowList := make([]*model.Cow, 0)
  87. pref := s.DB.Model(new(model.Cow)).
  88. Where("pasture_id = ?", userModel.AppPasture.Id).
  89. Where("calving_age > ?", req.CalvingAge).
  90. Where("breed_status != ?", pasturePb.BreedStatus_Pregnant)
  91. if req.EarNumber != "" {
  92. pref.Where("ear_number = ?", req.EarNumber)
  93. }
  94. if req.PenId > 0 {
  95. pref.Where("pen_id = ?", req.PenId)
  96. }
  97. var count int64
  98. if err = pref.Model(new(model.Cow)).
  99. Order("id desc").
  100. Count(&count).Limit(int(pagination.PageSize)).
  101. Offset(int(pagination.PageOffset)).
  102. Find(&cowList).Error; err != nil {
  103. return nil, xerr.WithStack(err)
  104. }
  105. breedStatusMap := s.CowBreedStatusMap()
  106. return &pasturePb.LongTermInfertilityResponse{
  107. Code: http.StatusOK,
  108. Msg: "ok",
  109. Data: &pasturePb.LongTermInfertilityData{
  110. List: model.CowSlice(cowList).LongTermInfertilityToPB(breedStatusMap),
  111. Total: int32(count),
  112. PageSize: pagination.PageSize,
  113. Page: pagination.Page,
  114. },
  115. }, nil
  116. }