|  | @@ -19,7 +19,9 @@ import (
 | 
	
		
			
				|  |  |  	"go.uber.org/zap"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const compareTime = 10 * 60
 | 
	
		
			
				|  |  | +const (
 | 
	
		
			
				|  |  | +	compareTime = 10 * 60
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // PasturePrefAnalysisData  PasturePrefExecTimeData PastureSprinkleFeedTime TODO  后期三个函数封装一下
 | 
	
		
			
				|  |  |  func (s *StoreEntry) PasturePrefAnalysisData(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (map[int64]*model.PastureAnalysisAccuracyData, error) {
 | 
	
	
		
			
				|  | @@ -185,18 +187,12 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 | 
	
		
			
				|  |  |  		Value: "牧场",
 | 
	
		
			
				|  |  |  	})
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	pastureAnalysisAccuracy, err := s.PasturePrefAnalysisData(ctx, req)
 | 
	
		
			
				|  |  | +	dashboardTopData, pastureAnalysisAccuracy, err := s.DashboardTopPasture(ctx, req)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	zaplog.Info("SearchAnalysisAccuracy", zap.Any("pastureAnalysisAccuracy", pastureAnalysisAccuracy))
 | 
	
		
			
				|  |  |  	res.Data.Table = s.TitleList(ctx, pastureAnalysisAccuracy)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	dashboardTopData, err := s.DashboardTopPasture(ctx, req)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	dashboardTopData1 := &model.Chart1{
 | 
	
		
			
				|  |  |  		MixedFodderAccurateRatio: &model.PastureTopData1{
 | 
	
		
			
				|  |  |  			Title: make([]string, 0),
 | 
	
	
		
			
				|  | @@ -215,69 +211,54 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 | 
	
		
			
				|  |  |  			Ratio: make([]float64, 0),
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	pastureDayTimeRatioList := make(map[operationPb.DashboardTopType_Kind][]*model.PastureDayTimeRatio)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	pastureDayTimeRatioList := make(map[operationPb.DashboardTopType_Kind][]*model.PastureDayTimeRatio, 0)
 | 
	
		
			
				|  |  | -	for pastureId, data := range pastureAnalysisAccuracy {
 | 
	
		
			
				|  |  | -		pastureInfo, err := s.GetGroupPastureListById(ctx, pastureId)
 | 
	
		
			
				|  |  | -		if err != nil {
 | 
	
		
			
				|  |  | -			zaplog.Error("SearchAnalysisAccuracy GetGroupPastureListById",
 | 
	
		
			
				|  |  | -				zap.Any("pastureId", pastureId), zap.Any("error", err))
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if data == nil {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		for _, v := range data.MixedFodderAccurateRatio {
 | 
	
		
			
				|  |  | -			pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE] =
 | 
	
		
			
				|  |  | -				append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE],
 | 
	
		
			
				|  |  | -					&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | -						PastureId:   pastureId,
 | 
	
		
			
				|  |  | -						PastureName: pastureInfo.Name,
 | 
	
		
			
				|  |  | -						DayTime:     v.DayTime,
 | 
	
		
			
				|  |  | -						Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | -					})
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		for _, v := range data.MixedFodderCorrectRatio {
 | 
	
		
			
				|  |  | -			pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT] =
 | 
	
		
			
				|  |  | -				append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT],
 | 
	
		
			
				|  |  | -					&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | -						PastureId:   pastureId,
 | 
	
		
			
				|  |  | -						PastureName: pastureInfo.Name,
 | 
	
		
			
				|  |  | -						DayTime:     v.DayTime,
 | 
	
		
			
				|  |  | -						Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | -					})
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +	for _, v := range dashboardTopData.MixedFodderCorrectRatio {
 | 
	
		
			
				|  |  | +		pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE] =
 | 
	
		
			
				|  |  | +			append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE],
 | 
	
		
			
				|  |  | +				&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | +					PastureId:   v.PastureId,
 | 
	
		
			
				|  |  | +					PastureName: v.PastureName,
 | 
	
		
			
				|  |  | +					Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | +				})
 | 
	
		
			
				|  |  | +		dashboardTopData1.MixedFodderCorrectRatio.Title = append(dashboardTopData1.MixedFodderCorrectRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | +		dashboardTopData1.MixedFodderCorrectRatio.Ratio = append(dashboardTopData1.MixedFodderCorrectRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		for _, v := range data.SprinkleFodderAccurateRatio {
 | 
	
		
			
				|  |  | -			pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE] =
 | 
	
		
			
				|  |  | -				append(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE],
 | 
	
		
			
				|  |  | -					&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | -						PastureId:   pastureId,
 | 
	
		
			
				|  |  | -						PastureName: pastureInfo.Name,
 | 
	
		
			
				|  |  | -						DayTime:     v.DayTime,
 | 
	
		
			
				|  |  | -						Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | -					})
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +	for _, v := range dashboardTopData.MixedFodderAccurateRatio {
 | 
	
		
			
				|  |  | +		pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT] =
 | 
	
		
			
				|  |  | +			append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT],
 | 
	
		
			
				|  |  | +				&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | +					PastureId:   v.PastureId,
 | 
	
		
			
				|  |  | +					PastureName: v.PastureName,
 | 
	
		
			
				|  |  | +					Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | +				})
 | 
	
		
			
				|  |  | +		dashboardTopData1.MixedFodderAccurateRatio.Title = append(dashboardTopData1.MixedFodderAccurateRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | +		dashboardTopData1.MixedFodderAccurateRatio.Ratio = append(dashboardTopData1.MixedFodderAccurateRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		for _, v := range data.SprinkleFodderCorrectRatio {
 | 
	
		
			
				|  |  | -			pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT] =
 | 
	
		
			
				|  |  | -				append(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT],
 | 
	
		
			
				|  |  | -					&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | -						PastureId:   pastureId,
 | 
	
		
			
				|  |  | -						PastureName: pastureInfo.Name,
 | 
	
		
			
				|  |  | -						DayTime:     v.DayTime,
 | 
	
		
			
				|  |  | -						Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | -					})
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +	for _, v := range dashboardTopData.SprinkleFodderAccurateRatio {
 | 
	
		
			
				|  |  | +		pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE] =
 | 
	
		
			
				|  |  | +			append(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE],
 | 
	
		
			
				|  |  | +				&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | +					PastureId:   v.PastureId,
 | 
	
		
			
				|  |  | +					PastureName: v.PastureName,
 | 
	
		
			
				|  |  | +					Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | +				})
 | 
	
		
			
				|  |  | +		dashboardTopData1.SprinkleFodderAccurateRatio.Title = append(dashboardTopData1.SprinkleFodderAccurateRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | +		dashboardTopData1.SprinkleFodderAccurateRatio.Ratio = append(dashboardTopData1.SprinkleFodderAccurateRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	zaplog.Info("SearchAnalysisAccuracyBefore", zap.Any("pastureDayTimeRatioList", pastureDayTimeRatioList))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	pastureTopDataList, err := s.TopPasture(ctx, req)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		zaplog.Error("SearchAnalysisAccuracy", zap.Any("TopPasture", err), zap.Any("request", req))
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | +	for _, v := range dashboardTopData.SprinkleFodderCorrectRatio {
 | 
	
		
			
				|  |  | +		pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT] =
 | 
	
		
			
				|  |  | +			append(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT],
 | 
	
		
			
				|  |  | +				&model.PastureDayTimeRatio{
 | 
	
		
			
				|  |  | +					PastureId:   v.PastureId,
 | 
	
		
			
				|  |  | +					PastureName: v.PastureName,
 | 
	
		
			
				|  |  | +					Ratio:       v.Ratio,
 | 
	
		
			
				|  |  | +				})
 | 
	
		
			
				|  |  | +		dashboardTopData1.SprinkleFodderCorrectRatio.Title = append(dashboardTopData1.SprinkleFodderCorrectRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | +		dashboardTopData1.SprinkleFodderCorrectRatio.Ratio = append(dashboardTopData1.SprinkleFodderCorrectRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	// 排序 最大值。最小值。中位数
 | 
	
		
			
				|  |  |  	sort.Slice(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE], func(i, j int) bool {
 | 
	
	
		
			
				|  | @@ -292,187 +273,34 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 | 
	
		
			
				|  |  |  	sort.Slice(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT], func(i, j int) bool {
 | 
	
		
			
				|  |  |  		return pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][i].Ratio < pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][j].Ratio
 | 
	
		
			
				|  |  |  	})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	zaplog.Info("SearchAnalysisAccuracyAfter", zap.Any("pastureDayTimeRatioList", pastureDayTimeRatioList))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	// 混料准确率
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][len(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE])-1].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][0].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", getPastureDayTimeRatioMiddleValue(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE]))
 | 
	
		
			
				|  |  | -	dashboardTopData1.MixedFodderAccurateRatio.TopOneName = pastureTopDataList.Data.MixedFodderAccurateRatio[0].PastureName
 | 
	
		
			
				|  |  | +	dashboardTopData1.MixedFodderAccurateRatio.TopOneName = pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][0].PastureName
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 混料正确率
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][len(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT])-1].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][0].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.MixedFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", getPastureDayTimeRatioMiddleValue(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT]))
 | 
	
		
			
				|  |  | -	dashboardTopData1.MixedFodderCorrectRatio.TopOneName = pastureTopDataList.Data.MixedFodderCorrectRatio[0].PastureName
 | 
	
		
			
				|  |  | +	dashboardTopData1.MixedFodderCorrectRatio.TopOneName = pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][0].PastureName
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 散料准确率
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][len(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE])-1].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][0].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", getPastureDayTimeRatioMiddleValue(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE]))
 | 
	
		
			
				|  |  | -	dashboardTopData1.SprinkleFodderAccurateRatio.TopOneName = pastureTopDataList.Data.SprinkleFodderAccurateRatio[0].PastureName
 | 
	
		
			
				|  |  | +	dashboardTopData1.SprinkleFodderAccurateRatio.TopOneName = pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][0].PastureName
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// 散料正确率
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][len(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT])-1].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][0].Ratio)
 | 
	
		
			
				|  |  |  	dashboardTopData1.SprinkleFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", getPastureDayTimeRatioMiddleValue(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT]))
 | 
	
		
			
				|  |  | -	dashboardTopData1.SprinkleFodderCorrectRatio.TopOneName = pastureTopDataList.Data.SprinkleFodderCorrectRatio[0].PastureName
 | 
	
		
			
				|  |  | -	zaplog.Info("SearchAnalysisAccuracyAfter", zap.Any("dashboardTopData", dashboardTopData))
 | 
	
		
			
				|  |  | -	for _, v := range dashboardTopData.MixedFodderCorrectRatio {
 | 
	
		
			
				|  |  | -		dashboardTopData1.MixedFodderCorrectRatio.Title = append(dashboardTopData1.MixedFodderCorrectRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | -		dashboardTopData1.MixedFodderCorrectRatio.Ratio = append(dashboardTopData1.MixedFodderCorrectRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +	dashboardTopData1.SprinkleFodderCorrectRatio.TopOneName = pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][0].PastureName
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	for _, v := range dashboardTopData.MixedFodderAccurateRatio {
 | 
	
		
			
				|  |  | -		dashboardTopData1.MixedFodderAccurateRatio.Title = append(dashboardTopData1.MixedFodderAccurateRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | -		dashboardTopData1.MixedFodderAccurateRatio.Ratio = append(dashboardTopData1.MixedFodderAccurateRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for _, v := range dashboardTopData.SprinkleFodderAccurateRatio {
 | 
	
		
			
				|  |  | -		dashboardTopData1.SprinkleFodderAccurateRatio.Title = append(dashboardTopData1.SprinkleFodderAccurateRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | -		dashboardTopData1.SprinkleFodderAccurateRatio.Ratio = append(dashboardTopData1.SprinkleFodderAccurateRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for _, v := range dashboardTopData.SprinkleFodderCorrectRatio {
 | 
	
		
			
				|  |  | -		dashboardTopData1.SprinkleFodderCorrectRatio.Title = append(dashboardTopData1.SprinkleFodderCorrectRatio.Title, v.PastureName)
 | 
	
		
			
				|  |  | -		dashboardTopData1.SprinkleFodderCorrectRatio.Ratio = append(dashboardTopData1.SprinkleFodderCorrectRatio.Ratio, v.Ratio)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  |  	res.Data.Chart = dashboardTopData1
 | 
	
		
			
				|  |  |  	return res, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (s *StoreEntry) SearchAnalysisAccuracyOld(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error) {
 | 
	
		
			
				|  |  | -	res := &model.SearchAnalysisAccuracyResponse{
 | 
	
		
			
				|  |  | -		Code: http.StatusOK,
 | 
	
		
			
				|  |  | -		Msg:  "ok",
 | 
	
		
			
				|  |  | -		Data: &model.AnalysisAccuracyData{
 | 
	
		
			
				|  |  | -			Chart: &model.Chart{},
 | 
	
		
			
				|  |  | -			Table: &model.Table{
 | 
	
		
			
				|  |  | -				TitleList: make([]*model.TableList, 0),
 | 
	
		
			
				|  |  | -				DataList:  &model.DataList{},
 | 
	
		
			
				|  |  | -			},
 | 
	
		
			
				|  |  | -		},
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	res.Data.Table.TitleList = append(res.Data.Table.TitleList, &model.TableList{
 | 
	
		
			
				|  |  | -		Name:  "title",
 | 
	
		
			
				|  |  | -		Value: "牧场",
 | 
	
		
			
				|  |  | -	})
 | 
	
		
			
				|  |  | -	pastureAnalysisAccuracy, err := s.PasturePrefAnalysisData(ctx, req)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	mixedFodderAccurateRatio, mixedFodderCorrectRatio, sprinkleFodderAccurateRatio, sprinkleFodderCorrectRatio :=
 | 
	
		
			
				|  |  | -		&model.CommonValueRatio{}, &model.CommonValueRatio{}, &model.CommonValueRatio{}, &model.CommonValueRatio{}
 | 
	
		
			
				|  |  | -	maTitleValueList, mcTitleValueList, saTitleValueList, scTitleValueList := make([]float64, 0), make([]float64, 0), make([]float64, 0), make([]float64, 0)
 | 
	
		
			
				|  |  | -	dayTimeList := tool.TimeBetween(req.StartDate, req.EndDate)
 | 
	
		
			
				|  |  | -	for pastureId, data := range pastureAnalysisAccuracy {
 | 
	
		
			
				|  |  | -		groupPasture, err := s.GetGroupPastureListById(ctx, pastureId)
 | 
	
		
			
				|  |  | -		if err != nil {
 | 
	
		
			
				|  |  | -			zaplog.Error("SearchAnalysisAccuracy GetGroupPastureListById",
 | 
	
		
			
				|  |  | -				zap.Any("pastureId", pastureId), zap.Any("error", err))
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if data == nil {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		mixedFodderAccurateRatioDataList := make([]string, 0)
 | 
	
		
			
				|  |  | -		for _, v := range data.MixedFodderAccurateRatio {
 | 
	
		
			
				|  |  | -			mixedFodderAccurateRatioDataList = append(mixedFodderAccurateRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
 | 
	
		
			
				|  |  | -			if len(mixedFodderAccurateRatio.DateDay) < len(dayTimeList) {
 | 
	
		
			
				|  |  | -				mixedFodderAccurateRatio.DateDay = append(mixedFodderAccurateRatio.DateDay, v.DayTime)
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			maTitleValueList = append(maTitleValueList, v.Ratio)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		mixedFodderAccurateRatio.DataList = append(mixedFodderAccurateRatio.DataList, mixedFodderAccurateRatioDataList)
 | 
	
		
			
				|  |  | -		mixedFodderAccurateRatio.PastureIds = append(mixedFodderAccurateRatio.PastureIds, int32(pastureId))
 | 
	
		
			
				|  |  | -		mixedFodderAccurateRatio.PastureName = append(mixedFodderAccurateRatio.PastureName, groupPasture.Name)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		mixedFodderCorrectRatioDataList := make([]string, 0)
 | 
	
		
			
				|  |  | -		for _, v := range data.MixedFodderCorrectRatio {
 | 
	
		
			
				|  |  | -			mixedFodderCorrectRatioDataList = append(mixedFodderCorrectRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
 | 
	
		
			
				|  |  | -			if len(mixedFodderCorrectRatio.DateDay) < len(dayTimeList) {
 | 
	
		
			
				|  |  | -				mixedFodderCorrectRatio.DateDay = append(mixedFodderCorrectRatio.DateDay, v.DayTime)
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			mcTitleValueList = append(mcTitleValueList, v.Ratio)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		mixedFodderCorrectRatio.DataList = append(mixedFodderCorrectRatio.DataList, mixedFodderCorrectRatioDataList)
 | 
	
		
			
				|  |  | -		mixedFodderCorrectRatio.PastureIds = append(mixedFodderCorrectRatio.PastureIds, int32(pastureId))
 | 
	
		
			
				|  |  | -		mixedFodderCorrectRatio.PastureName = append(mixedFodderCorrectRatio.PastureName, groupPasture.Name)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		sprinkleFodderRatioDataList := make([]string, 0)
 | 
	
		
			
				|  |  | -		for _, v := range data.SprinkleFodderAccurateRatio {
 | 
	
		
			
				|  |  | -			sprinkleFodderRatioDataList = append(sprinkleFodderRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
 | 
	
		
			
				|  |  | -			if len(sprinkleFodderAccurateRatio.DateDay) < len(dayTimeList) {
 | 
	
		
			
				|  |  | -				sprinkleFodderAccurateRatio.DateDay = append(sprinkleFodderAccurateRatio.DateDay, v.DayTime)
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			saTitleValueList = append(saTitleValueList, v.Ratio)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		sprinkleFodderAccurateRatio.DataList = append(sprinkleFodderAccurateRatio.DataList, sprinkleFodderRatioDataList)
 | 
	
		
			
				|  |  | -		sprinkleFodderAccurateRatio.PastureIds = append(sprinkleFodderAccurateRatio.PastureIds, int32(pastureId))
 | 
	
		
			
				|  |  | -		sprinkleFodderAccurateRatio.PastureName = append(sprinkleFodderAccurateRatio.PastureName, groupPasture.Name)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		sprinkleFodderCorrectRatioDataList := make([]string, 0)
 | 
	
		
			
				|  |  | -		for _, v := range data.SprinkleFodderCorrectRatio {
 | 
	
		
			
				|  |  | -			sprinkleFodderCorrectRatioDataList = append(sprinkleFodderCorrectRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
 | 
	
		
			
				|  |  | -			if len(sprinkleFodderCorrectRatio.DateDay) < len(dayTimeList) {
 | 
	
		
			
				|  |  | -				sprinkleFodderCorrectRatio.DateDay = append(sprinkleFodderCorrectRatio.DateDay, v.DayTime)
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			scTitleValueList = append(scTitleValueList, v.Ratio)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		sprinkleFodderCorrectRatio.DataList = append(sprinkleFodderCorrectRatio.DataList, sprinkleFodderCorrectRatioDataList)
 | 
	
		
			
				|  |  | -		sprinkleFodderCorrectRatio.PastureIds = append(sprinkleFodderCorrectRatio.PastureIds, int32(pastureId))
 | 
	
		
			
				|  |  | -		sprinkleFodderCorrectRatio.PastureName = append(sprinkleFodderCorrectRatio.PastureName, groupPasture.Name)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	pastureTopDataList, err := s.TopPasture(ctx, req)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		zaplog.Error("SearchAnalysisAccuracy", zap.Any("TopPasture", err), zap.Any("request", req))
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	sort.Float64s(maTitleValueList)
 | 
	
		
			
				|  |  | -	mixedFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", maTitleValueList[len(maTitleValueList)-1])
 | 
	
		
			
				|  |  | -	mixedFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", maTitleValueList[0])
 | 
	
		
			
				|  |  | -	mixedFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(maTitleValueList))
 | 
	
		
			
				|  |  | -	mixedFodderAccurateRatio.TopOneName = pastureTopDataList.Data.MixedFodderAccurateRatio[0].PastureName
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	sort.Float64s(mcTitleValueList)
 | 
	
		
			
				|  |  | -	mixedFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", mcTitleValueList[len(mcTitleValueList)-1])
 | 
	
		
			
				|  |  | -	mixedFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", mcTitleValueList[0])
 | 
	
		
			
				|  |  | -	mixedFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(mcTitleValueList))
 | 
	
		
			
				|  |  | -	mixedFodderCorrectRatio.TopOneName = pastureTopDataList.Data.MixedFodderCorrectRatio[0].PastureName
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	sort.Float64s(saTitleValueList)
 | 
	
		
			
				|  |  | -	sprinkleFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", saTitleValueList[len(saTitleValueList)-1])
 | 
	
		
			
				|  |  | -	sprinkleFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", saTitleValueList[0])
 | 
	
		
			
				|  |  | -	sprinkleFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(saTitleValueList))
 | 
	
		
			
				|  |  | -	sprinkleFodderAccurateRatio.TopOneName = pastureTopDataList.Data.SprinkleFodderAccurateRatio[0].PastureName
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	sort.Float64s(scTitleValueList)
 | 
	
		
			
				|  |  | -	sprinkleFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", scTitleValueList[len(scTitleValueList)-1])
 | 
	
		
			
				|  |  | -	sprinkleFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", scTitleValueList[0])
 | 
	
		
			
				|  |  | -	sprinkleFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(scTitleValueList))
 | 
	
		
			
				|  |  | -	sprinkleFodderCorrectRatio.TopOneName = pastureTopDataList.Data.SprinkleFodderCorrectRatio[0].PastureName
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	chart := &model.Chart{
 | 
	
		
			
				|  |  | -		MixedFodderAccurateRatio:    mixedFodderAccurateRatio,
 | 
	
		
			
				|  |  | -		MixedFodderCorrectRatio:     mixedFodderCorrectRatio,
 | 
	
		
			
				|  |  | -		SprinkleFodderAccurateRatio: sprinkleFodderAccurateRatio,
 | 
	
		
			
				|  |  | -		SprinkleFodderCorrectRatio:  sprinkleFodderCorrectRatio,
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	res.Data.Chart = chart
 | 
	
		
			
				|  |  | -	res.Data.Table = s.TitleList(ctx, pastureAnalysisAccuracy)
 | 
	
		
			
				|  |  | -	return res, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // TopPasture 牧场排名
 | 
	
		
			
				|  |  |  func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.GetPastureTopResponse, error) {
 | 
	
		
			
				|  |  |  	res := &model.GetPastureTopResponse{
 | 
	
	
		
			
				|  | @@ -480,7 +308,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
 | 
	
		
			
				|  |  |  		Msg:  "ok",
 | 
	
		
			
				|  |  |  		Data: nil,
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	dashboardTopData, err := s.DashboardTopPasture(ctx, req)
 | 
	
		
			
				|  |  | +	dashboardTopData, _, err := s.DashboardTopPasture(ctx, req)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -488,7 +316,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
 | 
	
		
			
				|  |  |  	return res, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.PastureTop, error) {
 | 
	
		
			
				|  |  | +func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.PastureTop, map[int64]*model.PastureAnalysisAccuracyData, error) {
 | 
	
		
			
				|  |  |  	dashboardTopData := &model.PastureTop{
 | 
	
		
			
				|  |  |  		MixedFodderAccurateRatio:    make([]*model.PastureTopData, 0),
 | 
	
		
			
				|  |  |  		MixedFodderCorrectRatio:     make([]*model.PastureTopData, 0),
 | 
	
	
		
			
				|  | @@ -497,7 +325,7 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	analysisAccuracy, err := s.PasturePrefAnalysisData(ctx, req)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | +		return nil, nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	for pastureId, data := range analysisAccuracy {
 | 
	
	
		
			
				|  | @@ -506,6 +334,7 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  			zaplog.Error("TopPasture", zap.Any("GetGroupPastureListById", pastureId), zap.Any("err", err))
 | 
	
		
			
				|  |  |  			continue
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		if data == nil {
 | 
	
		
			
				|  |  |  			continue
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -515,6 +344,7 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  			allMaRatio += v.Ratio
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		dashboardTopData.MixedFodderAccurateRatio = append(dashboardTopData.MixedFodderAccurateRatio, &model.PastureTopData{
 | 
	
		
			
				|  |  | +			PastureId:   pastureId,
 | 
	
		
			
				|  |  |  			PastureName: groupPasture.Name,
 | 
	
		
			
				|  |  |  			Ratio:       tool.Decimal(allMaRatio / float64(len(data.MixedFodderAccurateRatio))),
 | 
	
		
			
				|  |  |  		})
 | 
	
	
		
			
				|  | @@ -523,6 +353,7 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  			allMcRatio += v.Ratio
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		dashboardTopData.MixedFodderCorrectRatio = append(dashboardTopData.MixedFodderCorrectRatio, &model.PastureTopData{
 | 
	
		
			
				|  |  | +			PastureId:   pastureId,
 | 
	
		
			
				|  |  |  			PastureName: groupPasture.Name,
 | 
	
		
			
				|  |  |  			Ratio:       tool.Decimal(allMaRatio / float64(len(data.MixedFodderCorrectRatio))),
 | 
	
		
			
				|  |  |  		})
 | 
	
	
		
			
				|  | @@ -530,7 +361,9 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  		for _, v := range data.SprinkleFodderAccurateRatio {
 | 
	
		
			
				|  |  |  			allSaRatio += v.Ratio
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		dashboardTopData.SprinkleFodderAccurateRatio = append(dashboardTopData.SprinkleFodderAccurateRatio, &model.PastureTopData{
 | 
	
		
			
				|  |  | +			PastureId:   pastureId,
 | 
	
		
			
				|  |  |  			PastureName: groupPasture.Name,
 | 
	
		
			
				|  |  |  			Ratio:       tool.Decimal(allSaRatio / float64(len(data.SprinkleFodderAccurateRatio))),
 | 
	
		
			
				|  |  |  		})
 | 
	
	
		
			
				|  | @@ -538,10 +371,13 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  		for _, v := range data.SprinkleFodderCorrectRatio {
 | 
	
		
			
				|  |  |  			allScRatio += v.Ratio
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		dashboardTopData.SprinkleFodderCorrectRatio = append(dashboardTopData.SprinkleFodderCorrectRatio, &model.PastureTopData{
 | 
	
		
			
				|  |  | +			PastureId:   pastureId,
 | 
	
		
			
				|  |  |  			PastureName: groupPasture.Name,
 | 
	
		
			
				|  |  |  			Ratio:       tool.Decimal(allScRatio / float64(len(data.SprinkleFodderCorrectRatio))),
 | 
	
		
			
				|  |  |  		})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	sort.Slice(dashboardTopData.MixedFodderAccurateRatio, func(i, j int) bool {
 | 
	
	
		
			
				|  | @@ -569,7 +405,8 @@ func (s *StoreEntry) DashboardTopPasture(ctx context.Context, req *operationPb.S
 | 
	
		
			
				|  |  |  			dashboardTopData.SprinkleFodderCorrectRatio = dashboardTopRand(req, dashboardTopData.SprinkleFodderCorrectRatio)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return dashboardTopData, nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return dashboardTopData, analysisAccuracy, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (s *StoreEntry) TitleList(ctx context.Context, pastureAnalysisList map[int64]*model.PastureAnalysisAccuracyData) *model.Table {
 |