| 
					
				 | 
			
			
				@@ -24,7 +24,8 @@ func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	estrusWarningCowList := make([]*model.DashboardNeckRingEstrusWarning, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var count int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	neckRingEstrusList := make([]*model.NeckRingEstrusWarning, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	estrusWarningLevelItems := map[int32]int32{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		int32(pasturePb.EstrusLevel_Low):    0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		int32(pasturePb.EstrusLevel_Middle): 0, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -36,28 +37,38 @@ func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, xerr.Customf("系统错误!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err = pref.Order("a.level DESC"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Select("a.level, count(a.level) as count"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Group("a.level"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&estrusWarningCowList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Count(&count). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Find(&neckRingEstrusList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/*if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.NeckRingEstrusWarning).TableName())). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Select("a.level, count(a.level) as count"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("a.pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("a.is_show = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Group("a.level"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&estrusWarningCowList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	countEstrusWarning := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, v := range estrusWarningCowList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		estrusWarningLevelItems[int32(v.Level)] = estrusWarningLevelItems[v.Count] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		countEstrusWarning += int(v.Count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nowTime := time.Now().Local() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	optimumMating := map[string]int32{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"front":  0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"middle": 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"behind": 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range neckRingEstrusList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		estrusWarningLevelItems[int32(v.Level)] += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		countEstrusWarning += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cowInfo, _ := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, v.EarNumber) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pzHour := v.CalculatePzHour(cowInfo.Lact) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		optimumMatingStartTime := pzHour.Add(-4 * time.Hour) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		optimumMatingEndTime := pzHour.Add(4 * time.Hour) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 判断当前时间是否在 pzHour-4h 到 pzHour+4h 之间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if nowTime.After(optimumMatingStartTime) && nowTime.Before(optimumMatingEndTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			optimumMating["middle"] += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if nowTime.After(optimumMatingEndTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			optimumMating["behind"] += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if nowTime.Before(optimumMatingStartTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			optimumMating["front"] += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	zaplog.Info("NeckRingWarning", zap.Any("estrusWarningNumber", estrusWarningCowList), zap.Any("estrusWarningLevelItems", estrusWarningLevelItems)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	abortionCount := int64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	pref, err = s.AbortionWarningQuery(ctx, userModel.AppPasture.Id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -85,6 +96,7 @@ func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			AbortionWarningNumber:   int32(abortionCount), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			StressWarningNumber:     0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			EstrusWarningLevelItems: estrusWarningLevelItems, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			OptimumMating:           optimumMating, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |