فهرست منبع

work: PregnancyCheck 孕检清单增加字段

Yi 1 ماه پیش
والد
کامیت
115e4b2107
6فایلهای تغییر یافته به همراه88 افزوده شده و 19 حذف شده
  1. 1 1
      go.mod
  2. 4 0
      go.sum
  3. 3 3
      http/handler/cow/cow.go
  4. 54 6
      model/cow.go
  5. 10 0
      module/backend/calendar.go
  6. 16 9
      module/backend/cow.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-20250416032332-bd24f135dfbb
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250416085805-501c91e70d45
 	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

+ 4 - 0
go.sum

@@ -48,6 +48,10 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250415021421-cc74db5827d9 h1:WIXYHoPz
 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/go_proto v0.0.0-20250416061435-4d79cc588081 h1:kayy8O7/wiIw7eVM4XCYuQKqjloyoUjXifrOjgViMEY=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250416061435-4d79cc588081/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250416085805-501c91e70d45 h1:O4vnwyLdVPFXGoiqfQqeaYAzdgTwwwphyVJ/0ws/UqU=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250416085805-501c91e70d45/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=

+ 3 - 3
http/handler/cow/cow.go

@@ -113,7 +113,7 @@ func GrowthCurve(c *gin.Context) {
 	}
 
 	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.CowId, valid.Required),
+		valid.Field(&req.EarNumber, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
@@ -158,8 +158,8 @@ func BehaviorRate(c *gin.Context) {
 
 	if err := valid.ValidateStruct(&req,
 		valid.Field(&req.EarNumber, valid.Required),
-		valid.Field(&req.StartTime, valid.Required),
-		valid.Field(&req.EndTime, valid.Required),
+		valid.Field(&req.StartAt, valid.Required),
+		valid.Field(&req.EndAt, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return

+ 54 - 6
model/cow.go

@@ -476,13 +476,60 @@ func NewEnterCow(pastureId int64, req *pasturePb.EventEnterRequest, penMap map[i
 		admissionAt = int64(req.EnterAt)
 	}
 
+	breedStatus := pasturePb.BreedStatus_Invalid
 	isForbiddenMating := pasturePb.IsShow_No
-	if req.BreedStatus == pasturePb.BreedStatus_No_Mating {
-		isForbiddenMating = pasturePb.IsShow_Ok
+	cowType := pasturePb.CowType_Invalid
+	if req.Sex == pasturePb.Genders_Female {
+
+		if req.Lact == 0 && req.MatingAt <= 0 {
+			breedStatus = pasturePb.BreedStatus_UnBreed
+			cowType = pasturePb.CowType_Reserve_Calf
+		}
+
+		if req.MatingAt > 0 && (req.PregnantCheckResult != pasturePb.PregnantCheckResult_Pregnant &&
+			req.PregnantCheckResult != pasturePb.PregnantCheckResult_UnPregnant) &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Breeding
+			if req.Lact == 0 {
+				cowType = pasturePb.CowType_Reserve_Calf
+			} else {
+				cowType = pasturePb.CowType_Breeding_Calf
+			}
+		}
+
+		if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Pregnant
+			if req.Lact == 0 {
+				cowType = pasturePb.CowType_Reserve_Calf
+			} else {
+				cowType = pasturePb.CowType_Breeding_Calf
+			}
+		}
+
+		if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Empty
+			if req.Lact == 0 {
+				cowType = pasturePb.CowType_Reserve_Calf
+			} else {
+				cowType = pasturePb.CowType_Breeding_Calf
+			}
+		}
+
+		if req.CalvingAt > 0 && req.CalvingAt >= req.MatingAt && req.CalvingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Calving
+			cowType = pasturePb.CowType_Breeding_Calf
+		}
+
+		if req.AbortionAt > 0 && req.AbortionAt >= req.CalvingAt && req.AbortionAt >= req.MatingAt {
+			breedStatus = pasturePb.BreedStatus_Abort
+			cowType = pasturePb.CowType_Breeding_Calf
+		}
 	}
 
-	if req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
-		req.BreedStatus = pasturePb.BreedStatus_Pregnant
+	if breedStatus == pasturePb.BreedStatus_No_Mating {
+		isForbiddenMating = pasturePb.IsShow_Ok
 	}
 
 	cow := &Cow{
@@ -492,8 +539,8 @@ func NewEnterCow(pastureId int64, req *pasturePb.EventEnterRequest, penMap map[i
 		PenId:               req.PenId,
 		PenName:             penMap[req.PenId].Name,
 		Lact:                req.Lact,
-		CowType:             req.CowType,
-		BreedStatus:         req.BreedStatus,
+		CowType:             cowType,
+		BreedStatus:         breedStatus,
 		CowKind:             req.CowKind,
 		SourceKind:          req.CowSource,
 		FatherNumber:        req.FatherNumber,
@@ -725,6 +772,7 @@ func (c CowSlice) LongTermInfertilityToPB(breedStatusMap map[pasturePb.BreedStat
 			CalvingAge:           v.CalvingAge,
 			PenName:              v.PenName,
 			BreedStatusName:      breedStatusName,
+			BreedStatus:          v.BreedStatus,
 			LastCalvingAtFormat:  lastCalvingAtFormat,
 			LastAbortionAtFormat: lastAbortionAtFormat,
 			LastMatingAtFormat:   lastMatingAtFormat,

+ 10 - 0
module/backend/calendar.go

@@ -392,6 +392,16 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 		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 b.breed_status
+        WHEN 1 THEN '未配'
+        WHEN 2 THEN '已配'
+        WHEN 3 THEN '已孕'
+        WHEN 4 THEN '空怀'
+        WHEN 5 THEN '流产'
+        WHEN 6 THEN '产犊'
+        WHEN 7 THEN '禁配'
+        ELSE '未知'
+		END AS breed_status_name,
 		CASE a.pregnant_check_name
         WHEN 'pregnant_check_for_first' THEN '初检'
         WHEN 'pregnant_check_for_second' THEN '复检'

+ 16 - 9
module/backend/cow.go

@@ -300,9 +300,9 @@ func (s *StoreEntry) CowGrowthCurve(ctx context.Context, req *pasturePb.CowGrowt
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	cowInfo, err := s.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, int64(req.CowId))
+	cowInfo, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, req.EarNumber)
 	if err != nil {
-		return nil, xerr.Customf("错误的牛只信息: %d", req.CowId)
+		return nil, xerr.Customf("错误的牛只信息: %s", req.EarNumber)
 	}
 
 	weightList := make([]*model.EventWeight, 0)
@@ -403,7 +403,19 @@ func (s *StoreEntry) BehaviorRate(ctx context.Context, req *pasturePb.CowBehavio
 
 	cowInfo, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, req.EarNumber)
 	if err != nil {
-		return nil, xerr.Customf("错误的牛只信息: %d", req.CowId)
+		return nil, xerr.Customf("错误的牛只信息: %d", req.EarNumber)
+	}
+
+	if req.EndAt <= 0 || req.StartAt <= 0 || req.EndAt < req.StartAt {
+		return nil, xerr.Customf("时间范围错误")
+	}
+
+	t1 := time.Unix(int64(req.StartAt), 0).Local().Format(model.LayoutDate2)
+	t2 := time.Unix(int64(req.EndAt), 0).Local().Format(model.LayoutDate2)
+
+	dataBetween, err := util.GetDaysBetween(t1, t2)
+	if err != nil {
+		return nil, xerr.WithStack(err)
 	}
 
 	if cowInfo.NeckRingNumber == "" {
@@ -416,17 +428,12 @@ func (s *StoreEntry) BehaviorRate(ctx context.Context, req *pasturePb.CowBehavio
 		Where("neck_ring_number = ?", cowInfo.NeckRingNumber).
 		Where("pasture_id = ?", userModel.AppPasture.Id).
 		Where("cow_id > ?", 0).
-		Where("heat_date BETWEEN ? AND ?", req.StartTime, req.EndTime).
+		Where("heat_date BETWEEN ? AND ?", t1, t2).
 		Order("heat_date").
 		Group("heat_date").
 		Find(&neckActiveHabitList).Error; err != nil {
 	}
 
-	dataBetween, err := util.GetDaysBetween(req.StartTime, req.EndTime)
-	if err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
 	return &pasturePb.CowBehaviorRateResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",