|  | @@ -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"`
 | 
	
		
			
				|  |  |  }
 |