|
@@ -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)
|
|
|
+}
|