Parcourir la source

warning: estrusItems update

Yi il y a 4 jours
Parent
commit
fe14fa61ea

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250909031528-0279ad4ad300
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 2 - 0
go.sum

@@ -1359,6 +1359,8 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250908021214-0b0a0a501b87 h1:pi2uqAIu
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250908021214-0b0a0a501b87/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8 h1:UgJCyRGDRarvtFJ/kjaXqR9UmgbTp2TmaJGuxQx3wLk=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250908022339-e9d9f19403e8/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250909031528-0279ad4ad300 h1:PnxMhAEkE3tEOnoj+CEhjZoauRXmUDwlndiJeKkfAZM=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250909031528-0279ad4ad300/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0 h1:ZCOqEAnGm6+DTAhACigzWKbwMKtleb8/7OzP2xfHG7g=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 32 - 14
model/neck_ring_estrus_warning.go

@@ -63,7 +63,6 @@ func (n *NeckRingEstrusWarning) CalculatePzHour(lact int32) time.Time {
 	} else {
 		pzHour = firstTime.Add(16 * time.Hour) // v.firsttime + INTERVAL 16 HOUR
 	}
-
 	// 胎次调整
 	if lact >= 3 {
 		pzHour = pzHour.Add(-1 * time.Hour) // 减去 1 小时
@@ -73,7 +72,12 @@ func (n *NeckRingEstrusWarning) CalculatePzHour(lact int32) time.Time {
 
 type NeckRingEstrusWarningSlice []*NeckRingEstrusWarning
 
-func (n NeckRingEstrusWarningSlice) ToPB(cowMap map[int64]*Cow, eventLogMap map[int64]string, matingWindowPeriodKind pasturePb.MatingWindowPeriod_Kind) []*pasturePb.EstrusItem {
+func (n NeckRingEstrusWarningSlice) ToPB(
+	cowMap map[int64]*Cow,
+	eventLogMap map[int64]string,
+	matingWindowPeriodKind pasturePb.MatingWindowPeriod_Kind,
+	matingWindowPeriodKindList []pasturePb.MatingWindowPeriod_Kind,
+) []*pasturePb.EstrusItem {
 	res := make([]*pasturePb.EstrusItem, 0)
 	nowTime := time.Now().Local()
 	for _, v := range n {
@@ -98,19 +102,20 @@ func (n NeckRingEstrusWarningSlice) ToPB(cowMap map[int64]*Cow, eventLogMap map[
 		optimumMatingStartTime := pzHour.Add(-4 * time.Hour)
 		optimumMatingEndTime := pzHour.Add(4 * time.Hour)
 
-		switch matingWindowPeriodKind {
-		case pasturePb.MatingWindowPeriod_Front:
-			if !nowTime.Before(optimumMatingStartTime) {
-				continue
-			}
-		case pasturePb.MatingWindowPeriod_Middle:
-			if !(nowTime.After(optimumMatingStartTime) && nowTime.Before(optimumMatingEndTime)) {
-				continue
-			}
-		case pasturePb.MatingWindowPeriod_Behind:
-			if !nowTime.After(optimumMatingEndTime) {
-				continue
+		found := false
+		if len(matingWindowPeriodKindList) > 0 && len(matingWindowPeriodKindList) <= 2 {
+			for _, periodKind := range matingWindowPeriodKindList {
+				if isIPeriod(periodKind, nowTime, optimumMatingStartTime, optimumMatingEndTime) {
+					found = true
+					break
+				}
 			}
+		} else {
+			found = isIPeriod(matingWindowPeriodKind, nowTime, optimumMatingStartTime, optimumMatingEndTime)
+		}
+
+		if !found {
+			continue
 		}
 
 		firstTimeParseLocal, _ := util.TimeParseLocal(LayoutTime, v.FirstTime)
@@ -147,6 +152,19 @@ func (n NeckRingEstrusWarningSlice) ToPB(cowMap map[int64]*Cow, eventLogMap map[
 	return res
 }
 
+func isIPeriod(periodKind pasturePb.MatingWindowPeriod_Kind, nowTime, optimumMatingStartTime, optimumMatingEndTime time.Time) bool {
+	switch periodKind {
+	case pasturePb.MatingWindowPeriod_Front:
+		return nowTime.Before(optimumMatingStartTime)
+	case pasturePb.MatingWindowPeriod_Middle:
+		return nowTime.After(optimumMatingStartTime) && nowTime.Before(optimumMatingEndTime)
+	case pasturePb.MatingWindowPeriod_Behind:
+		return nowTime.After(optimumMatingEndTime)
+	default:
+		return false
+	}
+}
+
 const (
 	Nb1    = 12
 	Nb2    = 8

+ 0 - 1
module/backend/analysis_more.go

@@ -126,7 +126,6 @@ func (s *StoreEntry) CowBehaviorDistribution(ctx context.Context, req *pasturePb
 		Select("b.*").
 		Where("a.pasture_id = ?", userModel.AppPasture.Id).
 		Where("a.neck_ring_number != ?", "").
-		Where("a.sex = ?", pasturePb.Genders_Female).
 		Where("b.heat_date = ? ", req.DateTime).
 		Where("b.day_high > ?", 0)
 

+ 5 - 1
module/backend/neck_ring_warning.go

@@ -49,6 +49,10 @@ func (s *StoreEntry) NeckRingWarningEstrusOrAbortionCowList(ctx context.Context,
 		pref.Where("a.level = ?", req.Level)
 	}
 
+	if len(req.EstrusLevels) > 0 {
+		pref.Where("a.level IN ?", req.EstrusLevels)
+	}
+
 	if len(req.PenIds) > 0 {
 		pref.Where("b.pen_id IN ?", req.PenIds)
 	}
@@ -84,7 +88,7 @@ func (s *StoreEntry) NeckRingWarningEstrusOrAbortionCowList(ctx context.Context,
 			cowMap[cow.Id] = cow
 		}
 	}
-	list := model.NeckRingEstrusWarningSlice(neckRingEstrusList).ToPB(cowMap, eventLogMap, req.MatingWindowPeriod)
+	list := model.NeckRingEstrusWarningSlice(neckRingEstrusList).ToPB(cowMap, eventLogMap, req.MatingWindowPeriod, req.MatingWindowPeriods)
 	// 排序 先按照高峰时间正序排,然后再按照发情等级倒叙排
 	sort.Slice(list, func(i, j int) bool {
 		if list[i].PostPeakTimeForHours != list[j].PostPeakTimeForHours {

+ 50 - 0
util/util_more_test.go

@@ -0,0 +1,50 @@
+package util
+
+import (
+	"fmt"
+	"sync"
+	"testing"
+)
+
+func cat(catCh, dogCh chan struct{}, wg *sync.WaitGroup) {
+	defer wg.Done()
+	for i := 0; i < 100; i++ {
+		<-catCh
+		fmt.Println("cat", i)
+		dogCh <- struct{}{}
+	}
+}
+
+func dog(dogCh, fishCh chan struct{}, wg *sync.WaitGroup) {
+	defer wg.Done()
+	for i := 0; i < 100; i++ {
+		<-dogCh
+		fmt.Println("dog", i)
+		fishCh <- struct{}{}
+	}
+}
+
+func fish(fishCh, catCh chan struct{}, wg *sync.WaitGroup) {
+	defer wg.Done()
+	for i := 0; i < 100; i++ {
+		<-fishCh
+		fmt.Println("fish", i)
+		catCh <- struct{}{}
+	}
+}
+
+func Test001(T *testing.T) {
+	catCh := make(chan struct{}, 1)
+	dogCh := make(chan struct{}, 1)
+	fishCh := make(chan struct{}, 1)
+	var wg sync.WaitGroup
+	wg.Add(3)
+
+	go cat(catCh, dogCh, &wg)
+	go dog(dogCh, fishCh, &wg)
+	go fish(fishCh, catCh, &wg)
+
+	catCh <- struct{}{}
+	wg.Wait()
+
+}