Explorar o código

crontab: neckRingEstrus update firstTime

Yi hai 3 días
pai
achega
159d3201de
Modificáronse 5 ficheiros con 40 adicións e 11 borrados
  1. 1 1
      go.mod
  2. 2 0
      go.sum
  3. 1 1
      module/backend/analysis.go
  4. 7 4
      module/backend/calendar.go
  5. 29 5
      module/crontab/neck_ring_estrus.go

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250415021421-cc74db5827d9
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250416032332-bd24f135dfbb
 	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

+ 2 - 0
go.sum

@@ -46,6 +46,8 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250414061726-cf591d3e4e66 h1:9MiP71Uw
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250414061726-cf591d3e4e66/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250415021421-cc74db5827d9 h1:WIXYHoPz+mC8HehE51gZys3/lmPAT9iqAAC3+KaCkWs=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250415021421-cc74db5827d9/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250416032332-bd24f135dfbb h1:P2D/LHSvK9rizklquUghVuHaFtoNYhu6XpnFgPZoXBc=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250416032332-bd24f135dfbb/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=

+ 1 - 1
module/backend/analysis.go

@@ -34,7 +34,7 @@ func (s *StoreEntry) WeightScatterPlot(ctx context.Context, req *pasturePb.Searc
 		pref.Where("pen_id IN (?)", req.PenIds)
 	}
 
-	if len(req.AdmissionDate) == 2 {
+	if len(req.AdmissionDate) == 2 && len(req.AdmissionDate[0]) > 0 && len(req.AdmissionDate[1]) > 0 {
 		t0, _ := util.TimeParseLocal(model.LayoutDate2, req.AdmissionDate[0])
 		t1, _ := util.TimeParseLocal(model.LayoutDate2, req.AdmissionDate[1])
 		pref.Where("admission_at BETWEEN ? AND ?", t0.Unix(), t1.Unix()+86399)

+ 7 - 4
module/backend/calendar.go

@@ -388,8 +388,10 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 	newPregnancyCheckItems := make([]*pasturePb.PregnancyCheckItems, 0)
 	var count int64
 	pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventPregnantCheck).TableName())).
-		Select(`a.id,a.cow_id,a.ear_number,a.pen_id,a.status,b.breed_status,b.pen_name,b.cow_type,
-		DATE_FORMAT(FROM_UNIXTIME(b.last_mating_at),'%Y-%m-%d')as mating_at_format,pregnancy_age,DATEDIFF(CURDATE(), FROM_UNIXTIME(last_mating_at)) AS mating_age,
+		Select(`a.id,a.cow_id,a.ear_number,a.pen_id,a.status,b.pen_name,b.cow_type,
+		DATE_FORMAT(FROM_UNIXTIME(b.last_mating_at),'%Y-%m-%d')as mating_at_format,pregnancy_age,DATEDIFF(CURDATE(), 
+		FROM_UNIXTIME(last_mating_at)) AS mating_age,
+		b.breed_status,
 		CASE a.pregnant_check_name
         WHEN 'pregnant_check_for_first' THEN '初检'
         WHEN 'pregnant_check_for_second' THEN '复检'
@@ -432,7 +434,7 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 			Total:    int32(count),
 			Page:     pagination.Page,
 			PageSize: pagination.PageSize,
-			HeaderSort: []string{"id", "cowId", "earNumber", "cowTypeName", "penName", "lact", "dayAge", "planDay",
+			HeaderSort: []string{"id", "cowId", "earNumber", "cowTypeName", "penName", "lact", "dayAge", "breedStatus", "planDay",
 				"checkTypeName", "status", "matingTimes", "calvingAtFormat", "matingAtFormat", "matingAge", "bullId", "pregnancyAge"},
 			Header: map[string]string{
 				"id":              "编号",
@@ -451,6 +453,7 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 				"matingAge":       "配后天数",
 				"bullId":          "配种公牛",
 				"pregnancyAge":    "怀孕天数",
+				"breedStatus":     "繁殖状态",
 			},
 			List: newPregnancyCheckItems,
 		},
@@ -527,7 +530,7 @@ func (s *StoreEntry) MatingCowList(ctx context.Context, req *pasturePb.ItemsRequ
 		END AS expose_estrus_type_name,
 		CASE 
         	WHEN last_calving_at = 0 THEN ""
-        	ELSE DATE_FORMAT(FROM_UNIXTIME(last_calving_at), '%Y-%m-%d %H:%i:%s')
+        	ELSE DATE_FORMAT(FROM_UNIXTIME(last_calving_at), '%Y-%m-%d')
     	END AS last_calving_at_format,
 		b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age,b.pen_name`).
 		Joins("left join cow as b on a.cow_id = b.id").

+ 29 - 5
module/crontab/neck_ring_estrus.go

@@ -62,7 +62,7 @@ func (e *Entry) EntryCowEstrus(pastureId int64) (err error) {
 	}
 	nowTime := time.Now().Local()
 	e.CowEstrusWarning(pastureId, xToday, nowTime)
-	e.UpdateNewNeckRingEstrus(pastureId, nowTime)
+	e.UpdateNewNeckRingEstrus(pastureId, xToday, nowTime)
 	return nil
 }
 
@@ -186,11 +186,11 @@ func (e *Entry) CowEstrusWarning(pastureId int64, xToday *XToday, nowTime time.T
 	}
 }
 
-func (e *Entry) UpdateNewNeckRingEstrus(pastureId int64, nowTime time.Time) {
+func (e *Entry) UpdateNewNeckRingEstrus(pastureId int64, xToday *XToday, nowTime time.Time) {
 	// 更新牛只首次发情时间
 	e.UpdateEstrusFirstTime1(pastureId, nowTime)
 	e.UpdateEstrusIsPeak(pastureId, nowTime)
-	e.UpdateEstrusFirstTime2(pastureId, nowTime)
+	e.UpdateEstrusFirstTime2(pastureId, xToday, nowTime)
 	e.UpdateEstrusFirstTime3(pastureId, nowTime)
 }
 
@@ -213,10 +213,34 @@ func (e *Entry) UpdateEstrusFirstTime1(pastureId int64, xToday time.Time) {
 	}
 }
 
-func (e *Entry) UpdateEstrusFirstTime2(pastureId int64, xToday time.Time) {
+func (e *Entry) UpdateEstrusFirstTime2(pastureId int64, xToday *XToday, nowTime time.Time) {
 	neckRingEstrusList := e.FindNeckRingEstrusByFirstTimeEmpty(pastureId)
 	for _, v := range neckRingEstrusList {
-		zaplog.Info("UpdateEstrusFirstTime2", zap.Any("v", v))
+		// 获取牛只最近12小时内的活动记录
+		activeTime, _ := util.TimeParseLocal(model.LayoutTime, v.ActiveTime)
+		startTime := activeTime.Add(-12 * time.Hour)
+
+		// 查询符合条件的活动记录
+		var firstTime string
+		if err := e.DB.Model(new(model.NeckActiveHabit)).
+			Select("MIN(active_time) as first_time").
+			Where("pasture_id = ?", pastureId).
+			Where("cow_id = ?", v.CowId).
+			Where("heat_date = ?", activeTime.Format(model.LayoutDate2)).
+			Where("active_time BETWEEN ? AND ?", startTime.Format(model.LayoutTime), v.ActiveTime).
+			Where("cft >= ?", xToday.ActiveLow).
+			Scan(&firstTime).Error; err != nil {
+			zaplog.Error("UpdateEstrusFirstTime2", zap.Any("FindFirstTime", err))
+			continue
+		}
+
+		if firstTime != "" {
+			if err := e.DB.Model(new(model.NeckRingEstrus)).
+				Where("id = ?", v.Id).
+				Update("first_time", firstTime).Error; err != nil {
+				zaplog.Error("UpdateEstrusFirstTime2", zap.Any("Update", err))
+			}
+		}
 	}
 }