Browse Source

dashboard: 撒料时间统计分析

Yi 1 year ago
parent
commit
f0a5ea8d4d
5 changed files with 83 additions and 24 deletions
  1. 17 0
      http/handle/group/feed_formula.go
  2. 4 3
      http/routers/group_api.go
  3. 16 0
      models/group_data.go
  4. 25 21
      module/group.go
  5. 21 0
      service/group/group.go

+ 17 - 0
http/handle/group/feed_formula.go

@@ -66,3 +66,20 @@ func ProcessAnalysis(c *gin.Context) {
 		appG.Response(http.StatusOK, e.SUCCESS, res)
 	}
 }
+
+// SprinkleStatistics 撒料统计
+func SprinkleStatistics(c *gin.Context) {
+	appG := app.Gin{C: c}
+	var req models.SprinkleStatisticsRequest
+	if err := c.BindJSON(&req); err != nil {
+		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+		return
+	}
+	if res, err := group.SprinkleStatisticsService(&req); err != nil {
+		appG.Response(http.StatusBadRequest, e.ERROR_GET_S_FAIL, map[string]interface{}{
+			"error": err,
+		})
+	} else {
+		appG.Response(http.StatusOK, e.SUCCESS, res)
+	}
+}

+ 4 - 3
http/routers/group_api.go

@@ -13,8 +13,9 @@ func GroupAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		}
 
 		apiPasture := s.Group("/pasture")
-		apiPasture.POST("feed_formula/distribute", group.DistributeFeedFormula) // 饲料配方下发
-		apiPasture.POST("dashboard/accuracy_data", group.AnalysisAccuracy)      // 混料准确率数据
-		apiPasture.POST("dashboard/process_analysis", group.ProcessAnalysis)    // 过程分析
+		apiPasture.POST("feed_formula/distribute", group.DistributeFeedFormula)    // 饲料配方下发
+		apiPasture.POST("dashboard/accuracy_data", group.AnalysisAccuracy)         // 混料准确率数据
+		apiPasture.POST("dashboard/process_analysis", group.ProcessAnalysis)       // 过程分析
+		apiPasture.POST("dashboard/sprinkle_statistics", group.SprinkleStatistics) // 撒料统计
 	}
 }

+ 16 - 0
models/group_data.go

@@ -89,7 +89,23 @@ type ProcessData struct {
 	ExecBeginTime   time.Time `xorm:"exec_begin_time" json:"exec_begin_time"`
 	ExecEndTime     time.Time `xorm:"exec_end_time" json:"exec_end_time"`
 	ExecProcessTime string    `xorm:"exec_process_time" json:"exec_process_time"`
+	ExecStirDelay   int       `xorm:"exec_stir_delay" json:"exec_stir_delay"`
 	L2BeginTime     time.Time `xorm:"l2_begin_time"  json:"l2_begin_time"`
 	L2EndTime       time.Time `xorm:"l2_end_time"  json:"l2_end_time"`
 	L2ProcessTime   string    `xorm:"l2_process_time" json:"l2_process_time"`
 }
+
+type SprinkleStatisticsRequest struct {
+	FeedFormulaId int32  `json:"feed_formula_id"`
+	StartDate     string `json:"start_date"`
+	EndDate       string `json:"end_date"`   // 结束时间
+	PastureId     int32  `json:"pasture_id"` //牧场id
+}
+
+type SprinkleStatisticsDataList struct {
+	FBarId      int32     `xorm:"fbarid" json:"f_bar_id"`
+	FName       string    `xorm:"fname" json:"f_name"`
+	InTime      time.Time `xorm:"intime" json:"in_time"`
+	ProcessTime string    `xorm:"processtime" json:"process_time"`
+	Times       int32     `xorm:"times" json:"times"`
+}

+ 25 - 21
module/group.go

@@ -11,7 +11,7 @@ func MixedFodderData(req *models.AnalysisAccuracyRequest) ([]*models.MixedFodder
 	newSql := restful.Engine.NewSession().Table("downloadedplan").Alias("dp").
 		Select("dp.oweight,dp.lweight,dp.iweight,dp.mydate").
 		Join("LEFT", []string{"feedtemplet", "ft"}, "dp.tempid = ft.id").
-		Where("1 = 1")
+		Where("dp.pastureid = ?", req.PastureId)
 
 	if len(req.StartDate) > 0 && len(req.EndDate) > 0 {
 		newSql.And("dp.mydate >= ? and  dp.mydate <= ?", req.StartDate, req.EndDate)
@@ -21,10 +21,6 @@ func MixedFodderData(req *models.AnalysisAccuracyRequest) ([]*models.MixedFodder
 		newSql.And("ft.ccid = ?", req.CattleParentCategoryId)
 	}
 
-	if req.PastureId > 0 {
-		newSql.And("dp.pastureid = ?", req.PastureId)
-	}
-
 	if req.FeedFormulaId > 0 {
 		newSql.And("dp.tempid = ?", req.FeedFormulaId)
 	}
@@ -48,7 +44,7 @@ func MixedFodderCorrectData(req *models.AnalysisAccuracyRequest) ([]*models.Mixe
 	newSql := restful.Engine.NewSession().Table("downloadplandtl1").Alias("de").
 		Select(`SUM(de.havebuttom) AS "use_mixed_fodder_option_number",de.date,IFNULL(SUM(IF(ABS(de.actualweightminus-de.lweight)<=de.feedallowratio AND de.actualweightminus<>0,1,0)),0) AS "mixed_correct_number"`).
 		Join("LEFT", []string{"feedtemplet", "ft"}, "ft.id = de.fid").
-		Where("1 = 1")
+		Where("de.pastureid = ?", req.PastureId)
 
 	if len(req.StartDate) > 0 && len(req.EndDate) > 0 {
 		newSql.And("de.date >= ? and  de.date <= ?", req.StartDate, req.EndDate)
@@ -58,10 +54,6 @@ func MixedFodderCorrectData(req *models.AnalysisAccuracyRequest) ([]*models.Mixe
 		newSql.And("ft.ccid = ?", req.CattleParentCategoryId)
 	}
 
-	if req.PastureId > 0 {
-		newSql.And("de.pastureid = ?", req.PastureId)
-	}
-
 	if req.FeedFormulaId > 0 {
 		newSql.And("de.tempid = ?", req.FeedFormulaId)
 	}
@@ -76,7 +68,7 @@ func SprinkleFodderCorrectData(req *models.AnalysisAccuracyRequest) ([]*models.S
 	newSql := restful.Engine.NewSession().Table("downloadplandtl2").Alias("de").
 		Select(`SUM(de.havebuttom) AS "use_sprinkle_option_number",de.date,IFNULL(SUM(IF(ABS(de.actualweightminus-de.lweight)<=de.allowratio AND de.actualweightminus<>0,1,0)),0) AS "sprinkle_correct_number"`).
 		Join("LEFT", []string{"feedtemplet", "ft"}, "ft.id = de.feedtempletid").
-		Where("1 = 1")
+		Where("de.pastureid = ?", req.PastureId)
 
 	if len(req.StartDate) > 0 && len(req.EndDate) > 0 {
 		newSql.And("de.date >= ? and  de.date <= ?", req.StartDate, req.EndDate)
@@ -86,10 +78,6 @@ func SprinkleFodderCorrectData(req *models.AnalysisAccuracyRequest) ([]*models.S
 		newSql.And("ft.ccid = ?", req.CattleParentCategoryId)
 	}
 
-	if req.PastureId > 0 {
-		newSql.And("de.pastureid = ?", req.PastureId)
-	}
-
 	if req.FeedFormulaId > 0 {
 		newSql.And("de.tempid = ?", req.FeedFormulaId)
 	}
@@ -102,9 +90,9 @@ func SprinkleFodderCorrectData(req *models.AnalysisAccuracyRequest) ([]*models.S
 func ProcessAnalysisData(req *models.AnalysisAccuracyRequest) ([]*models.ProcessData, error) {
 	res := make([]*models.ProcessData, 0)
 	newSql := restful.Engine.Table("downloadplandtl1_exec").Alias("e").
-		Select("e.id,e.begintime as exec_begin_time,e.intime as exec_end_time,e.processtime as exec_process_time,l2.begintime as l2_begin_time,l2.intime as l2_end_time,l2.processtime as l2_process_time").
+		Select("e.id,e.begintime as exec_begin_time,e.intime as exec_end_time,e.processtime as exec_process_time,e.stirdelay as exec_stir_delay ,l2.begintime as l2_begin_time,l2.intime as l2_end_time,l2.processtime as l2_process_time").
 		Join("LEFT", []string{"downloadplandtl2", "l2"}, "e.pastureid = l2.pastureid and e.pid = l2.pid").
-		Where("1 = 1")
+		Where("e.pastureid = ?", req.PastureId)
 
 	if len(req.StartDate) > 0 && len(req.EndDate) > 0 {
 		newSql.And("e.date >= ? and  e.date <= ?", req.StartDate, req.EndDate)
@@ -114,10 +102,6 @@ func ProcessAnalysisData(req *models.AnalysisAccuracyRequest) ([]*models.Process
 		newSql.And("l2.cowclassid = ?", req.CattleParentCategoryId)
 	}
 
-	if req.PastureId > 0 {
-		newSql.And("e.pastureid = ?", req.PastureId)
-	}
-
 	if req.FeedFormulaId > 0 {
 		newSql.And("l2.feedtempletid = ?", req.FeedFormulaId)
 	}
@@ -127,3 +111,23 @@ func ProcessAnalysisData(req *models.AnalysisAccuracyRequest) ([]*models.Process
 
 	return res, nil
 }
+
+func SprinkleStatistics(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
+	res := make([]*models.SprinkleStatisticsDataList, 0)
+	newSql := restful.Engine.Table("downloadplandtl2").Alias("a").Select("a.fbarid,a.fname,a.intime,a.processtime,b.times").
+		Join("LEFT", []string{"downloadedplan", "b"}, "a.pastureid = b.pastureid AND b.pid = a.pid").
+		Where("a.pastureid = ?", req.PastureId).And("b.times > 0 ").And("a.fbarid > 0")
+	if len(req.StartDate) > 0 && len(req.EndDate) > 0 {
+		newSql.And("a.date >= ? and  a.date <= ?", req.StartDate, req.EndDate)
+	}
+
+	if req.FeedFormulaId > 0 {
+		newSql.And("a.feedtempletid = ?", req.FeedFormulaId)
+	}
+
+	if err := newSql.GroupBy("a.fbarid ,b.intime").Find(&res); err != nil {
+		return nil, err
+	}
+
+	return res, nil
+}

+ 21 - 0
service/group/group.go

@@ -176,9 +176,11 @@ func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.Proces
 
 	addFeedList := make([]int, 0)
 	sprinkleFeedList := make([]int, 0)
+	stirDelayList := make([]int, 0)
 	for _, v := range processDataList {
 		addFeedList = append(addFeedList, util.TimeParseToMinutes(v.ExecProcessTime))
 		sprinkleFeedList = append(sprinkleFeedList, util.TimeParseToMinutes(v.L2ProcessTime))
+		stirDelayList = append(stirDelayList, v.ExecStirDelay)
 	}
 
 	if len(addFeedList) > 0 {
@@ -199,5 +201,24 @@ func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.Proces
 		response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
 	}
 
+	if len(stirDelayList) > 0 {
+		sort.Ints(stirDelayList)
+		response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])
+		response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))
+		response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))
+		response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))
+		response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])
+
+	}
+
 	return response, nil
 }
+
+// SprinkleStatisticsService 撒料统计
+func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
+	sprinkleDataList, err := module.SprinkleStatistics(req)
+	if err != nil {
+		return nil, err
+	}
+	return sprinkleDataList, nil
+}