소스 검색

cow: neckRingGroup 群体对比数据

Yi 3 주 전
부모
커밋
62c398f36e
8개의 변경된 파일94개의 추가작업 그리고 6개의 파일을 삭제
  1. 1 1
      go.mod
  2. 4 0
      go.sum
  3. 24 1
      http/handler/cow/cow.go
  4. 1 0
      http/route/cow_api.go
  5. 2 2
      model/cow_more.go
  6. 1 1
      model/neck_active_habit.go
  7. 60 1
      module/backend/cow_more.go
  8. 1 0
      module/backend/interface.go

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250903094829-eb25a6aec6c4
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250905075804-317725621249
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 4 - 0
go.sum

@@ -1351,6 +1351,10 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250903092259-88c4bd8e87c2 h1:Hxgj54Wg
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250903092259-88c4bd8e87c2/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250903094829-eb25a6aec6c4 h1:2381qSPRvM4cExQSZX8H8B9NwxuKiosN6PGhrTznS34=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250903094829-eb25a6aec6c4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250905070832-566f6cc39123 h1:aiwgZ4QJ2luQu+uMgi0iyKlQ7BA3H0Jr6XGASUaD59Q=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250905070832-566f6cc39123/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250905075804-317725621249 h1:mBZ25jc4szOQ7lyhTG3M5qbQyaNnXWSbYAJkNgoJZy0=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250905075804-317725621249/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0 h1:ZCOqEAnGm6+DTAhACigzWKbwMKtleb8/7OzP2xfHG7g=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 24 - 1
http/handler/cow/cow.go

@@ -108,7 +108,6 @@ func BehaviorCurveApp(c *gin.Context) {
 	if err := valid.ValidateStruct(&req,
 		valid.Field(&req.EarNumber, valid.Required),
 		valid.Field(&req.Days, valid.Required),
-		valid.Field(&req.CurveNameList, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
@@ -122,6 +121,30 @@ func BehaviorCurveApp(c *gin.Context) {
 	ginutil.JSONResp(c, res)
 }
 
+func BehaviorCurveGroupComparison(c *gin.Context) {
+	var req pasturePb.CowBehaviorCurveRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.EarNumber, valid.Required),
+		valid.Field(&req.Days, valid.Required),
+		valid.Field(&req.CurveName, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.BehaviorCurveGroupComparison(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
 func GrowthCurve(c *gin.Context) {
 	var req pasturePb.CowGrowthCurveRequest
 	if err := ginutil.BindProto(c, &req); err != nil {

+ 1 - 0
http/route/cow_api.go

@@ -18,6 +18,7 @@ func CowAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		cowRoute.POST("/event/list", cow.EventList)
 		cowRoute.POST("/behavior/curve", cow.BehaviorCurve)
 		cowRoute.POST("/behavior/curve/app", cow.BehaviorCurveApp)
+		cowRoute.POST("/behavior/curve/group/comparison", cow.BehaviorCurveGroupComparison)
 		cowRoute.POST("/growth/curve", cow.GrowthCurve)
 		cowRoute.POST("/lact/curve", cow.LactCurve)
 		cowRoute.POST("/behavior/rate", cow.BehaviorRate)

+ 2 - 2
model/cow_more.go

@@ -410,6 +410,6 @@ type CowBehaviorCurveData struct {
 	RuminaChange     []int32                                 `json:"ruminaChange"`     // 反刍变化
 	LowActivity      int32                                   `json:"lowActivity"`      // 低活动量参数
 	MiddleActivity   int32                                   `json:"middleActivity"`   // 中活动量行数
-	IQR1             []int32                                 `json:"IQR1"`             // 1IQR
-	IQR3             []int32                                 `json:"IQR3"`             // 3IQR
+	IQR1             []int32                                 `json:"IQR1"`             // IQR1
+	IQR3             []int32                                 `json:"IQR3"`             // IQR3
 }

+ 1 - 1
model/neck_active_habit.go

@@ -303,7 +303,7 @@ func (n NeckActiveHabitSlice) ToPB2(dataBetween []string, groupNeckActiveHabitLi
 	return data
 }
 
-func (n NeckActiveHabitSlice) ToPBApp(curveNameList []string) *pasturePb.CowNeckRingAppData {
+func (n NeckActiveHabitSlice) ToPBApp() *pasturePb.CowNeckRingAppData {
 	res := &pasturePb.CowNeckRingAppData{
 		DateTime: make([]string, 0),
 		Activity: &pasturePb.ActivityData{

+ 60 - 1
module/backend/cow_more.go

@@ -339,7 +339,7 @@ func (s *StoreEntry) BehaviorCurveApp(ctx context.Context, req *pasturePb.CowBeh
 		return nil, xerr.WithStack(err)
 	}
 
-	data := model.NeckActiveHabitSlice(neckActiveHabitList).ToPBApp(req.CurveNameList)
+	data := model.NeckActiveHabitSlice(neckActiveHabitList).ToPBApp()
 	eventMapList := s.EventTypeMap(userModel)
 	for k, v := range eventMapList {
 		if k == pasturePb.EventType_Enter || k == pasturePb.EventType_Body_Score || k == pasturePb.EventType_Birth ||
@@ -413,3 +413,62 @@ func (s *StoreEntry) BehaviorCurveApp(ctx context.Context, req *pasturePb.CowBeh
 		Data: data,
 	}, nil
 }
+
+func (s *StoreEntry) BehaviorCurveGroupComparison(ctx context.Context, req *pasturePb.CowBehaviorCurveRequest) (*pasturePb.BehaviorCurveGroupComparisonResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	if req.Days > model.NeckRingDataDays+10 {
+		messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
+			MessageID: "validate.neckRingAppDays",
+		})
+		return nil, xerr.Customf(messageId)
+	}
+
+	cowInfo, err := s.GetCowEventByEarNumber(ctx, userModel.AppPasture.Id, req.EarNumber)
+	if err != nil {
+		messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
+			MessageID:    "auth.errorCow",
+			TemplateData: map[string]interface{}{"earNumber": req.EarNumber},
+		})
+		return nil, xerr.Customf(messageId)
+	}
+
+	nowTime := time.Now().Local()
+	endDataTime := nowTime.Format(model.LayoutDate2)
+	startDataTime := nowTime.AddDate(0, 0, int(-req.Days)+1).Format(model.LayoutDate2)
+
+	dayRange, err := util.GetDaysBetween(startDataTime, endDataTime)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	if len(dayRange) <= 0 {
+		messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
+			MessageID: "auth.errorDateRange",
+		})
+		return nil, xerr.Customf(messageId)
+	}
+
+	dataTimeList := make([]string, 0)
+	for _, v := range dayRange {
+		for i := 0; i <= 23; i++ {
+			if i%2 == 0 {
+				continue
+			}
+			dataTimeList = append(dataTimeList, fmt.Sprintf("%s %02d", v, i))
+		}
+	}
+
+	q1, q3 := s.CowIQR(cowInfo, req.CurveName, dayRange, dataTimeList)
+	return &pasturePb.BehaviorCurveGroupComparisonResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.CowNeckRingGroupComparisonData{
+			IQR1:     q1,
+			IQR3:     q3,
+			DateTime: dataTimeList,
+		},
+	}, nil
+}

+ 1 - 0
module/backend/interface.go

@@ -258,6 +258,7 @@ type CowService interface {
 	EventList(ctx context.Context, req *pasturePb.SearchCowEventListRequest, pagination *pasturePb.PaginationModel) (*pasturePb.CowEventListResponse, error)
 	BehaviorCurve(ctx context.Context, req *pasturePb.CowBehaviorCurveRequest) (*model.CowBehaviorCurveResponse, error)
 	BehaviorCurveApp(ctx context.Context, req *pasturePb.CowBehaviorCurveRequest) (*pasturePb.CowNeckRingAppResponse, error)
+	BehaviorCurveGroupComparison(ctx context.Context, req *pasturePb.CowBehaviorCurveRequest) (*pasturePb.BehaviorCurveGroupComparisonResponse, error)
 	CowGrowthCurve(ctx context.Context, req *pasturePb.CowGrowthCurveRequest) (*pasturePb.CowGrowthCurveResponse, error)
 	CowLactCurve(ctx context.Context, req *pasturePb.CowLactCurveRequest) (*pasturePb.CowLactCurveResponse, error)
 	BehaviorRate(ctx context.Context, req *pasturePb.CowBehaviorRateRequest) (*pasturePb.CowBehaviorRateResponse, error)