Browse Source

calendar: update

Yi 3 weeks ago
parent
commit
8feeb46708

+ 1 - 1
dep/di_crontab.go

@@ -98,7 +98,7 @@ func EntryCrontab(dependency CrontabDependency) *cron.Crontab {
 		panic(err)
 	}
 
-	err = newCrontab.Bind("NeckRingMerge", cs.NeckRingMerge, dependency.CrontabHub.NeckRingOriginalMergeData)
+	err = newCrontab.Bind("NeckRingMerge", cs.NeckRingMerge, dependency.CrontabHub.NeckRingOriginalMerge)
 	if err != nil {
 		zaplog.Error("EntryCrontab", zap.Any("NeckRingOriginalMergeData", err))
 		panic(err)

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250305125910-0c6e47c2e274
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250306060531-dfa1b97a964b
 	gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 10 - 0
go.sum

@@ -38,6 +38,14 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250305125910-0c6e47c2e274 h1:zbGuv1f9ZimRe8ViLJc16Pdvow7OV03itkuo7p/LDzM=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250305125910-0c6e47c2e274/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306013635-4cf08c9620eb h1:Py16cQzWd5G1m86qGUd/xAjI9f3pshaQv8QwacNiHe4=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306013635-4cf08c9620eb/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306025059-d5af4673e2ff h1:hpjGfL/IH3p+hArgoZBvS8K221zxLCmUexicN/me6Rc=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306025059-d5af4673e2ff/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306030727-9cd4d60bdaa7 h1:s3qKKeNDVEKzUP8UjYyl46awP0JUj8vv5hEVHpy19hM=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306030727-9cd4d60bdaa7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306060531-dfa1b97a964b h1:KBCoYhktN5Hm2aeYudrU1Qgq3g4GrI7Dnng/aoy+pR0=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250306060531-dfa1b97a964b/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b h1:w05MxH7yqveRlaRbxHhbif5YjPrJFodRPfOjYhXn7Zk=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -172,6 +180,7 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
 github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
@@ -609,6 +618,7 @@ go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM=
 go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=

+ 1 - 1
http/route/work_api.go

@@ -20,8 +20,8 @@ func WorkOrderAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		workRoute.GET("/user/order/list/:status", work.UserOrderList)
 
 		workRoute.POST("/calendar/list", work.CalendarList)
-		workRoute.POST("/calendar/detail", work.CalendarTableDetail)
 		workRoute.POST("/calendar/todo/list", work.CalendarToDoList)
+		workRoute.POST("/calendar/detail", work.CalendarTableDetail)
 
 		// 清单相关接口
 		workRoute.POST("/same/time/items", work.SameTimeCowList)

+ 13 - 0
model/app_pasture_receiver.go

@@ -0,0 +1,13 @@
+package model
+
+type AppPastureReceiver struct {
+	Id             int64  `json:"id"`
+	PastureId      int64  `json:"pastureId"`
+	ReceiverNumber string `json:"receiverNumber"`
+	CreatedAt      int64  `json:"createdAt"`
+	UpdatedAt      int64  `json:"updatedAt"`
+}
+
+func (a *AppPastureReceiver) TableName() string {
+	return "app_pasture_receiver"
+}

+ 3 - 0
model/cow.go

@@ -525,4 +525,7 @@ type CowBehaviorCurveData struct {
 	EstrusList       map[pasturePb.EstrusLevel_Kind][]string `json:"estrusList"`       // 发情预警
 	EventList        map[string][]string                     `json:"eventList"`        // 事件数据
 	EventMap         map[pasturePb.EventType_Kind]string     `json:"eventMap"`         // 所有事件
+	RuminaChange     []int32                                 `json:"ruminaChange"`     // 反刍变化
+	LowActivity      int32                                   `json:"lowActivity"`      // 低活动量参数
+	MiddleActivity   int32                                   `json:"middleActivity"`   // 中活动量行数
 }

+ 1 - 1
model/event_transfer_group.go

@@ -28,7 +28,7 @@ func (e *EventTransferGroup) TableName() string {
 func NewEventTransferGroup(pastureId int64, cow *Cow, req *pasturePb.TransferGroupEventData, transferPenMap map[int32]string, currentUser *SystemUser, operationUser *SystemUser) *EventTransferGroup {
 	return &EventTransferGroup{
 		PastureId:          pastureId,
-		CowId:              int64(req.CowId),
+		CowId:              cow.Id,
 		PenInId:            req.TransferInPenId,
 		PenOutId:           cow.PenId,
 		Lact:               cow.Lact,

+ 3 - 0
model/neck_active_habit.go

@@ -18,6 +18,7 @@ const (
 	DefaultChewFilter    = -99
 	DefaultFilterCorrect = 100
 	DefaultWeeklyActive  = 1500
+	DefaultRecordCount   = 6
 )
 
 type NeckActiveHabit struct {
@@ -124,6 +125,7 @@ func (n NeckActiveHabitSlice) ToPB(curveName string) *CowBehaviorCurveData {
 		EstrusList:       make(map[pasturePb.EstrusLevel_Kind][]string),
 		EventList:        make(map[string][]string),
 		EventMap:         make(map[pasturePb.EventType_Kind]string),
+		RuminaChange:     make([]int32, 0),
 	}
 	initFrameId := int32(0)
 	dateFrameMap := make(map[string][]int32)
@@ -172,6 +174,7 @@ func (n NeckActiveHabitSlice) ToPB(curveName string) *CowBehaviorCurveData {
 		case "active": // 活动量
 			res.OriginalDateList = append(res.OriginalDateList, v.High)
 			res.ChangeDateList = append(res.ChangeDateList, v.ChangeFilter)
+			res.RuminaChange = append(res.RuminaChange, v.ChangeRumina)
 		case "rumina": // 反刍
 			res.OriginalDateList = append(res.OriginalDateList, v.Rumina)
 			res.ChangeDateList = append(res.ChangeDateList, v.ChangeRumina)

+ 7 - 3
model/neck_ring_original.go

@@ -40,14 +40,15 @@ func (n *NeckRingOriginal) TableName() string {
 	return "neck_ring_original"
 }
 
-func NewNeckRingOriginal(neckLog *Behavior) *NeckRingOriginal {
+func NewNeckRingOriginal(neckLog *Behavior, pastureId int64) *NeckRingOriginal {
 	activeDateTimeType := pasturePb.ActiveTimeType_Twenty_Minutes
 	if neckLog.Frameid%10 == 8 {
 		activeDateTimeType = pasturePb.ActiveTimeType_Two_Hours
 	}
+
 	return &NeckRingOriginal{
 		Uuid:            neckLog.UUID,
-		PastureId:       1,
+		PastureId:       pastureId,
 		NeckRingNumber:  fmt.Sprintf("%d", neckLog.Ecowid),
 		Frameid:         neckLog.Frameid,
 		Rumina:          neckLog.Rumina,
@@ -93,10 +94,13 @@ type NeckRingOriginalMerge struct {
 }
 
 func (n *NeckRingOriginalMerge) IsMageData(data *NeckRingOriginal, xframeId int32) {
+	if n.RecordCount == 6 {
+		return
+	}
 	avgParam := int32(1)
 	if n.ActiveDateType == pasturePb.ActiveTimeType_Two_Hours {
 		n.RecordCount = AvgHours
-		avgParam = 6
+		avgParam = DefaultRecordCount
 	} else {
 		n.RecordCount += 1
 	}

+ 65 - 23
module/backend/calendar.go

@@ -20,22 +20,23 @@ func (s *StoreEntry) CalendarToDoList(ctx context.Context, req *pasturePb.Calend
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
+	whereSql := fmt.Sprintf(" AND pasture_id = %d AND end_day <= %d ", userModel.AppPasture.Id, util.TimeParseLocalEndUnix(time.Now().Format(model.LayoutDate2)))
 
 	calendarToDoList := make([]*pasturePb.CalendarToDoList, 0)
 	sql := `SELECT a.cow_id,b.pen_name,a.calendar_type_name,DATE_FORMAT(FROM_UNIXTIME(a.plan_day), '%Y-%m-%d') AS plan_day,a.remaining_days,b.lact,b.ear_number FROM (
-		SELECT cow_id,plan_day,'免疫' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_immunization_plan WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'免疫' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_immunization_plan WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,plan_day,'同期' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_cow_same_time WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'同期' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_cow_same_time WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,plan_day,'孕检' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_pregnant_check WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'孕检' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_pregnant_check WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,plan_day,'断奶' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_weaning WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'断奶' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_weaning WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,plan_day,'配种' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_mating WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'配种' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_mating WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,plan_day,'产犊' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_calving WHERE status = 2 AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
+		SELECT cow_id,plan_day,'产犊' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_calving WHERE status = 2` + whereSql + `
 		UNION ALL
-		SELECT cow_id,disease_at as plan_day,'疾病' as calendar_type_name,0 AS remaining_days FROM event_cow_disease WHERE diagnosed_result IN (2,3)
+		SELECT cow_id,disease_at as plan_day,'疾病' as calendar_type_name,0 AS remaining_days FROM event_cow_disease WHERE diagnosed_result IN (2,3) AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + `
 	) as a JOIN cow b ON a.cow_id = b.id WHERE 1 = 1 `
 
 	completeSql := fmt.Sprintf("%s ORDER BY a.plan_day DESC", sql)
@@ -70,15 +71,14 @@ func (s *StoreEntry) CalendarToDoList(ctx context.Context, req *pasturePb.Calend
 		toDayCompletedCountMap[v.CalendarTypeName] = v.Count
 	}
 
-	list := Paginate(calendarToDoList, req, pagination)
-
+	list, total := Paginate(calendarToDoList, req, pagination)
 	return &pasturePb.CalendarToDoResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.CalendarToDoData{
 			List:     list,
 			Progress: ProgressList(calendarToDoList, toDayCompletedCountMap),
-			Total:    int32(len(calendarToDoList)),
+			Total:    total,
 			PageSize: pagination.PageSize,
 			Page:     pagination.Page,
 		},
@@ -114,7 +114,7 @@ func (s *StoreEntry) CalendarTableDetail(ctx context.Context, req *pasturePb.Cal
 	newCalendar := &model.Calendar{}
 	if err = s.DB.Model(&model.Calendar{}).
 		Where("calendar_type = ?", req.CalendarType).
-		Where("show_day = ?", req.Start).
+		Where("start_day = ?", req.Start).
 		Where("is_show = ?", pasturePb.IsShow_Ok).
 		Where("pasture_id = ?", userModel.AppPasture.Id).
 		First(newCalendar).Error; err != nil {
@@ -504,10 +504,6 @@ func (s *StoreEntry) CalvingCowList(ctx context.Context, req *pasturePb.ItemsReq
 		pref.Where("a.plan_day <= ?", dateTime)
 	}
 
-	if req.Status > 0 {
-		pref.Where("a.status = ?", req.Status)
-	}
-
 	if req.PenId > 0 {
 		pref.Where("b.pen_id = ?", req.PenId)
 	}
@@ -554,7 +550,56 @@ func (s *StoreEntry) CalvingCowList(ctx context.Context, req *pasturePb.ItemsReq
 			List: calvingItems,
 		},
 	}, nil
+}
+
+// TreatmentCowList 治疗清单
+func (s *StoreEntry) TreatmentCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (interface{}, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
 
+	diseaseItems := make([]*model.EventCowDisease, 0)
+	count := int64(0)
+
+	pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
+		Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
+		Where("a.pasture_id = ?", userModel.AppPasture.Id).
+		Where("a.health_status IN (?)", []pasturePb.HealthStatus_Kind{pasturePb.HealthStatus_Disease, pasturePb.HealthStatus_Treatment})
+
+	if req.PenId > 0 {
+		pref.Where("b.pen_id = ?", req.PenId)
+	}
+
+	if err = pref.Order("a.disease_at DESC").
+		Count(&count).
+		Limit(int(pagination.PageSize)).
+		Offset(int(pagination.PageOffset)).
+		Find(&diseaseItems).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.EventCowDiseaseResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.EventCowDiseaseData{
+			List:     model.EventCowDiseaseSlice(diseaseItems).ToPB(s.HealthStatusMap()),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+			Header: map[string]string{
+				"id":                   "编号",
+				"cowId":                "牛号",
+				"earNumber":            "耳标",
+				"diagnoseName":         "疾病名称",
+				"healthStatus":         "健康状态",
+				"lastPrescriptionName": "处方名称",
+				"treatmentDays":        "治疗天数",
+				"onsetDays":            "发病天数",
+				"penName":              "栏舍名称",
+			},
+		},
+	}, nil
 }
 
 // WorkOrderCowList 暂时不处理工单业务
@@ -562,14 +607,10 @@ func (s *StoreEntry) WorkOrderCowList(ctx context.Context, req *pasturePb.ItemsR
 	return nil, nil
 }
 
-// TreatmentCowList 治疗清单
-func (s *StoreEntry) TreatmentCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (interface{}, error) {
-	return nil, nil
-}
-
 // Paginate 函数用于对切片进行分页
-func Paginate(slice []*pasturePb.CalendarToDoList, req *pasturePb.CalendarToDoRequest, pagination *pasturePb.PaginationModel) []*pasturePb.CalendarToDoList {
+func Paginate(slice []*pasturePb.CalendarToDoList, req *pasturePb.CalendarToDoRequest, pagination *pasturePb.PaginationModel) ([]*pasturePb.CalendarToDoList, int32) {
 	newSlice := make([]*pasturePb.CalendarToDoList, 0)
+
 	if req.CalendarType > 0 {
 		calendarTypeName := CalendarTypeMap()[req.CalendarType]
 		if len(calendarTypeName) > 0 {
@@ -596,12 +637,13 @@ func Paginate(slice []*pasturePb.CalendarToDoList, req *pasturePb.CalendarToDoRe
 		}
 		newSlice = filteredSlice
 	}
+	total := int32(len(newSlice))
 	// 计算起始索引
 	start := (pagination.Page - 1) * pagination.PageSize
 
 	// 如果起始索引超出切片长度,返回空切片
 	if start >= int32(len(newSlice)) {
-		return []*pasturePb.CalendarToDoList{}
+		return []*pasturePb.CalendarToDoList{}, total
 	}
 
 	// 计算结束索引
@@ -613,7 +655,7 @@ func Paginate(slice []*pasturePb.CalendarToDoList, req *pasturePb.CalendarToDoRe
 	}
 
 	// 返回分页后的切片
-	return newSlice[start:end]
+	return newSlice[start:end], total
 }
 
 func ProgressList(dataList []*pasturePb.CalendarToDoList, toDayCompletedCountMap map[string]int32) map[string]*pasturePb.ProgressList {

+ 2 - 0
module/backend/cow.go

@@ -214,6 +214,8 @@ func (s *StoreEntry) BehaviorCurve(ctx context.Context, req *pasturePb.CowBehavi
 
 	data := model.NeckActiveHabitSlice(neckActiveHabitList).ToPB(req.CurveName)
 	data.EventMap = s.EventTypeMap()
+	data.LowActivity = 62
+	data.MiddleActivity = 80
 	// 牛只事件列表
 	eventLogList := make([]*model.EventCowLog, 0)
 	eventLog := &model.EventCowLog{CowId: cowInfo.Id}

+ 13 - 5
module/backend/event_base.go

@@ -7,6 +7,7 @@ import (
 	"net/http"
 	"strconv"
 	"strings"
+	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 	"gitee.com/xuyiping_admin/pkg/xerr"
@@ -149,15 +150,22 @@ func (s *StoreEntry) GroupTransferList(ctx context.Context, req *pasturePb.Searc
 		Joins(fmt.Sprintf("JOIN %s AS f ON a.cow_id = f.id", new(model.Cow).TableName())).
 		Where("a.pasture_id = ?", userModel.AppPasture.Id)
 
-	if len(req.CowId) > 0 {
-		cowIds := strings.Split(req.CowId, ",")
-		pref.Where("a.cow_id IN ?", cowIds)
-	}
-
 	if req.EarNumber != "" {
 		pref.Where("a.ear_number = ?", req.EarNumber)
 	}
 
+	if req.TransferReasonId > 0 {
+		pref.Where("a.transfer_reason_id = ?", req.TransferReasonId)
+	}
+
+	if req.TransferInPenId > 0 {
+		pref.Where("a.pen_in_id = ?", req.TransferInPenId)
+	}
+
+	if req.StartDayAt > 0 && req.EndDayAt > 0 && req.EndDayAt >= req.StartDayAt {
+		pref.Where("a.transfer_date BETWEEN ? AND ?", time.Unix(int64(req.StartDayAt), 0).Format(model.LayoutDate2), time.Unix(int64(req.EndDayAt), 0).Format(model.LayoutDate2))
+	}
+
 	if err = pref.Order("a.id desc").Group("a.id").
 		Count(&count).Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).

+ 2 - 0
module/backend/event_health.go

@@ -83,6 +83,8 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 		newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
 		newEventCowDisease.FirstTreatmentAt = int64(req.DiseaseAt)
 		newEventCowDisease.LastTreatmentAt = int64(req.DiseaseAt)
+		newEventCowDisease.DiagnoseId = int32(disease.Id)
+		newEventCowDisease.DiagnoseName = disease.Name
 	}
 
 	newEventCowTreatment := &model.EventCowTreatment{}

+ 4 - 7
module/backend/goods.go

@@ -4,7 +4,6 @@ import (
 	"context"
 	"fmt"
 	"kpt-pasture/model"
-	"kpt-pasture/util"
 	"net/http"
 	"time"
 
@@ -385,18 +384,16 @@ func (s *StoreEntry) OutboundList(ctx context.Context, req *pasturePb.SearchOutb
 		return nil, xerr.WithStack(err)
 	}
 
-	startUnix := util.TimeParseLocalUnix(req.StartDayTime)
-	endUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
-
 	var count int64 = 0
 	outboundList := make([]*model.Outbound, 0)
-	pref := s.DB.Model(new(model.Outbound)).Where("pasture_id = ?", userModel.AppPasture.Id)
+	pref := s.DB.Model(new(model.Outbound)).
+		Where("pasture_id = ?", userModel.AppPasture.Id)
 	if req.OutType > 0 {
 		pref.Where("out_type = ?", req.OutType)
 	}
 
-	if startUnix > 0 && endUnix > 0 && startUnix <= endUnix {
-		pref.Where("applicant_at BETWEEN ? AND ?", startUnix, endUnix)
+	if req.StartDayTime > 0 && req.EndDayTime > 0 && req.EndDayTime >= req.StartDayTime {
+		pref.Where("applicant_at BETWEEN ? AND ?", req.StartDayTime, req.EndDayTime)
 	}
 
 	if req.Number != "" {

+ 5 - 5
module/crontab/interface.go

@@ -35,9 +35,9 @@ type Crontab interface {
 	DeleteOldOriginal() error
 	UpdateDiseaseToCalendar() error
 
-	// UpdateCowEstrus 脖环数据
-	UpdateCowEstrus() error           // 获取牛只疑似发情数据
-	NeckRingOriginalMergeData() error // 合并脖环数据
-	NeckRingCalculate() error         // 更新脖环数据
-	UpdateNeckRingWarning() error     // 发情和健康预警
+	// NeckRingOriginalMerge 脖环数据
+	NeckRingOriginalMerge() error // 合并脖环数据
+	NeckRingCalculate() error     // 更新脖环数据
+	UpdateCowEstrus() error       // 获取牛只疑似发情数据
+	UpdateNeckRingWarning() error // 发情和健康预警
 }

+ 2859 - 0
module/crontab/neck_ring_estus_test.go

@@ -1,7 +1,11 @@
 package crontab
 
 import (
+	"encoding/json"
+	"fmt"
 	"kpt-pasture/model"
+	"kpt-pasture/util"
+	"sort"
 	"testing"
 	"time"
 )
@@ -3237,3 +3241,2858 @@ func TestCalculateCFT(t *testing.T) {
 	activeTimeParse, _ := time.Parse(model.LayoutTime, "2025-03-04 01:00:00")
 	println(activeTimeParse.Format(model.LayoutTime))
 }
+
+func recalculate(neckRingList []*model.NeckRingOriginal) []*model.NeckActiveHabit {
+	originalMapData := make(map[string]*model.NeckRingOriginalMerge)
+	// 合并成2个小时的
+	for _, v := range neckRingList {
+		xframeId := util.XFrameId(v.Frameid)
+		mapKey := fmt.Sprintf("%s%s%s%s%d", v.NeckRingNumber, model.JoinKey, v.ActiveDate, model.JoinKey, xframeId) // 0001/2023-12-04/0 0001/2023-12-03/4
+		if originalMapData[mapKey] == nil {
+			originalMapData[mapKey] = new(model.NeckRingOriginalMerge)
+		}
+		originalMapData[mapKey].IsMageData(v, xframeId)
+	}
+
+	currTime := time.Now()
+	res := make([]*model.NeckActiveHabit, 0)
+	// 算平均值
+	for k, v := range originalMapData {
+		// 过滤掉合并后不等于6条数据
+		if v.RecordCount > model.DefaultRecordCount {
+			delete(originalMapData, k)
+			continue
+		} else if v.RecordCount < model.DefaultRecordCount {
+			currMaxXframeId := util.FrameIdMapReverse[int32(currTime.Hour())]
+			activeDateString := fmt.Sprintf("%s %02d:00:00", v.ActiveDate, v.XframeId*2+1)
+			activeDate, _ := time.Parse(model.LayoutTime, activeDateString)
+			if currMaxXframeId-v.XframeId <= 1 && currTime.Add(-1*time.Hour).Unix() < activeDate.Unix() {
+				delete(originalMapData, k)
+				continue
+			}
+		}
+		v.SumAvg()
+	}
+
+	if len(originalMapData) <= 0 {
+		return res
+	}
+	res = model.NeckRingOriginalMap(originalMapData).ForMatData()
+	sort.Sort(model.NeckActiveHabitSlice(res))
+	return res
+}
+
+func TestRecalculate(t *testing.T) {
+	str := `[
+    {
+        "id": 39746398,
+        "pastureId": 1,
+        "uuid": "321434420250303101",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 20,
+        "frameid": 101,
+        "rumina": 0,
+        "intake": 18,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 669,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 59,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741074907,
+        "updatedAt": 1741074907
+    },
+    {
+        "id": 39746815,
+        "pastureId": 1,
+        "uuid": "321434420250303102",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 20,
+        "frameid": 102,
+        "rumina": 0,
+        "intake": 16,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 710,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 58,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741075214,
+        "updatedAt": 1741075214
+    },
+    {
+        "id": 39755830,
+        "pastureId": 1,
+        "uuid": "321434420250303103",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 21,
+        "frameid": 103,
+        "rumina": 0,
+        "intake": 15,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 681,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 58,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741075500,
+        "updatedAt": 1741075500
+    },
+    {
+        "id": 39757863,
+        "pastureId": 1,
+        "uuid": "321434420250303104",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 21,
+        "frameid": 104,
+        "rumina": 2,
+        "intake": 13,
+        "inactive": 4,
+        "gasp": 0,
+        "high": 547,
+        "active": 15,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 57,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741075778,
+        "updatedAt": 1741075778
+    },
+    {
+        "id": 39758419,
+        "pastureId": 1,
+        "uuid": "321434420250303105",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 21,
+        "frameid": 105,
+        "rumina": 19,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 8,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 56,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741076414,
+        "updatedAt": 1741076414
+    },
+    {
+        "id": 39764857,
+        "pastureId": 1,
+        "uuid": "321434420250303105",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 21,
+        "frameid": 105,
+        "rumina": 19,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 8,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 57,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741076699,
+        "updatedAt": 1741076699
+    },
+    {
+        "id": 39775243,
+        "pastureId": 1,
+        "uuid": "321434420250303106",
+        "neckRingNumber": "3214344",
+        "activeDate": "2025-03-03",
+        "hours": 22,
+        "frameid": 106,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 13,
+        "gasp": 0,
+        "high": 44,
+        "active": 7,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 57,
+        "voltage": 297,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190705",
+        "receiveNumber": "869701075190705",
+        "createdAt": 1741078780,
+        "updatedAt": 1741078780
+    },
+    {
+        "id": 39712376,
+        "pastureId": 1,
+        "uuid": "105622025030471",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 71,
+        "rumina": 7,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 6,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741070601,
+        "updatedAt": 1741070601
+    },
+    {
+        "id": 39712377,
+        "pastureId": 1,
+        "uuid": "105622025030472",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 72,
+        "rumina": 17,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 8,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741070601,
+        "updatedAt": 1741070601
+    },
+    {
+        "id": 39741114,
+        "pastureId": 1,
+        "uuid": "105622025030473",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 73,
+        "rumina": 14,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 6,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074193,
+        "updatedAt": 1741074193
+    },
+    {
+        "id": 39741115,
+        "pastureId": 1,
+        "uuid": "105622025030474",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 74,
+        "rumina": 16,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 18,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074193,
+        "updatedAt": 1741074193
+    },
+    {
+        "id": 39741116,
+        "pastureId": 1,
+        "uuid": "105622025030475",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 75,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 16,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074193,
+        "updatedAt": 1741074193
+    },
+    {
+        "id": 39770269,
+        "pastureId": 1,
+        "uuid": "105622025030476",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 76,
+        "rumina": 0,
+        "intake": 2,
+        "inactive": 3,
+        "gasp": 0,
+        "high": 386,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39774441,
+        "pastureId": 1,
+        "uuid": "105622025030476",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 76,
+        "rumina": 0,
+        "intake": 2,
+        "inactive": 3,
+        "gasp": 0,
+        "high": 386,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39770270,
+        "pastureId": 1,
+        "uuid": "105622025030481",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 81,
+        "rumina": 0,
+        "intake": 1,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 374,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39774442,
+        "pastureId": 1,
+        "uuid": "105622025030481",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 81,
+        "rumina": 0,
+        "intake": 1,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 374,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39770271,
+        "pastureId": 1,
+        "uuid": "105622025030482",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 82,
+        "rumina": 1,
+        "intake": 2,
+        "inactive": 3,
+        "gasp": 0,
+        "high": 440,
+        "active": 17,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39774443,
+        "pastureId": 1,
+        "uuid": "105622025030482",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 82,
+        "rumina": 1,
+        "intake": 2,
+        "inactive": 3,
+        "gasp": 0,
+        "high": 440,
+        "active": 17,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39798900,
+        "pastureId": 1,
+        "uuid": "105622025030483",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 83,
+        "rumina": 4,
+        "intake": 3,
+        "inactive": 2,
+        "gasp": 0,
+        "high": 691,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081392,
+        "updatedAt": 1741081392
+    },
+    {
+        "id": 39798901,
+        "pastureId": 1,
+        "uuid": "105622025030484",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 84,
+        "rumina": 2,
+        "intake": 3,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 468,
+        "active": 17,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081392,
+        "updatedAt": 1741081392
+    },
+    {
+        "id": 39798949,
+        "pastureId": 1,
+        "uuid": "105622025030485",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 85,
+        "rumina": 1,
+        "intake": 6,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 549,
+        "active": 17,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081395,
+        "updatedAt": 1741081395
+    },
+    {
+        "id": 39832313,
+        "pastureId": 1,
+        "uuid": "105622025030486",
+        "neckRingNumber": "10562",
+        "activeDate": "2025-03-04",
+        "hours": 18,
+        "frameid": 86,
+        "rumina": 0,
+        "intake": 16,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 674,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 301,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741085617,
+        "updatedAt": 1741085617
+    },
+    {
+        "id": 39712469,
+        "pastureId": 1,
+        "uuid": "105742025030471",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 71,
+        "rumina": 0,
+        "intake": 15,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 564,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741070601,
+        "updatedAt": 1741070601
+    },
+    {
+        "id": 39712470,
+        "pastureId": 1,
+        "uuid": "105742025030472",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 72,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 13,
+        "gasp": 0,
+        "high": 190,
+        "active": 7,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741070601,
+        "updatedAt": 1741070601
+    },
+    {
+        "id": 39741207,
+        "pastureId": 1,
+        "uuid": "105742025030473",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 73,
+        "rumina": 18,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 29,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074196,
+        "updatedAt": 1741074196
+    },
+    {
+        "id": 39741208,
+        "pastureId": 1,
+        "uuid": "105742025030474",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 74,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 31,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074196,
+        "updatedAt": 1741074196
+    },
+    {
+        "id": 39741209,
+        "pastureId": 1,
+        "uuid": "105742025030475",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 75,
+        "rumina": 11,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 58,
+        "active": 3,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741074196,
+        "updatedAt": 1741074196
+    },
+    {
+        "id": 39774444,
+        "pastureId": 1,
+        "uuid": "105742025030476",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 76,
+        "rumina": 1,
+        "intake": 0,
+        "inactive": 15,
+        "gasp": 0,
+        "high": 391,
+        "active": 9,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39770362,
+        "pastureId": 1,
+        "uuid": "105742025030476",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 76,
+        "rumina": 1,
+        "intake": 0,
+        "inactive": 15,
+        "gasp": 0,
+        "high": 391,
+        "active": 9,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39774445,
+        "pastureId": 1,
+        "uuid": "105742025030481",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 81,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 391,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39770363,
+        "pastureId": 1,
+        "uuid": "105742025030481",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 81,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 391,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39774446,
+        "pastureId": 1,
+        "uuid": "105742025030482",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 82,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 323,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741078112,
+        "updatedAt": 1741078112
+    },
+    {
+        "id": 39770364,
+        "pastureId": 1,
+        "uuid": "105742025030482",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 82,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 323,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741077796,
+        "updatedAt": 1741077796
+    },
+    {
+        "id": 39799040,
+        "pastureId": 1,
+        "uuid": "105742025030483",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 83,
+        "rumina": 0,
+        "intake": 1,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 691,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081395,
+        "updatedAt": 1741081395
+    },
+    {
+        "id": 39799041,
+        "pastureId": 1,
+        "uuid": "105742025030484",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 84,
+        "rumina": 1,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 621,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081395,
+        "updatedAt": 1741081395
+    },
+    {
+        "id": 39799042,
+        "pastureId": 1,
+        "uuid": "105742025030485",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 85,
+        "rumina": 6,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 518,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741081395,
+        "updatedAt": 1741081395
+    },
+    {
+        "id": 39827555,
+        "pastureId": 1,
+        "uuid": "105742025030486",
+        "neckRingNumber": "10574",
+        "activeDate": "2025-03-04",
+        "hours": 18,
+        "frameid": 86,
+        "rumina": 0,
+        "intake": 13,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 707,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 57,
+        "hardwareVersion": 10,
+        "remain": 6,
+        "voltage": 306,
+        "restartReason": 0,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075191117",
+        "receiveNumber": "869701075191117",
+        "createdAt": 1741085005,
+        "updatedAt": 1741085005
+    },
+    {
+        "id": 39861751,
+        "pastureId": 1,
+        "uuid": "1070420250304101",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 20,
+        "frameid": 101,
+        "rumina": 2,
+        "intake": 5,
+        "inactive": 11,
+        "gasp": 0,
+        "high": 228,
+        "active": 9,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741090446,
+        "updatedAt": 1741090446
+    },
+    {
+        "id": 39870079,
+        "pastureId": 1,
+        "uuid": "1070420250304102",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 20,
+        "frameid": 102,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 74,
+        "active": 14,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741091644,
+        "updatedAt": 1741091644
+    },
+    {
+        "id": 39870180,
+        "pastureId": 1,
+        "uuid": "1070420250304102",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 20,
+        "frameid": 102,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 74,
+        "active": 14,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741091886,
+        "updatedAt": 1741091886
+    },
+    {
+        "id": 39878730,
+        "pastureId": 1,
+        "uuid": "1070420250304103",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 21,
+        "frameid": 103,
+        "rumina": 15,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 53,
+        "active": 13,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741092840,
+        "updatedAt": 1741092840
+    },
+    {
+        "id": 39890324,
+        "pastureId": 1,
+        "uuid": "1070420250304104",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 21,
+        "frameid": 104,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 15,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741094041,
+        "updatedAt": 1741094041
+    },
+    {
+        "id": 39898562,
+        "pastureId": 1,
+        "uuid": "1070420250304105",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 21,
+        "frameid": 105,
+        "rumina": 13,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 5,
+        "high": 9,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741095241,
+        "updatedAt": 1741095241
+    },
+    {
+        "id": 39907240,
+        "pastureId": 1,
+        "uuid": "1070420250304106",
+        "neckRingNumber": "10704",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 106,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 3,
+        "high": 29,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741096444,
+        "updatedAt": 1741096444
+    },
+    {
+        "id": 39765983,
+        "pastureId": 1,
+        "uuid": "107092025030481",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 81,
+        "rumina": 14,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 7,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741076914,
+        "updatedAt": 1741076914
+    },
+    {
+        "id": 39766488,
+        "pastureId": 1,
+        "uuid": "107092025030482",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 82,
+        "rumina": 13,
+        "intake": 0,
+        "inactive": 12,
+        "gasp": 0,
+        "high": 119,
+        "active": 5,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741077242,
+        "updatedAt": 1741077242
+    },
+    {
+        "id": 39775232,
+        "pastureId": 1,
+        "uuid": "107092025030483",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 83,
+        "rumina": 1,
+        "intake": 10,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 412,
+        "active": 18,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741078688,
+        "updatedAt": 1741078688
+    },
+    {
+        "id": 39794774,
+        "pastureId": 1,
+        "uuid": "107092025030484",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 84,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 372,
+        "active": 15,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741080504,
+        "updatedAt": 1741080504
+    },
+    {
+        "id": 39786688,
+        "pastureId": 1,
+        "uuid": "107092025030484",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 84,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 372,
+        "active": 15,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741079623,
+        "updatedAt": 1741079623
+    },
+    {
+        "id": 39795227,
+        "pastureId": 1,
+        "uuid": "107092025030485",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 17,
+        "frameid": 85,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 563,
+        "active": 18,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741080842,
+        "updatedAt": 1741080842
+    },
+    {
+        "id": 39803763,
+        "pastureId": 1,
+        "uuid": "107092025030486",
+        "neckRingNumber": "10709",
+        "activeDate": "2025-03-04",
+        "hours": 18,
+        "frameid": 86,
+        "rumina": 7,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 124,
+        "active": 6,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 305,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741081979,
+        "updatedAt": 1741081979
+    },
+    {
+        "id": 39585880,
+        "pastureId": 1,
+        "uuid": "107102025030451",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 10,
+        "frameid": 51,
+        "rumina": 15,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 139,
+        "active": 14,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741054411,
+        "updatedAt": 1741054411
+    },
+    {
+        "id": 39593663,
+        "pastureId": 1,
+        "uuid": "107102025030452",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 10,
+        "frameid": 52,
+        "rumina": 9,
+        "intake": 7,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 346,
+        "active": 15,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741055643,
+        "updatedAt": 1741055643
+    },
+    {
+        "id": 39602483,
+        "pastureId": 1,
+        "uuid": "107102025030453",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 53,
+        "rumina": 0,
+        "intake": 16,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 524,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741056836,
+        "updatedAt": 1741056836
+    },
+    {
+        "id": 39614495,
+        "pastureId": 1,
+        "uuid": "107102025030454",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 54,
+        "rumina": 0,
+        "intake": 17,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 558,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741058260,
+        "updatedAt": 1741058260
+    },
+    {
+        "id": 39614198,
+        "pastureId": 1,
+        "uuid": "107102025030454",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 54,
+        "rumina": 0,
+        "intake": 17,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 558,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741058020,
+        "updatedAt": 1741058020
+    },
+    {
+        "id": 39621998,
+        "pastureId": 1,
+        "uuid": "107102025030455",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 55,
+        "rumina": 0,
+        "intake": 3,
+        "inactive": 6,
+        "gasp": 0,
+        "high": 141,
+        "active": 7,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741059237,
+        "updatedAt": 1741059237
+    },
+    {
+        "id": 39631255,
+        "pastureId": 1,
+        "uuid": "107102025030456",
+        "neckRingNumber": "10710",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 56,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 4,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741060691,
+        "updatedAt": 1741060691
+    },
+    {
+        "id": 39919093,
+        "pastureId": 1,
+        "uuid": "1071820250304111",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 111,
+        "rumina": 19,
+        "intake": 0,
+        "inactive": 15,
+        "gasp": 0,
+        "high": 108,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741097888,
+        "updatedAt": 1741097888
+    },
+    {
+        "id": 39926993,
+        "pastureId": 1,
+        "uuid": "1071820250304112",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 112,
+        "rumina": 15,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 48,
+        "active": 8,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741098765,
+        "updatedAt": 1741098765
+    },
+    {
+        "id": 39936309,
+        "pastureId": 1,
+        "uuid": "1071820250304113",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 113,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 25,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741100289,
+        "updatedAt": 1741100289
+    },
+    {
+        "id": 39935620,
+        "pastureId": 1,
+        "uuid": "1071820250304113",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 113,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 25,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741099964,
+        "updatedAt": 1741099964
+    },
+    {
+        "id": 39947890,
+        "pastureId": 1,
+        "uuid": "1071820250304114",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 114,
+        "rumina": 0,
+        "intake": 1,
+        "inactive": 19,
+        "gasp": 0,
+        "high": 96,
+        "active": 6,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741101165,
+        "updatedAt": 1741101165
+    },
+    {
+        "id": 39956178,
+        "pastureId": 1,
+        "uuid": "1071820250304115",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 115,
+        "rumina": 0,
+        "intake": 18,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 433,
+        "active": 19,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741102365,
+        "updatedAt": 1741102365
+    },
+    {
+        "id": 39964758,
+        "pastureId": 1,
+        "uuid": "1071820250304116",
+        "neckRingNumber": "10718",
+        "activeDate": "2025-03-04",
+        "hours": 24,
+        "frameid": 116,
+        "rumina": 0,
+        "intake": 14,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 448,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741103565,
+        "updatedAt": 1741103565
+    },
+    {
+        "id": 39918690,
+        "pastureId": 1,
+        "uuid": "1072320250304111",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 111,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 7,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741097565,
+        "updatedAt": 1741097565
+    },
+    {
+        "id": 39927106,
+        "pastureId": 1,
+        "uuid": "1072320250304112",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 112,
+        "rumina": 3,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 23,
+        "active": 2,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741098781,
+        "updatedAt": 1741098781
+    },
+    {
+        "id": 39927434,
+        "pastureId": 1,
+        "uuid": "1072320250304112",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 22,
+        "frameid": 112,
+        "rumina": 3,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 23,
+        "active": 2,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741099092,
+        "updatedAt": 1741099092
+    },
+    {
+        "id": 39935746,
+        "pastureId": 1,
+        "uuid": "1072320250304113",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 113,
+        "rumina": 15,
+        "intake": 4,
+        "inactive": 16,
+        "gasp": 0,
+        "high": 178,
+        "active": 5,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741099983,
+        "updatedAt": 1741099983
+    },
+    {
+        "id": 39951142,
+        "pastureId": 1,
+        "uuid": "1072320250304114",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 114,
+        "rumina": 2,
+        "intake": 17,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 614,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741101771,
+        "updatedAt": 1741101771
+    },
+    {
+        "id": 39956291,
+        "pastureId": 1,
+        "uuid": "1072320250304115",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 23,
+        "frameid": 115,
+        "rumina": 0,
+        "intake": 20,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 628,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741102387,
+        "updatedAt": 1741102387
+    },
+    {
+        "id": 39964870,
+        "pastureId": 1,
+        "uuid": "1072320250304116",
+        "neckRingNumber": "10723",
+        "activeDate": "2025-03-04",
+        "hours": 24,
+        "frameid": 116,
+        "rumina": 0,
+        "intake": 9,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 452,
+        "active": 19,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 174,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741103582,
+        "updatedAt": 1741103582
+    },
+    {
+        "id": 39643327,
+        "pastureId": 1,
+        "uuid": "107252025030461",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 61,
+        "rumina": 0,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 18,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741061861,
+        "updatedAt": 1741061861
+    },
+    {
+        "id": 39651606,
+        "pastureId": 1,
+        "uuid": "107252025030462",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 62,
+        "rumina": 0,
+        "intake": 2,
+        "inactive": 17,
+        "gasp": 0,
+        "high": 115,
+        "active": 3,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741063089,
+        "updatedAt": 1741063089
+    },
+    {
+        "id": 39660185,
+        "pastureId": 1,
+        "uuid": "107252025030463",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 63,
+        "rumina": 0,
+        "intake": 15,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 734,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741064294,
+        "updatedAt": 1741064294
+    },
+    {
+        "id": 39659988,
+        "pastureId": 1,
+        "uuid": "107252025030463",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 63,
+        "rumina": 0,
+        "intake": 15,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 734,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741064041,
+        "updatedAt": 1741064041
+    },
+    {
+        "id": 39671876,
+        "pastureId": 1,
+        "uuid": "107252025030464",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 64,
+        "rumina": 2,
+        "intake": 17,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 589,
+        "active": 19,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741065521,
+        "updatedAt": 1741065521
+    },
+    {
+        "id": 39679662,
+        "pastureId": 1,
+        "uuid": "107252025030465",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 65,
+        "rumina": 0,
+        "intake": 20,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 607,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741066422,
+        "updatedAt": 1741066422
+    },
+    {
+        "id": 39688282,
+        "pastureId": 1,
+        "uuid": "107252025030466",
+        "neckRingNumber": "10725",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 66,
+        "rumina": 4,
+        "intake": 7,
+        "inactive": 1,
+        "gasp": 0,
+        "high": 470,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741067578,
+        "updatedAt": 1741067578
+    },
+    {
+        "id": 39699766,
+        "pastureId": 1,
+        "uuid": "107672025030471",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 71,
+        "rumina": 0,
+        "intake": 19,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 600,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741068766,
+        "updatedAt": 1741068766
+    },
+    {
+        "id": 39708539,
+        "pastureId": 1,
+        "uuid": "107672025030472",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 72,
+        "rumina": 0,
+        "intake": 2,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 337,
+        "active": 16,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741070036,
+        "updatedAt": 1741070036
+    },
+    {
+        "id": 39717751,
+        "pastureId": 1,
+        "uuid": "107672025030473",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 73,
+        "rumina": 4,
+        "intake": 8,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 45,
+        "active": 3,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741071486,
+        "updatedAt": 1741071486
+    },
+    {
+        "id": 39717511,
+        "pastureId": 1,
+        "uuid": "107672025030473",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 73,
+        "rumina": 4,
+        "intake": 8,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 45,
+        "active": 3,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741071239,
+        "updatedAt": 1741071239
+    },
+    {
+        "id": 39729605,
+        "pastureId": 1,
+        "uuid": "107672025030474",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 74,
+        "rumina": 14,
+        "intake": 5,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 241,
+        "active": 18,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741072723,
+        "updatedAt": 1741072723
+    },
+    {
+        "id": 39737760,
+        "pastureId": 1,
+        "uuid": "107672025030475",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 15,
+        "frameid": 75,
+        "rumina": 15,
+        "intake": 0,
+        "inactive": 19,
+        "gasp": 0,
+        "high": 34,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741073627,
+        "updatedAt": 1741073627
+    },
+    {
+        "id": 39746321,
+        "pastureId": 1,
+        "uuid": "107672025030476",
+        "neckRingNumber": "10767",
+        "activeDate": "2025-03-04",
+        "hours": 16,
+        "frameid": 76,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 18,
+        "gasp": 0,
+        "high": 94,
+        "active": 4,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741074841,
+        "updatedAt": 1741074841
+    },
+    {
+        "id": 39585903,
+        "pastureId": 1,
+        "uuid": "107682025030451",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 10,
+        "frameid": 51,
+        "rumina": 2,
+        "intake": 11,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 542,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741054411,
+        "updatedAt": 1741054411
+    },
+    {
+        "id": 39593688,
+        "pastureId": 1,
+        "uuid": "107682025030452",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 10,
+        "frameid": 52,
+        "rumina": 0,
+        "intake": 13,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 543,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741055643,
+        "updatedAt": 1741055643
+    },
+    {
+        "id": 39602507,
+        "pastureId": 1,
+        "uuid": "107682025030453",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 53,
+        "rumina": 12,
+        "intake": 3,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 227,
+        "active": 11,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741056836,
+        "updatedAt": 1741056836
+    },
+    {
+        "id": 39614221,
+        "pastureId": 1,
+        "uuid": "107682025030454",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 54,
+        "rumina": 16,
+        "intake": 0,
+        "inactive": 17,
+        "gasp": 1,
+        "high": 73,
+        "active": 4,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741058020,
+        "updatedAt": 1741058020
+    },
+    {
+        "id": 39614498,
+        "pastureId": 1,
+        "uuid": "107682025030454",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 54,
+        "rumina": 16,
+        "intake": 0,
+        "inactive": 17,
+        "gasp": 1,
+        "high": 73,
+        "active": 4,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741058260,
+        "updatedAt": 1741058260
+    },
+    {
+        "id": 39622024,
+        "pastureId": 1,
+        "uuid": "107682025030455",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 11,
+        "frameid": 55,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 0,
+        "high": 6,
+        "active": 1,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741059237,
+        "updatedAt": 1741059237
+    },
+    {
+        "id": 39631088,
+        "pastureId": 1,
+        "uuid": "107682025030456",
+        "neckRingNumber": "10768",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 56,
+        "rumina": 20,
+        "intake": 0,
+        "inactive": 20,
+        "gasp": 12,
+        "high": 0,
+        "active": 0,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 300,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741060454,
+        "updatedAt": 1741060454
+    },
+    {
+        "id": 39643330,
+        "pastureId": 1,
+        "uuid": "107902025030461",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 61,
+        "rumina": 6,
+        "intake": 5,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 157,
+        "active": 14,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741061861,
+        "updatedAt": 1741061861
+    },
+    {
+        "id": 39651445,
+        "pastureId": 1,
+        "uuid": "107902025030462",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 12,
+        "frameid": 62,
+        "rumina": 16,
+        "intake": 4,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 45,
+        "active": 6,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741062766,
+        "updatedAt": 1741062766
+    },
+    {
+        "id": 39659991,
+        "pastureId": 1,
+        "uuid": "107902025030463",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 63,
+        "rumina": 7,
+        "intake": 4,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 355,
+        "active": 17,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741064041,
+        "updatedAt": 1741064041
+    },
+    {
+        "id": 39671879,
+        "pastureId": 1,
+        "uuid": "107902025030464",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 64,
+        "rumina": 0,
+        "intake": 20,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 495,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741065521,
+        "updatedAt": 1741065521
+    },
+    {
+        "id": 39675509,
+        "pastureId": 1,
+        "uuid": "107902025030464",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 64,
+        "rumina": 0,
+        "intake": 20,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 495,
+        "active": 20,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 1,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741065787,
+        "updatedAt": 1741065787
+    },
+    {
+        "id": 39710887,
+        "pastureId": 1,
+        "uuid": "107902025030465",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 13,
+        "frameid": 65,
+        "rumina": 0,
+        "intake": 6,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 452,
+        "active": 19,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 4,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741070530,
+        "updatedAt": 1741070530
+    },
+    {
+        "id": 39712370,
+        "pastureId": 1,
+        "uuid": "107902025030466",
+        "neckRingNumber": "10790",
+        "activeDate": "2025-03-04",
+        "hours": 14,
+        "frameid": 66,
+        "rumina": 6,
+        "intake": 0,
+        "inactive": 0,
+        "gasp": 0,
+        "high": 209,
+        "active": 8,
+        "other": 0,
+        "firmwareVersion": 55,
+        "hardwareVersion": 0,
+        "remain": 3,
+        "voltage": 301,
+        "restartReason": 158,
+        "upper": 0,
+        "ActiveDateTimeType": 1,
+        "isShow": 2,
+        "imei": "869701075190853",
+        "receiveNumber": "869701075190853",
+        "createdAt": 1741070598,
+        "updatedAt": 1741070598
+    }
+]`
+
+	neckRingList := make([]*model.NeckRingOriginal, 0)
+	if err := json.Unmarshal([]byte(str), &neckRingList); err != nil {
+		panic(err)
+	}
+
+	neckRingList = RemoveDuplicates(neckRingList)
+	data := recalculate(neckRingList)
+	b, _ := json.Marshal(data)
+	fmt.Println(string(b))
+}

+ 80 - 91
module/crontab/neck_ring_merge.go

@@ -6,6 +6,7 @@ import (
 	"kpt-pasture/util"
 	"math"
 	"sort"
+	"strings"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -28,8 +29,8 @@ var (
 	calculateIsRunning bool
 )
 
-// NeckRingOriginalMergeData 把脖环数据合并成2个小时的
-func (e *Entry) NeckRingOriginalMergeData() (err error) {
+// NeckRingOriginalMerge 把脖环数据合并成2个小时的
+func (e *Entry) NeckRingOriginalMerge() (err error) {
 	if ok := e.IsExistCrontabLog(NeckRingOriginal); !ok {
 		newTime := time.Now()
 		e.CreateCrontabLog(NeckRingOriginal)
@@ -43,83 +44,29 @@ func (e *Entry) NeckRingOriginalMergeData() (err error) {
 			Delete(new(model.NeckActiveHabit))
 	}
 
+	pastureList := e.FindPastureList()
+	if pastureList == nil || len(pastureList) == 0 {
+		return nil
+	}
+
+	for _, pasture := range pastureList {
+		if err = e.OriginalMergeData(pasture.Id); err != nil {
+			zaplog.Error("NeckRingOriginalMerge", zap.Any("OriginalMergeData", err), zap.Any("pasture", pasture))
+		}
+	}
+	return nil
+}
+
+func (e *Entry) OriginalMergeData(pastureId int64) error {
 	limit := e.Cfg.NeckRingLimit
 	if limit <= 0 {
 		limit = defaultLimit
 	}
 
-	//createdAt := newTime.Add(-1 * time.Hour)
-	neckRingNumber := []string{
-		/*"10026", "10027", "10028", "10029", "10030",
-		"10031", "10032", "10033", "10034", "10035",
-		"10036", "10037", "10038", "10039", "10040",
-		"10041", "10042", "10043", "10044", "10046",
-		"10047", "10048", "10049", "10050", "10051",
-		"10052", "10053", "10054", "10055", "10056",
-		"9120007", "9120029", "9120040", "9120123", "9120164", "9120184", "9120219", "9120246", "9120321", "9120355",
-		"9120359", "9120375", "9120379", "9120391", "9120446", "9120493", "9120497", "9120512", "9120531", "9120533",
-		"9120540", "9120542", "9120612", "9120614", "9120615", "9120623", "9120625", "9120630", "9120653", "9120662",
-		"211670", "9121372", "3204736", "3212694", "3204532", "3214082", "9121667", "3212275", "3210345", "3217879",*/
-		"9422", "3206975", "9496", "3204907", "212194", "3211061", "9120840", "3207787", "3210201", "404", "3207104",
-		"3219173", "3216771", "3216872", "3209614", "3205455", "416", "9121026", "211622", "3207868", "3210340", "9120132",
-		"3207092", "3209390", "3205872", "3207367", "3219700", "9120022", "211246", "466", "3207565", "3208779", "3204863",
-		"3207963", "3204259", "3207966", "2640", "3214316", "3205778", "3206897", "3207745", "3209052", "3208045", "211627",
-		"3212873", "2100766", "9121950", "3206076", "3206438", "9466", "9121195", "9122044", "3209430", "3205599", "2100794",
-		"3048", "9467", "3207480", "3216011", "9121725", "9120340", "9121597", "427", "3209387", "3209490", "3214311",
-		"3206044", "211253", "3207553", "3215616", "211350", "3207551", "3205896", "417", "9121008", "3207694", "3209372",
-		"3217873", "3207227", "3207568", "3210615", "3204769", "3216095", "9121338", "3209124", "211340", "3219695",
-		"9121802", "3205517", "3210676", "9123325", "3204328", "9409", "211349", "3208860", "9121769", "3209221",
-		"3210916", "3205880", "438", "3205557", "9421", "211229", "444", "9123260", "9121464", "3212818", "3204834",
-		"3205408", "3207486", "498", "3206232", "3206315", "2100759", "9121955", "3204338", "3207606", "3208767", "450",
-		"9123330", "9121278", "9121011", "9122280", "479", "434", "3207614", "2355", "211644", "453", "9121308", "3209449",
-		"405", "3204240", "9120165", "9445", "9120456", "9123057", "471", "3206830", "464", "403", "2100749", "3218278",
-		"3218600", "212168", "9470", "428", "3205448", "3209790", "3208163", "213134", "3207603", "3206394", "3204476",
-		"9121569", "3206447", "3209456", "9120533", "3209044", "3214232", "3209337", "212193", "3216684", "3218450",
-		"3207194", "3204853", "3205858", "3207922", "3204645", "212157", "3214707", "213126", "3219468", "9120766",
-		"3218611", "3215948", "3211568", "9120227", "211348", "3212621", "3209898", "3207637", "9121071", "9123113",
-		"3206491", "3209922", "9440", "3207075", "423", "3204875", "9121888", "3210395", "9120630", "9120214", "3208166",
-		"211285", "3206880", "3209461", "3205597", "3216262", "3204942", "9123224", "3205918", "3204889", "3209047",
-		"3207024", "3207277", "3207699", "3205771", "9500", "3204450", "3205495", "9483", "3209876", "3205533", "3216075",
-		"9469", "3209827", "9122454", "413", "3216308", "3219301", "3210042", "3205064", "211390", "9121305", "3218596",
-		"3204955", "3215274", "212171", "3209460", "3211376", "3213812", "3205184", "3209287", "3211769", "3205926",
-		"3216585", "3213332", "3209340", "9123175", "3205843", "3207663", "3210829", "3209481", "9450", "9463",
-		"3209763", "3215627", "9121424", "3212746", "3218533", "3209072", "3207359", "3205888", "3214228", "3204884",
-		"3218613", "3209352", "3208192", "3216211", "3211454", "3217082", "3212728", "3206984", "3217750", "3213406",
-		"3206305", "9122130", "9121695", "9492", "3207856", "3218263", "9121058", "9123309", "9122466", "9122287",
-		"9120614", "3084", "3205559", "3205840", "9121444", "9121777", "3209308", "9122313", "9121672", "3210180",
-		"3207645", "3206419", "9413", "211576", "3209201", "2601", "3211708", "3206969", "3206871", "3210430",
-		"211674", "9122441", "3214386", "3206927", "3209332", "9462", "3206430", "3207485", "3204519", "3216214",
-		"9123371", "9120847", "9123355", "211690", "3210362", "3218862", "3213687", "3066", "3209787", "9120359",
-		"9468", "2315", "3207031", "211353", "211250", "3207688", "9122447", "3218688", "445", "3205848", "3214915",
-		"3208866", "1739", "3204990", "2100716", "212130", "3204214", "3208985", "211388", "9123166", "3208856", "211648",
-		"2311", "3204411", "3217860", "9523", "9524", "3209134", "3209212", "211630", "9123151", "3207375", "441", "9525",
-		"3205815", "3205527", "3215344", "3207185", "211332", "3217466", "9526", "1783", "9122414", "3207617", "212150",
-		"3204248", "3216316", "3209535", "3206873", "3208974", "9406", "9122407", "9121925", "2351", "3214481", "3204826",
-		"3205906", "3205109", "3209014", "211240", "3070", "474", "3204667", "3205511", "409", "3209061", "3205074", "3206009",
-		"9123010", "3207536", "3219231", "3207198", "9475", "9423", "9121871", "3204643", "3205471", "3206095", "9121981",
-		"9120835", "3206427", "3218217", "3207493", "2100732", "3204886", "3208174", "9486", "2100772", "3209419",
-		"3207087", "2328", "3207371", "3210597", "3206231", "3206931", "3204236", "3207411", "3206374", "3206452",
-		"3207472", "9429", "3218802", "211381", "9474", "3204420", "3207026", "3206124", "3209608", "3209330", "3209485",
-		"3216593", "3205921", "2375", "3204818", "3215544", "3213632", "3216924", "3204395", "3207111", "3206961", "212169",
-		"9123027", "2100744", "9520", "3208708", "3214104", "3206329", "9512", "3211187", "3207674", "3206004", "3207748",
-		"3209328", "3209033", "3205601", "3205776", "9438", "3205269", "3204664", "9514", "3204897", "9446", "3208827",
-		"3209611", "3208050", "9501", "9121120", "3213788", "9121699", "3204409", "3210073", "3207546", "2100758", "3206082",
-		"3208975", "9122051", "9518", "3207751", "9408", "3206437", "3207343", "3207021", "3216998", "3205349", "3214744",
-		"3205905", "3212646", "3209740", "3206239", "3207473", "3207236", "3209730", "3204360", "3206895", "9120696", "3204901",
-		"9508", "3207935", "3213977", "3214166", "448", "3205893", "3212052", "3205552", "3211112", "3213551", "3217077",
-		"3206322", "9465", "3208807", "3205211", "3215051", "3207121", "3215725", "3207229", "3219426", "3213345", "3217541",
-		"3216876", "3215675", "3214245", "3207012", "3218806", "3217024", "3212486", "3207620", "3211045", "3213712", "3215268",
-		"3215061", "3209099", "3218820", "3212817", "3204659", "3210976", "3213266", "3211716", "3207860", "3213350", "9517",
-		"3215001", "3217667", "3213039", "3207248", "9510", "3215056", "3218732", "3216053", "3209995", "3215773", "3211035",
-		"3213295", "3205725", "9464", "3205636",
-	}
 	neckRingList := make([]*model.NeckRingOriginal, 0)
-	if err = e.DB.Model(new(model.NeckRingOriginal)).
+	if err := e.DB.Model(new(model.NeckRingOriginal)).
 		Where("is_show = ?", pasturePb.IsShow_No).
-		Where("neck_ring_number IN (?)", neckRingNumber).
-		Where("active_date = ?", time.Now().Format(model.LayoutDate2)).
-		//Where("created_at <= ?", createdAt.Unix()).
-		Order("active_date,frameid,neck_ring_number").
+		Where("pasture_id = ?", pastureId).
 		Limit(int(limit)).Find(&neckRingList).Error; err != nil {
 		return xerr.WithStack(err)
 	}
@@ -127,17 +74,19 @@ func (e *Entry) NeckRingOriginalMergeData() (err error) {
 		return nil
 	}
 
+	// 去重
+	neckRingList = RemoveDuplicates(neckRingList)
 	// 计算合并
-	neckActiveHabitList := e.recalculate(neckRingList)
+	neckActiveHabitList := Recalculate(neckRingList)
 	if len(neckActiveHabitList) <= 0 {
 		return nil
 	}
 
 	for _, habit := range neckActiveHabitList {
 		//更新脖环牛只相关信息 新数据直接插入
-		historyNeckActiveHabit, ct := e.IsExistNeckActiveHabit(habit.NeckRingNumber, habit.HeatDate, habit.Frameid)
+		historyNeckActiveHabit, ct := e.IsExistNeckActiveHabit(pastureId, habit.NeckRingNumber, habit.HeatDate, habit.Frameid)
 		if ct <= 0 {
-			if err = e.DB.Create(habit).Error; err != nil {
+			if err := e.DB.Create(habit).Error; err != nil {
 				zaplog.Info("NeckRingOriginalMergeData-1",
 					zap.Any("err", err),
 					zap.Any("neckActiveHabit", habit),
@@ -149,11 +98,11 @@ func (e *Entry) NeckRingOriginalMergeData() (err error) {
 			if newNeckActiveHabit == nil {
 				continue
 			}
-			if err = e.DB.Model(new(model.NeckActiveHabit)).
+			if err := e.DB.Model(new(model.NeckActiveHabit)).
 				Select("rumina", "intake", "inactive", "gasp", "other", "high", "active", "is_show", "record_count").
 				Where("id = ?", historyNeckActiveHabit.Id).
 				Updates(newNeckActiveHabit).Error; err != nil {
-				zaplog.Error("NeckRingOriginalMergeData-3",
+				zaplog.Error("NeckRingOriginalMergeData-2",
 					zap.Any("err", err),
 					zap.Any("ct", ct),
 					zap.Any("historyNeckActiveHabit", historyNeckActiveHabit),
@@ -162,8 +111,8 @@ func (e *Entry) NeckRingOriginalMergeData() (err error) {
 			}
 		}
 
-		if err = e.UpdateNeckRingOriginalIsShow(habit); err != nil {
-			zaplog.Error("NeckRingOriginalMergeData-2",
+		if err := e.UpdateNeckRingOriginalIsShow(habit); err != nil {
+			zaplog.Error("NeckRingOriginalMergeData-4",
 				zap.Any("err", err),
 				zap.Any("neckActiveHabit", habit),
 			)
@@ -314,11 +263,14 @@ func (e *Entry) FirstFilterUpdate(pastureId int64, xToDay *XToday) (processIds [
 		Where("id BETWEEN ? AND ?", xToDay.LastMaxHabitId, xToDay.CurrMaxHabitId).
 		Where("pasture_id = ?", pastureId).
 		Where("is_show = ?", pasturePb.IsShow_No).
+		Where("record_count = ?", model.DefaultRecordCount).
 		Where(e.DB.Where("high >= ?", xToDay.High).Or("rumina >= ?", xToDay.Rumina)).
 		Order("heat_date,neck_ring_number,frameid").
-		Limit(int(defaultLimit)).Find(&newNeckActiveHabitList).Error; err != nil {
+		Limit(int(defaultLimit)).
+		Find(&newNeckActiveHabitList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
+
 	// 活动量滤波
 	for _, v := range newNeckActiveHabitList {
 		// 过滤牛只未绑定的脖环的数据
@@ -333,6 +285,8 @@ func (e *Entry) FirstFilterUpdate(pastureId int64, xToDay *XToday) (processIds [
 			frameId = 11
 			heatDateParse, _ := time.Parse(model.LayoutDate2, heatDate)
 			heatDate = heatDateParse.AddDate(0, 0, -1).Format(model.LayoutDate2)
+		} else {
+			frameId -= 1
 		}
 
 		firstFilterData := e.FindFirstFilter(pastureId, v.NeckRingNumber, heatDate, frameId)
@@ -366,7 +320,6 @@ func (e *Entry) FirstFilterUpdate(pastureId int64, xToDay *XToday) (processIds [
 		}
 
 		processIds = append(processIds, v.Id)
-
 		// 更新过滤值 // todo 记得更新胎次为牛只胎次,现在为了测试特意改成0
 		if err = e.DB.Model(new(model.NeckActiveHabit)).
 			Select("filter_high", "filter_rumina", "filter_chew", "cow_id", "lact", "calving_age", "ear_number").
@@ -703,8 +656,31 @@ func (e *Entry) UpdateNeckRingOriginalIsShow(habit *model.NeckActiveHabit) error
 	return nil
 }
 
-// recalculate 合并计算
-func (e *Entry) recalculate(neckRingList []*model.NeckRingOriginal) []*model.NeckActiveHabit {
+// RemoveDuplicates 清洗一下数据,去掉重复的,如果有重复的,取最新的一条数据
+func RemoveDuplicates(records []*model.NeckRingOriginal) []*model.NeckRingOriginal {
+	uniqueRecords := make(map[string]*model.NeckRingOriginal)
+	// 遍历原始数组
+	for _, record := range records {
+		mapKey := fmt.Sprintf("%s%s%s%s%d", record.NeckRingNumber, model.JoinKey, record.ActiveDate, model.JoinKey, record.Frameid) // 0001/2023-12-04/0 0001/2023-12-03/4
+		if existing, exists := uniqueRecords[mapKey]; exists {
+			if record.CreatedAt > existing.CreatedAt {
+				uniqueRecords[mapKey] = record
+			}
+		} else {
+			uniqueRecords[mapKey] = record
+		}
+	}
+
+	// 将 map 中的记录转换为切片
+	result := make([]*model.NeckRingOriginal, 0, len(uniqueRecords))
+	for _, record := range uniqueRecords {
+		result = append(result, record)
+	}
+	return result
+}
+
+// Recalculate 合并计算
+func Recalculate(neckRingList []*model.NeckRingOriginal) []*model.NeckActiveHabit {
 	originalMapData := make(map[string]*model.NeckRingOriginalMerge)
 	// 合并成2个小时的
 	for _, v := range neckRingList {
@@ -720,11 +696,8 @@ func (e *Entry) recalculate(neckRingList []*model.NeckRingOriginal) []*model.Nec
 	res := make([]*model.NeckActiveHabit, 0)
 	// 算平均值
 	for k, v := range originalMapData {
-		// 过滤掉合并后不等于6条数据
-		if v.RecordCount > 6 {
-			delete(originalMapData, k)
-			continue
-		} else if v.RecordCount < 6 {
+		// 过滤掉合并后<6条数据,如果时间太短就晚点再算
+		if v.RecordCount < model.DefaultRecordCount {
 			currMaxXframeId := util.FrameIdMapReverse[int32(currTime.Hour())]
 			activeDateString := fmt.Sprintf("%s %02d:00:00", v.ActiveDate, v.XframeId*2+1)
 			activeDate, _ := time.Parse(model.LayoutTime, activeDateString)
@@ -739,6 +712,7 @@ func (e *Entry) recalculate(neckRingList []*model.NeckRingOriginal) []*model.Nec
 	if len(originalMapData) <= 0 {
 		return res
 	}
+
 	res = model.NeckRingOriginalMap(originalMapData).ForMatData()
 	sort.Sort(model.NeckActiveHabitSlice(res))
 	return res
@@ -747,16 +721,31 @@ func (e *Entry) recalculate(neckRingList []*model.NeckRingOriginal) []*model.Nec
 func (e *Entry) againRecalculate(data *model.NeckActiveHabit) *model.NeckActiveHabit {
 	originalList := make([]*model.NeckRingOriginal, 0)
 	frameIds := util.FrameIds(data.Frameid)
-	if err := e.DB.Model(new(model.NeckRingOriginal)).
+	sql := ""
+	for _, frameId := range frameIds {
+		sql += fmt.Sprintf(`SELECT * FROM neck_ring_original WHERE pasture_id = %d AND neck_ring_number = '%s' AND  active_date = '%s' AND frameid = %d UNION ALL `, data.PastureId, data.NeckRingNumber, data.HeatDate, frameId)
+	}
+
+	if len(sql) > 0 {
+		sql = strings.TrimSuffix(sql, "UNION ALL ")
+	}
+
+	if err := e.DB.Raw(sql).Find(&originalList).Error; err != nil {
+		return nil
+	}
+
+	/*if err := e.DB.Model(new(model.NeckRingOriginal)).
 		Where("pasture_id = ?", data.PastureId).
 		Where("neck_ring_number = ?", data.NeckRingNumber).
 		Where("active_date = ?", data.HeatDate).
 		Where("frameid IN (?)", frameIds).
 		Find(&originalList).Error; err != nil {
 		return nil
-	}
+	}*/
+
+	originalList = RemoveDuplicates(originalList)
+	newDataList := Recalculate(originalList)
 
-	newDataList := e.recalculate(originalList)
 	if len(newDataList) != 1 {
 		return nil
 	}

+ 15 - 1
module/crontab/sql.go

@@ -104,10 +104,11 @@ func (e *Entry) IsExistEventEstrus(pastureId, cowId int64) *model.EventEstrus {
 	return res
 }
 
-func (e *Entry) IsExistNeckActiveHabit(neckRingNumber, heatDate string, frameId int32) (*model.NeckActiveHabit, int64) {
+func (e *Entry) IsExistNeckActiveHabit(pastureId int64, neckRingNumber, heatDate string, frameId int32) (*model.NeckActiveHabit, int64) {
 	count := int64(0)
 	neckActiveHabit := &model.NeckActiveHabit{}
 	if err := e.DB.Model(new(model.NeckActiveHabit)).
+		Where("pasture_id = ?", pastureId).
 		Where("neck_ring_number = ?", neckRingNumber).
 		Where("heat_date = ?", heatDate).
 		Where("frameid = ?", frameId).
@@ -117,6 +118,19 @@ func (e *Entry) IsExistNeckActiveHabit(neckRingNumber, heatDate string, frameId
 	return neckActiveHabit, count
 }
 
+func (e *Entry) FindAppPastureReceiver() map[string]int64 {
+	appPastureReceiverList := make([]*model.AppPastureReceiver, 0)
+	if err := e.DB.Model(new(model.AppPastureReceiver)).
+		Find(&appPastureReceiverList).Error; err != nil {
+		zaplog.Error("FindAppPastureReceiver", zap.Any("err", err))
+	}
+	receiverMap := make(map[string]int64)
+	for _, v := range appPastureReceiverList {
+		receiverMap[v.ReceiverNumber] = v.PastureId
+	}
+	return receiverMap
+}
+
 func (e *Entry) GetSystemNeckRingConfigure(pastureId int64) ([]*model.NeckRingConfigure, error) {
 	res := make([]*model.NeckRingConfigure, 0)
 	if err := e.DB.Model(new(model.NeckRingConfigure)).

+ 26 - 5
module/mqtt/mqtt_handle.go

@@ -27,10 +27,15 @@ var (
 		NeckRingErrorData:    make([]*model.NeckRingError, 0),
 	}
 	mu sync.Mutex
+
+	ReceiverMap map[string]int64 // 接收器数据
 )
 
 func (e *Entry) NeckRingHandle(data []byte) {
-	newData := e.MsgDataFormat2(data)
+	if len(ReceiverMap) <= 0 {
+		ReceiverMap = e.FindAppPastureReceiver()
+	}
+	newData := e.MsgDataFormat2(data, ReceiverMap)
 	if newData == nil {
 		return
 	}
@@ -42,6 +47,19 @@ func (e *Entry) NeckRingHandle(data []byte) {
 	}
 }
 
+func (e *Entry) FindAppPastureReceiver() map[string]int64 {
+	appPastureReceiverList := make([]*model.AppPastureReceiver, 0)
+	if err := e.DB.Model(new(model.AppPastureReceiver)).
+		Find(&appPastureReceiverList).Error; err != nil {
+		zaplog.Error("FindAppPastureReceiver", zap.Any("err", err))
+	}
+	receiverMap := make(map[string]int64)
+	for _, v := range appPastureReceiverList {
+		receiverMap[v.ReceiverNumber] = v.PastureId
+	}
+	return receiverMap
+}
+
 // 处理批量数据
 func (e *Entry) processBatch(batchList []*model.NeckRingOriginal) {
 	// 初始化分类数据
@@ -96,7 +114,6 @@ func (e *Entry) CreatedData(DSMLog *DataInsertNeckRingLog, originalData []byte)
 				return xerr.WithStack(err)
 			}
 		}
-		zaplog.Info("CreatedData", zap.Any("DSMLog", DSMLog), zap.Any("originalData", string(originalData)))
 		return nil
 	}); err != nil {
 		return xerr.WithStack(err)
@@ -104,7 +121,7 @@ func (e *Entry) CreatedData(DSMLog *DataInsertNeckRingLog, originalData []byte)
 	return nil
 }
 
-func (e *Entry) MsgDataFormat2(msg []byte) *DataInsertNeckRingLog {
+func (e *Entry) MsgDataFormat2(msg []byte, receiverMap map[string]int64) *DataInsertNeckRingLog {
 	mu.Lock()
 	defer mu.Unlock()
 	neckLogList := &model.NeckRingWrapper{}
@@ -120,8 +137,12 @@ func (e *Entry) MsgDataFormat2(msg []byte) *DataInsertNeckRingLog {
 	errorOriginal := make([]*model.NeckRingError, 0)
 
 	for _, neckLog := range neckLogList.NeckRing.NeckPck {
-		newOriginal := model.NewNeckRingOriginal(neckLog)
-		if ok := util.IsValidFrameId(neckLog.Frameid); !ok {
+		pastureId, ok := receiverMap[neckLog.Imei]
+		if !ok {
+			continue
+		}
+		newOriginal := model.NewNeckRingOriginal(neckLog, pastureId)
+		if ok = util.IsValidFrameId(neckLog.Frameid); !ok {
 			var ed model.NeckRingError
 			if err := copier.Copy(&ed, &newOriginal); err != nil {
 				zaplog.Error("MsgDataFormat2", zap.Any("copier", err), zap.Any("neckLog", neckLog))