|
|
@@ -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 {
|