|
@@ -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) {
|
|
@@ -67,7 +69,6 @@ func (s *StoreEntry) PasturePrefAnalysisData(ctx context.Context, req *operation
|
|
|
return
|
|
|
}
|
|
|
res[groupPasture.Id] = response.Data
|
|
|
-
|
|
|
}(pastureId)
|
|
|
}
|
|
|
wg.Wait()
|
|
@@ -75,7 +76,6 @@ func (s *StoreEntry) PasturePrefAnalysisData(ctx context.Context, req *operation
|
|
|
}
|
|
|
|
|
|
func (s *StoreEntry) PasturePrefExecTimeData(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (map[string]*model.ExecTimeData, error) {
|
|
|
-
|
|
|
res := make(map[string]*model.ExecTimeData, 0)
|
|
|
wg := sync.WaitGroup{}
|
|
|
wg.Add(len(req.PastureIds))
|
|
@@ -123,16 +123,14 @@ func (s *StoreEntry) PasturePrefExecTimeData(ctx context.Context, req *operation
|
|
|
return res, nil
|
|
|
}
|
|
|
|
|
|
-func (s *StoreEntry) PastureSprinkleFeedTime(ctx context.Context, req *operationPb.SprinkleFeedTimeRequest) (map[string][]*model.SprinkleStatisticsDataList, error) {
|
|
|
-
|
|
|
- res := make(map[string][]*model.SprinkleStatisticsDataList, 0)
|
|
|
+func (s *StoreEntry) PastureSprinkleFeedTime(ctx context.Context, req *operationPb.SprinkleFeedTimeRequest) (map[int64][]*model.SprinkleStatisticsDataList, map[int64]*model.GroupPasture, error) {
|
|
|
+ res, pastureList := make(map[int64][]*model.SprinkleStatisticsDataList), make(map[int64]*model.GroupPasture, 0)
|
|
|
wg := sync.WaitGroup{}
|
|
|
wg.Add(len(req.PastureIds))
|
|
|
var muError error
|
|
|
for _, pasture := range req.PastureIds {
|
|
|
go func(pId int32) {
|
|
|
defer wg.Done()
|
|
|
-
|
|
|
groupPasture, err := s.GetGroupPastureListById(ctx, int64(pId))
|
|
|
if err != nil {
|
|
|
zaplog.Error("PastureSprinkleFeedTime", zap.Any("GetGroupPastureListById", err))
|
|
@@ -146,6 +144,7 @@ func (s *StoreEntry) PastureSprinkleFeedTime(ctx context.Context, req *operation
|
|
|
StartDate: req.StartDate,
|
|
|
EndDate: req.EndDate,
|
|
|
}
|
|
|
+
|
|
|
if err = s.PastureHttpClient(ctx, model.DashboardSprinkleFeedTimeUrl, int64(pId), body, response); err != nil {
|
|
|
muError = multierr.Append(muError, err)
|
|
|
zaplog.Error("PastureSprinkleFeedTime",
|
|
@@ -160,160 +159,172 @@ func (s *StoreEntry) PastureSprinkleFeedTime(ctx context.Context, req *operation
|
|
|
if response.Code != http.StatusOK {
|
|
|
muError = multierr.Append(muError, xerr.Custom(response.Msg))
|
|
|
}
|
|
|
- res[groupPasture.Name] = response.Data
|
|
|
+ res[groupPasture.Id] = response.Data
|
|
|
+ pastureList[groupPasture.Id] = groupPasture
|
|
|
}(pasture)
|
|
|
}
|
|
|
wg.Wait()
|
|
|
- return res, nil
|
|
|
+ return res, pastureList, nil
|
|
|
}
|
|
|
|
|
|
-func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error) {
|
|
|
- res := &model.SearchAnalysisAccuracyResponse{
|
|
|
+// SearchAnalysisAccuracy 准确性分析
|
|
|
+func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse1, error) {
|
|
|
+ res := &model.SearchAnalysisAccuracyResponse1{
|
|
|
Code: http.StatusOK,
|
|
|
Msg: "ok",
|
|
|
- Data: &model.AnalysisAccuracyData{
|
|
|
- Chart: &model.Chart{},
|
|
|
+ Data: &model.AnalysisAccuracyData1{
|
|
|
Table: &model.Table{
|
|
|
TitleList: make([]*model.TableList, 0),
|
|
|
DataList: &model.DataList{},
|
|
|
},
|
|
|
+ Chart: nil,
|
|
|
},
|
|
|
}
|
|
|
+
|
|
|
res.Data.Table.TitleList = append(res.Data.Table.TitleList, &model.TableList{
|
|
|
Name: "title",
|
|
|
Value: "牧场",
|
|
|
})
|
|
|
- pastureAnalysisAccuracy, err := s.PasturePrefAnalysisData(ctx, req)
|
|
|
+
|
|
|
+ dashboardTopData, pastureAnalysisAccuracy, err := s.DashboardTopPasture(ctx, req)
|
|
|
if err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
+ res.Data.Table = s.TitleList(ctx, pastureAnalysisAccuracy)
|
|
|
|
|
|
- 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)
|
|
|
+ dashboardTopData1 := &model.Chart1{
|
|
|
+ MixedFodderAccurateRatio: &model.PastureTopData1{
|
|
|
+ Title: make([]string, 0),
|
|
|
+ Ratio: make([]float64, 0),
|
|
|
+ },
|
|
|
+ MixedFodderCorrectRatio: &model.PastureTopData1{
|
|
|
+ Title: make([]string, 0),
|
|
|
+ Ratio: make([]float64, 0),
|
|
|
+ },
|
|
|
+ SprinkleFodderAccurateRatio: &model.PastureTopData1{
|
|
|
+ Title: make([]string, 0),
|
|
|
+ Ratio: make([]float64, 0),
|
|
|
+ },
|
|
|
+ SprinkleFodderCorrectRatio: &model.PastureTopData1{
|
|
|
+ Title: make([]string, 0),
|
|
|
+ Ratio: make([]float64, 0),
|
|
|
+ },
|
|
|
}
|
|
|
-
|
|
|
- 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)
|
|
|
+ pastureDayTimeRatioList := make(map[operationPb.DashboardTopType_Kind][]*model.PastureDayTimeRatio)
|
|
|
+
|
|
|
+ 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)
|
|
|
}
|
|
|
|
|
|
- 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
|
|
|
+ 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)
|
|
|
+ }
|
|
|
|
|
|
- chart := &model.Chart{
|
|
|
- MixedFodderAccurateRatio: mixedFodderAccurateRatio,
|
|
|
- MixedFodderCorrectRatio: mixedFodderCorrectRatio,
|
|
|
- SprinkleFodderAccurateRatio: sprinkleFodderAccurateRatio,
|
|
|
- SprinkleFodderCorrectRatio: sprinkleFodderCorrectRatio,
|
|
|
+ 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)
|
|
|
}
|
|
|
|
|
|
- res.Data.Chart = chart
|
|
|
- res.Data.Table = s.TitleList(ctx, pastureAnalysisAccuracy)
|
|
|
+ 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 {
|
|
|
+ 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
|
|
|
+ })
|
|
|
+ // 混料准确率
|
|
|
+ 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 = pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE][len(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_ACCURATE])-1].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 = pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT][len(pastureDayTimeRatioList[operationPb.DashboardTopType_MIXED_CORRECT])-1].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 = pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE][len(pastureDayTimeRatioList[operationPb.DashboardTopType_SPRINKLE_ACCURATE])-1].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 = pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT][len(pastureDayTimeRatioList[operationPb.DashboardTopType_Sprinkle_CORRECT])-1].PastureName
|
|
|
+
|
|
|
+ res.Data.Chart = dashboardTopData1
|
|
|
return res, nil
|
|
|
}
|
|
|
|
|
|
// TopPasture 牧场排名
|
|
|
func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.GetPastureTopResponse, error) {
|
|
|
+ res := &model.GetPastureTopResponse{
|
|
|
+ Code: http.StatusOK,
|
|
|
+ Msg: "ok",
|
|
|
+ Data: nil,
|
|
|
+ }
|
|
|
+ dashboardTopData, _, err := s.DashboardTopPasture(ctx, req)
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ res.Data = dashboardTopData
|
|
|
+ return res, nil
|
|
|
+}
|
|
|
+
|
|
|
+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),
|
|
|
SprinkleFodderAccurateRatio: make([]*model.PastureTopData, 0),
|
|
|
SprinkleFodderCorrectRatio: make([]*model.PastureTopData, 0),
|
|
|
}
|
|
|
- res := &model.GetPastureTopResponse{
|
|
|
- Code: http.StatusOK,
|
|
|
- Msg: "ok",
|
|
|
- Data: nil,
|
|
|
- }
|
|
|
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 {
|
|
@@ -322,6 +333,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
|
|
|
zaplog.Error("TopPasture", zap.Any("GetGroupPastureListById", pastureId), zap.Any("err", err))
|
|
|
continue
|
|
|
}
|
|
|
+
|
|
|
if data == nil {
|
|
|
continue
|
|
|
}
|
|
@@ -331,6 +343,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
|
|
|
allMaRatio += v.Ratio
|
|
|
}
|
|
|
dashboardTopData.MixedFodderAccurateRatio = append(dashboardTopData.MixedFodderAccurateRatio, &model.PastureTopData{
|
|
|
+ PastureId: pastureId,
|
|
|
PastureName: groupPasture.Name,
|
|
|
Ratio: tool.Decimal(allMaRatio / float64(len(data.MixedFodderAccurateRatio))),
|
|
|
})
|
|
@@ -339,14 +352,16 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
|
|
|
allMcRatio += v.Ratio
|
|
|
}
|
|
|
dashboardTopData.MixedFodderCorrectRatio = append(dashboardTopData.MixedFodderCorrectRatio, &model.PastureTopData{
|
|
|
+ PastureId: pastureId,
|
|
|
PastureName: groupPasture.Name,
|
|
|
- Ratio: tool.Decimal(allMaRatio / float64(len(data.MixedFodderCorrectRatio))),
|
|
|
+ Ratio: tool.Decimal(allMcRatio / float64(len(data.MixedFodderCorrectRatio))),
|
|
|
})
|
|
|
|
|
|
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))),
|
|
|
})
|
|
@@ -355,6 +370,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
|
|
|
allScRatio += v.Ratio
|
|
|
}
|
|
|
dashboardTopData.SprinkleFodderCorrectRatio = append(dashboardTopData.SprinkleFodderCorrectRatio, &model.PastureTopData{
|
|
|
+ PastureId: pastureId,
|
|
|
PastureName: groupPasture.Name,
|
|
|
Ratio: tool.Decimal(allScRatio / float64(len(data.SprinkleFodderCorrectRatio))),
|
|
|
})
|
|
@@ -386,8 +402,7 @@ func (s *StoreEntry) TopPasture(ctx context.Context, req *operationPb.SearchAnal
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- res.Data = dashboardTopData
|
|
|
- return res, nil
|
|
|
+ return dashboardTopData, analysisAccuracy, nil
|
|
|
}
|
|
|
|
|
|
func (s *StoreEntry) TitleList(ctx context.Context, pastureAnalysisList map[int64]*model.PastureAnalysisAccuracyData) *model.Table {
|
|
@@ -537,35 +552,49 @@ func (s *StoreEntry) SprinkleFeedTime(ctx context.Context, req *operationPb.Spri
|
|
|
TableList: make([]*model.SprinkleFeedTimeTable, 0),
|
|
|
},
|
|
|
}
|
|
|
- pastureSprinkleDataList, err := s.PastureSprinkleFeedTime(ctx, req)
|
|
|
+ pastureSprinkleDataList, pastureList, err := s.PastureSprinkleFeedTime(ctx, req)
|
|
|
if err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
tableList := make([]*model.SprinkleFeedTimeTable, 0)
|
|
|
- infoSprinkleNumber, errorSprinkleNumber := make([]int32, 0), make([]int32, 0)
|
|
|
- for pastureName, data := range pastureSprinkleDataList {
|
|
|
- sprinkleFeedTimeList := make(map[int32]map[int32][]int64, 0)
|
|
|
- for _, v := range data {
|
|
|
- tableList = append(tableList, &model.SprinkleFeedTimeTable{
|
|
|
- PastureName: pastureName,
|
|
|
- BarnName: v.FName,
|
|
|
- ClassNumber: fmt.Sprintf("%d", v.Times),
|
|
|
- RealitySprinkleFeedTime: tool.TimeSub(v.InTime, v.ProcessTime),
|
|
|
- })
|
|
|
- realityTime := tool.TimeSub(v.InTime, v.ProcessTime)
|
|
|
- realityTimeUnix, _ := time.Parse(model.LayoutTime, realityTime)
|
|
|
- if sprinkleFeedTimeList[v.FBarId] == nil {
|
|
|
- sprinkleFeedTimeList[v.FBarId] = make(map[int32][]int64, 0)
|
|
|
- }
|
|
|
- sprinkleFeedTimeList[v.FBarId][v.Times] = append(sprinkleFeedTimeList[v.FBarId][v.Times], realityTimeUnix.Unix())
|
|
|
+ infoSprinkleNumber, errorSprinkleNumber, pastureIds := make([]int32, 0), make([]int32, 0), make([]int, 0)
|
|
|
+
|
|
|
+ for pastureId, _ := range pastureSprinkleDataList {
|
|
|
+ pastureIds = append(pastureIds, int(pastureId))
|
|
|
+ }
|
|
|
+
|
|
|
+ sort.Ints(pastureIds)
|
|
|
+ pastureInfo := &model.GroupPasture{}
|
|
|
+ for _, pastureId := range pastureIds {
|
|
|
+ if pastureData, ok := pastureList[int64(pastureId)]; ok {
|
|
|
+ pastureInfo = pastureData
|
|
|
}
|
|
|
- res.Data.Chart.Title = append(res.Data.Chart.Title, pastureName)
|
|
|
|
|
|
- infoNumber, errNumber := sprinkleExecTimeAnalysis(sprinkleFeedTimeList)
|
|
|
- infoSprinkleNumber = append(infoSprinkleNumber, infoNumber)
|
|
|
- errorSprinkleNumber = append(errorSprinkleNumber, errNumber)
|
|
|
+ if data, ok := pastureSprinkleDataList[int64(pastureId)]; ok {
|
|
|
+ sprinkleFeedTimeList := make(map[int32]map[int32][]int64, 0)
|
|
|
+ for _, v := range data {
|
|
|
+ tableList = append(tableList, &model.SprinkleFeedTimeTable{
|
|
|
+ PastureName: pastureInfo.Name,
|
|
|
+ BarnName: v.FName,
|
|
|
+ ClassNumber: fmt.Sprintf("%d", v.Times),
|
|
|
+ RealitySprinkleFeedTime: tool.TimeSub(v.InTime, v.ProcessTime),
|
|
|
+ })
|
|
|
+ realityTime := tool.TimeSub(v.InTime, v.ProcessTime)
|
|
|
+ realityTimeUnix, _ := time.Parse(model.LayoutTime, realityTime)
|
|
|
+ if sprinkleFeedTimeList[v.FBarId] == nil {
|
|
|
+ sprinkleFeedTimeList[v.FBarId] = make(map[int32][]int64, 0)
|
|
|
+ }
|
|
|
+ sprinkleFeedTimeList[v.FBarId][v.Times] = append(sprinkleFeedTimeList[v.FBarId][v.Times], realityTimeUnix.Unix())
|
|
|
+ }
|
|
|
+
|
|
|
+ res.Data.Chart.Title = append(res.Data.Chart.Title, pastureInfo.Name)
|
|
|
+ infoNumber, errNumber := sprinkleExecTimeAnalysis(sprinkleFeedTimeList)
|
|
|
+ infoSprinkleNumber = append(infoSprinkleNumber, infoNumber)
|
|
|
+ errorSprinkleNumber = append(errorSprinkleNumber, errNumber)
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
res.Data.Chart.SprinkleNumberList = append(res.Data.Chart.SprinkleNumberList, infoSprinkleNumber, errorSprinkleNumber)
|
|
|
res.Data.TableList = tableList
|
|
|
return res, nil
|
|
@@ -590,7 +619,69 @@ func (s *StoreEntry) FeedMixedAndTmrName(ctx context.Context, req *operationPb.M
|
|
|
},
|
|
|
}
|
|
|
response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
|
|
|
- if err := s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
|
|
|
+ if err = s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ return response, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s *StoreEntry) FeedTemplateHistory(ctx context.Context, req *operationPb.FeedTemplateHistoryRequest) (*model.PastureFeedTemplateHistoryResponse, error) {
|
|
|
+ groupPasture, err := s.GetGroupPastureListById(ctx, int64(req.PastureId))
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ pastureId := req.PastureId
|
|
|
+ if groupPasture.PastureId > 0 {
|
|
|
+ pastureId = int32(groupPasture.PastureId)
|
|
|
+ }
|
|
|
+
|
|
|
+ body := &model.PastureFeedTemplateHistoryRequest{
|
|
|
+ PastureId: fmt.Sprintf("%d", pastureId),
|
|
|
+ FTid: int64(req.Ftid),
|
|
|
+ StartDate: req.StartTime,
|
|
|
+ EndDate: req.EndTime,
|
|
|
+ }
|
|
|
+ response := &model.PastureFeedTemplateHistoryResponse{}
|
|
|
+ if err = s.PastureHttpClient(ctx, model.UrlFeedTemplateHistory, int64(req.PastureId), body, response); err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ return response, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s *StoreEntry) BarnHistory(ctx context.Context, req *operationPb.BarnHistoryRequest) (*model.PastureBarnHistoryResponse, error) {
|
|
|
+ _, err := s.GetGroupPastureListById(ctx, int64(req.PastureId))
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ body := &model.PastureBarnHistoryRequest{
|
|
|
+ BarName: req.BarnName,
|
|
|
+ StartDate: req.StartTime,
|
|
|
+ EndDate: req.EndTime,
|
|
|
+ }
|
|
|
+ response := &model.PastureBarnHistoryResponse{}
|
|
|
+ if err = s.PastureHttpClient(ctx, model.UrlBarnHistory, int64(req.PastureId), body, response); err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ return response, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s *StoreEntry) SpillageAllHistory(ctx context.Context, req *operationPb.BarnHistoryRequest) (*model.PastureBarnHistoryResponse, error) {
|
|
|
+ groupPasture, err := s.GetGroupPastureListById(ctx, int64(req.PastureId))
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ pastureId := req.PastureId
|
|
|
+ if groupPasture.PastureId > 0 {
|
|
|
+ pastureId = int32(groupPasture.PastureId)
|
|
|
+ }
|
|
|
+ body := &model.PastureBarnHistoryRequest{
|
|
|
+ PastureId: fmt.Sprintf("%d", pastureId),
|
|
|
+ BarName: req.BarnName,
|
|
|
+ StartDate: req.StartTime,
|
|
|
+ EndDate: req.EndTime,
|
|
|
+ }
|
|
|
+ response := &model.PastureBarnHistoryResponse{}
|
|
|
+ if err = s.PastureHttpClient(ctx, model.UrlSpillageAllHistory, int64(req.PastureId), body, response); err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
return response, nil
|
|
@@ -631,3 +722,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)
|
|
|
+}
|