Browse Source

Merge branch 'feature/group_list' of xuyiping/kpt-tmr-group into release/v1.0.2

xuyiping 1 year ago
parent
commit
3387c32977
2 changed files with 71 additions and 231 deletions
  1. 7 4
      model/analysis_accuracy.go
  2. 64 227
      module/backend/dashboard_service.go

+ 7 - 4
model/analysis_accuracy.go

@@ -107,13 +107,16 @@ type GetPastureTopResponse struct {
 }
 
 type PastureTop struct {
-	MixedFodderAccurateRatio    []*PastureTopData `json:"mixed_fodder_accurate_ratio"`
-	MixedFodderCorrectRatio     []*PastureTopData `json:"mixed_fodder_correct_ratio"`
-	SprinkleFodderAccurateRatio []*PastureTopData `json:"sprinkle_fodder_accurate_ratio"`
-	SprinkleFodderCorrectRatio  []*PastureTopData `json:"sprinkle_fodder_correct_ratio"`
+	MixedFodderAccurateRatio    []*PastureTopData                                      `json:"mixed_fodder_accurate_ratio"`
+	MixedFodderCorrectRatio     []*PastureTopData                                      `json:"mixed_fodder_correct_ratio"`
+	SprinkleFodderAccurateRatio []*PastureTopData                                      `json:"sprinkle_fodder_accurate_ratio"`
+	SprinkleFodderCorrectRatio  []*PastureTopData                                      `json:"sprinkle_fodder_correct_ratio"`
+	Table                       *Table                                                 `json:"table"`
+	PastureTopData1             map[operationPb.DashboardTopType_Kind]*PastureTopData1 `json:"pasture_top_data"`
 }
 
 type PastureTopData struct {
+	PastureId   int64   `json:"pasture_id"`
 	PastureName string  `json:"pasture_name"`
 	Ratio       float64 `json:"ratio"`
 }

+ 64 - 227
module/backend/dashboard_service.go

@@ -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 {