Browse Source

FeedFormula: 集团配方下发

Yi 1 year ago
parent
commit
c64c3913dd

+ 6 - 0
backend/operation/feed_formula.proto

@@ -64,4 +64,10 @@ message UniqueID {
     string encode_number = 1;
   }
   UniqueData data = 3;
+}
+
+// DistributeFeedFormulaRequest 饲料配方下发
+message DistributeFeedFormulaRequest {
+  repeated int32 pasture_ids = 1;          // 牧场ids集合
+  repeated int32 feed_formula_ids = 2;     // 配方ids集合
 }

+ 2 - 0
backend/operation/pasture.proto

@@ -208,6 +208,8 @@ message ForageEnumList {
   repeated FormulaOptionEnum use_materials_list = 11;             // 用料分析-列表显示
   repeated FormulaOptionEnum use_materials_type = 12;             // 用料分析-统计类型
   repeated FormulaOptionEnum price_materials_type = 13;           // 价格分析-统计类型
+  repeated FormulaOptionEnum jump_type = 14;                      // 准确性-跳转方式
+  repeated FormulaOptionEnum statistics_type = 15;                // 准确性-统计类型
 }
 
 message ForageSourceEnum {

+ 8 - 0
backend/operation/statistic.proto

@@ -155,6 +155,14 @@ message SprinkleStatisticsRequest {
   PaginationModel pagination = 20;   // 分页
 }
 
+// GetDataByNameRequest
+message GetDataByNameRequest {
+  string start_time  = 1;            // 开始时间
+  string end_time = 2;               // 结束时间
+  string api_name = 3;               // 牧场端接口标识名称
+  int32 pasture_id = 4;              // 牧场id
+}
+
 // ProcessAnalysisRequest 过程分析
 message ProcessAnalysisRequest {
   string start_time  = 1;            // 开始时间

+ 41 - 0
http/handler/dashboard/dashboard.go

@@ -0,0 +1,41 @@
+package dashboard
+
+import (
+	"kpt-tmr-group/http/middleware"
+	"kpt-tmr-group/pkg/apierr"
+	"kpt-tmr-group/pkg/ginutil"
+	"kpt-tmr-group/pkg/valid"
+	operationPb "kpt-tmr-group/proto/go/backend/operation"
+	"net/http"
+
+	"github.com/gin-gonic/gin"
+)
+
+// AnalysisAccuracy 首页仪表盘-准确性分析
+func AnalysisAccuracy(c *gin.Context) {
+	var req operationPb.SearchAnalysisAccuracyRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.PastureIds, valid.Required),
+		valid.Field(&req.CattleParentCategoryId, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.SearchAnalysisAccuracy(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
+// ExecutionTime 执行时间
+func ExecutionTime(c *gin.Context) {
+
+}

+ 20 - 0
http/handler/feed/feed_formula.go

@@ -255,3 +255,23 @@ func EncodeNumber(c *gin.Context) {
 		Data: &operationPb.UniqueID_UniqueData{EncodeNumber: middleware.BackendOperation(c).OpsService.EncodeNumber(c)},
 	})
 }
+
+// DistributeFeedFormula 饲料配方下发
+func DistributeFeedFormula(c *gin.Context) {
+	req := &operationPb.DistributeFeedFormulaRequest{}
+	if err := ginutil.BindProto(c, req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.DistributeFeedFormula(c, req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}

+ 26 - 25
http/handler/statistic/analysis.go

@@ -403,6 +403,32 @@ func SearchSprinkleStatistics(c *gin.Context) {
 	c.JSON(http.StatusOK, res)
 }
 
+// GetDataByName 共同接口
+func GetDataByName(c *gin.Context) {
+	var req operationPb.GetDataByNameRequest
+	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.ApiName, valid.Required),
+		valid.Field(&req.StartTime, valid.Required),
+		valid.Field(&req.EndTime, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.GetDataByName(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, res)
+}
+
 // SearchProcessAnalysis 过程分析
 func SearchProcessAnalysis(c *gin.Context) {
 	var req operationPb.ProcessAnalysisRequest
@@ -465,28 +491,3 @@ func TrainNumber(c *gin.Context) {
 	}
 	ginutil.JSONResp(c, res)
 }
-
-// AnalysisAccuracy 首页仪表盘-准确性分析
-func AnalysisAccuracy(c *gin.Context) {
-	var req operationPb.SearchAnalysisAccuracyRequest
-	if err := c.BindJSON(&req); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.PastureIds, valid.Required),
-		valid.Field(&req.CattleParentCategoryId, valid.Required),
-	); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	res, err := middleware.BackendOperation(c).OpsService.SearchAnalysisAccuracy(c, &req)
-	if err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-	c.JSON(http.StatusOK, res)
-	//ginutil.JSONResp(c, res)
-}

+ 5 - 1
http/route/app_api.go

@@ -2,6 +2,7 @@ package route
 
 import (
 	"kpt-tmr-group/http/handler"
+	"kpt-tmr-group/http/handler/dashboard"
 	"kpt-tmr-group/http/handler/feed"
 	"kpt-tmr-group/http/handler/mobile"
 	"kpt-tmr-group/http/handler/pasture"
@@ -102,6 +103,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/feed_formula/excel_import", feed.ExcelImportFeedFormula)
 		opsRoute.POST("/feed_formula/excel_template", feed.ExcelTemplateFeedFormula)
 		opsRoute.GET("/feed_formula/encode_number", feed.EncodeNumber)
+		opsRoute.POST("/feed_formula/distribute", feed.DistributeFeedFormula)
 
 		//统计分析 statistic analysis
 		opsRoute.POST("/feed_estimate/list", statistic.SearchFormulaEstimateList)
@@ -116,11 +118,13 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/accuracy/agg_statistics", statistic.SearchAccuracyAggStatistics)
 		opsRoute.POST("/accuracy/mixed_statistics", statistic.SearchMixFeedStatistics)
 		opsRoute.POST("/accuracy/sprinkle_statistics", statistic.SearchSprinkleStatistics)
+		opsRoute.POST("/accuracy/data_by_name", statistic.GetDataByName)
 		opsRoute.POST("/process/analysis", statistic.SearchProcessAnalysis)
 		opsRoute.POST("/statistics/train_number", statistic.TrainNumber)
 
 		// 首页仪表盘
-		opsRoute.GET("/analysis/accuracy", statistic.AnalysisAccuracy)
+		opsRoute.POST("/dashboard/accuracy", dashboard.AnalysisAccuracy)
+		opsRoute.POST("/dashboard/exec_time", dashboard.ExecutionTime)
 
 		// 其他
 	}

+ 5 - 0
model/feed_formula.go

@@ -79,3 +79,8 @@ func (f FeedFormulaSlice) ToPB() []*operationPb.AddFeedFormulaRequest {
 	}
 	return res
 }
+
+type DistributeData struct {
+	PastureList     []*GroupPasture
+	FeedFormulaList []*FeedFormula
+}

+ 6 - 0
model/formula_estimate.go

@@ -205,4 +205,10 @@ type TrainNumberList struct {
 	InfoValue string `json:"inforvalue"`
 }
 
+type GetDataByNameParams struct {
+	PastureId string `json:"pastureid"`
+	StartTime string `json:"startTime"`
+	StopTime  string `json:"stopTime"`
+}
+
 var DefaultSheetName = "Sheet1"

+ 12 - 0
model/pasture_data.go

@@ -0,0 +1,12 @@
+package model
+
+type DistributeFeedFormulaRequest struct {
+	PastureId int64          `json:"pasture_id"`
+	Body      []*FeedFormula `json:"body"`
+}
+
+type PastureResponse struct {
+	Code int32       `json:"code"`
+	Msg  string      `json:"msg"`
+	Data interface{} `json:"data"`
+}

+ 26 - 0
model/pasture_data_log.go

@@ -0,0 +1,26 @@
+package model
+
+type PastureDataLog struct {
+	Id        int64  `json:"id"`
+	LogType   int32  `json:"log_type"`
+	PastureId int64  `json:"pasture_id"`
+	Body      string `json:"body"`
+	Url       string `json:"url"`
+	Response  string `json:"response"`
+	CreatedAt int64  `json:"created_at"`
+	UpdatedAt int64  `json:"updated_at"`
+}
+
+func (p *PastureDataLog) TableName() string {
+	return "pasture_data_log"
+}
+
+func NewPastureDataLog(pastureId int64, logType int32, url, body, response string) *PastureDataLog {
+	return &PastureDataLog{
+		LogType:   logType,
+		PastureId: pastureId,
+		Body:      body,
+		Url:       url,
+		Response:  response,
+	}
+}

+ 73 - 1
module/backend/feed_service.go

@@ -3,6 +3,7 @@ package backend
 import (
 	"bytes"
 	"context"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"io"
@@ -12,16 +13,22 @@ import (
 	operationPb "kpt-tmr-group/proto/go/backend/operation"
 	"net/http"
 	"strconv"
+	"sync"
 	"time"
 
+	"go.uber.org/multierr"
+
 	"github.com/xuri/excelize/v2"
 	"go.uber.org/zap"
-
 	"gorm.io/gorm"
 )
 
 const EncodeNumberPrefix = "encode_number"
 
+var PastureDataLogType = map[string]int32{
+	"FeedFormula_Distribute": 1,
+}
+
 // CreateFeedFormula 添加数据
 func (s *StoreEntry) CreateFeedFormula(ctx context.Context, req *operationPb.AddFeedFormulaRequest) error {
 	forage := model.NewFeedFormula(req)
@@ -325,3 +332,68 @@ func (s *StoreEntry) EncodeNumber(ctx context.Context) string {
 		return fmt.Sprintf("%d", data.Data)
 	}
 }
+
+// DistributeFeedFormula 配方下发牧场
+func (s *StoreEntry) DistributeFeedFormula(ctx context.Context, req *operationPb.DistributeFeedFormulaRequest) error {
+	distributeData, err := s.checkoutDistributeData(ctx, req)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+	if len(distributeData.PastureList) <= 0 {
+		return nil
+	}
+
+	feedFormulaList := make([]*model.FeedFormula, 0)
+	if err = s.DB.Where("id IN ?", req.FeedFormulaIds).Find(&feedFormulaList).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+
+	wg := sync.WaitGroup{}
+	wg.Add(len(distributeData.PastureList))
+	var muError error
+	for _, pasture := range distributeData.PastureList {
+		go func(p *model.GroupPasture) {
+			response := &model.PastureResponse{}
+			body := &model.DistributeFeedFormulaRequest{
+				PastureId: p.Id,
+				Body:      feedFormulaList,
+			}
+			if err = s.PastureHttpClient(ctx, FeedFormulaDistributeUrl, p.Id, body, response); err != nil {
+				muError = multierr.Append(muError, err)
+				zaplog.Error("DistributeFeedFormula", zap.Any("pasture", p), zap.Any("body", feedFormulaList), zap.Any("err", err), zap.Any("response", response))
+				b, _ := json.Marshal(body)
+				res, _ := json.Marshal(response)
+				pastureDataLog := model.NewPastureDataLog(p.Id, PastureDataLogType["FeedFormula_Distribute"], FeedFormulaDistributeUrl, string(b), string(res))
+				s.DB.Create(pastureDataLog)
+			}
+			if response.Code != http.StatusOK {
+				muError = multierr.Append(muError, xerr.Custom(response.Msg))
+			}
+
+			wg.Done()
+		}(pasture)
+	}
+	wg.Wait()
+	return muError
+}
+
+func (s *StoreEntry) checkoutDistributeData(ctx context.Context, req *operationPb.DistributeFeedFormulaRequest) (*model.DistributeData, error) {
+	result := &model.DistributeData{
+		PastureList:     make([]*model.GroupPasture, 0),
+		FeedFormulaList: make([]*model.FeedFormula, 0),
+	}
+
+	if err := s.DB.Where("id IN ?", req.PastureIds).Where("is_delete = ?", operationPb.IsShow_OK).Find(&result.PastureList).Error; err != nil {
+		return result, xerr.WithStack(err)
+	}
+
+	if err := s.DB.Where("id IN ?", req.FeedFormulaIds).Find(&result.FeedFormulaList).Error; err != nil {
+		return result, xerr.WithStack(err)
+	}
+
+	if len(result.PastureList) <= 0 || len(result.FeedFormulaList) <= 0 {
+		return result, xerr.Customf("数据错误")
+	}
+
+	return result, nil
+}

+ 2 - 0
module/backend/interface.go

@@ -95,6 +95,7 @@ type PastureService interface {
 	ExcelExportFeedFormula(ctx context.Context, req *operationPb.SearchFeedFormulaRequest) (*bytes.Buffer, error)
 	ExcelTemplateFeedFormula(ctx context.Context) (*bytes.Buffer, error)
 	EncodeNumber(ctx context.Context) string
+	DistributeFeedFormula(ctx context.Context, req *operationPb.DistributeFeedFormulaRequest) error
 }
 
 type SystemService interface {
@@ -144,6 +145,7 @@ type StatisticService interface {
 	SearchMixFeedStatistics(ctx context.Context, req *operationPb.MixFeedStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchSprinkleStatistics(ctx context.Context, req *operationPb.SprinkleStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchProcessAnalysis(ctx context.Context, req *operationPb.ProcessAnalysisRequest) (*model.PastureCommonResponse, error)
+	GetDataByName(ctx context.Context, req *operationPb.GetDataByNameRequest) (*model.PastureCommonResponse, error)
 
 	GetTrainNumber(ctx context.Context, req *operationPb.TrainNumberRequest) (*operationPb.TrainNumberResponse, error)
 	SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error)

+ 74 - 0
module/backend/mock/kptservice.go

@@ -307,6 +307,20 @@ func (mr *MockKptServiceMockRecorder) DetailsSystemUser(arg0, arg1 interface{})
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DetailsSystemUser", reflect.TypeOf((*MockKptService)(nil).DetailsSystemUser), arg0, arg1)
 }
 
+// DistributeFeedFormula mocks base method.
+func (m *MockKptService) DistributeFeedFormula(arg0 context.Context, arg1 *operationPb.DistributeFeedFormulaRequest) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DistributeFeedFormula", arg0, arg1)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DistributeFeedFormula indicates an expected call of DistributeFeedFormula.
+func (mr *MockKptServiceMockRecorder) DistributeFeedFormula(arg0, arg1 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DistributeFeedFormula", reflect.TypeOf((*MockKptService)(nil).DistributeFeedFormula), arg0, arg1)
+}
+
 // EditCattleCategory mocks base method.
 func (m *MockKptService) EditCattleCategory(arg0 context.Context, arg1 *operationPb.AddCattleCategoryRequest) error {
 	m.ctrl.T.Helper()
@@ -550,6 +564,21 @@ func (mr *MockKptServiceMockRecorder) ForageEnumList(arg0 interface{}) *gomock.C
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForageEnumList", reflect.TypeOf((*MockKptService)(nil).ForageEnumList), arg0)
 }
 
+// GetDataByName mocks base method.
+func (m *MockKptService) GetDataByName(arg0 context.Context, arg1 *operationPb.GetDataByNameRequest) (*model.PastureCommonResponse, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetDataByName", arg0, arg1)
+	ret0, _ := ret[0].(*model.PastureCommonResponse)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetDataByName indicates an expected call of GetDataByName.
+func (mr *MockKptServiceMockRecorder) GetDataByName(arg0, arg1 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDataByName", reflect.TypeOf((*MockKptService)(nil).GetDataByName), arg0, arg1)
+}
+
 // GetOpenId mocks base method.
 func (m *MockKptService) GetOpenId(arg0 context.Context, arg1 string) (*operationPb.WxOpenId, error) {
 	m.ctrl.T.Helper()
@@ -595,6 +624,21 @@ func (mr *MockKptServiceMockRecorder) GetSystemUserPermissions(arg0, arg1 interf
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSystemUserPermissions", reflect.TypeOf((*MockKptService)(nil).GetSystemUserPermissions), arg0, arg1)
 }
 
+// GetTrainNumber mocks base method.
+func (m *MockKptService) GetTrainNumber(arg0 context.Context, arg1 *operationPb.TrainNumberRequest) (*operationPb.TrainNumberResponse, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetTrainNumber", arg0, arg1)
+	ret0, _ := ret[0].(*operationPb.TrainNumberResponse)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetTrainNumber indicates an expected call of GetTrainNumber.
+func (mr *MockKptServiceMockRecorder) GetTrainNumber(arg0, arg1 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrainNumber", reflect.TypeOf((*MockKptService)(nil).GetTrainNumber), arg0, arg1)
+}
+
 // GetUserInfo mocks base method.
 func (m *MockKptService) GetUserInfo(arg0 context.Context, arg1 string) (*operationPb.UserAuth, error) {
 	m.ctrl.T.Helper()
@@ -610,6 +654,21 @@ func (mr *MockKptServiceMockRecorder) GetUserInfo(arg0, arg1 interface{}) *gomoc
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserInfo", reflect.TypeOf((*MockKptService)(nil).GetUserInfo), arg0, arg1)
 }
 
+// InventoryStatisticsExcelExport mocks base method.
+func (m *MockKptService) InventoryStatisticsExcelExport(arg0 context.Context, arg1 *operationPb.SearchInventoryStatisticsRequest) (*bytes.Buffer, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "InventoryStatisticsExcelExport", arg0, arg1)
+	ret0, _ := ret[0].(*bytes.Buffer)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// InventoryStatisticsExcelExport indicates an expected call of InventoryStatisticsExcelExport.
+func (mr *MockKptServiceMockRecorder) InventoryStatisticsExcelExport(arg0, arg1 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InventoryStatisticsExcelExport", reflect.TypeOf((*MockKptService)(nil).InventoryStatisticsExcelExport), arg0, arg1)
+}
+
 // IsShowCattleCategory mocks base method.
 func (m *MockKptService) IsShowCattleCategory(arg0 context.Context, arg1 *operationPb.IsShowCattleCategory) error {
 	m.ctrl.T.Helper()
@@ -1048,3 +1107,18 @@ func (mr *MockKptServiceMockRecorder) SearchUserMaterialsStatistics(arg0, arg1 i
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SearchUserMaterialsStatistics", reflect.TypeOf((*MockKptService)(nil).SearchUserMaterialsStatistics), arg0, arg1)
 }
+
+// UserMaterialsStatisticsExcelExport mocks base method.
+func (m *MockKptService) UserMaterialsStatisticsExcelExport(arg0 context.Context, arg1 *operationPb.SearchUserMaterialsStatisticsRequest) (*bytes.Buffer, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UserMaterialsStatisticsExcelExport", arg0, arg1)
+	ret0, _ := ret[0].(*bytes.Buffer)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// UserMaterialsStatisticsExcelExport indicates an expected call of UserMaterialsStatisticsExcelExport.
+func (mr *MockKptServiceMockRecorder) UserMaterialsStatisticsExcelExport(arg0, arg1 interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UserMaterialsStatisticsExcelExport", reflect.TypeOf((*MockKptService)(nil).UserMaterialsStatisticsExcelExport), arg0, arg1)
+}

+ 34 - 0
module/backend/pasture_service.go

@@ -649,6 +649,40 @@ func (s *StoreEntry) ForageEnumList(ctx context.Context) *operationPb.ForageEnum
 		Label: "车次",
 	})
 
+	res.Data.JumpType = append(res.Data.JumpType, &operationPb.FormulaOptionEnum{
+		Value: 0,
+		Label: "手动跳转",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 1,
+		Label: "自动跳转",
+	})
+
+	res.Data.StatisticsType = append(res.Data.StatisticsType, &operationPb.FormulaOptionEnum{
+		Value: 7,
+		Label: "无分类",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 0,
+		Label: "驾驶员",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 1,
+		Label: "配方名称",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 2,
+		Label: "栏舍名称",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 3,
+		Label: "牧畜类别",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 4,
+		Label: "车次",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 5,
+		Label: "TMR名称",
+	}, &operationPb.FormulaOptionEnum{
+		Value: 6,
+		Label: "饲料",
+	})
+
 	res.Data.FormulaList = append(res.Data.FormulaList, &operationPb.FormulaOptionEnum{
 		Value: 0,
 		Label: "所有",

+ 19 - 0
module/backend/statistic_service.go

@@ -21,6 +21,8 @@ import (
 
 type PastureClientHandler func(ctx context.Context, pastureId int64, body interface{}) error
 
+const FeedFormulaDistributeUrl = "pasture/feed_formula/distribute"
+
 // type eventHandler func(ev map[string]interface{}, openID string, appID string, enterpriseID int, cts int64, conn redis.Conn) error
 
 // PastureDetailById 获取指定牧场详情
@@ -533,6 +535,23 @@ func (s *StoreEntry) SearchProcessAnalysis(ctx context.Context, req *operationPb
 	return response, nil
 }
 
+// GetDataByName 共同接口
+func (s *StoreEntry) GetDataByName(ctx context.Context, req *operationPb.GetDataByNameRequest) (*model.PastureCommonResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name: req.ApiName,
+		ParamMaps: &model.GetDataByNameParams{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			StartTime: req.StartTime,
+			StopTime:  req.StartTime,
+		},
+	}
+	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
+}
+
 // GetTrainNumber 获取班次
 func (s *StoreEntry) GetTrainNumber(ctx context.Context, req *operationPb.TrainNumberRequest) (*operationPb.TrainNumberResponse, error) {
 	body := &model.PastureCommonRequest{

+ 95 - 20
proto/go/backend/operation/feed_formula.pb.go

@@ -552,6 +552,62 @@ func (x *UniqueID) GetData() *UniqueID_UniqueData {
 	return nil
 }
 
+// DistributeFeedFormulaRequest 饲料配方下发
+type DistributeFeedFormulaRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PastureIds     []int32 `protobuf:"varint,1,rep,packed,name=pasture_ids,json=pastureIds,proto3" json:"pasture_ids,omitempty"`               // 牧场ids集合
+	FeedFormulaIds []int32 `protobuf:"varint,2,rep,packed,name=feed_formula_ids,json=feedFormulaIds,proto3" json:"feed_formula_ids,omitempty"` // 配方ids集合
+}
+
+func (x *DistributeFeedFormulaRequest) Reset() {
+	*x = DistributeFeedFormulaRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_feed_formula_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeFeedFormulaRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeFeedFormulaRequest) ProtoMessage() {}
+
+func (x *DistributeFeedFormulaRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_feed_formula_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeFeedFormulaRequest.ProtoReflect.Descriptor instead.
+func (*DistributeFeedFormulaRequest) Descriptor() ([]byte, []int) {
+	return file_backend_operation_feed_formula_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *DistributeFeedFormulaRequest) GetPastureIds() []int32 {
+	if x != nil {
+		return x.PastureIds
+	}
+	return nil
+}
+
+func (x *DistributeFeedFormulaRequest) GetFeedFormulaIds() []int32 {
+	if x != nil {
+		return x.FeedFormulaIds
+	}
+	return nil
+}
+
 type UniqueID_UniqueData struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -563,7 +619,7 @@ type UniqueID_UniqueData struct {
 func (x *UniqueID_UniqueData) Reset() {
 	*x = UniqueID_UniqueData{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_feed_formula_proto_msgTypes[6]
+		mi := &file_backend_operation_feed_formula_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -576,7 +632,7 @@ func (x *UniqueID_UniqueData) String() string {
 func (*UniqueID_UniqueData) ProtoMessage() {}
 
 func (x *UniqueID_UniqueData) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_feed_formula_proto_msgTypes[6]
+	mi := &file_backend_operation_feed_formula_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -714,9 +770,15 @@ var file_backend_operation_feed_formula_proto_rawDesc = []byte{
 	0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x31, 0x0a, 0x0a, 0x55, 0x6e, 0x69,
 	0x71, 0x75, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64,
 	0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
-	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0f, 0x5a, 0x0d,
-	0x2e, 0x3b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x62, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x69, 0x0a, 0x1c,
+	0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x46, 0x6f,
+	0x72, 0x6d, 0x75, 0x6c, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b,
+	0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x05, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a,
+	0x10, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x5f, 0x69, 0x64,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x65, 0x65, 0x64, 0x46, 0x6f, 0x72,
+	0x6d, 0x75, 0x6c, 0x61, 0x49, 0x64, 0x73, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x3b, 0x6f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -731,7 +793,7 @@ func file_backend_operation_feed_formula_proto_rawDescGZIP() []byte {
 	return file_backend_operation_feed_formula_proto_rawDescData
 }
 
-var file_backend_operation_feed_formula_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_backend_operation_feed_formula_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
 var file_backend_operation_feed_formula_proto_goTypes = []interface{}{
 	(*AddFeedFormulaRequest)(nil),         // 0: backend.operation.AddFeedFormulaRequest
 	(*SearchFeedFormulaRequest)(nil),      // 1: backend.operation.SearchFeedFormulaRequest
@@ -739,23 +801,24 @@ var file_backend_operation_feed_formula_proto_goTypes = []interface{}{
 	(*SearchFeedFormulaListData)(nil),     // 3: backend.operation.SearchFeedFormulaListData
 	(*IsShowModifyFeedFormula)(nil),       // 4: backend.operation.IsShowModifyFeedFormula
 	(*UniqueID)(nil),                      // 5: backend.operation.UniqueID
-	(*UniqueID_UniqueData)(nil),           // 6: backend.operation.UniqueID.UniqueData
-	(CattleCategoryParent_Kind)(0),        // 7: backend.operation.CattleCategoryParent.Kind
-	(DataSource_Kind)(0),                  // 8: backend.operation.DataSource.Kind
-	(IsShow_Kind)(0),                      // 9: backend.operation.IsShow.Kind
-	(*PaginationModel)(nil),               // 10: backend.operation.PaginationModel
+	(*DistributeFeedFormulaRequest)(nil),  // 6: backend.operation.DistributeFeedFormulaRequest
+	(*UniqueID_UniqueData)(nil),           // 7: backend.operation.UniqueID.UniqueData
+	(CattleCategoryParent_Kind)(0),        // 8: backend.operation.CattleCategoryParent.Kind
+	(DataSource_Kind)(0),                  // 9: backend.operation.DataSource.Kind
+	(IsShow_Kind)(0),                      // 10: backend.operation.IsShow.Kind
+	(*PaginationModel)(nil),               // 11: backend.operation.PaginationModel
 }
 var file_backend_operation_feed_formula_proto_depIdxs = []int32{
-	7,  // 0: backend.operation.AddFeedFormulaRequest.cattle_category_id:type_name -> backend.operation.CattleCategoryParent.Kind
-	8,  // 1: backend.operation.AddFeedFormulaRequest.data_source_id:type_name -> backend.operation.DataSource.Kind
-	9,  // 2: backend.operation.AddFeedFormulaRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	9,  // 3: backend.operation.AddFeedFormulaRequest.is_modify:type_name -> backend.operation.IsShow.Kind
-	9,  // 4: backend.operation.SearchFeedFormulaRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	10, // 5: backend.operation.SearchFeedFormulaRequest.pagination:type_name -> backend.operation.PaginationModel
+	8,  // 0: backend.operation.AddFeedFormulaRequest.cattle_category_id:type_name -> backend.operation.CattleCategoryParent.Kind
+	9,  // 1: backend.operation.AddFeedFormulaRequest.data_source_id:type_name -> backend.operation.DataSource.Kind
+	10, // 2: backend.operation.AddFeedFormulaRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	10, // 3: backend.operation.AddFeedFormulaRequest.is_modify:type_name -> backend.operation.IsShow.Kind
+	10, // 4: backend.operation.SearchFeedFormulaRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	11, // 5: backend.operation.SearchFeedFormulaRequest.pagination:type_name -> backend.operation.PaginationModel
 	3,  // 6: backend.operation.SearchFeedFormulaListResponse.data:type_name -> backend.operation.SearchFeedFormulaListData
 	0,  // 7: backend.operation.SearchFeedFormulaListData.list:type_name -> backend.operation.AddFeedFormulaRequest
-	9,  // 8: backend.operation.IsShowModifyFeedFormula.is_show:type_name -> backend.operation.IsShow.Kind
-	6,  // 9: backend.operation.UniqueID.data:type_name -> backend.operation.UniqueID.UniqueData
+	10, // 8: backend.operation.IsShowModifyFeedFormula.is_show:type_name -> backend.operation.IsShow.Kind
+	7,  // 9: backend.operation.UniqueID.data:type_name -> backend.operation.UniqueID.UniqueData
 	10, // [10:10] is the sub-list for method output_type
 	10, // [10:10] is the sub-list for method input_type
 	10, // [10:10] is the sub-list for extension type_name
@@ -844,6 +907,18 @@ func file_backend_operation_feed_formula_proto_init() {
 			}
 		}
 		file_backend_operation_feed_formula_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeFeedFormulaRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_feed_formula_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UniqueID_UniqueData); i {
 			case 0:
 				return &v.state
@@ -862,7 +937,7 @@ func file_backend_operation_feed_formula_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_backend_operation_feed_formula_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   7,
+			NumMessages:   8,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 89 - 62
proto/go/backend/operation/pasture.pb.go

@@ -1816,6 +1816,8 @@ type ForageEnumList struct {
 	UseMaterialsList      []*FormulaOptionEnum        `protobuf:"bytes,11,rep,name=use_materials_list,json=useMaterialsList,proto3" json:"use_materials_list,omitempty"`              // 用料分析-列表显示
 	UseMaterialsType      []*FormulaOptionEnum        `protobuf:"bytes,12,rep,name=use_materials_type,json=useMaterialsType,proto3" json:"use_materials_type,omitempty"`              // 用料分析-统计类型
 	PriceMaterialsType    []*FormulaOptionEnum        `protobuf:"bytes,13,rep,name=price_materials_type,json=priceMaterialsType,proto3" json:"price_materials_type,omitempty"`        // 价格分析-统计类型
+	JumpType              []*FormulaOptionEnum        `protobuf:"bytes,14,rep,name=jump_type,json=jumpType,proto3" json:"jump_type,omitempty"`                                        // 准确性-跳转方式
+	StatisticsType        []*FormulaOptionEnum        `protobuf:"bytes,15,rep,name=statistics_type,json=statisticsType,proto3" json:"statistics_type,omitempty"`                      // 准确性-统计类型
 }
 
 func (x *ForageEnumList) Reset() {
@@ -1941,6 +1943,20 @@ func (x *ForageEnumList) GetPriceMaterialsType() []*FormulaOptionEnum {
 	return nil
 }
 
+func (x *ForageEnumList) GetJumpType() []*FormulaOptionEnum {
+	if x != nil {
+		return x.JumpType
+	}
+	return nil
+}
+
+func (x *ForageEnumList) GetStatisticsType() []*FormulaOptionEnum {
+	if x != nil {
+		return x.StatisticsType
+	}
+	return nil
+}
+
 type ForageSourceEnum struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2696,7 +2712,7 @@ var file_backend_operation_pasture_proto_rawDesc = []byte{
 	0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62,
 	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
 	0x2e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa5, 0x08, 0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb7, 0x09, 0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65,
 	0x45, 0x6e, 0x75, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x61,
 	0x67, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
 	0x23, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
@@ -2762,59 +2778,68 @@ var file_backend_operation_pasture_proto_rawDesc = []byte{
 	0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70,
 	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f,
 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65,
-	0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a,
-	0x10, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x75,
-	0x6d, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
-	0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a,
-	0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61,
-	0x62, 0x65, 0x6c, 0x22, 0x68, 0x0a, 0x12, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61,
-	0x6e, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
-	0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72,
-	0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64,
-	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x64, 0x0a,
-	0x10, 0x4a, 0x75, 0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75,
-	0x6d, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a,
+	0x09, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b,
 	0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4a, 0x75, 0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x54, 0x79, 0x70,
-	0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a,
-	0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61,
-	0x62, 0x65, 0x6c, 0x22, 0x74, 0x0a, 0x18, 0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x50, 0x61, 0x72,
-	0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x75, 0x6d, 0x12,
-	0x42, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x08, 0x6a, 0x75, 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65,
+	0x12, 0x4d, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b,
+	0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f,
+	0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x52,
+	0x0e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x54, 0x79, 0x70, 0x65, 0x22,
+	0x64, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45,
+	0x6e, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12,
+	0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x68, 0x0a, 0x12, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50,
+	0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x62, 0x61, 0x63,
+	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46,
+	0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4b, 0x69,
+	0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62,
+	0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+	0x64, 0x0a, 0x10, 0x4a, 0x75, 0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x45,
+	0x6e, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4a, 0x75, 0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x54,
+	0x79, 0x70, 0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12,
+	0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x74, 0x0a, 0x18, 0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x50,
+	0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x75,
+	0x6d, 0x12, 0x42, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x2c, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67,
+	0x6f, 0x72, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x74, 0x0a, 0x18, 0x46,
+	0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67,
+	0x6f, 0x72, 0x79, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
+	0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x61, 0x67,
+	0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e,
+	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c,
+	0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65,
+	0x6c, 0x22, 0x58, 0x0a, 0x0a, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x45, 0x6e, 0x75, 0x6d, 0x12,
+	0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e,
 	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
-	0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x74, 0x0a, 0x18, 0x46, 0x6f, 0x72,
-	0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
-	0x79, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f,
-	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43,
-	0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69,
+	0x6f, 0x6e, 0x2e, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x62, 0x0a, 0x0f, 0x46,
+	0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x39,
+	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e,
+	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4b, 0x69,
 	0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62,
 	0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
-	0x58, 0x0a, 0x0a, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x34, 0x0a,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x62,
-	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x2e, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x62, 0x0a, 0x0f, 0x46, 0x6f, 0x72,
-	0x6d, 0x75, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x39, 0x0a, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x62, 0x61,
-	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
-	0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64,
-	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3f, 0x0a,
-	0x11, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e,
-	0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65,
-	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x0f,
-	0x5a, 0x0d, 0x2e, 0x3b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x62, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x3f, 0x0a, 0x11, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x45, 0x6e, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61,
+	0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+	0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x3b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50,
+	0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2917,18 +2942,20 @@ var file_backend_operation_pasture_proto_depIdxs = []int32{
 	30, // 42: backend.operation.ForageEnumList.use_materials_list:type_name -> backend.operation.FormulaOptionEnum
 	30, // 43: backend.operation.ForageEnumList.use_materials_type:type_name -> backend.operation.FormulaOptionEnum
 	30, // 44: backend.operation.ForageEnumList.price_materials_type:type_name -> backend.operation.FormulaOptionEnum
-	35, // 45: backend.operation.ForageSourceEnum.value:type_name -> backend.operation.ForageSource.Kind
-	36, // 46: backend.operation.ForagePlanTypeEnum.value:type_name -> backend.operation.ForagePlanType.Kind
-	37, // 47: backend.operation.JumpDelaTypeEnum.value:type_name -> backend.operation.JumpDelaType.Kind
-	33, // 48: backend.operation.CattleParentCategoryEnum.value:type_name -> backend.operation.CattleCategoryParent.Kind
-	34, // 49: backend.operation.ForageParentCategoryEnum.value:type_name -> backend.operation.ForageCategoryParent.Kind
-	31, // 50: backend.operation.IsShowEnum.value:type_name -> backend.operation.IsShow.Kind
-	38, // 51: backend.operation.FormulaTypeEnum.value:type_name -> backend.operation.FormulaType.Kind
-	52, // [52:52] is the sub-list for method output_type
-	52, // [52:52] is the sub-list for method input_type
-	52, // [52:52] is the sub-list for extension type_name
-	52, // [52:52] is the sub-list for extension extendee
-	0,  // [0:52] is the sub-list for field type_name
+	30, // 45: backend.operation.ForageEnumList.jump_type:type_name -> backend.operation.FormulaOptionEnum
+	30, // 46: backend.operation.ForageEnumList.statistics_type:type_name -> backend.operation.FormulaOptionEnum
+	35, // 47: backend.operation.ForageSourceEnum.value:type_name -> backend.operation.ForageSource.Kind
+	36, // 48: backend.operation.ForagePlanTypeEnum.value:type_name -> backend.operation.ForagePlanType.Kind
+	37, // 49: backend.operation.JumpDelaTypeEnum.value:type_name -> backend.operation.JumpDelaType.Kind
+	33, // 50: backend.operation.CattleParentCategoryEnum.value:type_name -> backend.operation.CattleCategoryParent.Kind
+	34, // 51: backend.operation.ForageParentCategoryEnum.value:type_name -> backend.operation.ForageCategoryParent.Kind
+	31, // 52: backend.operation.IsShowEnum.value:type_name -> backend.operation.IsShow.Kind
+	38, // 53: backend.operation.FormulaTypeEnum.value:type_name -> backend.operation.FormulaType.Kind
+	54, // [54:54] is the sub-list for method output_type
+	54, // [54:54] is the sub-list for method input_type
+	54, // [54:54] is the sub-list for extension type_name
+	54, // [54:54] is the sub-list for extension extendee
+	0,  // [0:54] is the sub-list for field type_name
 }
 
 func init() { file_backend_operation_pasture_proto_init() }

+ 317 - 223
proto/go/backend/operation/statistic.pb.go

@@ -1276,6 +1276,78 @@ func (x *SprinkleStatisticsRequest) GetPagination() *PaginationModel {
 	return nil
 }
 
+// GetDataByNameRequest
+type GetDataByNameRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	StartTime string `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`  // 开始时间
+	EndTime   string `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`        // 结束时间
+	ApiName   string `protobuf:"bytes,3,opt,name=api_name,json=apiName,proto3" json:"api_name,omitempty"`        // 牧场端接口标识名称
+	PastureId int32  `protobuf:"varint,4,opt,name=pasture_id,json=pastureId,proto3" json:"pasture_id,omitempty"` // 牧场id
+}
+
+func (x *GetDataByNameRequest) Reset() {
+	*x = GetDataByNameRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_statistic_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetDataByNameRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDataByNameRequest) ProtoMessage() {}
+
+func (x *GetDataByNameRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_statistic_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetDataByNameRequest.ProtoReflect.Descriptor instead.
+func (*GetDataByNameRequest) Descriptor() ([]byte, []int) {
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *GetDataByNameRequest) GetStartTime() string {
+	if x != nil {
+		return x.StartTime
+	}
+	return ""
+}
+
+func (x *GetDataByNameRequest) GetEndTime() string {
+	if x != nil {
+		return x.EndTime
+	}
+	return ""
+}
+
+func (x *GetDataByNameRequest) GetApiName() string {
+	if x != nil {
+		return x.ApiName
+	}
+	return ""
+}
+
+func (x *GetDataByNameRequest) GetPastureId() int32 {
+	if x != nil {
+		return x.PastureId
+	}
+	return 0
+}
+
 // ProcessAnalysisRequest 过程分析
 type ProcessAnalysisRequest struct {
 	state         protoimpl.MessageState
@@ -1305,7 +1377,7 @@ type ProcessAnalysisRequest struct {
 func (x *ProcessAnalysisRequest) Reset() {
 	*x = ProcessAnalysisRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[10]
+		mi := &file_backend_operation_statistic_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1318,7 +1390,7 @@ func (x *ProcessAnalysisRequest) String() string {
 func (*ProcessAnalysisRequest) ProtoMessage() {}
 
 func (x *ProcessAnalysisRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[10]
+	mi := &file_backend_operation_statistic_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1331,7 +1403,7 @@ func (x *ProcessAnalysisRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ProcessAnalysisRequest.ProtoReflect.Descriptor instead.
 func (*ProcessAnalysisRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{10}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *ProcessAnalysisRequest) GetStartTime() string {
@@ -1474,7 +1546,7 @@ type TrainNumberRequest struct {
 func (x *TrainNumberRequest) Reset() {
 	*x = TrainNumberRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[11]
+		mi := &file_backend_operation_statistic_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1487,7 +1559,7 @@ func (x *TrainNumberRequest) String() string {
 func (*TrainNumberRequest) ProtoMessage() {}
 
 func (x *TrainNumberRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[11]
+	mi := &file_backend_operation_statistic_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1500,7 +1572,7 @@ func (x *TrainNumberRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TrainNumberRequest.ProtoReflect.Descriptor instead.
 func (*TrainNumberRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{11}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *TrainNumberRequest) GetApiName() string {
@@ -1544,7 +1616,7 @@ type TrainNumberResponse struct {
 func (x *TrainNumberResponse) Reset() {
 	*x = TrainNumberResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[12]
+		mi := &file_backend_operation_statistic_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1557,7 +1629,7 @@ func (x *TrainNumberResponse) String() string {
 func (*TrainNumberResponse) ProtoMessage() {}
 
 func (x *TrainNumberResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[12]
+	mi := &file_backend_operation_statistic_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1570,7 +1642,7 @@ func (x *TrainNumberResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TrainNumberResponse.ProtoReflect.Descriptor instead.
 func (*TrainNumberResponse) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{12}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *TrainNumberResponse) GetCode() int32 {
@@ -1605,7 +1677,7 @@ type TrainNumberData struct {
 func (x *TrainNumberData) Reset() {
 	*x = TrainNumberData{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[13]
+		mi := &file_backend_operation_statistic_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1618,7 +1690,7 @@ func (x *TrainNumberData) String() string {
 func (*TrainNumberData) ProtoMessage() {}
 
 func (x *TrainNumberData) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[13]
+	mi := &file_backend_operation_statistic_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1631,7 +1703,7 @@ func (x *TrainNumberData) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TrainNumberData.ProtoReflect.Descriptor instead.
 func (*TrainNumberData) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{13}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{14}
 }
 
 func (x *TrainNumberData) GetList() []*FormulaOptionEnum {
@@ -1657,7 +1729,7 @@ type SearchAnalysisAccuracyRequest struct {
 func (x *SearchAnalysisAccuracyRequest) Reset() {
 	*x = SearchAnalysisAccuracyRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[14]
+		mi := &file_backend_operation_statistic_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1670,7 +1742,7 @@ func (x *SearchAnalysisAccuracyRequest) String() string {
 func (*SearchAnalysisAccuracyRequest) ProtoMessage() {}
 
 func (x *SearchAnalysisAccuracyRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[14]
+	mi := &file_backend_operation_statistic_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1683,7 +1755,7 @@ func (x *SearchAnalysisAccuracyRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SearchAnalysisAccuracyRequest.ProtoReflect.Descriptor instead.
 func (*SearchAnalysisAccuracyRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{14}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *SearchAnalysisAccuracyRequest) GetCattleParentCategoryId() CattleCategoryParent_Kind {
@@ -1734,7 +1806,7 @@ type SearchAnalysisAccuracyResponse struct {
 func (x *SearchAnalysisAccuracyResponse) Reset() {
 	*x = SearchAnalysisAccuracyResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[15]
+		mi := &file_backend_operation_statistic_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1747,7 +1819,7 @@ func (x *SearchAnalysisAccuracyResponse) String() string {
 func (*SearchAnalysisAccuracyResponse) ProtoMessage() {}
 
 func (x *SearchAnalysisAccuracyResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[15]
+	mi := &file_backend_operation_statistic_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1760,7 +1832,7 @@ func (x *SearchAnalysisAccuracyResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SearchAnalysisAccuracyResponse.ProtoReflect.Descriptor instead.
 func (*SearchAnalysisAccuracyResponse) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{15}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *SearchAnalysisAccuracyResponse) GetCode() int32 {
@@ -1796,7 +1868,7 @@ type AnalysisAccuracy struct {
 func (x *AnalysisAccuracy) Reset() {
 	*x = AnalysisAccuracy{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[16]
+		mi := &file_backend_operation_statistic_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1809,7 +1881,7 @@ func (x *AnalysisAccuracy) String() string {
 func (*AnalysisAccuracy) ProtoMessage() {}
 
 func (x *AnalysisAccuracy) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[16]
+	mi := &file_backend_operation_statistic_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1822,7 +1894,7 @@ func (x *AnalysisAccuracy) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AnalysisAccuracy.ProtoReflect.Descriptor instead.
 func (*AnalysisAccuracy) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{16}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *AnalysisAccuracy) GetChart() *Chart {
@@ -1853,7 +1925,7 @@ type Chart struct {
 func (x *Chart) Reset() {
 	*x = Chart{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[17]
+		mi := &file_backend_operation_statistic_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1866,7 +1938,7 @@ func (x *Chart) String() string {
 func (*Chart) ProtoMessage() {}
 
 func (x *Chart) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[17]
+	mi := &file_backend_operation_statistic_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1879,7 +1951,7 @@ func (x *Chart) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Chart.ProtoReflect.Descriptor instead.
 func (*Chart) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{17}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *Chart) GetMixedFodderAccurateRatio() *CommonValueRatio {
@@ -1921,7 +1993,7 @@ type Table struct {
 func (x *Table) Reset() {
 	*x = Table{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[18]
+		mi := &file_backend_operation_statistic_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1934,7 +2006,7 @@ func (x *Table) String() string {
 func (*Table) ProtoMessage() {}
 
 func (x *Table) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[18]
+	mi := &file_backend_operation_statistic_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1947,7 +2019,7 @@ func (x *Table) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Table.ProtoReflect.Descriptor instead.
 func (*Table) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{18}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *Table) GetTableList() []*Table_TableList {
@@ -1973,7 +2045,7 @@ type CommonValueRatio struct {
 func (x *CommonValueRatio) Reset() {
 	*x = CommonValueRatio{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[19]
+		mi := &file_backend_operation_statistic_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1986,7 +2058,7 @@ func (x *CommonValueRatio) String() string {
 func (*CommonValueRatio) ProtoMessage() {}
 
 func (x *CommonValueRatio) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[19]
+	mi := &file_backend_operation_statistic_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1999,7 +2071,7 @@ func (x *CommonValueRatio) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CommonValueRatio.ProtoReflect.Descriptor instead.
 func (*CommonValueRatio) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{19}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *CommonValueRatio) GetMaxValue() string {
@@ -2055,7 +2127,7 @@ type ValueRatio struct {
 func (x *ValueRatio) Reset() {
 	*x = ValueRatio{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[20]
+		mi := &file_backend_operation_statistic_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2068,7 +2140,7 @@ func (x *ValueRatio) String() string {
 func (*ValueRatio) ProtoMessage() {}
 
 func (x *ValueRatio) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[20]
+	mi := &file_backend_operation_statistic_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2081,7 +2153,7 @@ func (x *ValueRatio) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ValueRatio.ProtoReflect.Descriptor instead.
 func (*ValueRatio) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{20}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *ValueRatio) GetValueRatio() []string {
@@ -2103,7 +2175,7 @@ type Table_TableList struct {
 func (x *Table_TableList) Reset() {
 	*x = Table_TableList{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_statistic_proto_msgTypes[21]
+		mi := &file_backend_operation_statistic_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2116,7 +2188,7 @@ func (x *Table_TableList) String() string {
 func (*Table_TableList) ProtoMessage() {}
 
 func (x *Table_TableList) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_statistic_proto_msgTypes[21]
+	mi := &file_backend_operation_statistic_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2129,7 +2201,7 @@ func (x *Table_TableList) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Table_TableList.ProtoReflect.Descriptor instead.
 func (*Table_TableList) Descriptor() ([]byte, []int) {
-	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{18, 0}
+	return file_backend_operation_statistic_proto_rawDescGZIP(), []int{19, 0}
 }
 
 func (x *Table_TableList) GetId() int32 {
@@ -2387,149 +2459,158 @@ var file_backend_operation_statistic_proto_rawDesc = []byte{
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f,
 	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74,
 	0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x04, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
-	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19,
-	0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x69,
-	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x69,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72,
-	0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65,
-	0x12, 0x19, 0x0a, 0x08, 0x74, 0x6d, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x03,
-	0x28, 0x09, 0x52, 0x07, 0x74, 0x6d, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65,
-	0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
-	0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a,
-	0x0d, 0x6d, 0x69, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x69, 0x78, 0x46, 0x65, 0x65, 0x64, 0x54, 0x79, 0x70,
-	0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x31, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x32,
-	0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x32, 0x12, 0x14, 0x0a,
-	0x05, 0x68, 0x6c, 0x7a, 0x71, 0x31, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x68, 0x6c,
-	0x7a, 0x71, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c, 0x7a, 0x71, 0x32, 0x18, 0x0d, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x05, 0x68, 0x6c, 0x7a, 0x71, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x77,
-	0x63, 0x31, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x77, 0x63, 0x31, 0x12,
-	0x14, 0x0a, 0x05, 0x73, 0x6c, 0x77, 0x63, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
-	0x73, 0x6c, 0x77, 0x63, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x7a, 0x71, 0x31, 0x18, 0x10,
-	0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x7a, 0x71, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x73,
-	0x6c, 0x7a, 0x71, 0x32, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x7a, 0x71,
-	0x32, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
-	0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e,
-	0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e,
-	0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
-	0x61, 0x70, 0x69, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x61, 0x70, 0x69, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75,
-	0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x73,
-	0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6e,
-	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x4e,
-	0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x67, 0x69,
-	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x70, 0x61, 0x67,
-	0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x69, 0x6e,
-	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12,
-	0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f,
-	0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x03, 0x6d, 0x73, 0x67, 0x12, 0x36, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61,
+	0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a,
+	0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08,
+	0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x69, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x69, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x49,
+	0x64, 0x22, 0x9e, 0x04, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x61,
+	0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+	0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65,
+	0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65,
+	0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x69, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x69, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64,
+	0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a,
+	0x08, 0x74, 0x6d, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x07, 0x74, 0x6d, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72,
+	0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x77, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x69,
+	0x78, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x6d, 0x69, 0x78, 0x46, 0x65, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14,
+	0x0a, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x31, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x68,
+	0x6c, 0x77, 0x63, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x32, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x05, 0x68, 0x6c, 0x77, 0x63, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c,
+	0x7a, 0x71, 0x31, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x68, 0x6c, 0x7a, 0x71, 0x31,
+	0x12, 0x14, 0x0a, 0x05, 0x68, 0x6c, 0x7a, 0x71, 0x32, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x05, 0x68, 0x6c, 0x7a, 0x71, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x77, 0x63, 0x31, 0x18,
+	0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x77, 0x63, 0x31, 0x12, 0x14, 0x0a, 0x05,
+	0x73, 0x6c, 0x77, 0x63, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x77,
+	0x63, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x7a, 0x71, 0x31, 0x18, 0x10, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x05, 0x73, 0x6c, 0x7a, 0x71, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6c, 0x7a, 0x71,
+	0x32, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x6c, 0x7a, 0x71, 0x32, 0x12, 0x42,
+	0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01,
 	0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62,
-	0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4b, 0x0a, 0x0f,
-	0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12,
-	0x38, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e,
-	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45,
-	0x6e, 0x75, 0x6d, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8b, 0x02, 0x0a, 0x1d, 0x53, 0x65,
-	0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75,
-	0x72, 0x61, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x19, 0x63,
-	0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x74,
-	0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c,
-	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
-	0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x16, 0x63, 0x61,
-	0x74, 0x74, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,
-	0x72, 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72,
-	0x6d, 0x75, 0x6c, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x66,
-	0x65, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
-	0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65,
-	0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65,
-	0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72,
-	0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x73,
-	0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x73, 0x22, 0x7f, 0x0a, 0x1e, 0x53, 0x65, 0x61, 0x72, 0x63,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x69,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x69,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f,
+	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72,
+	0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f,
+	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e, 0x75, 0x6d,
+	0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63,
+	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12,
+	0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73,
+	0x67, 0x12, 0x36, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x44,
+	0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4b, 0x0a, 0x0f, 0x54, 0x72, 0x61,
+	0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x04,
+	0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x63,
+	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46,
+	0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d,
+	0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8b, 0x02, 0x0a, 0x1d, 0x53, 0x65, 0x61, 0x72, 0x63,
 	0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63,
-	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a,
-	0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12,
-	0x37, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
-	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61,
-	0x63, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x72, 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c,
-	0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x05,
-	0x63, 0x68, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61,
+	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x19, 0x63, 0x61, 0x74, 0x74,
+	0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f,
+	0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x62, 0x61,
 	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
-	0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x05, 0x63, 0x68, 0x61, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x05,
-	0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61,
-	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
-	0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x9f, 0x03, 0x0a,
-	0x05, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x62, 0x0a, 0x1b, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f,
-	0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x5f,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61,
+	0x43, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x50, 0x61,
+	0x72, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x16, 0x63, 0x61, 0x74, 0x74, 0x6c,
+	0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49,
+	0x64, 0x12, 0x26, 0x0a, 0x0f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c,
+	0x61, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x66, 0x65, 0x65, 0x64,
+	0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61,
+	0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73,
+	0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f,
+	0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44,
+	0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69,
+	0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72,
+	0x65, 0x49, 0x64, 0x73, 0x22, 0x7f, 0x0a, 0x1e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e,
+	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73,
+	0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63,
+	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,
+	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x52,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x72, 0x0a, 0x10, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
+	0x73, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x63, 0x68, 0x61,
+	0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x68, 0x61,
+	0x72, 0x74, 0x52, 0x05, 0x63, 0x68, 0x61, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x62,
+	0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x62,
+	0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x9f, 0x03, 0x0a, 0x05, 0x43, 0x68,
+	0x61, 0x72, 0x74, 0x12, 0x62, 0x0a, 0x1b, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x64,
+	0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52, 0x18, 0x6d,
+	0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61,
+	0x74, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x60, 0x0a, 0x1a, 0x6d, 0x69, 0x78, 0x65, 0x64,
+	0x5f, 0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x5f,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61,
 	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
 	0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f,
-	0x52, 0x18, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63,
-	0x75, 0x72, 0x61, 0x74, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x60, 0x0a, 0x1a, 0x6d, 0x69,
-	0x78, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65,
-	0x63, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
-	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61,
-	0x74, 0x69, 0x6f, 0x52, 0x17, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72,
-	0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x68, 0x0a, 0x1e,
-	0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f,
-	0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f,
-	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52, 0x1b, 0x73, 0x70, 0x72, 0x69, 0x6e,
-	0x6b, 0x6c, 0x65, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x74,
-	0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x66, 0x0a, 0x1d, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b,
-	0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63,
-	0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
+	0x52, 0x17, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x72,
+	0x72, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x68, 0x0a, 0x1e, 0x73, 0x70, 0x72,
+	0x69, 0x6e, 0x6b, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63,
+	0x75, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52, 0x1b, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b, 0x6c, 0x65,
+	0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x52, 0x61,
+	0x74, 0x69, 0x6f, 0x12, 0x66, 0x0a, 0x1d, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b, 0x6c, 0x65, 0x5f,
+	0x66, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63,
+	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52,
+	0x1a, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b, 0x6c, 0x65, 0x46, 0x6f, 0x64, 0x64, 0x65, 0x72, 0x43,
+	0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x22, 0x7b, 0x0a, 0x05, 0x54,
+	0x61, 0x62, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69,
+	0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
+	0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x62,
+	0x6c, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x74, 0x61,
+	0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x2f, 0x0a, 0x09, 0x54, 0x61, 0x62, 0x6c, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x1b, 0x0a,
+	0x09, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69,
+	0x64, 0x64, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a,
+	0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x64, 0x61,
+	0x74, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
 	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74,
-	0x69, 0x6f, 0x52, 0x1a, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x6b, 0x6c, 0x65, 0x46, 0x6f, 0x64, 0x64,
-	0x65, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x22, 0x7b,
-	0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65,
-	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x62, 0x61,
-	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
-	0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x2f, 0x0a, 0x09, 0x54, 0x61,
-	0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x10,
-	0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f,
-	0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a,
-	0x0c, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,
-	0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a,
-	0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x1d, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52,
-	0x08, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x73,
-	0x74, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52,
-	0x0b, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08,
-	0x64, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
-	0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x79, 0x22, 0x2d, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x75, 0x65,
-	0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x3b, 0x6f, 0x70, 0x65, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x52, 0x08, 0x64, 0x61,
+	0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72,
+	0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61,
+	0x73, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x61, 0x74,
+	0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x61, 0x74,
+	0x65, 0x44, 0x61, 0x79, 0x22, 0x2d, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61, 0x74,
+	0x69, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x61,
+	0x74, 0x69, 0x6f, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x3b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x50, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2544,7 +2625,7 @@ func file_backend_operation_statistic_proto_rawDescGZIP() []byte {
 	return file_backend_operation_statistic_proto_rawDescData
 }
 
-var file_backend_operation_statistic_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
+var file_backend_operation_statistic_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
 var file_backend_operation_statistic_proto_goTypes = []interface{}{
 	(*SearchFormulaEstimateRequest)(nil),         // 0: backend.operation.SearchFormulaEstimateRequest
 	(*SearchInventoryStatisticsRequest)(nil),     // 1: backend.operation.SearchInventoryStatisticsRequest
@@ -2556,45 +2637,46 @@ var file_backend_operation_statistic_proto_goTypes = []interface{}{
 	(*AccuracyAggStatisticsRequest)(nil),         // 7: backend.operation.AccuracyAggStatisticsRequest
 	(*MixFeedStatisticsRequest)(nil),             // 8: backend.operation.MixFeedStatisticsRequest
 	(*SprinkleStatisticsRequest)(nil),            // 9: backend.operation.SprinkleStatisticsRequest
-	(*ProcessAnalysisRequest)(nil),               // 10: backend.operation.ProcessAnalysisRequest
-	(*TrainNumberRequest)(nil),                   // 11: backend.operation.TrainNumberRequest
-	(*TrainNumberResponse)(nil),                  // 12: backend.operation.TrainNumberResponse
-	(*TrainNumberData)(nil),                      // 13: backend.operation.TrainNumberData
-	(*SearchAnalysisAccuracyRequest)(nil),        // 14: backend.operation.SearchAnalysisAccuracyRequest
-	(*SearchAnalysisAccuracyResponse)(nil),       // 15: backend.operation.SearchAnalysisAccuracyResponse
-	(*AnalysisAccuracy)(nil),                     // 16: backend.operation.AnalysisAccuracy
-	(*Chart)(nil),                                // 17: backend.operation.Chart
-	(*Table)(nil),                                // 18: backend.operation.Table
-	(*CommonValueRatio)(nil),                     // 19: backend.operation.CommonValueRatio
-	(*ValueRatio)(nil),                           // 20: backend.operation.ValueRatio
-	(*Table_TableList)(nil),                      // 21: backend.operation.Table.TableList
-	(*PaginationModel)(nil),                      // 22: backend.operation.PaginationModel
-	(*FormulaOptionEnum)(nil),                    // 23: backend.operation.FormulaOptionEnum
-	(CattleCategoryParent_Kind)(0),               // 24: backend.operation.CattleCategoryParent.Kind
+	(*GetDataByNameRequest)(nil),                 // 10: backend.operation.GetDataByNameRequest
+	(*ProcessAnalysisRequest)(nil),               // 11: backend.operation.ProcessAnalysisRequest
+	(*TrainNumberRequest)(nil),                   // 12: backend.operation.TrainNumberRequest
+	(*TrainNumberResponse)(nil),                  // 13: backend.operation.TrainNumberResponse
+	(*TrainNumberData)(nil),                      // 14: backend.operation.TrainNumberData
+	(*SearchAnalysisAccuracyRequest)(nil),        // 15: backend.operation.SearchAnalysisAccuracyRequest
+	(*SearchAnalysisAccuracyResponse)(nil),       // 16: backend.operation.SearchAnalysisAccuracyResponse
+	(*AnalysisAccuracy)(nil),                     // 17: backend.operation.AnalysisAccuracy
+	(*Chart)(nil),                                // 18: backend.operation.Chart
+	(*Table)(nil),                                // 19: backend.operation.Table
+	(*CommonValueRatio)(nil),                     // 20: backend.operation.CommonValueRatio
+	(*ValueRatio)(nil),                           // 21: backend.operation.ValueRatio
+	(*Table_TableList)(nil),                      // 22: backend.operation.Table.TableList
+	(*PaginationModel)(nil),                      // 23: backend.operation.PaginationModel
+	(*FormulaOptionEnum)(nil),                    // 24: backend.operation.FormulaOptionEnum
+	(CattleCategoryParent_Kind)(0),               // 25: backend.operation.CattleCategoryParent.Kind
 }
 var file_backend_operation_statistic_proto_depIdxs = []int32{
-	22, // 0: backend.operation.SearchFormulaEstimateRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 1: backend.operation.SearchInventoryStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 2: backend.operation.SearchUserMaterialsStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 3: backend.operation.SearchPriceStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 4: backend.operation.SearchFeedStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 5: backend.operation.CowsAnalysisRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 6: backend.operation.MixFeedStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 7: backend.operation.SprinkleStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 8: backend.operation.ProcessAnalysisRequest.pagination:type_name -> backend.operation.PaginationModel
-	22, // 9: backend.operation.TrainNumberRequest.pagination:type_name -> backend.operation.PaginationModel
-	13, // 10: backend.operation.TrainNumberResponse.data:type_name -> backend.operation.TrainNumberData
-	23, // 11: backend.operation.TrainNumberData.list:type_name -> backend.operation.FormulaOptionEnum
-	24, // 12: backend.operation.SearchAnalysisAccuracyRequest.cattle_parent_category_id:type_name -> backend.operation.CattleCategoryParent.Kind
-	16, // 13: backend.operation.SearchAnalysisAccuracyResponse.data:type_name -> backend.operation.AnalysisAccuracy
-	17, // 14: backend.operation.AnalysisAccuracy.chart:type_name -> backend.operation.Chart
-	18, // 15: backend.operation.AnalysisAccuracy.table:type_name -> backend.operation.Table
-	19, // 16: backend.operation.Chart.mixed_fodder_accurate_ratio:type_name -> backend.operation.CommonValueRatio
-	19, // 17: backend.operation.Chart.mixed_fodder_correct_ratio:type_name -> backend.operation.CommonValueRatio
-	19, // 18: backend.operation.Chart.sprinkle_fodder_accurate_ratio:type_name -> backend.operation.CommonValueRatio
-	19, // 19: backend.operation.Chart.sprinkle_fodder_correct_ratio:type_name -> backend.operation.CommonValueRatio
-	21, // 20: backend.operation.Table.table_list:type_name -> backend.operation.Table.TableList
-	20, // 21: backend.operation.CommonValueRatio.data_list:type_name -> backend.operation.ValueRatio
+	23, // 0: backend.operation.SearchFormulaEstimateRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 1: backend.operation.SearchInventoryStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 2: backend.operation.SearchUserMaterialsStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 3: backend.operation.SearchPriceStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 4: backend.operation.SearchFeedStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 5: backend.operation.CowsAnalysisRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 6: backend.operation.MixFeedStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 7: backend.operation.SprinkleStatisticsRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 8: backend.operation.ProcessAnalysisRequest.pagination:type_name -> backend.operation.PaginationModel
+	23, // 9: backend.operation.TrainNumberRequest.pagination:type_name -> backend.operation.PaginationModel
+	14, // 10: backend.operation.TrainNumberResponse.data:type_name -> backend.operation.TrainNumberData
+	24, // 11: backend.operation.TrainNumberData.list:type_name -> backend.operation.FormulaOptionEnum
+	25, // 12: backend.operation.SearchAnalysisAccuracyRequest.cattle_parent_category_id:type_name -> backend.operation.CattleCategoryParent.Kind
+	17, // 13: backend.operation.SearchAnalysisAccuracyResponse.data:type_name -> backend.operation.AnalysisAccuracy
+	18, // 14: backend.operation.AnalysisAccuracy.chart:type_name -> backend.operation.Chart
+	19, // 15: backend.operation.AnalysisAccuracy.table:type_name -> backend.operation.Table
+	20, // 16: backend.operation.Chart.mixed_fodder_accurate_ratio:type_name -> backend.operation.CommonValueRatio
+	20, // 17: backend.operation.Chart.mixed_fodder_correct_ratio:type_name -> backend.operation.CommonValueRatio
+	20, // 18: backend.operation.Chart.sprinkle_fodder_accurate_ratio:type_name -> backend.operation.CommonValueRatio
+	20, // 19: backend.operation.Chart.sprinkle_fodder_correct_ratio:type_name -> backend.operation.CommonValueRatio
+	22, // 20: backend.operation.Table.table_list:type_name -> backend.operation.Table.TableList
+	21, // 21: backend.operation.CommonValueRatio.data_list:type_name -> backend.operation.ValueRatio
 	22, // [22:22] is the sub-list for method output_type
 	22, // [22:22] is the sub-list for method input_type
 	22, // [22:22] is the sub-list for extension type_name
@@ -2732,7 +2814,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ProcessAnalysisRequest); i {
+			switch v := v.(*GetDataByNameRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2744,7 +2826,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TrainNumberRequest); i {
+			switch v := v.(*ProcessAnalysisRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2756,7 +2838,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TrainNumberResponse); i {
+			switch v := v.(*TrainNumberRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2768,7 +2850,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TrainNumberData); i {
+			switch v := v.(*TrainNumberResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2780,7 +2862,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchAnalysisAccuracyRequest); i {
+			switch v := v.(*TrainNumberData); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2792,7 +2874,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchAnalysisAccuracyResponse); i {
+			switch v := v.(*SearchAnalysisAccuracyRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2804,7 +2886,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AnalysisAccuracy); i {
+			switch v := v.(*SearchAnalysisAccuracyResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2816,7 +2898,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Chart); i {
+			switch v := v.(*AnalysisAccuracy); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2828,7 +2910,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Table); i {
+			switch v := v.(*Chart); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2840,7 +2922,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CommonValueRatio); i {
+			switch v := v.(*Table); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2852,7 +2934,7 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ValueRatio); i {
+			switch v := v.(*CommonValueRatio); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2864,6 +2946,18 @@ func file_backend_operation_statistic_proto_init() {
 			}
 		}
 		file_backend_operation_statistic_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ValueRatio); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_statistic_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Table_TableList); i {
 			case 0:
 				return &v.state
@@ -2882,7 +2976,7 @@ func file_backend_operation_statistic_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_backend_operation_statistic_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   22,
+			NumMessages:   23,
 			NumExtensions: 0,
 			NumServices:   0,
 		},