瀏覽代碼

cow: neckRingGroupComparison update

Yi 3 周之前
父節點
當前提交
55237e7e67
共有 4 個文件被更改,包括 80 次插入12 次删除
  1. 1 1
      go.mod
  2. 4 0
      go.sum
  3. 59 0
      model/neck_active_habit.go
  4. 16 11
      module/backend/cow_more.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-20250905075804-317725621249
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8
 	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

@@ -1355,6 +1355,10 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250905070832-566f6cc39123 h1:aiwgZ4QJ
 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/go_proto v0.0.0-20250908021214-0b0a0a501b87 h1:pi2uqAIu/ANKro8a22I8v/d4gXBfnpQCR3ZqESZee7A=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250908021214-0b0a0a501b87/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8 h1:UgJCyRGDRarvtFJ/kjaXqR9UmgbTp2TmaJGuxQx3wLk=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8/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=

+ 59 - 0
model/neck_active_habit.go

@@ -414,6 +414,65 @@ func (n NeckActiveHabitSlice) ToPBApp() *pasturePb.CowNeckRingAppData {
 	return res
 }
 
+func (n NeckActiveHabitSlice) ToOriginalDataList(curveName string) (originalDataList []int32, datetimeList []string) {
+	initFrameId := int32(0)
+	dateFrameMap := make(map[string][]int32)
+	for _, v := range n {
+		if dateFrameMap[v.HeatDate] == nil {
+			initFrameId = 0
+			dateFrameMap[v.HeatDate] = make([]int32, 0)
+		}
+		// 补全结尾不够的数据
+		if initFrameId == 0 && len(datetimeList) > 0 {
+			lastDateTime := datetimeList[len(datetimeList)-1]
+			lastDatePare := strings.Split(lastDateTime, " ")
+			if len(lastDatePare) == 2 {
+				lastDay := lastDatePare[0]
+				lastHourStr := lastDatePare[1]
+				lastHour, _ := strconv.ParseInt(lastHourStr, 10, 64)
+				maxHour := util.ExpectedFrameIDs[len(util.ExpectedFrameIDs)-1]
+				xframeId := int32(lastHour-1)/2 + 1
+				if xframeId != maxHour {
+					for ; xframeId <= maxHour; xframeId++ {
+						datetimeList = append(datetimeList, fmt.Sprintf("%s %02d", lastDay, util.ExpectedFrameIDs[xframeId]*2+1))
+						originalDataList = append(originalDataList, 0)
+					}
+				}
+			}
+		}
+		expectedFrameId := util.ExpectedFrameIDs[initFrameId]
+		if expectedFrameId != v.Frameid {
+			maxFrameId := int32(math.Abs(float64(expectedFrameId - v.Frameid)))
+			for ; expectedFrameId < maxFrameId; expectedFrameId++ {
+				datetimeList = append(datetimeList, fmt.Sprintf("%s %02d", v.HeatDate, util.ExpectedFrameIDs[expectedFrameId]*2+1))
+				originalDataList = append(originalDataList, 0)
+			}
+			initFrameId = expectedFrameId
+		}
+
+		// 格式化为到小时的字符串
+		parsedTime, _ := util.TimeParseLocal(LayoutTime, v.ActiveTime)
+		hourStr := parsedTime.Format(LayoutHour)
+		datetimeList = append(datetimeList, hourStr)
+		switch curveName {
+		case "active": // 活动量
+			originalDataList = append(originalDataList, v.High)
+		case "rumina": // 反刍
+			originalDataList = append(originalDataList, v.Rumina)
+		case "intake": // 采食
+			originalDataList = append(originalDataList, v.Intake)
+		case "inactive": // 休息
+			originalDataList = append(originalDataList, v.Inactive)
+		case "chew": // 咀嚼
+			originalDataList = append(originalDataList, v.Rumina+v.Intake)
+		case "immobility": // 静止
+			originalDataList = append(originalDataList, 120-v.Active)
+		}
+		initFrameId++
+	}
+	return
+}
+
 type MaxHabitIdModel struct {
 	Id int64 `json:"id"`
 }

+ 16 - 11
module/backend/cow_more.go

@@ -451,24 +451,29 @@ func (s *StoreEntry) BehaviorCurveGroupComparison(ctx context.Context, req *past
 		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))
-		}
+	// 行为曲线数据
+	neckActiveHabitList := make([]*model.NeckActiveHabit, 0)
+	if err = s.DB.Table(new(model.NeckActiveHabit).TableName()).
+		Where("neck_ring_number = ?", cowInfo.NeckRingNumber).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Where("cow_id > ?", 0).
+		Where("heat_date IN (?)", dayRange).
+		Order("heat_date, frameid").
+		Find(&neckActiveHabitList).Error; err != nil {
+		return nil, xerr.WithStack(err)
 	}
 
+	originalDataList, dataTimeList := model.NeckActiveHabitSlice(neckActiveHabitList).ToOriginalDataList(req.CurveName)
 	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,
+			DateTime:         dataTimeList,
+			OriginalDataList: originalDataList,
+			IQR1:             q1,
+			IQR3:             q3,
 		},
 	}, nil
 }