Bladeren bron

AnalysisAccuracy: 准确性分析优化

Yi 1 jaar geleden
bovenliggende
commit
17ce14d9a3
2 gewijzigde bestanden met toevoegingen van 88 en 39 verwijderingen
  1. 7 0
      model/analysis_accuracy.go
  2. 81 39
      module/backend/dashboard_service.go

+ 7 - 0
model/analysis_accuracy.go

@@ -192,3 +192,10 @@ type SprinkleStatisticsDataList struct {
 	ProcessTime string `json:"process_time"`
 	Times       int32  `json:"times"`
 }
+
+type PastureDayTimeRatio struct {
+	PastureId   int64   `json:"pasture_id"`
+	PastureName string  `json:"pasture_name"`
+	DayTime     string  `json:"day_time"`
+	Ratio       float64 `json:"ratio"`
+}

+ 81 - 39
module/backend/dashboard_service.go

@@ -166,6 +166,7 @@ func (s *StoreEntry) PastureSprinkleFeedTime(ctx context.Context, req *operation
 	return res, pastureList, nil
 }
 
+// SearchAnalysisAccuracy 准确性分析
 func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse1, error) {
 	res := &model.SearchAnalysisAccuracyResponse1{
 		Code: http.StatusOK,
@@ -190,11 +191,6 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 	}
 	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),
@@ -214,9 +210,10 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 		},
 	}
 
-	maTitleValueList, mcTitleValueList, saTitleValueList, scTitleValueList := make([]float64, 0), make([]float64, 0), make([]float64, 0), make([]float64, 0)
+	pastureDayTimeRatioList := make(map[operationPb.DashboardTopType_Kind][]*model.PastureDayTimeRatio, 0)
 	for pastureId, data := range pastureAnalysisAccuracy {
-		if _, err = s.GetGroupPastureListById(ctx, pastureId); err != nil {
+		pastureInfo, err := s.GetGroupPastureListById(ctx, pastureId)
+		if err != nil {
 			zaplog.Error("SearchAnalysisAccuracy GetGroupPastureListById",
 				zap.Any("pastureId", pastureId), zap.Any("error", err))
 			continue
@@ -225,28 +222,48 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 			continue
 		}
 
-		mixedFodderAccurateRatioDataList := make([]string, 0)
 		for _, v := range data.MixedFodderAccurateRatio {
-			mixedFodderAccurateRatioDataList = append(mixedFodderAccurateRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
-			maTitleValueList = append(maTitleValueList, v.Ratio)
+			pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE] =
+				append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE],
+					&model.PastureDayTimeRatio{
+						PastureId:   pastureId,
+						PastureName: pastureInfo.Name,
+						DayTime:     v.DayTime,
+						Ratio:       v.Ratio,
+					})
 		}
 
-		mixedFodderCorrectRatioDataList := make([]string, 0)
 		for _, v := range data.MixedFodderCorrectRatio {
-			mixedFodderCorrectRatioDataList = append(mixedFodderCorrectRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
-			mcTitleValueList = append(mcTitleValueList, v.Ratio)
+			pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT] =
+				append(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT],
+					&model.PastureDayTimeRatio{
+						PastureId:   pastureId,
+						PastureName: pastureInfo.Name,
+						DayTime:     v.DayTime,
+						Ratio:       v.Ratio,
+					})
 		}
 
-		sprinkleFodderRatioDataList := make([]string, 0)
 		for _, v := range data.SprinkleFodderAccurateRatio {
-			sprinkleFodderRatioDataList = append(sprinkleFodderRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
-			saTitleValueList = append(saTitleValueList, v.Ratio)
+			pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE] =
+				append(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE],
+					&model.PastureDayTimeRatio{
+						PastureId:   pastureId,
+						PastureName: pastureInfo.Name,
+						DayTime:     v.DayTime,
+						Ratio:       v.Ratio,
+					})
 		}
 
-		sprinkleFodderCorrectRatioDataList := make([]string, 0)
 		for _, v := range data.SprinkleFodderCorrectRatio {
-			sprinkleFodderCorrectRatioDataList = append(sprinkleFodderCorrectRatioDataList, fmt.Sprintf("%.2f", v.Ratio))
-			scTitleValueList = append(scTitleValueList, v.Ratio)
+			pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT] =
+				append(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT],
+					&model.PastureDayTimeRatio{
+						PastureId:   pastureId,
+						PastureName: pastureInfo.Name,
+						DayTime:     v.DayTime,
+						Ratio:       v.Ratio,
+					})
 		}
 	}
 
@@ -255,47 +272,60 @@ func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationP
 		zaplog.Error("SearchAnalysisAccuracy", zap.Any("TopPasture", err), zap.Any("request", req))
 		return nil, xerr.WithStack(err)
 	}
+	// 排序 最大值。最小值。中位数
+	sort.Slice(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE], func(i, j int) bool {
+		return pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][i].Ratio < pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][j].Ratio
+	})
+	sort.Slice(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT], func(i, j int) bool {
+		return pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][i].Ratio < pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][j].Ratio
+	})
+	sort.Slice(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE], func(i, j int) bool {
+		return pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][i].Ratio < pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][j].Ratio
+	})
+	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
+	})
 
-	sort.Float64s(maTitleValueList)
-	dashboardTopData1.MixedFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", maTitleValueList[len(maTitleValueList)-1])
-	dashboardTopData1.MixedFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", maTitleValueList[0])
-	dashboardTopData1.MixedFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(maTitleValueList))
+	// 混料准确率
+	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
 
-	sort.Float64s(mcTitleValueList)
-	dashboardTopData1.MixedFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", mcTitleValueList[len(mcTitleValueList)-1])
-	dashboardTopData1.MixedFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", mcTitleValueList[0])
-	dashboardTopData1.MixedFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(mcTitleValueList))
+	// 混料正确率
+	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
 
-	sort.Float64s(saTitleValueList)
-	dashboardTopData1.SprinkleFodderAccurateRatio.MaxValue = fmt.Sprintf("%.2f", saTitleValueList[len(saTitleValueList)-1])
-	dashboardTopData1.SprinkleFodderAccurateRatio.MinValue = fmt.Sprintf("%.2f", saTitleValueList[0])
-	dashboardTopData1.SprinkleFodderAccurateRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(saTitleValueList))
+	// 散料准确率
+	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
 
-	sort.Float64s(scTitleValueList)
-	dashboardTopData1.SprinkleFodderCorrectRatio.MaxValue = fmt.Sprintf("%.2f", scTitleValueList[len(scTitleValueList)-1])
-	dashboardTopData1.SprinkleFodderCorrectRatio.MinValue = fmt.Sprintf("%.2f", scTitleValueList[0])
-	dashboardTopData1.SprinkleFodderCorrectRatio.MiddleValue = fmt.Sprintf("%.2f", tool.Median(scTitleValueList))
+	// 散料正确率
+	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
 
-	for _, v := range dashboardTopData.MixedFodderCorrectRatio {
+	for _, v := range pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE] {
 		dashboardTopData1.MixedFodderCorrectRatio.Title = append(dashboardTopData1.MixedFodderCorrectRatio.Title, v.PastureName)
 		dashboardTopData1.MixedFodderCorrectRatio.Ratio = append(dashboardTopData1.MixedFodderCorrectRatio.Ratio, v.Ratio)
 	}
 
-	for _, v := range dashboardTopData.MixedFodderAccurateRatio {
+	for _, v := range pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT] {
 		dashboardTopData1.MixedFodderAccurateRatio.Title = append(dashboardTopData1.MixedFodderAccurateRatio.Title, v.PastureName)
 		dashboardTopData1.MixedFodderAccurateRatio.Ratio = append(dashboardTopData1.MixedFodderAccurateRatio.Ratio, v.Ratio)
 	}
 
-	for _, v := range dashboardTopData.SprinkleFodderAccurateRatio {
+	for _, v := range pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE] {
 		dashboardTopData1.SprinkleFodderAccurateRatio.Title = append(dashboardTopData1.SprinkleFodderAccurateRatio.Title, v.PastureName)
 		dashboardTopData1.SprinkleFodderAccurateRatio.Ratio = append(dashboardTopData1.SprinkleFodderAccurateRatio.Ratio, v.Ratio)
 	}
 
-	for _, v := range dashboardTopData.SprinkleFodderCorrectRatio {
+	for _, v := range pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT] {
 		dashboardTopData1.SprinkleFodderCorrectRatio.Title = append(dashboardTopData1.SprinkleFodderCorrectRatio.Title, v.PastureName)
 		dashboardTopData1.SprinkleFodderCorrectRatio.Ratio = append(dashboardTopData1.SprinkleFodderCorrectRatio.Ratio, v.Ratio)
 	}
@@ -850,3 +880,15 @@ func dashboardTopRand(req *operationPb.SearchAnalysisAccuracyRequest, data []*mo
 	}
 	return res
 }
+
+func getPastureDayTimeRatioMiddleValue(pastureDayTimeRatio []*model.PastureDayTimeRatio) float64 {
+	if len(pastureDayTimeRatio) <= 0 {
+		return 0
+	}
+	ratioList := make([]float64, 0)
+	for _, v := range pastureDayTimeRatio {
+		ratioList = append(ratioList, v.Ratio)
+	}
+	sort.Float64s(ratioList)
+	return tool.Median(ratioList)
+}