Prechádzať zdrojové kódy

forage: 饲料列表

Yi 1 rok pred
rodič
commit
e89abaf275

+ 20 - 0
backend/operation/enum.proto

@@ -25,6 +25,7 @@ message CattleCategoryParent {
   }
   }
 }
 }
 
 
+// 饲料类别
 message ForageCategoryParent {
 message ForageCategoryParent {
   enum Kind {
   enum Kind {
     INVALID = 0;           // 无效
     INVALID = 0;           // 无效
@@ -35,6 +36,16 @@ message ForageCategoryParent {
   }
   }
 }
 }
 
 
+// 饲料来源
+message ForageSource {
+  enum Kind {
+    INVALID = 0;           // 无效
+    SYSTEM_BUILT_IN = 1;   // 系统内置
+    USER_DEFINED = 2;      // 用户自定义
+  }
+}
+
+// 跳转延迟
 message JumpDelaType {
 message JumpDelaType {
   enum Kind {
   enum Kind {
     INVALID = 0;           // 禁用
     INVALID = 0;           // 禁用
@@ -42,4 +53,13 @@ message JumpDelaType {
     SIX = 2;               // 6秒
     SIX = 2;               // 6秒
     NINE = 3;              // 9秒
     NINE = 3;              // 9秒
   }
   }
+}
+
+// 计划类型
+message ForagePlanType {
+  enum Kind {
+    INVALID = 0;           // 无
+    FORKLIFT = 1;          // 铲车
+    CONCENTRATE = 2;     // 精料
+  }
 }
 }

+ 28 - 6
backend/operation/pasture.proto

@@ -108,7 +108,6 @@ message SearchForageCategoryResponse {
   repeated AddForageCategoryRequest list = 3;
   repeated AddForageCategoryRequest list = 3;
 }
 }
 
 
-
 // 饲料列表
 // 饲料列表
 message AddForageRequest {
 message AddForageRequest {
   int64 id = 1;
   int64 id = 1;
@@ -117,22 +116,45 @@ message AddForageRequest {
   string category_name = 4;       // 饲料分类名称
   string category_name = 4;       // 饲料分类名称
   int64 material_type = 5;        // 物料类型
   int64 material_type = 5;        // 物料类型
   string unique_encode = 7;       // 唯一编码
   string unique_encode = 7;       // 唯一编码
-
-
+  ForageSource.Kind forage_source_id = 8;       // 饲料来源
+  ForagePlanType.Kind plan_type_id = 9;       // 计划类型
+  string  small_material_scale = 10;           // 小料称
+  int64 allow_error = 11;                     // 允许误差 (单位kg)
+  int64 package_weight = 12;                  // 包装重量 (单位kg)
+  int64 price = 13;                          // 单价(单位分)
+  int64 jump_weight = 14;                    // 跳转重量域(单位kg)
+  JumpDelaType.Kind jump_delay = 15;         // 跳转延迟
+  IsShow.Kind confirm_start = 16;            // 确认开始
+  int64  relay_locations = 17;               // 继电器位置
+  IsShow.Kind jmp = 18;                     // 无上域
+  string backup1 = 19;                      // 备用字段1
+  string backup2 = 20;                      // 备用字段2
+  string backup3 = 21;                      // 备用字段3
+  int64 created_at = 22;                    // 创建时间
+  string created_at_format = 23;            // 创建时间格式化
+  IsShow.Kind is_show = 24;                  // 是否启用
 }
 }
 
 
 message SearchForageListRequest {
 message SearchForageListRequest {
   string name = 1;   // 饲料名称
   string name = 1;   // 饲料名称
   string category_id = 2;   // 饲料分类id
   string category_id = 2;   // 饲料分类id
-  string forage_source = 3;   // 饲料来源
+  int64 forage_source_id = 3;   // 饲料来源
   IsShow.Kind is_show = 4;    // 是否启用
   IsShow.Kind is_show = 4;    // 是否启用
   int64 allow_error = 5;      // 允许误差
   int64 allow_error = 5;      // 允许误差
   int64 jump_weight = 6;      // 跳转重量域
   int64 jump_weight = 6;      // 跳转重量域
   JumpDelaType.Kind  jump_delay = 7;   // 跳转延迟
   JumpDelaType.Kind  jump_delay = 7;   // 跳转延迟
+  PaginationModel pagination = 8; // 分页
 }
 }
 
 
 message SearchForageListResponse {
 message SearchForageListResponse {
   int32 page = 1;
   int32 page = 1;
-  int32 total = 2;
-  repeated AddForageRequest list = 3;
+  int32 page_size = 2;
+  int32 total = 3;
+  repeated AddForageRequest list = 4;
+}
+
+// 是否启用
+message IsShowForage {
+  int64 forage_id = 1;
+  IsShow.Kind is_show = 2;
 }
 }

+ 7 - 0
backend/operation/system.proto

@@ -32,6 +32,13 @@ message SearchRoleResponse {
   repeated AddRoleRequest list = 4;
   repeated AddRoleRequest list = 4;
 }
 }
 
 
+// 角色对应权限列表
+message RolePermissionsList {
+  repeated int64 mobile_list = 1;    // 移动端权限id
+  repeated int64 pasture_list = 2;    // 牧场端列表
+  repeated int64 menu_list = 3;      // 后端权限列表
+}
+
 // 用户token
 // 用户token
 message SystemToken {
 message SystemToken {
   string token = 1;
   string token = 1;

+ 125 - 1
http/handler/pasture/forage_list.go

@@ -1,12 +1,136 @@
 package pasture
 package pasture
 
 
-import "github.com/gin-gonic/gin"
+import (
+	"kpt-tmr-group/http/middleware"
+	"kpt-tmr-group/pkg/apierr"
+	"kpt-tmr-group/pkg/apiok"
+	"kpt-tmr-group/pkg/valid"
+	"kpt-tmr-group/pkg/xerr"
+	operationPb "kpt-tmr-group/proto/go/backend/operation"
+	"net/http"
+
+	"github.com/gin-gonic/gin"
+)
+
+func AddForage(c *gin.Context) {
+	var req operationPb.AddForageRequest
+	if err := c.BindJSON(&req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.Name, valid.Required),
+		valid.Field(&req.CategoryId, valid.Required),
+		valid.Field(&req.UniqueEncode, valid.Required),
+		valid.Field(&req.ForageSourceId, valid.Required),
+		valid.Field(&req.PlanTypeId, valid.Required),
+		valid.Field(&req.JumpWeight, valid.Required, valid.Min(0), valid.Max(50)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.CreateForage(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
+}
+
+func EditForage(c *gin.Context) {
+	var req operationPb.AddForageRequest
+	if err := c.BindJSON(&req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.Id, valid.Required, valid.Min(1)),
+		valid.Field(&req.Name, valid.Required),
+		valid.Field(&req.CategoryId, valid.Required),
+		valid.Field(&req.UniqueEncode, valid.Required),
+		valid.Field(&req.ForageSourceId, valid.Required),
+		valid.Field(&req.PlanTypeId, valid.Required),
+		valid.Field(&req.JumpWeight, valid.Required, valid.Min(0), valid.Max(50)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.EditForage(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
+}
 
 
 func SearchForageList(c *gin.Context) {
 func SearchForageList(c *gin.Context) {
+	req := &operationPb.SearchForageListRequest{}
+	if err := c.BindJSON(req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
 
 
+	res, err := middleware.BackendOperation(c).OpsService.SearchForageList(c, req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	c.JSON(http.StatusOK, apiok.CommonResponse(res))
 }
 }
 
 
 // SearchForageEnumList 饲料列表公共枚举
 // SearchForageEnumList 饲料列表公共枚举
 func SearchForageEnumList(c *gin.Context) {
 func SearchForageEnumList(c *gin.Context) {
+	res := middleware.BackendOperation(c).OpsService.ForageEnumList(c)
+	c.JSON(http.StatusOK, apiok.CommonResponse(res))
+}
+
+func DeleteForageList(c *gin.Context) {
+	ids := make([]int64, 0)
+	if err := c.BindJSON(&ids); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if len(ids) <= 0 {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, xerr.Custom("参数错误"))
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.DeleteForageList(c, ids); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
+
+}
+
+func IsShowForage(c *gin.Context) {
+	var req operationPb.IsShowForage
+	if err := c.BindJSON(&req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ForageId, valid.Required, valid.Min(1)),
+		valid.Field(&req.IsShow, valid.Required, valid.Min(1), valid.Max(2)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
 
 
+	if err := middleware.BackendOperation(c).OpsService.IsShowForage(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
 }
 }

+ 19 - 0
http/handler/system/role.go

@@ -62,6 +62,25 @@ func EditSystemRole(c *gin.Context) {
 	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
 	c.JSON(http.StatusOK, apiok.CommonResponse(apiok.NewApiOk(true)))
 }
 }
 
 
+// GetRolePermissions 获取角色对应的权限
+func GetRolePermissions(c *gin.Context) {
+	roleIdStr := c.Param("role_id")
+	roleId, _ := strconv.Atoi(roleIdStr)
+
+	if err := valid.Validate(roleId, valid.Required, valid.Min(1)); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.GetRolePermissions(c, int64(roleId))
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	c.JSON(http.StatusOK, apiok.CommonResponse(res))
+}
+
 // DeleteSystemRole 删除角色
 // DeleteSystemRole 删除角色
 func DeleteSystemRole(c *gin.Context) {
 func DeleteSystemRole(c *gin.Context) {
 	roleIdStr := c.Param("role_id")
 	roleIdStr := c.Param("role_id")

+ 8 - 3
http/route/app_api.go

@@ -35,6 +35,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 
 
 		// 系统角色
 		// 系统角色
 		systemRoute.POST("/role/add", system.AddSystemRole)
 		systemRoute.POST("/role/add", system.AddSystemRole)
+		systemRoute.GET("/role/permissions/:role_id", system.GetRolePermissions)
 		systemRoute.POST("/role/edit", system.EditSystemRole)
 		systemRoute.POST("/role/edit", system.EditSystemRole)
 		systemRoute.DELETE("/role/:role_id", system.DeleteSystemRole)
 		systemRoute.DELETE("/role/:role_id", system.DeleteSystemRole)
 		systemRoute.POST("/role/list", system.SearchSystemRoleList)
 		systemRoute.POST("/role/list", system.SearchSystemRoleList)
@@ -59,7 +60,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/pasture/is_show", pasture.IsShowGroupPasture)
 		opsRoute.POST("/pasture/is_show", pasture.IsShowGroupPasture)
 
 
 		// 牲牧类型
 		// 牲牧类型
-		opsRoute.GET("/cattle/category/parent_list", pasture.ParentCattleCategoryList)
+		// opsRoute.GET("/cattle/category/parent_list", pasture.ParentCattleCategoryList)
 		opsRoute.POST("/cattle/category/add", pasture.AddCattleCategory)
 		opsRoute.POST("/cattle/category/add", pasture.AddCattleCategory)
 		opsRoute.POST("/cattle/category/edit", pasture.EditCattleCategory)
 		opsRoute.POST("/cattle/category/edit", pasture.EditCattleCategory)
 		opsRoute.POST("/cattle/category/is_show", pasture.IsShowCattleCategory)
 		opsRoute.POST("/cattle/category/is_show", pasture.IsShowCattleCategory)
@@ -67,7 +68,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/cattle/category/list", pasture.SearchCattleCategory)
 		opsRoute.POST("/cattle/category/list", pasture.SearchCattleCategory)
 
 
 		// 饲料类别
 		// 饲料类别
-		opsRoute.GET("/forage/category/parent_list", pasture.ParentForageCategoryList)
+		// opsRoute.GET("/forage/category/parent_list", pasture.ParentForageCategoryList)
 		opsRoute.POST("/forage/category/add", pasture.AddForageCategory)
 		opsRoute.POST("/forage/category/add", pasture.AddForageCategory)
 		opsRoute.POST("/forage/category/edit", pasture.EditForageCategory)
 		opsRoute.POST("/forage/category/edit", pasture.EditForageCategory)
 		opsRoute.POST("/forage/category/is_show", pasture.IsShowForageCategory)
 		opsRoute.POST("/forage/category/is_show", pasture.IsShowForageCategory)
@@ -75,8 +76,12 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/forage/category/list", pasture.SearchForageCategory)
 		opsRoute.POST("/forage/category/list", pasture.SearchForageCategory)
 
 
 		// 饲料列表
 		// 饲料列表
+		opsRoute.POST("/forage/add", pasture.AddForage)
+		opsRoute.POST("/forage/edit", pasture.EditForage)
 		opsRoute.POST("/forage/list", pasture.SearchForageList)
 		opsRoute.POST("/forage/list", pasture.SearchForageList)
-		opsRoute.GET("/forage/enum/list", pasture.SearchForageList)
+		opsRoute.POST("forage/delete", pasture.DeleteForageList)
+		opsRoute.POST("forage/is_show", pasture.IsShowForage)
+		opsRoute.GET("/forage/enum/list", pasture.SearchForageEnumList)
 	}
 	}
 }
 }
 
 

+ 1 - 1
model/cattle_category.go

@@ -17,7 +17,7 @@ type CattleCategory struct {
 	UpdatedAt  int64                                 `json:"updated_at"`
 	UpdatedAt  int64                                 `json:"updated_at"`
 }
 }
 
 
-func (s *CattleCategory) TableName() string {
+func (c *CattleCategory) TableName() string {
 	return "cattle_category"
 	return "cattle_category"
 }
 }
 
 

+ 89 - 0
model/forage.go

@@ -0,0 +1,89 @@
+package model
+
+import (
+	operationPb "kpt-tmr-group/proto/go/backend/operation"
+	"time"
+)
+
+type Forage struct {
+	Id                 int64                           `json:"int_64"`
+	Name               string                          `json:"name"`
+	CategoryId         int64                           `json:"category_id"`
+	MaterialType       int64                           `json:"material_type"`
+	UniqueEncode       string                          `json:"unique_encode"`
+	ForageSourceId     operationPb.ForageSource_Kind   `json:"forage_source_id"`
+	PlanTypeId         operationPb.ForagePlanType_Kind `json:"plan_type_id"`
+	SmallMaterialScale string                          `json:"small_material_scale"`
+	AllowError         int64                           `json:"allow_error"`
+	PackageWeight      int64                           `json:"package_weight"`
+	Price              int64                           `json:"price"`
+	JumpWeight         int64                           `json:"jump_weight"`
+	JumpDelay          operationPb.JumpDelaType_Kind   `json:"jump_delay"`
+	ConfirmStart       operationPb.IsShow_Kind         `json:"confirm_start"`
+	RelayLocations     int64                           `json:"relay_locations"`
+	Jmp                operationPb.IsShow_Kind         `json:"jmp"`
+	Backup1            string                          `json:"backup1"`
+	Backup2            string                          `json:"backup2"`
+	Backup3            string                          `json:"backup3"`
+	IsShow             operationPb.IsShow_Kind         `json:"is_show"`
+	IsDelete           operationPb.IsShow_Kind         `json:"is_delete"`
+	CreatedAt          int64                           `json:"created_at"`
+	UpdatedAt          int64                           `json:"updated_at"`
+}
+
+func (c *Forage) TableName() string {
+	return "forage"
+}
+
+func NewForage(req *operationPb.AddForageRequest) *Forage {
+	return &Forage{
+		Name:               req.Name,
+		CategoryId:         req.CategoryId,
+		UniqueEncode:       req.UniqueEncode,
+		ForageSourceId:     req.ForageSourceId,
+		PlanTypeId:         req.PlanTypeId,
+		SmallMaterialScale: req.SmallMaterialScale,
+		AllowError:         req.AllowError,
+		PackageWeight:      req.PackageWeight,
+		Price:              req.Price,
+		JumpWeight:         req.JumpWeight,
+		JumpDelay:          req.JumpDelay,
+		ConfirmStart:       req.ConfirmStart,
+		RelayLocations:     req.RelayLocations,
+		IsShow:             operationPb.IsShow_OK,
+		IsDelete:           operationPb.IsShow_OK,
+		Jmp:                req.Jmp,
+		Backup1:            req.Backup1,
+		Backup2:            req.Backup2,
+		Backup3:            req.Backup3,
+	}
+}
+
+type ForageSlice []*Forage
+
+func (f ForageSlice) ToPB() []*operationPb.AddForageRequest {
+	res := make([]*operationPb.AddForageRequest, len(f))
+	for i, v := range f {
+		res[i] = &operationPb.AddForageRequest{
+			Id:                 v.Id,
+			Name:               v.Name,
+			CategoryId:         v.CategoryId,
+			MaterialType:       v.MaterialType,
+			UniqueEncode:       v.UniqueEncode,
+			ForageSourceId:     v.ForageSourceId,
+			PlanTypeId:         v.PlanTypeId,
+			SmallMaterialScale: v.SmallMaterialScale,
+			AllowError:         v.AllowError,
+			PackageWeight:      v.PackageWeight,
+			Price:              v.Price,
+			JumpWeight:         v.JumpWeight,
+			JumpDelay:          v.JumpDelay,
+			ConfirmStart:       v.ConfirmStart,
+			RelayLocations:     v.RelayLocations,
+			IsShow:             v.IsShow,
+			CreatedAt:          v.CreatedAt,
+			CreatedAtFormat:    time.Unix(v.CreatedAt, 0).Format(LayoutTime),
+		}
+	}
+	return res
+}

+ 10 - 1
module/backend/interface.go

@@ -54,13 +54,21 @@ type Operation interface {
 	DeleteCattleCategory(ctx context.Context, cattleCategoryId int64) error
 	DeleteCattleCategory(ctx context.Context, cattleCategoryId int64) error
 	SearchCattleCategoryList(ctx context.Context, req *operationPb.SearchCattleCategoryRequest) (*model.CattleCategoryResponse, error)
 	SearchCattleCategoryList(ctx context.Context, req *operationPb.SearchCattleCategoryRequest) (*model.CattleCategoryResponse, error)
 
 
-	// ParentForageCategoryList 饲料类别
+	// ParentForageCategoryList 饲料类别相关
 	ParentForageCategoryList(ctx context.Context) map[operationPb.ForageCategoryParent_Kind]string
 	ParentForageCategoryList(ctx context.Context) map[operationPb.ForageCategoryParent_Kind]string
 	AddForageCategory(ctx context.Context, req *operationPb.AddForageCategoryRequest) error
 	AddForageCategory(ctx context.Context, req *operationPb.AddForageCategoryRequest) error
 	EditForageCategory(ctx context.Context, req *operationPb.AddForageCategoryRequest) error
 	EditForageCategory(ctx context.Context, req *operationPb.AddForageCategoryRequest) error
 	IsShowForageCategory(ctx context.Context, req *operationPb.IsShowForageCategory) error
 	IsShowForageCategory(ctx context.Context, req *operationPb.IsShowForageCategory) error
 	DeleteForageCategory(ctx context.Context, cattleCategoryId int64) error
 	DeleteForageCategory(ctx context.Context, cattleCategoryId int64) error
 	SearchForageCategoryList(ctx context.Context, req *operationPb.SearchForageCategoryRequest) (*model.ForageCategoryResponse, error)
 	SearchForageCategoryList(ctx context.Context, req *operationPb.SearchForageCategoryRequest) (*model.ForageCategoryResponse, error)
+
+	// CreateForage 饲料相关
+	CreateForage(ctx context.Context, req *operationPb.AddForageRequest) error
+	EditForage(ctx context.Context, req *operationPb.AddForageRequest) error
+	SearchForageList(ctx context.Context, req *operationPb.SearchForageListRequest) (*operationPb.SearchForageListResponse, error)
+	ForageEnumList(ctx context.Context) *ForageEnumList
+	DeleteForageList(ctx context.Context, ids []int64) error
+	IsShowForage(ctx context.Context, req *operationPb.IsShowForage) error
 }
 }
 
 
 type SystemOperation interface {
 type SystemOperation interface {
@@ -78,6 +86,7 @@ type SystemOperation interface {
 	CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
 	CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
 	EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
 	EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error
 	DeleteSystemRole(ctx context.Context, roleId int64) error
 	DeleteSystemRole(ctx context.Context, roleId int64) error
+	GetRolePermissions(ctx context.Context, roleId int64) (*operationPb.RolePermissionsList, error)
 	SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*operationPb.SearchRoleResponse, error)
 	SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*operationPb.SearchRoleResponse, error)
 
 
 	// CreateSystemMenu 系统菜单权限
 	// CreateSystemMenu 系统菜单权限

+ 164 - 4
module/backend/pasture_service.go

@@ -12,7 +12,7 @@ import (
 )
 )
 
 
 var (
 var (
-	CattleCategoryMap = map[operationPb.CattleCategoryParent_Kind]string{
+	CattleParentCategoryMap = map[operationPb.CattleCategoryParent_Kind]string{
 		operationPb.CattleCategoryParent_LACTATION_CAW: "泌乳牛",
 		operationPb.CattleCategoryParent_LACTATION_CAW: "泌乳牛",
 		operationPb.CattleCategoryParent_FATTEN_CAW:    "育肥牛",
 		operationPb.CattleCategoryParent_FATTEN_CAW:    "育肥牛",
 		operationPb.CattleCategoryParent_RESERVE_CAW:   "后备牛",
 		operationPb.CattleCategoryParent_RESERVE_CAW:   "后备牛",
@@ -20,14 +20,42 @@ var (
 		operationPb.CattleCategoryParent_PERINATAL_CAW: "围产牛",
 		operationPb.CattleCategoryParent_PERINATAL_CAW: "围产牛",
 		operationPb.CattleCategoryParent_OTHER_CAW:     "其他",
 		operationPb.CattleCategoryParent_OTHER_CAW:     "其他",
 	}
 	}
-	ForageCategoryMap = map[operationPb.ForageCategoryParent_Kind]string{
+	ForageParentCategoryMap = map[operationPb.ForageCategoryParent_Kind]string{
 		operationPb.ForageCategoryParent_ROUGHAGE:                       "粗料",
 		operationPb.ForageCategoryParent_ROUGHAGE:                       "粗料",
 		operationPb.ForageCategoryParent_CONCENTRATE:                    "精料",
 		operationPb.ForageCategoryParent_CONCENTRATE:                    "精料",
 		operationPb.ForageCategoryParent_HALF_ROUGHAGE_HALF_CONCENTRATE: "粗料精料各半",
 		operationPb.ForageCategoryParent_HALF_ROUGHAGE_HALF_CONCENTRATE: "粗料精料各半",
 		operationPb.ForageCategoryParent_OTHER:                          "其他",
 		operationPb.ForageCategoryParent_OTHER:                          "其他",
 	}
 	}
+	ForageSourceMap = map[operationPb.ForageSource_Kind]string{
+		operationPb.ForageSource_SYSTEM_BUILT_IN: "系统内置",
+		operationPb.ForageSource_USER_DEFINED:    "用户自定义",
+	}
+	ForagePlanTypeMap = map[operationPb.ForagePlanType_Kind]string{
+		operationPb.ForagePlanType_INVALID:     "无",
+		operationPb.ForagePlanType_FORKLIFT:    "铲车",
+		operationPb.ForagePlanType_CONCENTRATE: "精料",
+	}
+	JumpDelaTypeMap = map[operationPb.JumpDelaType_Kind]string{
+		operationPb.JumpDelaType_INVALID: "禁用",
+		operationPb.JumpDelaType_THREE:   "3秒",
+		operationPb.JumpDelaType_SIX:     "6秒",
+		operationPb.JumpDelaType_NINE:    "9秒",
+	}
+	IsShowMap = map[operationPb.IsShow_Kind]string{
+		operationPb.IsShow_OK: "是",
+		operationPb.IsShow_NO: "否",
+	}
 )
 )
 
 
+type ForageEnumList struct {
+	ForageSource         map[operationPb.ForageSource_Kind]string         `json:"forage_source"`
+	ForagePlanType       map[operationPb.ForagePlanType_Kind]string       `json:"forage_plan_type"`
+	JumpDelaType         map[operationPb.JumpDelaType_Kind]string         `json:"jump_dela_type"`
+	CattleParentCategory map[operationPb.CattleCategoryParent_Kind]string `json:"cattle_parent_category"`
+	ForageParentCategory map[operationPb.ForageCategoryParent_Kind]string `json:"forage_parent_category"`
+	IsShow               map[operationPb.IsShow_Kind]string               `json:"is_show"`
+}
+
 // CreateGroupPasture 创建集团牧场
 // CreateGroupPasture 创建集团牧场
 func (s *StoreEntry) CreateGroupPasture(ctx context.Context, req *operationPb.AddPastureRequest) error {
 func (s *StoreEntry) CreateGroupPasture(ctx context.Context, req *operationPb.AddPastureRequest) error {
 	pastureList := model.NewGroupPasture(req)
 	pastureList := model.NewGroupPasture(req)
@@ -149,7 +177,7 @@ func (s *StoreEntry) IsShowGroupPasture(ctx context.Context, req *operationPb.Is
 
 
 // ParentCattleCategoryList 畜牧类别父类列表
 // ParentCattleCategoryList 畜牧类别父类列表
 func (s *StoreEntry) ParentCattleCategoryList(ctx context.Context) map[operationPb.CattleCategoryParent_Kind]string {
 func (s *StoreEntry) ParentCattleCategoryList(ctx context.Context) map[operationPb.CattleCategoryParent_Kind]string {
-	return CattleCategoryMap
+	return CattleParentCategoryMap
 }
 }
 
 
 // AddCattleCategory 添加畜牧分类
 // AddCattleCategory 添加畜牧分类
@@ -249,7 +277,7 @@ func (s *StoreEntry) SearchCattleCategoryList(ctx context.Context, req *operatio
 
 
 // ParentForageCategoryList 饲料类别父类列表
 // ParentForageCategoryList 饲料类别父类列表
 func (s *StoreEntry) ParentForageCategoryList(ctx context.Context) map[operationPb.ForageCategoryParent_Kind]string {
 func (s *StoreEntry) ParentForageCategoryList(ctx context.Context) map[operationPb.ForageCategoryParent_Kind]string {
-	return ForageCategoryMap
+	return ForageParentCategoryMap
 }
 }
 
 
 // AddForageCategory 添加饲料分类
 // AddForageCategory 添加饲料分类
@@ -346,3 +374,135 @@ func (s *StoreEntry) SearchForageCategoryList(ctx context.Context, req *operatio
 		List:  model.ForageCategorySlice(forageCategory).ToPB(),
 		List:  model.ForageCategorySlice(forageCategory).ToPB(),
 	}, nil
 	}, nil
 }
 }
+
+// CreateForage 创建饲料
+func (s *StoreEntry) CreateForage(ctx context.Context, req *operationPb.AddForageRequest) error {
+	forage := model.NewForage(req)
+	if err := s.DB.Create(forage).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+// EditForage 编辑饲料
+func (s *StoreEntry) EditForage(ctx context.Context, req *operationPb.AddForageRequest) error {
+	forage := model.Forage{Id: req.Id}
+	if err := s.DB.Where("is_delete = ?", operationPb.IsShow_OK).First(forage).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return xerr.Custom("该数据不存在")
+		}
+		return xerr.WithStack(err)
+	}
+
+	updateData := &model.Forage{
+		Name:               req.Name,
+		CategoryId:         req.CategoryId,
+		UniqueEncode:       req.UniqueEncode,
+		ForageSourceId:     req.ForageSourceId,
+		PlanTypeId:         req.PlanTypeId,
+		SmallMaterialScale: req.SmallMaterialScale,
+		AllowError:         req.AllowError,
+		PackageWeight:      req.PackageWeight,
+		Price:              req.Price,
+		JumpWeight:         req.JumpWeight,
+		JumpDelay:          req.JumpDelay,
+		ConfirmStart:       req.ConfirmStart,
+		RelayLocations:     req.RelayLocations,
+		Jmp:                req.Jmp,
+		Backup1:            req.Backup1,
+		Backup2:            req.Backup2,
+		Backup3:            req.Backup3,
+	}
+
+	if err := s.DB.Model(new(model.Forage)).Omit("is_show", "is_delete").Where("id = ?", req.Id).
+		Updates(updateData).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+
+	return nil
+}
+
+func (s *StoreEntry) SearchForageList(ctx context.Context, req *operationPb.SearchForageListRequest) (*operationPb.SearchForageListResponse, error) {
+	forage := make([]*model.Forage, 0)
+	var count int64 = 0
+
+	pref := s.DB.Model(new(model.Forage)).Where("is_delete = ?", operationPb.IsShow_OK)
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if req.CategoryId != "" {
+		pref.Where("category_id = ?", req.CategoryId)
+	}
+
+	if req.ForageSourceId > 0 {
+		pref.Where("forage_source_id = ?", req.ForageSourceId)
+	}
+
+	if req.IsShow > 0 {
+		pref.Where("is_show = ?", req.IsShow)
+	}
+
+	if req.AllowError > 0 {
+		pref.Where("allow_error = ?", req.AllowError)
+	}
+
+	if req.AllowError > 0 {
+		pref.Where("allow_error = ?", req.AllowError)
+	}
+
+	if req.JumpWeight > 0 {
+		pref.Where("jump_weight = ?", req.JumpWeight)
+	}
+
+	if req.JumpDelay > 0 {
+		pref.Where("jump_delay = ?", req.JumpDelay)
+	}
+
+	if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
+		Find(&forage).Debug().Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &operationPb.SearchForageListResponse{
+		Page:  req.Pagination.Page,
+		Total: int32(count),
+		List:  model.ForageSlice(forage).ToPB(),
+	}, nil
+}
+
+func (s *StoreEntry) ForageEnumList(ctx context.Context) *ForageEnumList {
+	return &ForageEnumList{
+		JumpDelaType:         JumpDelaTypeMap,
+		ForageSource:         ForageSourceMap,
+		ForagePlanType:       ForagePlanTypeMap,
+		CattleParentCategory: CattleParentCategoryMap,
+		ForageParentCategory: ForageParentCategoryMap,
+		IsShow:               IsShowMap,
+	}
+}
+
+func (s *StoreEntry) DeleteForageList(ctx context.Context, ids []int64) error {
+	if len(ids) == 0 {
+		return xerr.Custom("参数错误")
+	}
+	if err := s.DB.Where("id IN ?", ids).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) IsShowForage(ctx context.Context, req *operationPb.IsShowForage) error {
+	forage := &model.Forage{Id: req.ForageId}
+	if err := s.DB.First(forage).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return xerr.Custom("该数据不存在")
+		}
+		return xerr.WithStack(err)
+	}
+
+	if err := s.DB.Model(new(model.Forage)).Where("id = ?", req.ForageId).Update("is_show", req.IsShow).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}

+ 33 - 0
module/backend/system_permissions.go

@@ -18,6 +18,39 @@ type SystemAllPermissionsList struct {
 	MobileList  []*model.SystemMobilePermissions
 	MobileList  []*model.SystemMobilePermissions
 }
 }
 
 
+func (s *StoreEntry) AllPermissionsListToRolePermissions(req *SystemAllPermissionsList) *operationPb.RolePermissionsList {
+	res := &operationPb.RolePermissionsList{
+		MobileList:  make([]int64, 0),
+		MenuList:    make([]int64, 0),
+		PastureList: make([]int64, 0),
+	}
+	wg := sync.WaitGroup{}
+	wg.Add(3)
+	go func() {
+		for _, v := range req.MobileList {
+			res.MobileList = append(res.MobileList, v.MobileId)
+		}
+		wg.Done()
+	}()
+
+	go func() {
+		for _, v := range req.MenuList {
+			res.MenuList = append(res.MenuList, v.MenuId)
+		}
+		wg.Done()
+	}()
+
+	go func() {
+		for _, v := range req.PastureList {
+			res.PastureList = append(res.PastureList, v.PastureId)
+		}
+		wg.Done()
+	}()
+
+	wg.Wait()
+	return res
+}
+
 // SystemUserMenuPermissionsUnDuplicate 角色权限去重
 // SystemUserMenuPermissionsUnDuplicate 角色权限去重
 func (s *SystemAllPermissionsList) SystemUserMenuPermissionsUnDuplicate() {
 func (s *SystemAllPermissionsList) SystemUserMenuPermissionsUnDuplicate() {
 	newMenuList := make([]*model.SystemMenuPermissions, 0)
 	newMenuList := make([]*model.SystemMenuPermissions, 0)

+ 26 - 0
module/backend/system_service.go

@@ -342,6 +342,32 @@ func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.
 	}, nil
 	}, nil
 }
 }
 
 
+// GetRolePermissions 查询系统角色权限
+func (s *StoreEntry) GetRolePermissions(ctx context.Context, roleId int64) (*operationPb.RolePermissionsList, error) {
+	systemRole := &model.SystemRole{
+		Id: roleId,
+	}
+	if err := s.DB.First(systemRole).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.Custom("该数据不存在")
+		}
+		return nil, xerr.WithStack(err)
+	}
+
+	systemAllPermissionsList := &SystemAllPermissionsList{
+		PastureList: make([]*model.SystemGroupPasturePermissions, 0),
+		MenuList:    make([]*model.SystemMenuPermissions, 0),
+		MobileList:  make([]*model.SystemMobilePermissions, 0),
+	}
+
+	item := s.GetSystemAllPermissionsList(ctx, systemRole.Id)
+	systemAllPermissionsList.PastureList = append(systemAllPermissionsList.PastureList, item.PastureList...)
+	systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)
+	systemAllPermissionsList.MobileList = append(systemAllPermissionsList.MobileList, item.MobileList...)
+
+	return s.AllPermissionsListToRolePermissions(systemAllPermissionsList), nil
+}
+
 // CreateSystemMenu 添加系统菜单权限
 // CreateSystemMenu 添加系统菜单权限
 func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
 func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
 	systemMenu := model.NewSystemMenu(req)
 	systemMenu := model.NewSystemMenu(req)

+ 333 - 10
proto/go/backend/operation/enum.pb.go

@@ -185,6 +185,156 @@ func (ForageCategoryParent_Kind) EnumDescriptor() ([]byte, []int) {
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{2, 0}
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{2, 0}
 }
 }
 
 
+type ForageSource_Kind int32
+
+const (
+	ForageSource_INVALID         ForageSource_Kind = 0 // 无效
+	ForageSource_SYSTEM_BUILT_IN ForageSource_Kind = 1 // 系统内置
+	ForageSource_USER_DEFINED    ForageSource_Kind = 2 // 用户自定义
+)
+
+// Enum value maps for ForageSource_Kind.
+var (
+	ForageSource_Kind_name = map[int32]string{
+		0: "INVALID",
+		1: "SYSTEM_BUILT_IN",
+		2: "USER_DEFINED",
+	}
+	ForageSource_Kind_value = map[string]int32{
+		"INVALID":         0,
+		"SYSTEM_BUILT_IN": 1,
+		"USER_DEFINED":    2,
+	}
+)
+
+func (x ForageSource_Kind) Enum() *ForageSource_Kind {
+	p := new(ForageSource_Kind)
+	*p = x
+	return p
+}
+
+func (x ForageSource_Kind) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ForageSource_Kind) Descriptor() protoreflect.EnumDescriptor {
+	return file_backend_operation_enum_proto_enumTypes[3].Descriptor()
+}
+
+func (ForageSource_Kind) Type() protoreflect.EnumType {
+	return &file_backend_operation_enum_proto_enumTypes[3]
+}
+
+func (x ForageSource_Kind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ForageSource_Kind.Descriptor instead.
+func (ForageSource_Kind) EnumDescriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{3, 0}
+}
+
+type JumpDelaType_Kind int32
+
+const (
+	JumpDelaType_INVALID JumpDelaType_Kind = 0 // 禁用
+	JumpDelaType_THREE   JumpDelaType_Kind = 1 // 3秒
+	JumpDelaType_SIX     JumpDelaType_Kind = 2 // 6秒
+	JumpDelaType_NINE    JumpDelaType_Kind = 3 // 9秒
+)
+
+// Enum value maps for JumpDelaType_Kind.
+var (
+	JumpDelaType_Kind_name = map[int32]string{
+		0: "INVALID",
+		1: "THREE",
+		2: "SIX",
+		3: "NINE",
+	}
+	JumpDelaType_Kind_value = map[string]int32{
+		"INVALID": 0,
+		"THREE":   1,
+		"SIX":     2,
+		"NINE":    3,
+	}
+)
+
+func (x JumpDelaType_Kind) Enum() *JumpDelaType_Kind {
+	p := new(JumpDelaType_Kind)
+	*p = x
+	return p
+}
+
+func (x JumpDelaType_Kind) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (JumpDelaType_Kind) Descriptor() protoreflect.EnumDescriptor {
+	return file_backend_operation_enum_proto_enumTypes[4].Descriptor()
+}
+
+func (JumpDelaType_Kind) Type() protoreflect.EnumType {
+	return &file_backend_operation_enum_proto_enumTypes[4]
+}
+
+func (x JumpDelaType_Kind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use JumpDelaType_Kind.Descriptor instead.
+func (JumpDelaType_Kind) EnumDescriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{4, 0}
+}
+
+type ForagePlanType_Kind int32
+
+const (
+	ForagePlanType_INVALID     ForagePlanType_Kind = 0 // 无
+	ForagePlanType_FORKLIFT    ForagePlanType_Kind = 1 // 铲车
+	ForagePlanType_CONCENTRATE ForagePlanType_Kind = 2 // 精料
+)
+
+// Enum value maps for ForagePlanType_Kind.
+var (
+	ForagePlanType_Kind_name = map[int32]string{
+		0: "INVALID",
+		1: "FORKLIFT",
+		2: "CONCENTRATE",
+	}
+	ForagePlanType_Kind_value = map[string]int32{
+		"INVALID":     0,
+		"FORKLIFT":    1,
+		"CONCENTRATE": 2,
+	}
+)
+
+func (x ForagePlanType_Kind) Enum() *ForagePlanType_Kind {
+	p := new(ForagePlanType_Kind)
+	*p = x
+	return p
+}
+
+func (x ForagePlanType_Kind) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ForagePlanType_Kind) Descriptor() protoreflect.EnumDescriptor {
+	return file_backend_operation_enum_proto_enumTypes[5].Descriptor()
+}
+
+func (ForagePlanType_Kind) Type() protoreflect.EnumType {
+	return &file_backend_operation_enum_proto_enumTypes[5]
+}
+
+func (x ForagePlanType_Kind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ForagePlanType_Kind.Descriptor instead.
+func (ForagePlanType_Kind) EnumDescriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{5, 0}
+}
+
 // 字段类型
 // 字段类型
 type IsShow struct {
 type IsShow struct {
 	state         protoimpl.MessageState
 	state         protoimpl.MessageState
@@ -262,6 +412,7 @@ func (*CattleCategoryParent) Descriptor() ([]byte, []int) {
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{1}
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{1}
 }
 }
 
 
+// 饲料类别
 type ForageCategoryParent struct {
 type ForageCategoryParent struct {
 	state         protoimpl.MessageState
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	sizeCache     protoimpl.SizeCache
@@ -300,6 +451,123 @@ func (*ForageCategoryParent) Descriptor() ([]byte, []int) {
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{2}
 	return file_backend_operation_enum_proto_rawDescGZIP(), []int{2}
 }
 }
 
 
+// 饲料来源
+type ForageSource struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ForageSource) Reset() {
+	*x = ForageSource{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_enum_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ForageSource) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ForageSource) ProtoMessage() {}
+
+func (x *ForageSource) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_enum_proto_msgTypes[3]
+	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 ForageSource.ProtoReflect.Descriptor instead.
+func (*ForageSource) Descriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{3}
+}
+
+// 跳转延迟
+type JumpDelaType struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *JumpDelaType) Reset() {
+	*x = JumpDelaType{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_enum_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *JumpDelaType) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*JumpDelaType) ProtoMessage() {}
+
+func (x *JumpDelaType) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_enum_proto_msgTypes[4]
+	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 JumpDelaType.ProtoReflect.Descriptor instead.
+func (*JumpDelaType) Descriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{4}
+}
+
+// 计划类型
+type ForagePlanType struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ForagePlanType) Reset() {
+	*x = ForagePlanType{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_enum_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ForagePlanType) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ForagePlanType) ProtoMessage() {}
+
+func (x *ForagePlanType) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_enum_proto_msgTypes[5]
+	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 ForagePlanType.ProtoReflect.Descriptor instead.
+func (*ForagePlanType) Descriptor() ([]byte, []int) {
+	return file_backend_operation_enum_proto_rawDescGZIP(), []int{5}
+}
+
 var File_backend_operation_enum_proto protoreflect.FileDescriptor
 var File_backend_operation_enum_proto protoreflect.FileDescriptor
 
 
 var file_backend_operation_enum_proto_rawDesc = []byte{
 var file_backend_operation_enum_proto_rawDesc = []byte{
@@ -325,9 +593,22 @@ var file_backend_operation_enum_proto_rawDesc = []byte{
 	0x43, 0x4f, 0x4e, 0x43, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x22, 0x0a,
 	0x43, 0x4f, 0x4e, 0x43, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x22, 0x0a,
 	0x1e, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x52, 0x4f, 0x55, 0x47, 0x48, 0x41, 0x47, 0x45, 0x5f, 0x48,
 	0x1e, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x52, 0x4f, 0x55, 0x47, 0x48, 0x41, 0x47, 0x45, 0x5f, 0x48,
 	0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4f, 0x4e, 0x43, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x54, 0x45, 0x10,
 	0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4f, 0x4e, 0x43, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x54, 0x45, 0x10,
-	0x03, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x04, 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,
+	0x03, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x04, 0x22, 0x4a, 0x0a, 0x0c,
+	0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x0a, 0x04,
+	0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10,
+	0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x42, 0x55, 0x49, 0x4c,
+	0x54, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44,
+	0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x22, 0x41, 0x0a, 0x0c, 0x4a, 0x75, 0x6d, 0x70,
+	0x44, 0x65, 0x6c, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x31, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64,
+	0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a,
+	0x05, 0x54, 0x48, 0x52, 0x45, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x49, 0x58, 0x10,
+	0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x49, 0x4e, 0x45, 0x10, 0x03, 0x22, 0x44, 0x0a, 0x0e, 0x46,
+	0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x32, 0x0a,
+	0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
+	0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x4b, 0x4c, 0x49, 0x46, 0x54, 0x10, 0x01,
+	0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4e, 0x43, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x54, 0x45, 0x10,
+	0x02, 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 (
 var (
@@ -342,15 +623,21 @@ func file_backend_operation_enum_proto_rawDescGZIP() []byte {
 	return file_backend_operation_enum_proto_rawDescData
 	return file_backend_operation_enum_proto_rawDescData
 }
 }
 
 
-var file_backend_operation_enum_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
-var file_backend_operation_enum_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_backend_operation_enum_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
+var file_backend_operation_enum_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
 var file_backend_operation_enum_proto_goTypes = []interface{}{
 var file_backend_operation_enum_proto_goTypes = []interface{}{
 	(IsShow_Kind)(0),               // 0: backend.operation.IsShow.Kind
 	(IsShow_Kind)(0),               // 0: backend.operation.IsShow.Kind
 	(CattleCategoryParent_Kind)(0), // 1: backend.operation.CattleCategoryParent.Kind
 	(CattleCategoryParent_Kind)(0), // 1: backend.operation.CattleCategoryParent.Kind
 	(ForageCategoryParent_Kind)(0), // 2: backend.operation.ForageCategoryParent.Kind
 	(ForageCategoryParent_Kind)(0), // 2: backend.operation.ForageCategoryParent.Kind
-	(*IsShow)(nil),                 // 3: backend.operation.IsShow
-	(*CattleCategoryParent)(nil),   // 4: backend.operation.CattleCategoryParent
-	(*ForageCategoryParent)(nil),   // 5: backend.operation.ForageCategoryParent
+	(ForageSource_Kind)(0),         // 3: backend.operation.ForageSource.Kind
+	(JumpDelaType_Kind)(0),         // 4: backend.operation.JumpDelaType.Kind
+	(ForagePlanType_Kind)(0),       // 5: backend.operation.ForagePlanType.Kind
+	(*IsShow)(nil),                 // 6: backend.operation.IsShow
+	(*CattleCategoryParent)(nil),   // 7: backend.operation.CattleCategoryParent
+	(*ForageCategoryParent)(nil),   // 8: backend.operation.ForageCategoryParent
+	(*ForageSource)(nil),           // 9: backend.operation.ForageSource
+	(*JumpDelaType)(nil),           // 10: backend.operation.JumpDelaType
+	(*ForagePlanType)(nil),         // 11: backend.operation.ForagePlanType
 }
 }
 var file_backend_operation_enum_proto_depIdxs = []int32{
 var file_backend_operation_enum_proto_depIdxs = []int32{
 	0, // [0:0] is the sub-list for method output_type
 	0, // [0:0] is the sub-list for method output_type
@@ -402,14 +689,50 @@ func file_backend_operation_enum_proto_init() {
 				return nil
 				return nil
 			}
 			}
 		}
 		}
+		file_backend_operation_enum_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ForageSource); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_enum_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*JumpDelaType); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_enum_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ForagePlanType); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	}
 	type x struct{}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_backend_operation_enum_proto_rawDesc,
 			RawDescriptor: file_backend_operation_enum_proto_rawDesc,
-			NumEnums:      3,
-			NumMessages:   3,
+			NumEnums:      6,
+			NumMessages:   6,
 			NumExtensions: 0,
 			NumExtensions: 0,
 			NumServices:   0,
 			NumServices:   0,
 		},
 		},

+ 647 - 26
proto/go/backend/operation/pasture.pb.go

@@ -982,6 +982,460 @@ func (x *SearchForageCategoryResponse) GetList() []*AddForageCategoryRequest {
 	return nil
 	return nil
 }
 }
 
 
+// 饲料列表
+type AddForageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id                 int64               `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name               string              `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`                                                                                       // 饲料名称
+	CategoryId         int64               `protobuf:"varint,3,opt,name=category_id,json=categoryId,proto3" json:"category_id,omitempty"`                                                        // 饲料分类id
+	CategoryName       string              `protobuf:"bytes,4,opt,name=category_name,json=categoryName,proto3" json:"category_name,omitempty"`                                                   // 饲料分类名称
+	MaterialType       int64               `protobuf:"varint,5,opt,name=material_type,json=materialType,proto3" json:"material_type,omitempty"`                                                  // 物料类型
+	UniqueEncode       string              `protobuf:"bytes,7,opt,name=unique_encode,json=uniqueEncode,proto3" json:"unique_encode,omitempty"`                                                   // 唯一编码
+	ForageSourceId     ForageSource_Kind   `protobuf:"varint,8,opt,name=forage_source_id,json=forageSourceId,proto3,enum=backend.operation.ForageSource_Kind" json:"forage_source_id,omitempty"` // 饲料来源
+	PlanTypeId         ForagePlanType_Kind `protobuf:"varint,9,opt,name=plan_type_id,json=planTypeId,proto3,enum=backend.operation.ForagePlanType_Kind" json:"plan_type_id,omitempty"`           // 计划类型
+	SmallMaterialScale string              `protobuf:"bytes,10,opt,name=small_material_scale,json=smallMaterialScale,proto3" json:"small_material_scale,omitempty"`                              // 小料称
+	AllowError         int64               `protobuf:"varint,11,opt,name=allow_error,json=allowError,proto3" json:"allow_error,omitempty"`                                                       // 允许误差 (单位kg)
+	PackageWeight      int64               `protobuf:"varint,12,opt,name=package_weight,json=packageWeight,proto3" json:"package_weight,omitempty"`                                              // 包装重量 (单位kg)
+	Price              int64               `protobuf:"varint,13,opt,name=price,proto3" json:"price,omitempty"`                                                                                   // 单价(单位分)
+	JumpWeight         int64               `protobuf:"varint,14,opt,name=jump_weight,json=jumpWeight,proto3" json:"jump_weight,omitempty"`                                                       // 跳转重量域(单位kg)
+	JumpDelay          JumpDelaType_Kind   `protobuf:"varint,15,opt,name=jump_delay,json=jumpDelay,proto3,enum=backend.operation.JumpDelaType_Kind" json:"jump_delay,omitempty"`                 // 跳转延迟
+	ConfirmStart       IsShow_Kind         `protobuf:"varint,16,opt,name=confirm_start,json=confirmStart,proto3,enum=backend.operation.IsShow_Kind" json:"confirm_start,omitempty"`              // 确认开始
+	RelayLocations     int64               `protobuf:"varint,17,opt,name=relay_locations,json=relayLocations,proto3" json:"relay_locations,omitempty"`                                           // 继电器位置
+	Jmp                IsShow_Kind         `protobuf:"varint,18,opt,name=jmp,proto3,enum=backend.operation.IsShow_Kind" json:"jmp,omitempty"`                                                    // 无上域
+	Backup1            string              `protobuf:"bytes,19,opt,name=backup1,proto3" json:"backup1,omitempty"`                                                                                // 备用字段1
+	Backup2            string              `protobuf:"bytes,20,opt,name=backup2,proto3" json:"backup2,omitempty"`                                                                                // 备用字段2
+	Backup3            string              `protobuf:"bytes,21,opt,name=backup3,proto3" json:"backup3,omitempty"`                                                                                // 备用字段3
+	CreatedAt          int64               `protobuf:"varint,22,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`                                                          // 创建时间
+	CreatedAtFormat    string              `protobuf:"bytes,23,opt,name=created_at_format,json=createdAtFormat,proto3" json:"created_at_format,omitempty"`                                       // 创建时间格式化
+	IsShow             IsShow_Kind         `protobuf:"varint,24,opt,name=is_show,json=isShow,proto3,enum=backend.operation.IsShow_Kind" json:"is_show,omitempty"`                                // 是否启用
+}
+
+func (x *AddForageRequest) Reset() {
+	*x = AddForageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_pasture_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddForageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddForageRequest) ProtoMessage() {}
+
+func (x *AddForageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_pasture_proto_msgTypes[13]
+	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 AddForageRequest.ProtoReflect.Descriptor instead.
+func (*AddForageRequest) Descriptor() ([]byte, []int) {
+	return file_backend_operation_pasture_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *AddForageRequest) GetId() int64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetCategoryId() int64 {
+	if x != nil {
+		return x.CategoryId
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetCategoryName() string {
+	if x != nil {
+		return x.CategoryName
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetMaterialType() int64 {
+	if x != nil {
+		return x.MaterialType
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetUniqueEncode() string {
+	if x != nil {
+		return x.UniqueEncode
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetForageSourceId() ForageSource_Kind {
+	if x != nil {
+		return x.ForageSourceId
+	}
+	return ForageSource_INVALID
+}
+
+func (x *AddForageRequest) GetPlanTypeId() ForagePlanType_Kind {
+	if x != nil {
+		return x.PlanTypeId
+	}
+	return ForagePlanType_INVALID
+}
+
+func (x *AddForageRequest) GetSmallMaterialScale() string {
+	if x != nil {
+		return x.SmallMaterialScale
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetAllowError() int64 {
+	if x != nil {
+		return x.AllowError
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetPackageWeight() int64 {
+	if x != nil {
+		return x.PackageWeight
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetPrice() int64 {
+	if x != nil {
+		return x.Price
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetJumpWeight() int64 {
+	if x != nil {
+		return x.JumpWeight
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetJumpDelay() JumpDelaType_Kind {
+	if x != nil {
+		return x.JumpDelay
+	}
+	return JumpDelaType_INVALID
+}
+
+func (x *AddForageRequest) GetConfirmStart() IsShow_Kind {
+	if x != nil {
+		return x.ConfirmStart
+	}
+	return IsShow_INVALID
+}
+
+func (x *AddForageRequest) GetRelayLocations() int64 {
+	if x != nil {
+		return x.RelayLocations
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetJmp() IsShow_Kind {
+	if x != nil {
+		return x.Jmp
+	}
+	return IsShow_INVALID
+}
+
+func (x *AddForageRequest) GetBackup1() string {
+	if x != nil {
+		return x.Backup1
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetBackup2() string {
+	if x != nil {
+		return x.Backup2
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetBackup3() string {
+	if x != nil {
+		return x.Backup3
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetCreatedAt() int64 {
+	if x != nil {
+		return x.CreatedAt
+	}
+	return 0
+}
+
+func (x *AddForageRequest) GetCreatedAtFormat() string {
+	if x != nil {
+		return x.CreatedAtFormat
+	}
+	return ""
+}
+
+func (x *AddForageRequest) GetIsShow() IsShow_Kind {
+	if x != nil {
+		return x.IsShow
+	}
+	return IsShow_INVALID
+}
+
+type SearchForageListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name           string            `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`                                                                      // 饲料名称
+	CategoryId     string            `protobuf:"bytes,2,opt,name=category_id,json=categoryId,proto3" json:"category_id,omitempty"`                                        // 饲料分类id
+	ForageSourceId int64             `protobuf:"varint,3,opt,name=forage_source_id,json=forageSourceId,proto3" json:"forage_source_id,omitempty"`                         // 饲料来源
+	IsShow         IsShow_Kind       `protobuf:"varint,4,opt,name=is_show,json=isShow,proto3,enum=backend.operation.IsShow_Kind" json:"is_show,omitempty"`                // 是否启用
+	AllowError     int64             `protobuf:"varint,5,opt,name=allow_error,json=allowError,proto3" json:"allow_error,omitempty"`                                       // 允许误差
+	JumpWeight     int64             `protobuf:"varint,6,opt,name=jump_weight,json=jumpWeight,proto3" json:"jump_weight,omitempty"`                                       // 跳转重量域
+	JumpDelay      JumpDelaType_Kind `protobuf:"varint,7,opt,name=jump_delay,json=jumpDelay,proto3,enum=backend.operation.JumpDelaType_Kind" json:"jump_delay,omitempty"` // 跳转延迟
+	Pagination     *PaginationModel  `protobuf:"bytes,8,opt,name=pagination,proto3" json:"pagination,omitempty"`                                                          // 分页
+}
+
+func (x *SearchForageListRequest) Reset() {
+	*x = SearchForageListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_pasture_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SearchForageListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchForageListRequest) ProtoMessage() {}
+
+func (x *SearchForageListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_pasture_proto_msgTypes[14]
+	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 SearchForageListRequest.ProtoReflect.Descriptor instead.
+func (*SearchForageListRequest) Descriptor() ([]byte, []int) {
+	return file_backend_operation_pasture_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *SearchForageListRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SearchForageListRequest) GetCategoryId() string {
+	if x != nil {
+		return x.CategoryId
+	}
+	return ""
+}
+
+func (x *SearchForageListRequest) GetForageSourceId() int64 {
+	if x != nil {
+		return x.ForageSourceId
+	}
+	return 0
+}
+
+func (x *SearchForageListRequest) GetIsShow() IsShow_Kind {
+	if x != nil {
+		return x.IsShow
+	}
+	return IsShow_INVALID
+}
+
+func (x *SearchForageListRequest) GetAllowError() int64 {
+	if x != nil {
+		return x.AllowError
+	}
+	return 0
+}
+
+func (x *SearchForageListRequest) GetJumpWeight() int64 {
+	if x != nil {
+		return x.JumpWeight
+	}
+	return 0
+}
+
+func (x *SearchForageListRequest) GetJumpDelay() JumpDelaType_Kind {
+	if x != nil {
+		return x.JumpDelay
+	}
+	return JumpDelaType_INVALID
+}
+
+func (x *SearchForageListRequest) GetPagination() *PaginationModel {
+	if x != nil {
+		return x.Pagination
+	}
+	return nil
+}
+
+type SearchForageListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Page     int32               `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"`
+	PageSize int32               `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	Total    int32               `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
+	List     []*AddForageRequest `protobuf:"bytes,4,rep,name=list,proto3" json:"list,omitempty"`
+}
+
+func (x *SearchForageListResponse) Reset() {
+	*x = SearchForageListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_pasture_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SearchForageListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchForageListResponse) ProtoMessage() {}
+
+func (x *SearchForageListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_pasture_proto_msgTypes[15]
+	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 SearchForageListResponse.ProtoReflect.Descriptor instead.
+func (*SearchForageListResponse) Descriptor() ([]byte, []int) {
+	return file_backend_operation_pasture_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *SearchForageListResponse) GetPage() int32 {
+	if x != nil {
+		return x.Page
+	}
+	return 0
+}
+
+func (x *SearchForageListResponse) GetPageSize() int32 {
+	if x != nil {
+		return x.PageSize
+	}
+	return 0
+}
+
+func (x *SearchForageListResponse) GetTotal() int32 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+func (x *SearchForageListResponse) GetList() []*AddForageRequest {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+// 是否启用
+type IsShowForage struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ForageId int64       `protobuf:"varint,1,opt,name=forage_id,json=forageId,proto3" json:"forage_id,omitempty"`
+	IsShow   IsShow_Kind `protobuf:"varint,2,opt,name=is_show,json=isShow,proto3,enum=backend.operation.IsShow_Kind" json:"is_show,omitempty"`
+}
+
+func (x *IsShowForage) Reset() {
+	*x = IsShowForage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_pasture_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IsShowForage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IsShowForage) ProtoMessage() {}
+
+func (x *IsShowForage) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_pasture_proto_msgTypes[16]
+	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 IsShowForage.ProtoReflect.Descriptor instead.
+func (*IsShowForage) Descriptor() ([]byte, []int) {
+	return file_backend_operation_pasture_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *IsShowForage) GetForageId() int64 {
+	if x != nil {
+		return x.ForageId
+	}
+	return 0
+}
+
+func (x *IsShowForage) GetIsShow() IsShow_Kind {
+	if x != nil {
+		return x.IsShow
+	}
+	return IsShow_INVALID
+}
+
 var File_backend_operation_pasture_proto protoreflect.FileDescriptor
 var File_backend_operation_pasture_proto protoreflect.FileDescriptor
 
 
 var file_backend_operation_pasture_proto_rawDesc = []byte{
 var file_backend_operation_pasture_proto_rawDesc = []byte{
@@ -1148,8 +1602,109 @@ var file_backend_operation_pasture_proto_rawDesc = []byte{
 	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
 	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
 	0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, 0x74, 0x65,
 	0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, 0x74, 0x65,
 	0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73,
 	0x67, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73,
-	0x74, 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,
+	0x74, 0x22, 0xc8, 0x07, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61,
+	0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63,
+	0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70,
+	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
+	0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x6e,
+	0x69, 0x71, 0x75, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x66, 0x6f,
+	0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08,
+	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, 0x0e, 0x66, 0x6f, 0x72, 0x61,
+	0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0c, 0x70, 0x6c,
+	0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 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, 0x0a, 0x70, 0x6c, 0x61, 0x6e, 0x54, 0x79,
+	0x70, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x61,
+	0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x12, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
+	0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x6c, 0x6c,
+	0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x63, 0x6b, 0x61,
+	0x67, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14,
+	0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x70,
+	0x72, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x77, 0x65, 0x69,
+	0x67, 0x68, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6a, 0x75, 0x6d, 0x70, 0x57,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x43, 0x0a, 0x0a, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x64, 0x65,
+	0x6c, 0x61, 0x79, 0x18, 0x0f, 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,
+	0x09, 0x6a, 0x75, 0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 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, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12,
+	0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x4c,
+	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x03, 0x6a, 0x6d, 0x70, 0x18,
+	0x12, 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, 0x03, 0x6a, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61,
+	0x63, 0x6b, 0x75, 0x70, 0x31, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x63,
+	0x6b, 0x75, 0x70, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x32, 0x18,
+	0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x32, 0x12, 0x18,
+	0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x33, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x33, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x17, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x46, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x18,
+	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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x22, 0xfc, 0x02, 0x0a,
+	0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
+	0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x28, 0x0a,
+	0x10, 0x66, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68,
+	0x6f, 0x77, 0x18, 0x04, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77,
+	0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f,
+	0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6a, 0x75, 0x6d, 0x70, 0x57, 0x65, 0x69, 0x67,
+	0x68, 0x74, 0x12, 0x43, 0x0a, 0x0a, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79,
+	0x18, 0x07, 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, 0x09, 0x6a, 0x75,
+	0x6d, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 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, 0x9a, 0x01, 0x0a, 0x18,
+	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09,
+	0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74,
+	0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12,
+	0x37, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e,
+	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x64, 0x0a, 0x0c, 0x49, 0x73, 0x53, 0x68,
+	0x6f, 0x77, 0x46, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x61,
+	0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x6f, 0x72,
+	0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77,
+	0x18, 0x02, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 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 (
 var (
@@ -1164,7 +1719,7 @@ func file_backend_operation_pasture_proto_rawDescGZIP() []byte {
 	return file_backend_operation_pasture_proto_rawDescData
 	return file_backend_operation_pasture_proto_rawDescData
 }
 }
 
 
-var file_backend_operation_pasture_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
+var file_backend_operation_pasture_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
 var file_backend_operation_pasture_proto_goTypes = []interface{}{
 var file_backend_operation_pasture_proto_goTypes = []interface{}{
 	(*AddPastureRequest)(nil),            // 0: backend.operation.AddPastureRequest
 	(*AddPastureRequest)(nil),            // 0: backend.operation.AddPastureRequest
 	(*SearchPastureRequest)(nil),         // 1: backend.operation.SearchPastureRequest
 	(*SearchPastureRequest)(nil),         // 1: backend.operation.SearchPastureRequest
@@ -1179,33 +1734,51 @@ var file_backend_operation_pasture_proto_goTypes = []interface{}{
 	(*IsShowForageCategory)(nil),         // 10: backend.operation.IsShowForageCategory
 	(*IsShowForageCategory)(nil),         // 10: backend.operation.IsShowForageCategory
 	(*SearchForageCategoryRequest)(nil),  // 11: backend.operation.SearchForageCategoryRequest
 	(*SearchForageCategoryRequest)(nil),  // 11: backend.operation.SearchForageCategoryRequest
 	(*SearchForageCategoryResponse)(nil), // 12: backend.operation.SearchForageCategoryResponse
 	(*SearchForageCategoryResponse)(nil), // 12: backend.operation.SearchForageCategoryResponse
-	(IsShow_Kind)(0),                     // 13: backend.operation.IsShow.Kind
-	(*PaginationModel)(nil),              // 14: backend.operation.PaginationModel
-	(CattleCategoryParent_Kind)(0),       // 15: backend.operation.CattleCategoryParent.Kind
-	(ForageCategoryParent_Kind)(0),       // 16: backend.operation.ForageCategoryParent.Kind
+	(*AddForageRequest)(nil),             // 13: backend.operation.AddForageRequest
+	(*SearchForageListRequest)(nil),      // 14: backend.operation.SearchForageListRequest
+	(*SearchForageListResponse)(nil),     // 15: backend.operation.SearchForageListResponse
+	(*IsShowForage)(nil),                 // 16: backend.operation.IsShowForage
+	(IsShow_Kind)(0),                     // 17: backend.operation.IsShow.Kind
+	(*PaginationModel)(nil),              // 18: backend.operation.PaginationModel
+	(CattleCategoryParent_Kind)(0),       // 19: backend.operation.CattleCategoryParent.Kind
+	(ForageCategoryParent_Kind)(0),       // 20: backend.operation.ForageCategoryParent.Kind
+	(ForageSource_Kind)(0),               // 21: backend.operation.ForageSource.Kind
+	(ForagePlanType_Kind)(0),             // 22: backend.operation.ForagePlanType.Kind
+	(JumpDelaType_Kind)(0),               // 23: backend.operation.JumpDelaType.Kind
 }
 }
 var file_backend_operation_pasture_proto_depIdxs = []int32{
 var file_backend_operation_pasture_proto_depIdxs = []int32{
-	13, // 0: backend.operation.AddPastureRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	14, // 1: backend.operation.SearchPastureRequest.pagination:type_name -> backend.operation.PaginationModel
+	17, // 0: backend.operation.AddPastureRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 1: backend.operation.SearchPastureRequest.pagination:type_name -> backend.operation.PaginationModel
 	0,  // 2: backend.operation.SearchPastureResponse.list:type_name -> backend.operation.AddPastureRequest
 	0,  // 2: backend.operation.SearchPastureResponse.list:type_name -> backend.operation.AddPastureRequest
-	13, // 3: backend.operation.IsShowGroupPasture.is_show:type_name -> backend.operation.IsShow.Kind
-	15, // 4: backend.operation.AddCattleCategoryRequest.parent_id:type_name -> backend.operation.CattleCategoryParent.Kind
-	13, // 5: backend.operation.AddCattleCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	13, // 6: backend.operation.IsShowCattleCategory.is_show:type_name -> backend.operation.IsShow.Kind
-	13, // 7: backend.operation.SearchCattleCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	14, // 8: backend.operation.SearchCattleCategoryRequest.pagination:type_name -> backend.operation.PaginationModel
+	17, // 3: backend.operation.IsShowGroupPasture.is_show:type_name -> backend.operation.IsShow.Kind
+	19, // 4: backend.operation.AddCattleCategoryRequest.parent_id:type_name -> backend.operation.CattleCategoryParent.Kind
+	17, // 5: backend.operation.AddCattleCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 6: backend.operation.IsShowCattleCategory.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 7: backend.operation.SearchCattleCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 8: backend.operation.SearchCattleCategoryRequest.pagination:type_name -> backend.operation.PaginationModel
 	5,  // 9: backend.operation.SearchCattleCategoryResponse.list:type_name -> backend.operation.AddCattleCategoryRequest
 	5,  // 9: backend.operation.SearchCattleCategoryResponse.list:type_name -> backend.operation.AddCattleCategoryRequest
-	16, // 10: backend.operation.AddForageCategoryRequest.parent_id:type_name -> backend.operation.ForageCategoryParent.Kind
-	13, // 11: backend.operation.AddForageCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	13, // 12: backend.operation.IsShowForageCategory.is_show:type_name -> backend.operation.IsShow.Kind
-	13, // 13: backend.operation.SearchForageCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	14, // 14: backend.operation.SearchForageCategoryRequest.pagination:type_name -> backend.operation.PaginationModel
+	20, // 10: backend.operation.AddForageCategoryRequest.parent_id:type_name -> backend.operation.ForageCategoryParent.Kind
+	17, // 11: backend.operation.AddForageCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 12: backend.operation.IsShowForageCategory.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 13: backend.operation.SearchForageCategoryRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 14: backend.operation.SearchForageCategoryRequest.pagination:type_name -> backend.operation.PaginationModel
 	9,  // 15: backend.operation.SearchForageCategoryResponse.list:type_name -> backend.operation.AddForageCategoryRequest
 	9,  // 15: backend.operation.SearchForageCategoryResponse.list:type_name -> backend.operation.AddForageCategoryRequest
-	16, // [16:16] is the sub-list for method output_type
-	16, // [16:16] is the sub-list for method input_type
-	16, // [16:16] is the sub-list for extension type_name
-	16, // [16:16] is the sub-list for extension extendee
-	0,  // [0:16] is the sub-list for field type_name
+	21, // 16: backend.operation.AddForageRequest.forage_source_id:type_name -> backend.operation.ForageSource.Kind
+	22, // 17: backend.operation.AddForageRequest.plan_type_id:type_name -> backend.operation.ForagePlanType.Kind
+	23, // 18: backend.operation.AddForageRequest.jump_delay:type_name -> backend.operation.JumpDelaType.Kind
+	17, // 19: backend.operation.AddForageRequest.confirm_start:type_name -> backend.operation.IsShow.Kind
+	17, // 20: backend.operation.AddForageRequest.jmp:type_name -> backend.operation.IsShow.Kind
+	17, // 21: backend.operation.AddForageRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 22: backend.operation.SearchForageListRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	23, // 23: backend.operation.SearchForageListRequest.jump_delay:type_name -> backend.operation.JumpDelaType.Kind
+	18, // 24: backend.operation.SearchForageListRequest.pagination:type_name -> backend.operation.PaginationModel
+	13, // 25: backend.operation.SearchForageListResponse.list:type_name -> backend.operation.AddForageRequest
+	17, // 26: backend.operation.IsShowForage.is_show:type_name -> backend.operation.IsShow.Kind
+	27, // [27:27] is the sub-list for method output_type
+	27, // [27:27] is the sub-list for method input_type
+	27, // [27:27] is the sub-list for extension type_name
+	27, // [27:27] is the sub-list for extension extendee
+	0,  // [0:27] is the sub-list for field type_name
 }
 }
 
 
 func init() { file_backend_operation_pasture_proto_init() }
 func init() { file_backend_operation_pasture_proto_init() }
@@ -1372,6 +1945,54 @@ func file_backend_operation_pasture_proto_init() {
 				return nil
 				return nil
 			}
 			}
 		}
 		}
+		file_backend_operation_pasture_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddForageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_pasture_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SearchForageListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_pasture_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SearchForageListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_pasture_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IsShowForage); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	}
 	type x struct{}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 	out := protoimpl.TypeBuilder{
@@ -1379,7 +2000,7 @@ func file_backend_operation_pasture_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_backend_operation_pasture_proto_rawDesc,
 			RawDescriptor: file_backend_operation_pasture_proto_rawDesc,
 			NumEnums:      0,
 			NumEnums:      0,
-			NumMessages:   13,
+			NumMessages:   17,
 			NumExtensions: 0,
 			NumExtensions: 0,
 			NumServices:   0,
 			NumServices:   0,
 		},
 		},

+ 309 - 225
proto/go/backend/operation/system.pb.go

@@ -266,6 +266,70 @@ func (x *SearchRoleResponse) GetList() []*AddRoleRequest {
 	return nil
 	return nil
 }
 }
 
 
+// 角色对应权限列表
+type RolePermissionsList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MobileList  []int64 `protobuf:"varint,1,rep,packed,name=mobile_list,json=mobileList,proto3" json:"mobile_list,omitempty"`    // 移动端权限id
+	PastureList []int64 `protobuf:"varint,2,rep,packed,name=pasture_list,json=pastureList,proto3" json:"pasture_list,omitempty"` // 牧场端列表
+	MenuList    []int64 `protobuf:"varint,3,rep,packed,name=menu_list,json=menuList,proto3" json:"menu_list,omitempty"`          // 后端权限列表
+}
+
+func (x *RolePermissionsList) Reset() {
+	*x = RolePermissionsList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_backend_operation_system_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RolePermissionsList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RolePermissionsList) ProtoMessage() {}
+
+func (x *RolePermissionsList) ProtoReflect() protoreflect.Message {
+	mi := &file_backend_operation_system_proto_msgTypes[3]
+	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 RolePermissionsList.ProtoReflect.Descriptor instead.
+func (*RolePermissionsList) Descriptor() ([]byte, []int) {
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *RolePermissionsList) GetMobileList() []int64 {
+	if x != nil {
+		return x.MobileList
+	}
+	return nil
+}
+
+func (x *RolePermissionsList) GetPastureList() []int64 {
+	if x != nil {
+		return x.PastureList
+	}
+	return nil
+}
+
+func (x *RolePermissionsList) GetMenuList() []int64 {
+	if x != nil {
+		return x.MenuList
+	}
+	return nil
+}
+
 // 用户token
 // 用户token
 type SystemToken struct {
 type SystemToken struct {
 	state         protoimpl.MessageState
 	state         protoimpl.MessageState
@@ -278,7 +342,7 @@ type SystemToken struct {
 func (x *SystemToken) Reset() {
 func (x *SystemToken) Reset() {
 	*x = SystemToken{}
 	*x = SystemToken{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[3]
+		mi := &file_backend_operation_system_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -291,7 +355,7 @@ func (x *SystemToken) String() string {
 func (*SystemToken) ProtoMessage() {}
 func (*SystemToken) ProtoMessage() {}
 
 
 func (x *SystemToken) ProtoReflect() protoreflect.Message {
 func (x *SystemToken) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[3]
+	mi := &file_backend_operation_system_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -304,7 +368,7 @@ func (x *SystemToken) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SystemToken.ProtoReflect.Descriptor instead.
 // Deprecated: Use SystemToken.ProtoReflect.Descriptor instead.
 func (*SystemToken) Descriptor() ([]byte, []int) {
 func (*SystemToken) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{3}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{4}
 }
 }
 
 
 func (x *SystemToken) GetToken() string {
 func (x *SystemToken) GetToken() string {
@@ -330,7 +394,7 @@ type UserAuth struct {
 func (x *UserAuth) Reset() {
 func (x *UserAuth) Reset() {
 	*x = UserAuth{}
 	*x = UserAuth{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[4]
+		mi := &file_backend_operation_system_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -343,7 +407,7 @@ func (x *UserAuth) String() string {
 func (*UserAuth) ProtoMessage() {}
 func (*UserAuth) ProtoMessage() {}
 
 
 func (x *UserAuth) ProtoReflect() protoreflect.Message {
 func (x *UserAuth) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[4]
+	mi := &file_backend_operation_system_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -356,7 +420,7 @@ func (x *UserAuth) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use UserAuth.ProtoReflect.Descriptor instead.
 // Deprecated: Use UserAuth.ProtoReflect.Descriptor instead.
 func (*UserAuth) Descriptor() ([]byte, []int) {
 func (*UserAuth) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{4}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{5}
 }
 }
 
 
 func (x *UserAuth) GetUserName() string {
 func (x *UserAuth) GetUserName() string {
@@ -406,7 +470,7 @@ type UserRole struct {
 func (x *UserRole) Reset() {
 func (x *UserRole) Reset() {
 	*x = UserRole{}
 	*x = UserRole{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[5]
+		mi := &file_backend_operation_system_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -419,7 +483,7 @@ func (x *UserRole) String() string {
 func (*UserRole) ProtoMessage() {}
 func (*UserRole) ProtoMessage() {}
 
 
 func (x *UserRole) ProtoReflect() protoreflect.Message {
 func (x *UserRole) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[5]
+	mi := &file_backend_operation_system_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -432,7 +496,7 @@ func (x *UserRole) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use UserRole.ProtoReflect.Descriptor instead.
 // Deprecated: Use UserRole.ProtoReflect.Descriptor instead.
 func (*UserRole) Descriptor() ([]byte, []int) {
 func (*UserRole) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{5}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{6}
 }
 }
 
 
 func (x *UserRole) GetId() int64 {
 func (x *UserRole) GetId() int64 {
@@ -468,7 +532,7 @@ type AddSystemUser struct {
 func (x *AddSystemUser) Reset() {
 func (x *AddSystemUser) Reset() {
 	*x = AddSystemUser{}
 	*x = AddSystemUser{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[6]
+		mi := &file_backend_operation_system_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -481,7 +545,7 @@ func (x *AddSystemUser) String() string {
 func (*AddSystemUser) ProtoMessage() {}
 func (*AddSystemUser) ProtoMessage() {}
 
 
 func (x *AddSystemUser) ProtoReflect() protoreflect.Message {
 func (x *AddSystemUser) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[6]
+	mi := &file_backend_operation_system_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -494,7 +558,7 @@ func (x *AddSystemUser) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use AddSystemUser.ProtoReflect.Descriptor instead.
 // Deprecated: Use AddSystemUser.ProtoReflect.Descriptor instead.
 func (*AddSystemUser) Descriptor() ([]byte, []int) {
 func (*AddSystemUser) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{6}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{7}
 }
 }
 
 
 func (x *AddSystemUser) GetId() int64 {
 func (x *AddSystemUser) GetId() int64 {
@@ -577,7 +641,7 @@ type SearchUserRequest struct {
 func (x *SearchUserRequest) Reset() {
 func (x *SearchUserRequest) Reset() {
 	*x = SearchUserRequest{}
 	*x = SearchUserRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[7]
+		mi := &file_backend_operation_system_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -590,7 +654,7 @@ func (x *SearchUserRequest) String() string {
 func (*SearchUserRequest) ProtoMessage() {}
 func (*SearchUserRequest) ProtoMessage() {}
 
 
 func (x *SearchUserRequest) ProtoReflect() protoreflect.Message {
 func (x *SearchUserRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[7]
+	mi := &file_backend_operation_system_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -603,7 +667,7 @@ func (x *SearchUserRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SearchUserRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use SearchUserRequest.ProtoReflect.Descriptor instead.
 func (*SearchUserRequest) Descriptor() ([]byte, []int) {
 func (*SearchUserRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{7}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{8}
 }
 }
 
 
 func (x *SearchUserRequest) GetName() string {
 func (x *SearchUserRequest) GetName() string {
@@ -661,7 +725,7 @@ type SearchUserResponse struct {
 func (x *SearchUserResponse) Reset() {
 func (x *SearchUserResponse) Reset() {
 	*x = SearchUserResponse{}
 	*x = SearchUserResponse{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[8]
+		mi := &file_backend_operation_system_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -674,7 +738,7 @@ func (x *SearchUserResponse) String() string {
 func (*SearchUserResponse) ProtoMessage() {}
 func (*SearchUserResponse) ProtoMessage() {}
 
 
 func (x *SearchUserResponse) ProtoReflect() protoreflect.Message {
 func (x *SearchUserResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[8]
+	mi := &file_backend_operation_system_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -687,7 +751,7 @@ func (x *SearchUserResponse) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SearchUserResponse.ProtoReflect.Descriptor instead.
 // Deprecated: Use SearchUserResponse.ProtoReflect.Descriptor instead.
 func (*SearchUserResponse) Descriptor() ([]byte, []int) {
 func (*SearchUserResponse) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{8}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{9}
 }
 }
 
 
 func (x *SearchUserResponse) GetPage() int32 {
 func (x *SearchUserResponse) GetPage() int32 {
@@ -723,7 +787,7 @@ type IsShowSystemUserRequest struct {
 func (x *IsShowSystemUserRequest) Reset() {
 func (x *IsShowSystemUserRequest) Reset() {
 	*x = IsShowSystemUserRequest{}
 	*x = IsShowSystemUserRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[9]
+		mi := &file_backend_operation_system_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -736,7 +800,7 @@ func (x *IsShowSystemUserRequest) String() string {
 func (*IsShowSystemUserRequest) ProtoMessage() {}
 func (*IsShowSystemUserRequest) ProtoMessage() {}
 
 
 func (x *IsShowSystemUserRequest) ProtoReflect() protoreflect.Message {
 func (x *IsShowSystemUserRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[9]
+	mi := &file_backend_operation_system_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -749,7 +813,7 @@ func (x *IsShowSystemUserRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use IsShowSystemUserRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use IsShowSystemUserRequest.ProtoReflect.Descriptor instead.
 func (*IsShowSystemUserRequest) Descriptor() ([]byte, []int) {
 func (*IsShowSystemUserRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{9}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{10}
 }
 }
 
 
 func (x *IsShowSystemUserRequest) GetUserId() int64 {
 func (x *IsShowSystemUserRequest) GetUserId() int64 {
@@ -794,7 +858,7 @@ type AddMenuRequest struct {
 func (x *AddMenuRequest) Reset() {
 func (x *AddMenuRequest) Reset() {
 	*x = AddMenuRequest{}
 	*x = AddMenuRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[10]
+		mi := &file_backend_operation_system_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -807,7 +871,7 @@ func (x *AddMenuRequest) String() string {
 func (*AddMenuRequest) ProtoMessage() {}
 func (*AddMenuRequest) ProtoMessage() {}
 
 
 func (x *AddMenuRequest) ProtoReflect() protoreflect.Message {
 func (x *AddMenuRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[10]
+	mi := &file_backend_operation_system_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -820,7 +884,7 @@ func (x *AddMenuRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use AddMenuRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use AddMenuRequest.ProtoReflect.Descriptor instead.
 func (*AddMenuRequest) Descriptor() ([]byte, []int) {
 func (*AddMenuRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{10}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{11}
 }
 }
 
 
 func (x *AddMenuRequest) GetId() int64 {
 func (x *AddMenuRequest) GetId() int64 {
@@ -954,7 +1018,7 @@ type IsShowSystemMenuRequest struct {
 func (x *IsShowSystemMenuRequest) Reset() {
 func (x *IsShowSystemMenuRequest) Reset() {
 	*x = IsShowSystemMenuRequest{}
 	*x = IsShowSystemMenuRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[11]
+		mi := &file_backend_operation_system_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -967,7 +1031,7 @@ func (x *IsShowSystemMenuRequest) String() string {
 func (*IsShowSystemMenuRequest) ProtoMessage() {}
 func (*IsShowSystemMenuRequest) ProtoMessage() {}
 
 
 func (x *IsShowSystemMenuRequest) ProtoReflect() protoreflect.Message {
 func (x *IsShowSystemMenuRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[11]
+	mi := &file_backend_operation_system_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -980,7 +1044,7 @@ func (x *IsShowSystemMenuRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use IsShowSystemMenuRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use IsShowSystemMenuRequest.ProtoReflect.Descriptor instead.
 func (*IsShowSystemMenuRequest) Descriptor() ([]byte, []int) {
 func (*IsShowSystemMenuRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{11}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{12}
 }
 }
 
 
 func (x *IsShowSystemMenuRequest) GetMenuId() int64 {
 func (x *IsShowSystemMenuRequest) GetMenuId() int64 {
@@ -1010,7 +1074,7 @@ type SearchMenuRequest struct {
 func (x *SearchMenuRequest) Reset() {
 func (x *SearchMenuRequest) Reset() {
 	*x = SearchMenuRequest{}
 	*x = SearchMenuRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[12]
+		mi := &file_backend_operation_system_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -1023,7 +1087,7 @@ func (x *SearchMenuRequest) String() string {
 func (*SearchMenuRequest) ProtoMessage() {}
 func (*SearchMenuRequest) ProtoMessage() {}
 
 
 func (x *SearchMenuRequest) ProtoReflect() protoreflect.Message {
 func (x *SearchMenuRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[12]
+	mi := &file_backend_operation_system_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -1036,7 +1100,7 @@ func (x *SearchMenuRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SearchMenuRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use SearchMenuRequest.ProtoReflect.Descriptor instead.
 func (*SearchMenuRequest) Descriptor() ([]byte, []int) {
 func (*SearchMenuRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{12}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{13}
 }
 }
 
 
 func (x *SearchMenuRequest) GetName() string {
 func (x *SearchMenuRequest) GetName() string {
@@ -1066,7 +1130,7 @@ type SearchMenuResponse struct {
 func (x *SearchMenuResponse) Reset() {
 func (x *SearchMenuResponse) Reset() {
 	*x = SearchMenuResponse{}
 	*x = SearchMenuResponse{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[13]
+		mi := &file_backend_operation_system_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -1079,7 +1143,7 @@ func (x *SearchMenuResponse) String() string {
 func (*SearchMenuResponse) ProtoMessage() {}
 func (*SearchMenuResponse) ProtoMessage() {}
 
 
 func (x *SearchMenuResponse) ProtoReflect() protoreflect.Message {
 func (x *SearchMenuResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[13]
+	mi := &file_backend_operation_system_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -1092,7 +1156,7 @@ func (x *SearchMenuResponse) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SearchMenuResponse.ProtoReflect.Descriptor instead.
 // Deprecated: Use SearchMenuResponse.ProtoReflect.Descriptor instead.
 func (*SearchMenuResponse) Descriptor() ([]byte, []int) {
 func (*SearchMenuResponse) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{13}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{14}
 }
 }
 
 
 func (x *SearchMenuResponse) GetPage() int32 {
 func (x *SearchMenuResponse) GetPage() int32 {
@@ -1130,7 +1194,7 @@ type SystemUserMenuPermissions struct {
 func (x *SystemUserMenuPermissions) Reset() {
 func (x *SystemUserMenuPermissions) Reset() {
 	*x = SystemUserMenuPermissions{}
 	*x = SystemUserMenuPermissions{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[14]
+		mi := &file_backend_operation_system_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -1143,7 +1207,7 @@ func (x *SystemUserMenuPermissions) String() string {
 func (*SystemUserMenuPermissions) ProtoMessage() {}
 func (*SystemUserMenuPermissions) ProtoMessage() {}
 
 
 func (x *SystemUserMenuPermissions) ProtoReflect() protoreflect.Message {
 func (x *SystemUserMenuPermissions) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[14]
+	mi := &file_backend_operation_system_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -1156,7 +1220,7 @@ func (x *SystemUserMenuPermissions) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use SystemUserMenuPermissions.ProtoReflect.Descriptor instead.
 // Deprecated: Use SystemUserMenuPermissions.ProtoReflect.Descriptor instead.
 func (*SystemUserMenuPermissions) Descriptor() ([]byte, []int) {
 func (*SystemUserMenuPermissions) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{14}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{15}
 }
 }
 
 
 func (x *SystemUserMenuPermissions) GetPastureList() []*AddPastureRequest {
 func (x *SystemUserMenuPermissions) GetPastureList() []*AddPastureRequest {
@@ -1193,7 +1257,7 @@ type AddMobileRequest struct {
 func (x *AddMobileRequest) Reset() {
 func (x *AddMobileRequest) Reset() {
 	*x = AddMobileRequest{}
 	*x = AddMobileRequest{}
 	if protoimpl.UnsafeEnabled {
 	if protoimpl.UnsafeEnabled {
-		mi := &file_backend_operation_system_proto_msgTypes[15]
+		mi := &file_backend_operation_system_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 		ms.StoreMessageInfo(mi)
 	}
 	}
@@ -1206,7 +1270,7 @@ func (x *AddMobileRequest) String() string {
 func (*AddMobileRequest) ProtoMessage() {}
 func (*AddMobileRequest) ProtoMessage() {}
 
 
 func (x *AddMobileRequest) ProtoReflect() protoreflect.Message {
 func (x *AddMobileRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_backend_operation_system_proto_msgTypes[15]
+	mi := &file_backend_operation_system_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
 		if ms.LoadMessageInfo() == nil {
@@ -1219,7 +1283,7 @@ func (x *AddMobileRequest) ProtoReflect() protoreflect.Message {
 
 
 // Deprecated: Use AddMobileRequest.ProtoReflect.Descriptor instead.
 // Deprecated: Use AddMobileRequest.ProtoReflect.Descriptor instead.
 func (*AddMobileRequest) Descriptor() ([]byte, []int) {
 func (*AddMobileRequest) Descriptor() ([]byte, []int) {
-	return file_backend_operation_system_proto_rawDescGZIP(), []int{15}
+	return file_backend_operation_system_proto_rawDescGZIP(), []int{16}
 }
 }
 
 
 func (x *AddMobileRequest) GetId() int64 {
 func (x *AddMobileRequest) GetId() int64 {
@@ -1285,150 +1349,157 @@ var file_backend_operation_system_proto_rawDesc = []byte{
 	0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63,
 	0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63,
 	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,
 	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,
 	0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x6c,
 	0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x6c,
-	0x69, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x6f, 0x6b,
-	0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb1, 0x01, 0x0a, 0x08, 0x55, 0x73, 0x65,
-	0x72, 0x41, 0x75, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61,
-	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61,
-	0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14,
-	0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70,
-	0x68, 0x6f, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70,
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65,
-	0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x70, 0x6c, 0x6f,
-	0x79, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
-	0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x08,
-	0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 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, 0xc6, 0x02, 0x0a,
-	0x0d, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e,
-	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65,
-	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72,
-	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x69,
-	0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x05, 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, 0x06, 0x69, 0x73,
-	0x53, 0x68, 0x6f, 0x77, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65,
-	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x70,
-	0x6c, 0x6f, 0x79, 0x65, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x09,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x46,
-	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xa1, 0x02, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
-	0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
+	0x69, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x13, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69,
+	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f,
+	0x62, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52,
+	0x0a, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70,
+	0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x03, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b,
+	0x0a, 0x09, 0x6d, 0x65, 0x6e, 0x75, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x03, 0x52, 0x08, 0x6d, 0x65, 0x6e, 0x75, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0b, 0x53,
+	0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,
+	0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+	0x22, 0xb1, 0x01, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x12, 0x1b, 0x0a,
+	0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61,
+	0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61,
+	0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x05,
+	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61,
+	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+	0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12,
 	0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
 	0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18,
-	0x03, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x2c, 0x0a,
-	0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74,
-	0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x63,
-	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e,
-	0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x06, 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, 0x74, 0x0a, 0x12, 0x53, 0x65, 0x61,
-	0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70,
-	0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x04, 0x6c, 0x69, 0x73,
-	0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
-	0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53,
-	0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22,
-	0x6b, 0x0a, 0x17, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55,
-	0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
-	0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65,
-	0x72, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x02,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65,
+	0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 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, 0xc6, 0x02, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74,
+	0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68,
+	0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65,
+	0x12, 0x31, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f,
+	0x6c, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x05,
 	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f,
 	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,
 	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x2e,
-	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x22, 0x87, 0x04, 0x0a,
-	0x0e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64,
-	0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6e, 0x75, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x65, 0x6e, 0x75, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a,
-	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69,
-	0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68,
-	0x6f, 0x77, 0x18, 0x07, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77,
-	0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x12,
-	0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63,
-	0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65,
-	0x63, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65,
-	0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
-	0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
+	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x23, 0x0a, 0x0d,
+	0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73,
+	0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
 	0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f,
 	0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f,
-	0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14, 0x0a,
-	0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65,
-	0x76, 0x65, 0x6c, 0x12, 0x3d, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18,
-	0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e,
-	0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e,
-	0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72,
-	0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x66, 0x66, 0x69, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x05, 0x61, 0x66, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70,
-	0x41, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65,
-	0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x22, 0x6b, 0x0a, 0x17, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77,
-	0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x65, 0x6e, 0x75, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6e, 0x75, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73,
-	0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x02, 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, 0x06, 0x69, 0x73, 0x53,
-	0x68, 0x6f, 0x77, 0x22, 0x6b, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6e,
-	0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a,
-	0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x75, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f,
-	0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,
-	0x12, 0x35, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21,
-	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0xea, 0x01, 0x0a, 0x19, 0x53, 0x79, 0x73, 0x74,
-	0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6e, 0x75, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0c, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65,
-	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x62, 0x61,
+	0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xa1, 0x02,
+	0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x70, 0x6c, 0x6f,
+	0x79, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07,
+	0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x03, 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, 0x06, 0x69,
+	0x73, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x65,
+	0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a,
+	0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 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, 0x74, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x12, 0x34, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x20, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x73, 0x65,
+	0x72, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x6b, 0x0a, 0x17, 0x49, 0x73, 0x53, 0x68, 0x6f,
+	0x77, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69,
+	0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x02, 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, 0x06, 0x69, 0x73,
+	0x53, 0x68, 0x6f, 0x77, 0x22, 0x87, 0x04, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e, 0x75,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70,
+	0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08,
+	0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6e, 0x75,
+	0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x65, 0x6e,
+	0x75, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70,
+	0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12,
+	0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x07, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70,
+	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d,
+	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x09,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f,
+	0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1a,
+	0x0a, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x3d, 0x0a, 0x08, 0x63,
+	0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x66,
+	0x66, 0x69, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x66, 0x66, 0x69, 0x78,
+	0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x22, 0x6b,
+	0x0a, 0x17, 0x49, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x65,
+	0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x65, 0x6e,
+	0x75, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6e, 0x75,
+	0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x02, 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, 0x06, 0x69, 0x73, 0x53, 0x68, 0x6f, 0x77, 0x22, 0x6b, 0x0a, 0x11, 0x53,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x02, 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, 0x75, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72,
+	0x63, 0x68, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12,
+	0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61,
+	0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x35, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
+	0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65,
+	0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22,
+	0xea, 0x01, 0x0a, 0x19, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65,
+	0x6e, 0x75, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a,
+	0x0c, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x5f, 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, 0x41, 0x64, 0x64, 0x50, 0x61, 0x73, 0x74, 0x75,
+	0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x74, 0x75,
+	0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x6d, 0x65, 0x6e, 0x75, 0x5f, 0x6c,
+	0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63, 0x6b,
+	0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64,
+	0x64, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x65,
+	0x6e, 0x75, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,
+	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61,
 	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
 	0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
-	0x41, 0x64, 0x64, 0x50, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e,
-	0x0a, 0x09, 0x6d, 0x65, 0x6e, 0x75, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6e, 0x75, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x6e, 0x75, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44,
-	0x0a, 0x0b, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x6f, 0x70,
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x62, 0x69, 0x6c,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,
-	0x4c, 0x69, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x62, 0x69, 0x6c,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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,
+	0x41, 0x64, 0x64, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x52, 0x0a, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x10,
+	0x41, 0x64, 0x64, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 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 (
 var (
@@ -1443,47 +1514,48 @@ func file_backend_operation_system_proto_rawDescGZIP() []byte {
 	return file_backend_operation_system_proto_rawDescData
 	return file_backend_operation_system_proto_rawDescData
 }
 }
 
 
-var file_backend_operation_system_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
+var file_backend_operation_system_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
 var file_backend_operation_system_proto_goTypes = []interface{}{
 var file_backend_operation_system_proto_goTypes = []interface{}{
 	(*AddRoleRequest)(nil),            // 0: backend.operation.AddRoleRequest
 	(*AddRoleRequest)(nil),            // 0: backend.operation.AddRoleRequest
 	(*SearchRoleRequest)(nil),         // 1: backend.operation.SearchRoleRequest
 	(*SearchRoleRequest)(nil),         // 1: backend.operation.SearchRoleRequest
 	(*SearchRoleResponse)(nil),        // 2: backend.operation.SearchRoleResponse
 	(*SearchRoleResponse)(nil),        // 2: backend.operation.SearchRoleResponse
-	(*SystemToken)(nil),               // 3: backend.operation.SystemToken
-	(*UserAuth)(nil),                  // 4: backend.operation.UserAuth
-	(*UserRole)(nil),                  // 5: backend.operation.UserRole
-	(*AddSystemUser)(nil),             // 6: backend.operation.AddSystemUser
-	(*SearchUserRequest)(nil),         // 7: backend.operation.SearchUserRequest
-	(*SearchUserResponse)(nil),        // 8: backend.operation.SearchUserResponse
-	(*IsShowSystemUserRequest)(nil),   // 9: backend.operation.IsShowSystemUserRequest
-	(*AddMenuRequest)(nil),            // 10: backend.operation.AddMenuRequest
-	(*IsShowSystemMenuRequest)(nil),   // 11: backend.operation.IsShowSystemMenuRequest
-	(*SearchMenuRequest)(nil),         // 12: backend.operation.SearchMenuRequest
-	(*SearchMenuResponse)(nil),        // 13: backend.operation.SearchMenuResponse
-	(*SystemUserMenuPermissions)(nil), // 14: backend.operation.SystemUserMenuPermissions
-	(*AddMobileRequest)(nil),          // 15: backend.operation.AddMobileRequest
-	(IsShow_Kind)(0),                  // 16: backend.operation.IsShow.Kind
-	(*PaginationModel)(nil),           // 17: backend.operation.PaginationModel
-	(*AddPastureRequest)(nil),         // 18: backend.operation.AddPastureRequest
+	(*RolePermissionsList)(nil),       // 3: backend.operation.RolePermissionsList
+	(*SystemToken)(nil),               // 4: backend.operation.SystemToken
+	(*UserAuth)(nil),                  // 5: backend.operation.UserAuth
+	(*UserRole)(nil),                  // 6: backend.operation.UserRole
+	(*AddSystemUser)(nil),             // 7: backend.operation.AddSystemUser
+	(*SearchUserRequest)(nil),         // 8: backend.operation.SearchUserRequest
+	(*SearchUserResponse)(nil),        // 9: backend.operation.SearchUserResponse
+	(*IsShowSystemUserRequest)(nil),   // 10: backend.operation.IsShowSystemUserRequest
+	(*AddMenuRequest)(nil),            // 11: backend.operation.AddMenuRequest
+	(*IsShowSystemMenuRequest)(nil),   // 12: backend.operation.IsShowSystemMenuRequest
+	(*SearchMenuRequest)(nil),         // 13: backend.operation.SearchMenuRequest
+	(*SearchMenuResponse)(nil),        // 14: backend.operation.SearchMenuResponse
+	(*SystemUserMenuPermissions)(nil), // 15: backend.operation.SystemUserMenuPermissions
+	(*AddMobileRequest)(nil),          // 16: backend.operation.AddMobileRequest
+	(IsShow_Kind)(0),                  // 17: backend.operation.IsShow.Kind
+	(*PaginationModel)(nil),           // 18: backend.operation.PaginationModel
+	(*AddPastureRequest)(nil),         // 19: backend.operation.AddPastureRequest
 }
 }
 var file_backend_operation_system_proto_depIdxs = []int32{
 var file_backend_operation_system_proto_depIdxs = []int32{
-	16, // 0: backend.operation.AddRoleRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	17, // 1: backend.operation.SearchRoleRequest.pagination:type_name -> backend.operation.PaginationModel
+	17, // 0: backend.operation.AddRoleRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 1: backend.operation.SearchRoleRequest.pagination:type_name -> backend.operation.PaginationModel
 	0,  // 2: backend.operation.SearchRoleResponse.list:type_name -> backend.operation.AddRoleRequest
 	0,  // 2: backend.operation.SearchRoleResponse.list:type_name -> backend.operation.AddRoleRequest
-	5,  // 3: backend.operation.UserAuth.roles:type_name -> backend.operation.UserRole
-	5,  // 4: backend.operation.AddSystemUser.roles:type_name -> backend.operation.UserRole
-	16, // 5: backend.operation.AddSystemUser.is_show:type_name -> backend.operation.IsShow.Kind
-	16, // 6: backend.operation.SearchUserRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	17, // 7: backend.operation.SearchUserRequest.pagination:type_name -> backend.operation.PaginationModel
-	6,  // 8: backend.operation.SearchUserResponse.list:type_name -> backend.operation.AddSystemUser
-	16, // 9: backend.operation.IsShowSystemUserRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	16, // 10: backend.operation.AddMenuRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	10, // 11: backend.operation.AddMenuRequest.children:type_name -> backend.operation.AddMenuRequest
-	16, // 12: backend.operation.IsShowSystemMenuRequest.is_show:type_name -> backend.operation.IsShow.Kind
-	17, // 13: backend.operation.SearchMenuRequest.pagination:type_name -> backend.operation.PaginationModel
-	10, // 14: backend.operation.SearchMenuResponse.list:type_name -> backend.operation.AddMenuRequest
-	18, // 15: backend.operation.SystemUserMenuPermissions.pasture_list:type_name -> backend.operation.AddPastureRequest
-	10, // 16: backend.operation.SystemUserMenuPermissions.menu_list:type_name -> backend.operation.AddMenuRequest
-	15, // 17: backend.operation.SystemUserMenuPermissions.mobile_list:type_name -> backend.operation.AddMobileRequest
+	6,  // 3: backend.operation.UserAuth.roles:type_name -> backend.operation.UserRole
+	6,  // 4: backend.operation.AddSystemUser.roles:type_name -> backend.operation.UserRole
+	17, // 5: backend.operation.AddSystemUser.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 6: backend.operation.SearchUserRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 7: backend.operation.SearchUserRequest.pagination:type_name -> backend.operation.PaginationModel
+	7,  // 8: backend.operation.SearchUserResponse.list:type_name -> backend.operation.AddSystemUser
+	17, // 9: backend.operation.IsShowSystemUserRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	17, // 10: backend.operation.AddMenuRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	11, // 11: backend.operation.AddMenuRequest.children:type_name -> backend.operation.AddMenuRequest
+	17, // 12: backend.operation.IsShowSystemMenuRequest.is_show:type_name -> backend.operation.IsShow.Kind
+	18, // 13: backend.operation.SearchMenuRequest.pagination:type_name -> backend.operation.PaginationModel
+	11, // 14: backend.operation.SearchMenuResponse.list:type_name -> backend.operation.AddMenuRequest
+	19, // 15: backend.operation.SystemUserMenuPermissions.pasture_list:type_name -> backend.operation.AddPastureRequest
+	11, // 16: backend.operation.SystemUserMenuPermissions.menu_list:type_name -> backend.operation.AddMenuRequest
+	16, // 17: backend.operation.SystemUserMenuPermissions.mobile_list:type_name -> backend.operation.AddMobileRequest
 	18, // [18:18] is the sub-list for method output_type
 	18, // [18:18] is the sub-list for method output_type
 	18, // [18:18] is the sub-list for method input_type
 	18, // [18:18] is the sub-list for method input_type
 	18, // [18:18] is the sub-list for extension type_name
 	18, // [18:18] is the sub-list for extension type_name
@@ -1537,7 +1609,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SystemToken); i {
+			switch v := v.(*RolePermissionsList); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1549,7 +1621,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UserAuth); i {
+			switch v := v.(*SystemToken); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1561,7 +1633,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UserRole); i {
+			switch v := v.(*UserAuth); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1573,7 +1645,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AddSystemUser); i {
+			switch v := v.(*UserRole); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1585,7 +1657,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchUserRequest); i {
+			switch v := v.(*AddSystemUser); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1597,7 +1669,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchUserResponse); i {
+			switch v := v.(*SearchUserRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1609,7 +1681,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IsShowSystemUserRequest); i {
+			switch v := v.(*SearchUserResponse); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1621,7 +1693,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AddMenuRequest); i {
+			switch v := v.(*IsShowSystemUserRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1633,7 +1705,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IsShowSystemMenuRequest); i {
+			switch v := v.(*AddMenuRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1645,7 +1717,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchMenuRequest); i {
+			switch v := v.(*IsShowSystemMenuRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1657,7 +1729,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SearchMenuResponse); i {
+			switch v := v.(*SearchMenuRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1669,7 +1741,7 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SystemUserMenuPermissions); i {
+			switch v := v.(*SearchMenuResponse); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
 			case 1:
 			case 1:
@@ -1681,6 +1753,18 @@ func file_backend_operation_system_proto_init() {
 			}
 			}
 		}
 		}
 		file_backend_operation_system_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 		file_backend_operation_system_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SystemUserMenuPermissions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_backend_operation_system_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*AddMobileRequest); i {
 			switch v := v.(*AddMobileRequest); i {
 			case 0:
 			case 0:
 				return &v.state
 				return &v.state
@@ -1699,7 +1783,7 @@ func file_backend_operation_system_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_backend_operation_system_proto_rawDesc,
 			RawDescriptor: file_backend_operation_system_proto_rawDesc,
 			NumEnums:      0,
 			NumEnums:      0,
-			NumMessages:   16,
+			NumMessages:   17,
 			NumExtensions: 0,
 			NumExtensions: 0,
 			NumServices:   0,
 			NumServices:   0,
 		},
 		},