analysis_more.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package backend
  2. import (
  3. "context"
  4. "kpt-pasture/model"
  5. "kpt-pasture/util"
  6. "net/http"
  7. "time"
  8. "gitee.com/xuyiping_admin/pkg/xerr"
  9. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  10. )
  11. func (s *StoreEntry) PenBehavior(ctx context.Context, req *pasturePb.BarnBehaviorCurveRequest) (*pasturePb.BarnBehaviorCurveResponse, error) {
  12. userModel, err := s.GetUserModel(ctx)
  13. if err != nil {
  14. return nil, err
  15. }
  16. if req.StartAt == 0 || req.EndAt == 0 || req.EndAt < req.StartAt {
  17. return nil, xerr.Customf("时间范围错误")
  18. }
  19. startTime := time.Unix(int64(req.StartAt), 0).Local().Format(model.LayoutDate2)
  20. endTime := time.Unix(int64(req.EndAt), 0).Local().Format(model.LayoutDate2)
  21. penBehaviorList := make([]*model.PenBehavior, 0)
  22. if err = s.DB.Model(new(model.PenBehavior)).
  23. Where("pasture_id = ?", userModel.AppPasture.Id).
  24. Where("pen_id = ?", req.PenId).
  25. Where("heat_date BETWEEN ? AND ?", startTime, endTime).
  26. Find(&penBehaviorList).Error; err != nil {
  27. return nil, err
  28. }
  29. return &pasturePb.BarnBehaviorCurveResponse{
  30. Code: http.StatusOK,
  31. Msg: "ok",
  32. Data: model.PenBehaviorSlice(penBehaviorList).ToPB(),
  33. }, nil
  34. }
  35. func (s *StoreEntry) PenBehaviorDaily(ctx context.Context, req *pasturePb.BarnMonitorRequest) (*pasturePb.BarnMonitorResponse, error) {
  36. userModel, err := s.GetUserModel(ctx)
  37. if err != nil {
  38. return nil, xerr.WithStack(err)
  39. }
  40. if req.StartAt == 0 || req.EndAt == 0 || req.EndAt < req.StartAt {
  41. return nil, xerr.Customf("时间范围错误")
  42. }
  43. startDate := time.Unix(int64(req.StartAt), 0).Local().Format(model.LayoutDate2)
  44. endDate := time.Unix(int64(req.EndAt), 0).Local().Format(model.LayoutDate2)
  45. dataTimeRange, err := util.GetDaysBetween(startDate, endDate)
  46. if err != nil {
  47. return nil, xerr.WithStack(err)
  48. }
  49. penBehaviorDayModelList := make([]*model.PenBehaviorDayModel, 0)
  50. pref := s.DB.Model(new(model.PenBehaviorDay)).
  51. Select(`distinct(heat_date) as heat_date,pen_id,pen_name,rumina_std,cow_count,day_rumina,day_intake,
  52. day_inactive,day_milk,day_rumina+day_intake as day_chew,24*60 - day_active as day_immobility`).
  53. Where("pasture_id = ?", userModel.AppPasture.Id).
  54. Where("heat_date BETWEEN ? AND ?", startDate, endDate)
  55. if len(req.BarnIds) == 0 && req.BehaviorKind > 0 {
  56. if err = pref.Where("pen_id IN (?)", req.BarnIds).
  57. Order("heat_date").
  58. Find(penBehaviorDayModelList).Error; err != nil {
  59. return nil, xerr.WithStack(err)
  60. }
  61. } else {
  62. if err = pref.Group("heat_date,pen_id").
  63. Order("heat_date,pen_id").
  64. Find(penBehaviorDayModelList).Error; err != nil {
  65. return nil, xerr.WithStack(err)
  66. }
  67. }
  68. return &pasturePb.BarnMonitorResponse{
  69. Code: http.StatusOK,
  70. Msg: "ok",
  71. Data: model.PenBehaviorDayModelSlice(penBehaviorDayModelList).ToPB(dataTimeRange),
  72. }, err
  73. }