Pārlūkot izejas kodu

statistics: 库存管理和饲喂效率

Yi 1 gadu atpakaļ
vecāks
revīzija
64f0b96b90

+ 45 - 1
backend/operation/statistic.proto

@@ -7,17 +7,61 @@ option go_package = ".;operationPb";
 import "backend/operation/pagination.proto";
 import "backend/operation/enum.proto";
 
+// SearchFormulaEstimateRequest 配方评估
 message SearchFormulaEstimateRequest {
   string start_time  = 1;     // 开始时间
   string end_time    = 2;     // 结束时间
   int32 search_type = 3;      // 查询方式  1 安照配方 2 按照栏舍
-  string name = 4;            // 名称
+  string api_name = 4;        // 牧场端接口标识名称
   int32 pasture_id = 5;       // 牧场id
   int32 template_id = 6;     // 配方模板id
   int32 barn_id = 7;          // 栏舍id
   PaginationModel pagination = 8; // 分页
 }
 
+// SearchInventoryStatisticsRequest 库存管理-库存统计
+message SearchInventoryStatisticsRequest {
+  string start_time  = 1;     // 开始时间
+  string end_time    = 2;     // 结束时间
+  string api_name = 3;        // 牧场端接口标识名称
+  string feed_name = 4;       // 饲料名称
+  int32 pasture_id = 5;       // 牧场id
+  PaginationModel pagination = 6; // 分页
+}
+
+// SearchUserMaterialsStatisticsRequest 库存管理-用料分析
+message SearchUserMaterialsStatisticsRequest {
+  string start_time  = 1;     // 开始时间
+  string end_time    = 2;     // 结束时间
+  string api_name = 3;        // 牧场端接口标识名称
+  int32 pasture_id = 4;       // 牧场id
+  int32 error_check = 5;       // 误差是否选中 0 未选中 1 选中
+  int32 type_check = 6;        // 返回实际或理论 1 理论 2 实际
+  string feed_name = 7;        // 名称
+  PaginationModel pagination = 8; // 分页
+}
+
+// SearchFeedStatisticsRequest 饲喂效率-效率统计
+message SearchFeedStatisticsRequest {
+  string start_time  = 1;            // 开始时间
+  string api_name = 2;               // 牧场端接口标识名称
+  int32 pasture_id = 3;              // 牧场id
+  string formula_template = 4;       // 配方模板名称
+  string barn_name = 5;               // 栏舍名称
+  string cattle_category_name = 6;   // 畜牧类别名称
+  int32 class_number = 7;            // 班次
+  PaginationModel pagination = 8;   // 分页
+}
+
+// FeedChartStatisticsRequest 饲喂效率chart图表
+message FeedChartStatisticsRequest {
+  string start_time = 1;     // 开始时间
+  string end_time = 2;       // 结束时间
+  int32 pasture_id = 3;      // 牧场id
+  int32 status = 4;
+  string api_type = 5;       // mr 泌乳牛干物质采食量 sl 牛栏剩料率 hl 混料时间统计 zh 转化率 cbft 成本分析
+}
+
 // 首页 dashboard 准确性分析
 message SearchAnalysisAccuracyRequest {
   CattleCategoryParent.Kind cattle_parent_category_id = 1;   // 牧畜分类id 泌乳牛

+ 157 - 2
http/handler/statistic/analysis.go

@@ -20,7 +20,8 @@ func SearchFormulaEstimateList(c *gin.Context) {
 	}
 
 	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.Name, valid.Required),
+		valid.Field(&req.ApiName, valid.Required),
+		valid.Field(&req.PastureId, valid.Required),
 		valid.Field(&req.StartTime, valid.Required),
 		valid.Field(&req.EndTime, valid.Required),
 		valid.Field(&req.SearchType, valid.Required, valid.Min(0), valid.Max(2)),
@@ -40,7 +41,161 @@ func SearchFormulaEstimateList(c *gin.Context) {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}
-	// ginutil.JSONResp(c, res)
+	c.JSON(http.StatusOK, res)
+}
+
+// SearchInventoryStatistics 库存管理-库存统计
+func SearchInventoryStatistics(c *gin.Context) {
+	var req operationPb.SearchInventoryStatisticsRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ApiName, valid.Required),
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+		valid.Field(&req.EndTime, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.SearchInventoryStatistics(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
+// SearchUserMaterialsStatistics 库存管理-用料分析
+func SearchUserMaterialsStatistics(c *gin.Context) {
+	var req operationPb.SearchUserMaterialsStatisticsRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ApiName, valid.Required),
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+		valid.Field(&req.EndTime, valid.Required),
+		valid.Field(&req.TypeCheck, valid.Required, valid.Min(1), valid.Max(2)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.SearchUserMaterialsStatistics(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
+// SearchPriceStatistics 库存管理-价格分析
+func SearchPriceStatistics(c *gin.Context) {
+	var req operationPb.SearchUserMaterialsStatisticsRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ApiName, valid.Required),
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+		valid.Field(&req.EndTime, valid.Required),
+		valid.Field(&req.TypeCheck, valid.Required, valid.Min(1), valid.Max(2)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.SearchUserMaterialsStatistics(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
+// SearchFeedStatistics 饲喂效率-效率统计
+func SearchFeedStatistics(c *gin.Context) {
+	var req operationPb.SearchFeedStatisticsRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ApiName, valid.Required),
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.SearchFeedStatistics(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
+// SearchFeedChartStatistics 饲喂效率-chart图表分析
+func SearchFeedChartStatistics(c *gin.Context) {
+	var req operationPb.FeedChartStatisticsRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+		valid.Field(&req.EndTime, valid.Required),
+		valid.Field(&req.ApiType, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.FeedChartStatistics(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
 	c.JSON(http.StatusOK, res)
 }
 

+ 5 - 0
http/route/app_api.go

@@ -105,6 +105,11 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 
 		//统计分析 statistic analysis
 		opsRoute.POST("/feed_estimate/list", statistic.SearchFormulaEstimateList)
+		opsRoute.POST("/inventory/statistics", statistic.SearchInventoryStatistics)
+		opsRoute.POST("/inventory/user_materials_statistics", statistic.SearchUserMaterialsStatistics)
+		opsRoute.POST("/inventory/price_statistics", statistic.SearchPriceStatistics)
+		opsRoute.POST("/feed_efficiency/statistics", statistic.SearchFeedStatistics)
+		opsRoute.POST("/feed_efficiency/char_statistics", statistic.SearchFeedChartStatistics)
 
 		opsRoute.GET("/analysis/accuracy", statistic.AnalysisAccuracy)
 

+ 63 - 12
model/formula_estimate.go

@@ -1,5 +1,6 @@
 package model
 
+/*
 type FormulaEstimate struct {
 	Id                   int32  `json:"id"`
 	PastureId            int32  `json:"pasture_id"`
@@ -60,14 +61,16 @@ type FormulaEstimate struct {
 func (f *FormulaEstimate) TableName() string {
 	return "formula_estimate"
 }
+*/
 
-type FormulaEstimateRequest struct {
-	Name       string                 `json:"name"`
-	Page       int32                  `json:"page"`
-	Offset     int32                  `json:"offset"`
-	PageCount  int32                  `json:"pagecount"`
-	ReturnType string                 `json:"returntype"`
-	ParamMaps  *FormulaEstimateParams `json:"parammaps"`
+type PastureCommonRequest struct {
+	Name       string      `json:"name"`
+	Page       int32       `json:"page"`
+	Offset     int32       `json:"offset"`
+	PageCount  int32       `json:"pagecount"`
+	ReturnType string      `json:"returntype"`
+	Checked    int32       `json:"checked"`
+	ParamMaps  interface{} `json:"parammaps"`
 }
 
 type FormulaEstimateParams struct {
@@ -80,15 +83,63 @@ type FormulaEstimateParams struct {
 	Barid         string   `json:"barid"`
 }
 
-type FormulaEstimateResponse struct {
-	Code int32                `json:"code"`
-	Msg  string               `json:"msg"`
-	Data *FormulaEstimateData `json:"data"`
+type PastureCommonResponse struct {
+	Code int32              `json:"code"`
+	Msg  string             `json:"msg"`
+	Data *PastureCommonData `json:"data"`
 }
 
-type FormulaEstimateData struct {
+type PastureCommonData struct {
 	List     interface{} `json:"list"`
 	PageSize int32       `json:"pageSize"`
 	Total    int32       `json:"total"`
 	PageNum  int32       `json:"pageNum"`
 }
+
+type InventoryStatisticsParams struct {
+	PastureId string `json:"pastureid"`
+	StartTime string `json:"startTime"`
+	StopTime  string `json:"stopTime"`
+	FeedName  string `json:"feedname"`
+}
+
+type InventoryStatisticsList struct {
+	FeedName   string `json:"feedname"`
+	LaidSum    string `json:"laidsum"`
+	StartPrice string `json:"startprice"`
+	StartSum   string `json:"startsum"`
+	StopPrice  string `json:"stopprice"`
+	StopSum    string `json:"stopsum"`
+	UseSumRG   string `json:"usesumRG"`
+	UseSumXH   string `json:"usesumXH"`
+	UseSumXT   string `json:"usesumXT"`
+}
+
+type UserMaterialsStatisticsParams struct {
+	PastureId string `json:"pastureid"`
+	StartTime string `json:"startTime"`
+	StopTime  string `json:"stopTime"`
+	FeedName  string `json:"fname"`
+	Typea     string `json:"typea"`
+}
+
+type FeedStatisticsParams struct {
+	PastureId string `json:"pastureid"`
+	StartTime string `json:"startTime"`
+	StopTime  string `json:"stopTime"`
+	FeedName  string `json:"fname"`
+	BarName   string `json:"barname"`
+	CowClass  string `json:"cowclass"`
+	Times     string `json:"times"`
+}
+
+type FeedChartParams struct {
+	ParamMaps *ParamMaps `json:"parammaps"`
+}
+
+type ParamMaps struct {
+	PastureId string `json:"pastureid"`
+	StartTime string `json:"startTime"`
+	StopTime  string `json:"stopTime"`
+	Status    int32  `json:"status"`
+}

+ 79 - 4
model/group_pasture.go

@@ -3,6 +3,7 @@ package model
 import (
 	"bytes"
 	"encoding/json"
+	"fmt"
 	"go.uber.org/zap"
 	"io/ioutil"
 	"kpt-tmr-group/pkg/logger/zaplog"
@@ -34,7 +35,34 @@ func (g *GroupPasture) TableName() string {
 	return "group_pasture"
 }
 
-const InitManagerPassword = "123456"
+const (
+	InitManagerPassword = "123456"
+	UrlDataByName       = "authdata/GetDataByName"
+	UrlReportForm       = "authdata/GetReportform"
+)
+
+var FeedCharUrl = map[string]string{
+	"mr":   "authdata/chart/feedEffMR",
+	"sl":   "authdata/chart/feedEffSL",
+	"hl":   "authdata/chart/feedEffHL",
+	"zh":   "authdata/chart/feedEffZH",
+	"cbft": "authdata/chart/feedEffCBFT",
+}
+
+type PastureTokenRequest struct {
+	UserName string `json:"username"`
+	Password string `json:"password"`
+}
+
+type PastureTokenResponse struct {
+	Code int32             `json:"code"`
+	Msg  string            `json:"msg"`
+	Data *PastureTokenData `json:"data"`
+}
+
+type PastureTokenData struct {
+	Token string `json:"token"`
+}
 
 func NewGroupPasture(req *operationPb.AddPastureRequest) *GroupPasture {
 	groupPasture := &GroupPasture{
@@ -57,7 +85,12 @@ type PastureClient struct {
 }
 
 func NewPastureClient(g *GroupPasture) *PastureClient {
-	return &PastureClient{Detail: g}
+	return &PastureClient{
+		Detail: g,
+		authClient: &http.Client{
+			Timeout: time.Duration(5) * time.Second,
+		},
+	}
 }
 
 func (p *PastureClient) doRequest(req *http.Request) ([]byte, error) {
@@ -82,6 +115,12 @@ func (p *PastureClient) doRequest(req *http.Request) ([]byte, error) {
 }
 
 func (p *PastureClient) DoGet(url string) ([]byte, error) {
+	// 获取token
+	if err := p.GetToken(); err != nil {
+		zaplog.Error("PastureClient", zap.Any("GetToken Err", err), zap.Any("detail", p.Detail))
+		return nil, xerr.WithStack(err)
+	}
+
 	req, err := http.NewRequest(http.MethodGet, url, nil)
 	if err != nil {
 		zaplog.Error("PastureClient", zap.Any("DoGet", err))
@@ -99,6 +138,11 @@ func (p *PastureClient) DoPost(url string, body interface{}) ([]byte, error) {
 		zaplog.Error("PastureClient", zap.Any("DoPost-Marshal", err))
 		return nil, xerr.WithStack(err)
 	}
+	// 获取token
+	if err = p.GetToken(); err != nil {
+		zaplog.Error("PastureClient", zap.Any("GetToken Err", err), zap.Any("detail", p.Detail))
+		return nil, xerr.WithStack(err)
+	}
 	req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(b))
 	if err != nil {
 		zaplog.Error("PastureClient", zap.Any("NewRequest", err))
@@ -110,8 +154,39 @@ func (p *PastureClient) DoPost(url string, body interface{}) ([]byte, error) {
 	return p.doRequest(req)
 }
 
-func (p *PastureClient) GetToken() {
-
+func (p *PastureClient) GetToken() error {
+	url := fmt.Sprintf("%s/%s", p.Detail.Domain, "auth")
+	body := &PastureTokenRequest{
+		UserName: p.Detail.Account,
+		Password: p.Detail.Password,
+	}
+	b, err := json.Marshal(body)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+	req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(b))
+	if err != nil {
+		zaplog.Error("PastureClient", zap.Any("GetToken", err))
+		return xerr.WithStack(err)
+	}
+	req.Header.Add("Accept", "application/json")
+	req.Header.Add("Content-Type", "application/json")
+	result, err := p.doRequest(req)
+	if err != nil {
+		zaplog.Error("PastureClient", zap.Any("GetToken-doRequest", err))
+		return xerr.WithStack(err)
+	}
+	response := &PastureTokenResponse{}
+	if err = json.Unmarshal(result, response); err != nil {
+		zaplog.Error("PastureClient", zap.String("GetToken", string(result)))
+		return xerr.WithStack(err)
+	}
+	if response.Code != http.StatusOK || response.Data == nil || response.Data.Token == "" {
+		zaplog.Error("PastureClient", zap.Any("response", response))
+		return xerr.Customf("获取牧场端token失败 Err:%s", err)
+	}
+	p.Token = response.Data.Token
+	return nil
 }
 
 type GroupPastureSlice []*GroupPasture

+ 5 - 1
module/backend/interface.go

@@ -129,7 +129,11 @@ type SystemService interface {
 }
 
 type StatisticService interface {
-	SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*model.FormulaEstimateResponse, error)
+	SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*model.PastureCommonResponse, error)
+	SearchInventoryStatistics(ctx context.Context, req *operationPb.SearchInventoryStatisticsRequest) (*model.PastureCommonResponse, error)
+	SearchUserMaterialsStatistics(ctx context.Context, req *operationPb.SearchUserMaterialsStatisticsRequest) (*model.PastureCommonResponse, error)
+	SearchFeedStatistics(ctx context.Context, req *operationPb.SearchFeedStatisticsRequest) (*model.PastureCommonResponse, error)
+	FeedChartStatistics(ctx context.Context, req *operationPb.FeedChartStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error)
 }
 

+ 121 - 18
module/backend/statistic_service.go

@@ -14,6 +14,10 @@ import (
 	"strings"
 )
 
+type PastureClientHandler func(ctx context.Context, pastureId int64, body interface{}) error
+
+// type eventHandler func(ev map[string]interface{}, openID string, appID string, enterpriseID int, cts int64, conn redis.Conn) error
+
 // PastureDetailById 获取指定牧场详情
 func (s *StoreEntry) PastureDetailById(ctx context.Context, pastureId int64) (*model.GroupPasture, error) {
 	result := &model.GroupPasture{Id: pastureId}
@@ -23,20 +27,36 @@ func (s *StoreEntry) PastureDetailById(ctx context.Context, pastureId int64) (*m
 	return result, nil
 }
 
-// SearchFormulaEstimateList 配方评估
-func (s *StoreEntry) SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*model.FormulaEstimateResponse, error) {
-	pastureDetail, err := s.PastureDetailById(ctx, int64(req.PastureId))
+func (s *StoreEntry) PastureHttpClient(ctx context.Context, apiUrl string, pastureId int64, body interface{}, response interface{}) error {
+	pastureDetail, err := s.PastureDetailById(ctx, pastureId)
 	if err != nil {
-		zaplog.Error("SearchFormulaEstimateList", zap.Any("Err", err), zap.Any("req", req))
-		return nil, xerr.Customf("该牧场数据错误")
+		zaplog.Error("SearchFormulaEstimateList", zap.Any("Err", err), zap.Int64("pastureId", pastureId))
+		return xerr.Customf("该牧场数据错误,Err:%s", err)
 	}
+
 	pastureClient := model.NewPastureClient(pastureDetail)
-	body := &model.FormulaEstimateRequest{
-		Name:       req.Name,
+	url := fmt.Sprintf("%s/%s", pastureDetail.Domain, apiUrl)
+
+	result, err := pastureClient.DoPost(url, body)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
+	if err = json.Unmarshal(result, response); err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+
+}
+
+// SearchFormulaEstimateList 配方评估
+func (s *StoreEntry) SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*model.PastureCommonResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name:       req.ApiName,
 		Page:       req.Pagination.Page,
 		Offset:     req.Pagination.PageOffset,
 		PageCount:  req.Pagination.PageSize,
-		ReturnType: "map",
+		ReturnType: "Map",
 		ParamMaps: &model.FormulaEstimateParams{
 			PastureId:     fmt.Sprintf("%d", req.PastureId),
 			StartTime:     req.StartTime,
@@ -47,23 +67,106 @@ func (s *StoreEntry) SearchFormulaEstimateList(ctx context.Context, req *operati
 			Barid:         fmt.Sprintf("%d", req.BarnId),
 		},
 	}
-	url := fmt.Sprintf("%s/%s", pastureDetail.Domain, "authdata/GetDataByName")
-	result, err := pastureClient.DoPost(url, body)
-	if err != nil {
+	response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
+	if err := s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	response := &model.FormulaEstimateResponse{}
-	if err = json.Unmarshal(result, response); err != nil {
+	return response, nil
+}
+
+// SearchInventoryStatistics 库存管理-库存统计
+func (s *StoreEntry) SearchInventoryStatistics(ctx context.Context, req *operationPb.SearchInventoryStatisticsRequest) (*model.PastureCommonResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name:       req.ApiName,
+		Page:       req.Pagination.Page,
+		Offset:     req.Pagination.PageOffset,
+		PageCount:  req.Pagination.PageSize,
+		ReturnType: "Map",
+		ParamMaps: &model.InventoryStatisticsParams{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			StartTime: req.StartTime,
+			StopTime:  req.EndTime,
+			FeedName:  req.FeedName,
+		},
+	}
+	response := &model.PastureCommonResponse{
+		Data: &model.PastureCommonData{
+			List: make([]*model.InventoryStatisticsList, 0),
+		},
+	}
+	if err := s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	if response.Code == 400 {
-		if response.Msg == "登录超时" {
+	return response, nil
+}
 
-		} else {
-			return nil, xerr.WithStack(err)
-		}
+// SearchUserMaterialsStatistics 库存管理-用料分析
+func (s *StoreEntry) SearchUserMaterialsStatistics(ctx context.Context, req *operationPb.SearchUserMaterialsStatisticsRequest) (*model.PastureCommonResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name:       req.ApiName,
+		Page:       req.Pagination.Page,
+		Offset:     req.Pagination.PageOffset,
+		PageCount:  req.Pagination.PageSize,
+		ReturnType: "Map",
+		Checked:    req.ErrorCheck,
+		ParamMaps: &model.UserMaterialsStatisticsParams{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			StartTime: req.StartTime,
+			StopTime:  req.EndTime,
+			FeedName:  req.FeedName,
+			Typea:     fmt.Sprintf("%d", req.TypeCheck),
+		},
+	}
+	response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
+	if err := s.PastureHttpClient(ctx, model.UrlReportForm, int64(req.PastureId), body, response); err != nil {
+		return nil, xerr.WithStack(err)
 	}
+	return response, nil
+}
 
+// SearchFeedStatistics 饲喂效率-效率统计
+func (s *StoreEntry) SearchFeedStatistics(ctx context.Context, req *operationPb.SearchFeedStatisticsRequest) (*model.PastureCommonResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name:       req.ApiName,
+		Page:       req.Pagination.Page,
+		Offset:     req.Pagination.PageOffset,
+		PageCount:  req.Pagination.PageSize,
+		ReturnType: "Map",
+		ParamMaps: &model.FeedStatisticsParams{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			StartTime: req.StartTime,
+			StopTime:  req.StartTime,
+			FeedName:  req.FormulaTemplate,
+			BarName:   req.BarnName,
+			CowClass:  req.CattleCategoryName,
+			Times:     fmt.Sprintf("%d", req.ClassNumber),
+		},
+	}
+	response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
+	if err := s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return response, nil
+}
+
+// FeedChartStatistics 饲喂效率图表分析
+func (s *StoreEntry) FeedChartStatistics(ctx context.Context, req *operationPb.FeedChartStatisticsRequest) (*model.PastureCommonResponse, error) {
+	body := &model.FeedChartParams{
+		ParamMaps: &model.ParamMaps{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			StartTime: req.StartTime,
+			StopTime:  req.StartTime,
+			Status:    req.Status,
+		},
+	}
+	url, ok := model.FeedCharUrl[req.ApiType]
+	if !ok {
+		return nil, xerr.Customf("错误的接口类型:%s", req.ApiType)
+	}
+	response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
+	if err := s.PastureHttpClient(ctx, url, int64(req.PastureId), body, response); err != nil {
+		return nil, xerr.WithStack(err)
+	}
 	return response, nil
 }
 

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 607 - 155
proto/go/backend/operation/statistic.pb.go


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels