2 커밋 fd7088d3fd ... 55237e7e67

작성자 SHA1 메시지 날짜
  Yi 55237e7e67 cow: neckRingGroupComparison update 2 달 전
  Yi fd7088d3fd cow: neckRingGroupComparison update 2 달 전
2개의 변경된 파일54개의 추가작업 그리고 36개의 파일을 삭제
  1. 53 26
      model/neck_active_habit.go
  2. 1 10
      module/backend/cow_more.go

+ 53 - 26
model/neck_active_habit.go

@@ -414,36 +414,63 @@ func (n NeckActiveHabitSlice) ToPBApp() *pasturePb.CowNeckRingAppData {
 	return res
 }
 
-func (n NeckActiveHabitSlice) ToOriginalDataList(curveName string, dateTimeList []string) []int32 {
-	originalDataList := make([]int32, 0)
-	dateTimeMap := make(map[string]*NeckActiveHabit)
+func (n NeckActiveHabitSlice) ToOriginalDataList(curveName string) (originalDataList []int32, datetimeList []string) {
+	initFrameId := int32(0)
+	dateFrameMap := make(map[string][]int32)
 	for _, v := range n {
-		dateTime := fmt.Sprintf("%s %02d", v.HeatDate, util.ExpectedFrameIDs[v.Frameid]*2+1)
-		dateTimeMap[dateTime] = v
-	}
-
-	for _, v := range dateTimeList {
-		if originalData, ok := dateTimeMap[v]; ok {
-			switch curveName {
-			case "active": // 活动量
-				originalDataList = append(originalDataList, originalData.High)
-			case "rumina": // 反刍
-				originalDataList = append(originalDataList, originalData.Rumina)
-			case "intake": // 采食
-				originalDataList = append(originalDataList, originalData.Intake)
-			case "inactive": // 休息
-				originalDataList = append(originalDataList, originalData.Inactive)
-			case "chew": // 咀嚼
-				originalDataList = append(originalDataList, originalData.Rumina+originalData.Intake)
-			case "immobility": // 静止
-				originalDataList = append(originalDataList, 120-originalData.Active)
+		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)
+					}
+				}
 			}
-		} else {
-			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
+		}
 
-	return originalDataList
+		// 格式化为到小时的字符串
+		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 {

+ 1 - 10
module/backend/cow_more.go

@@ -464,16 +464,7 @@ func (s *StoreEntry) BehaviorCurveGroupComparison(ctx context.Context, req *past
 		return nil, xerr.WithStack(err)
 	}
 
-	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))
-		}
-	}
-	originalDataList := model.NeckActiveHabitSlice(neckActiveHabitList).ToOriginalDataList(req.CurveName, dataTimeList)
+	originalDataList, dataTimeList := model.NeckActiveHabitSlice(neckActiveHabitList).ToOriginalDataList(req.CurveName)
 	q1, q3 := s.CowIQR(cowInfo, req.CurveName, dayRange, dataTimeList)
 	return &pasturePb.BehaviorCurveGroupComparisonResponse{
 		Code: http.StatusOK,