From 0fd3231799d9185af352dcbc4f8e14df5e0f0233 Mon Sep 17 00:00:00 2001
From: liujiandao <274878379@qq.com>
Date: 星期五, 22 三月 2024 10:53:38 +0800
Subject: [PATCH] 采购单到货与质检信息操作

---
 model/purchase/purchase.go                    |   13 
 model/purchase/request/purchase.go            |   27 
 docs/swagger.yaml                             |  201 ++++++
 proto/purchase_wms.proto                      |    6 
 docs/docs.go                                  |  334 +++++++++++
 docs/swagger.json                             |  334 +++++++++++
 api/v1/purchase/purchase.go                   |  221 +++++++
 router/purchase/purchase.go                   |   25 
 utils/timex.go                                |   91 +++
 proto/purchase_wms/purchase_wms.pb.go         |  375 ++++++-----
 model/purchase/purchase_quality_inspection.go |   31 +
 service/purchase/purchase.go                  |  110 +++
 initialize/gorm.go                            |    2 
 model/purchase/purchase_product_confirm.go    |   27 
 14 files changed, 1,597 insertions(+), 200 deletions(-)

diff --git a/api/v1/purchase/purchase.go b/api/v1/purchase/purchase.go
index c847f43..316a704 100644
--- a/api/v1/purchase/purchase.go
+++ b/api/v1/purchase/purchase.go
@@ -3,6 +3,7 @@
 import (
 	"context"
 	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
 	"go.uber.org/zap"
 	"gorm.io/gorm"
 	"srm/global"
@@ -415,3 +416,223 @@
 	}
 	response.OkWithData(operationInfos, c)
 }
+
+// NewSubmit
+// @Tags      Purchase
+// @Summary   鏂扮増鎻愪氦
+// @Security  ApiKeyAuth
+// @accept    application/json
+// @Produce   application/json
+// @Param		id	path		int	true	"閲囪喘鍗旾D"                                           true  "閲囪喘鍗旾D"
+// @Success   200   {object}  response.Response{msg=string}  "鏂扮増鎻愪氦"
+// @Router    /purchase/newSubmit/{id} [get]
+func (e *PurchaseApi) NewSubmit(c *gin.Context) {
+	id, _ := strconv.Atoi(c.Param("id"))
+	if id == 0 {
+		response.FailWithMessage("鍙傛暟缂哄け", c)
+		return
+	}
+	data, err := service.NewPurchaseService().GetPurchase(uint(id))
+	if err != nil {
+		global.GVA_LOG.Error("鑾峰彇澶辫触!", zap.Error(err))
+		response.FailWithMessage("鑾峰彇澶辫触", c)
+		return
+	}
+	productList, err := service.NewPurchaseService().GetPurchaseProductList(uint(id))
+	if err != nil {
+		global.GVA_LOG.Error("鑾峰彇澶辫触!", zap.Error(err))
+		response.FailWithMessage("鑾峰彇澶辫触", c)
+		return
+	}
+	list := make([]*purchase.PurchaseProductConfirm, 0)
+	for _, products := range productList {
+		var ppc purchase.PurchaseProductConfirm
+		ppc.PurchaseNumber = data.Number
+		ppc.Principal = data.Principal
+		ppc.ProductId = products.Product.Number
+		ppc.ProductName = products.Product.Name
+		ppc.Unit = products.Product.Unit
+		ppc.Specs = products.Product.Specifications
+		ppc.Type = products.Product.ModelNumber
+		ppc.Amount = products.Amount
+		ppc.OverReceiveAmount = decimal.NewFromInt(0)
+		ppc.NotReceiveAmount = products.Amount
+		ppc.NowReceiveAmount = decimal.NewFromInt(0)
+		ppc.SurplusReceiveAmount = products.Amount
+		list = append(list, &ppc)
+	}
+	err = service.NewPurchaseService().SavePurchaseProductConfirm(list)
+
+	if err != nil {
+		global.GVA_LOG.Error("鎻愪氦澶辫触!", zap.Error(err))
+		response.FailWithMessage("鎻愪氦澶辫触", c)
+		return
+	}
+	response.OkWithMessage("鎻愪氦鎴愬姛", c)
+}
+
+// GetPurchaseProductConfirmInfo
+// @Tags      Purchase
+// @Summary   鑾峰彇纭淇℃伅
+// @Security  ApiKeyAuth
+// @accept    application/json
+// @Produce   application/json
+// @Param     number  path     string   true  "閲囪喘鍗曠紪鐮�"
+// @Success   200   {object}  response.Response{data=[]purchase.PurchaseProductConfirm}  "鑾峰彇纭淇℃伅"
+// @Router    /purchase/getPurchaseProductConfirmInfo/{number} [get]
+func (e *PurchaseApi) GetPurchaseProductConfirmInfo(c *gin.Context) {
+	number := c.Param("number")
+	if number == "" {
+		response.FailWithMessage("鍙傛暟缂哄け", c)
+		return
+	}
+	info, err := service.NewPurchaseService().GetPurchaseProductConfirmInfo(number)
+	if err != nil {
+		global.GVA_LOG.Error("鑾峰彇纭淇℃伅澶辫触!", zap.Error(err))
+		response.FailWithMessage("鑾峰彇纭淇℃伅澶辫触", c)
+		return
+	}
+	response.OkWithData(info, c)
+}
+
+// SavePurchaseProductConfirm
+// @Tags      Purchase
+// @Summary   纭鏀惰揣
+// @Security  ApiKeyAuth
+// @accept    application/json
+// @Produce   application/json
+// @Param     data  body     []purchaserequest.PurchaseProductConfirmInfo   true  "list"
+// @Success   200   {object}  response.Response{msg=string}  "纭鏀惰揣"
+// @Router    /purchase/savePurchaseProductConfirm [post]
+func (e *PurchaseApi) SavePurchaseProductConfirm(c *gin.Context) {
+	var params []*purchaserequest.PurchaseProductConfirmInfo
+	err := c.ShouldBindJSON(&params)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	list := make([]*purchase.PurchaseProductConfirm, 0, len(params))
+	if err := utils.AssignTo(params, &list); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	server := service.NewPurchaseService()
+	err = server.SavePurchaseProductConfirm(list)
+
+	if err != nil {
+		global.GVA_LOG.Error("淇濆瓨澶辫触!", zap.Error(err))
+		response.FailWithMessage("淇濆瓨澶辫触", c)
+		return
+	}
+	err = server.SavePurchaseQualityInspection(list)
+	if err != nil {
+		global.GVA_LOG.Error("淇濆瓨澶辫触!", zap.Error(err))
+		response.FailWithMessage("淇濆瓨澶辫触", c)
+		return
+	}
+	response.OkWithMessage("淇濆瓨鎴愬姛", c)
+}
+
+// GetPurchaseQualityInspectionInfo
+// @Tags      Purchase
+// @Summary   鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅
+// @Security  ApiKeyAuth
+// @accept    application/json
+// @Produce   application/json
+// @Param     data  body     purchaserequest.GetQualityInspectionInfo   true  "鍙傛暟"
+// @Success   200   {object}  response.Response{data=[]purchase.PurchaseProductConfirm}  "鑾峰彇纭淇℃伅"
+// @Router    /purchase/getPurchaseQualityInspectionInfo [post]
+func (e *PurchaseApi) GetPurchaseQualityInspectionInfo(c *gin.Context) {
+	var params purchaserequest.GetQualityInspectionInfo
+	err := c.ShouldBindJSON(&params)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	if params.PurchaseNumber == "" {
+		response.FailWithMessage("閲囪喘鍗曠紪鐮佷笉鑳戒负绌�", c)
+		return
+	}
+	infos, err := service.NewPurchaseService().GetPurchaseQualityInspection(params)
+	if err != nil {
+		global.GVA_LOG.Error("鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅!", zap.Error(err))
+		response.FailWithMessage("鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅", c)
+		return
+	}
+	response.OkWithData(infos, c)
+}
+
+// SavePurchaseQualityInspectionInfo
+// @Tags      Purchase
+// @Summary   淇濆瓨閲囪喘璐ㄦ淇℃伅淇℃伅
+// @Security  ApiKeyAuth
+// @accept    application/json
+// @Produce   application/json
+// @Param     data  body     purchaserequest.GetQualityInspectionInfo   true  "鍙傛暟"
+// @Success   200   {object}  response.Response{data=[]purchase.PurchaseProductConfirm}  "鑾峰彇纭淇℃伅"
+// @Router    /purchase/savePurchaseQualityInspectionInfo [post]
+func (e *PurchaseApi) SavePurchaseQualityInspectionInfo(c *gin.Context) {
+	var params purchaserequest.SaveQualityInspectionInfo
+	err := c.ShouldBindJSON(&params)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	if params.PurchaseId == 0 || len(params.Ids) == 0 {
+		response.FailWithMessage("閲囪喘鍗曠紪鐮佸拰id涓嶈兘涓虹┖", c)
+		return
+	}
+	server := service.PurchaseService{}
+	if params.Status == purchase.Unqualified {
+		err := server.UpdatePurchaseQualityInspection(params.Ids, params.Status)
+		if err != nil {
+			global.GVA_LOG.Error("璐ㄦ澶辫触!", zap.Error(err))
+			response.FailWithMessage("璐ㄦ澶辫触", c)
+			return
+		}
+	} else if params.Status == purchase.InWarehouse {
+		purchaseData, err := server.GetPurchase(params.PurchaseId)
+		if err != nil {
+			global.GVA_LOG.Error("鑾峰彇澶辫触!", zap.Error(err))
+			response.FailWithMessage("鑾峰彇澶辫触", c)
+			return
+		}
+		inspectionList, err := server.GetPurchaseQualityInspectionList(params.Ids)
+		if err != nil {
+			global.GVA_LOG.Error("鑾峰彇澶辫触!", zap.Error(err))
+			response.FailWithMessage("鑾峰彇澶辫触", c)
+			return
+		}
+		product := make([]*purchase_wms.PurchaseProduct, 0)
+		for _, inspection := range inspectionList {
+			var p purchase_wms.PurchaseProduct
+			p.Id = inspection.ProductId
+			p.Amount = inspection.Amount.IntPart()
+			product = append(product, &p)
+		}
+		client := purchase_wms.NewPurchaseServiceClient(purchase_wms.PurchaseConn)
+		_, err = client.PurchaseToWms(context.Background(), &purchase_wms.PurchaseToWmsRequest{
+			Number:        purchaseData.Number,
+			SupplierName:  purchaseData.Supplier.Name,
+			SupplierId:    int64(purchaseData.SupplierId),
+			Product:       product,
+			Source:        "SRM_PURCHASE",
+			WarehouseName: purchaseData.Warehouse,
+		})
+		if err != nil {
+			global.GVA_LOG.Error("grpc璋冪敤澶辫触!", zap.Error(err))
+			response.FailWithMessage("grpc璋冪敤澶辫触", c)
+			return
+		}
+		err = server.UpdatePurchaseQualityInspection(params.Ids, params.Status)
+		if err != nil {
+			global.GVA_LOG.Error("璐ㄦ澶辫触!", zap.Error(err))
+			response.FailWithMessage("璐ㄦ澶辫触", c)
+			return
+		}
+	}
+
+	response.OkWithMessage("璐ㄦ鎴愬姛", c)
+}
diff --git a/docs/docs.go b/docs/docs.go
index a683fef..5dc2a02 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1648,6 +1648,110 @@
                 }
             }
         },
+        "/purchase/getPurchaseProductConfirmInfo/{number}": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鑾峰彇纭淇℃伅",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "閲囪喘鍗曠紪鐮�",
+                        "name": "number",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鑾峰彇纭淇℃伅",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/purchase.PurchaseProductConfirm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/getPurchaseQualityInspectionInfo": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/purchaserequest.GetQualityInspectionInfo"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鑾峰彇纭淇℃伅",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/purchase.PurchaseProductConfirm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/purchase/getWarehouseInfo": {
             "get": {
                 "security": [
@@ -1681,6 +1785,54 @@
                                             "items": {
                                                 "$ref": "#/definitions/purchase_wms.SrmGetWarehouseInfoResponse"
                                             }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/newSubmit/{id}": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鏂扮増鎻愪氦",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "閲囪喘鍗旾D",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鏂扮増鎻愪氦",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "msg": {
+                                            "type": "string"
                                         }
                                     }
                                 }
@@ -2108,6 +2260,59 @@
                                         "data": {
                                             "$ref": "#/definitions/response.PageResult"
                                         },
+                                        "msg": {
+                                            "type": "string"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/savePurchaseProductConfirm": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "纭鏀惰揣",
+                "parameters": [
+                    {
+                        "description": "list",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "$ref": "#/definitions/purchaserequest.PurchaseProductConfirmInfo"
+                            }
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "纭鏀惰揣",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
                                         "msg": {
                                             "type": "string"
                                         }
@@ -3677,21 +3882,30 @@
                 2,
                 3,
                 4,
-                5
+                5,
+                6,
+                7,
+                8
             ],
             "x-enum-comments": {
                 "OrderStatusCanceled": "宸插彇娑�",
                 "OrderStatusCompleted": "宸插畬鎴�",
                 "OrderStatusConfirmed": "寰呯‘璁�",
+                "OrderStatusPartReceive": "閮ㄥ垎鏀惰揣",
                 "OrderStatusReceived": "寰呭叆搴�",
-                "OrderStatusStored": "宸插叆搴�"
+                "OrderStatusStored": "宸插叆搴�",
+                "OrderStatusWaitQuality": "寰呰川妫�",
+                "OrderStatusWaitReceive": "寰呮敹璐�"
             },
             "x-enum-varnames": [
                 "OrderStatusConfirmed",
                 "OrderStatusReceived",
                 "OrderStatusStored",
                 "OrderStatusCompleted",
-                "OrderStatusCanceled"
+                "OrderStatusCanceled",
+                "OrderStatusWaitReceive",
+                "OrderStatusPartReceive",
+                "OrderStatusWaitQuality"
             ]
         },
         "purchase.PriceAdjustmentType": {
@@ -3861,6 +4075,59 @@
                 }
             }
         },
+        "purchase.PurchaseProductConfirm": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "created_at": {
+                    "type": "string"
+                },
+                "id": {
+                    "description": "涓婚敭ID",
+                    "type": "string",
+                    "example": "0"
+                },
+                "notReceiveAmount": {
+                    "type": "number"
+                },
+                "nowReceiveAmount": {
+                    "description": "鏈鏀惰揣鏁伴噺",
+                    "type": "number"
+                },
+                "overReceiveAmount": {
+                    "type": "number"
+                },
+                "principal": {
+                    "type": "string"
+                },
+                "productId": {
+                    "type": "string"
+                },
+                "productName": {
+                    "type": "string"
+                },
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "specs": {
+                    "type": "string"
+                },
+                "surplusReceiveAmount": {
+                    "type": "number"
+                },
+                "type": {
+                    "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                },
+                "updated_at": {
+                    "type": "string"
+                }
+            }
+        },
         "purchase.PurchaseProducts": {
             "type": "object",
             "properties": {
@@ -3985,6 +4252,26 @@
                 }
             }
         },
+        "purchaserequest.GetQualityInspectionInfo": {
+            "type": "object",
+            "properties": {
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "array",
+                    "items": {
+                        "type": "integer"
+                    }
+                },
+                "times": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
+                }
+            }
+        },
         "purchaserequest.Purchase": {
             "type": "object",
             "properties": {
@@ -4097,6 +4384,47 @@
                 }
             }
         },
+        "purchaserequest.PurchaseProductConfirmInfo": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "notReceiveAmount": {
+                    "type": "number"
+                },
+                "nowReceiveAmount": {
+                    "type": "number"
+                },
+                "overReceiveAmount": {
+                    "type": "number"
+                },
+                "principal": {
+                    "type": "string"
+                },
+                "productId": {
+                    "type": "string"
+                },
+                "productName": {
+                    "type": "string"
+                },
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "specs": {
+                    "type": "string"
+                },
+                "surplusReceiveAmount": {
+                    "type": "number"
+                },
+                "type": {
+                    "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                }
+            }
+        },
         "purchaserequest.PurchaseType": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 4c8c5ad..2cc58b6 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1639,6 +1639,110 @@
                 }
             }
         },
+        "/purchase/getPurchaseProductConfirmInfo/{number}": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鑾峰彇纭淇℃伅",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "閲囪喘鍗曠紪鐮�",
+                        "name": "number",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鑾峰彇纭淇℃伅",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/purchase.PurchaseProductConfirm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/getPurchaseQualityInspectionInfo": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅",
+                "parameters": [
+                    {
+                        "description": "鍙傛暟",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/purchaserequest.GetQualityInspectionInfo"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鑾峰彇纭淇℃伅",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/purchase.PurchaseProductConfirm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "/purchase/getWarehouseInfo": {
             "get": {
                 "security": [
@@ -1672,6 +1776,54 @@
                                             "items": {
                                                 "$ref": "#/definitions/purchase_wms.SrmGetWarehouseInfoResponse"
                                             }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/newSubmit/{id}": {
+            "get": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "鏂扮増鎻愪氦",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "閲囪喘鍗旾D",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "鏂扮増鎻愪氦",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "msg": {
+                                            "type": "string"
                                         }
                                     }
                                 }
@@ -2099,6 +2251,59 @@
                                         "data": {
                                             "$ref": "#/definitions/response.PageResult"
                                         },
+                                        "msg": {
+                                            "type": "string"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/purchase/savePurchaseProductConfirm": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "Purchase"
+                ],
+                "summary": "纭鏀惰揣",
+                "parameters": [
+                    {
+                        "description": "list",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "$ref": "#/definitions/purchaserequest.PurchaseProductConfirmInfo"
+                            }
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "纭鏀惰揣",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
                                         "msg": {
                                             "type": "string"
                                         }
@@ -3668,21 +3873,30 @@
                 2,
                 3,
                 4,
-                5
+                5,
+                6,
+                7,
+                8
             ],
             "x-enum-comments": {
                 "OrderStatusCanceled": "宸插彇娑�",
                 "OrderStatusCompleted": "宸插畬鎴�",
                 "OrderStatusConfirmed": "寰呯‘璁�",
+                "OrderStatusPartReceive": "閮ㄥ垎鏀惰揣",
                 "OrderStatusReceived": "寰呭叆搴�",
-                "OrderStatusStored": "宸插叆搴�"
+                "OrderStatusStored": "宸插叆搴�",
+                "OrderStatusWaitQuality": "寰呰川妫�",
+                "OrderStatusWaitReceive": "寰呮敹璐�"
             },
             "x-enum-varnames": [
                 "OrderStatusConfirmed",
                 "OrderStatusReceived",
                 "OrderStatusStored",
                 "OrderStatusCompleted",
-                "OrderStatusCanceled"
+                "OrderStatusCanceled",
+                "OrderStatusWaitReceive",
+                "OrderStatusPartReceive",
+                "OrderStatusWaitQuality"
             ]
         },
         "purchase.PriceAdjustmentType": {
@@ -3852,6 +4066,59 @@
                 }
             }
         },
+        "purchase.PurchaseProductConfirm": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "created_at": {
+                    "type": "string"
+                },
+                "id": {
+                    "description": "涓婚敭ID",
+                    "type": "string",
+                    "example": "0"
+                },
+                "notReceiveAmount": {
+                    "type": "number"
+                },
+                "nowReceiveAmount": {
+                    "description": "鏈鏀惰揣鏁伴噺",
+                    "type": "number"
+                },
+                "overReceiveAmount": {
+                    "type": "number"
+                },
+                "principal": {
+                    "type": "string"
+                },
+                "productId": {
+                    "type": "string"
+                },
+                "productName": {
+                    "type": "string"
+                },
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "specs": {
+                    "type": "string"
+                },
+                "surplusReceiveAmount": {
+                    "type": "number"
+                },
+                "type": {
+                    "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                },
+                "updated_at": {
+                    "type": "string"
+                }
+            }
+        },
         "purchase.PurchaseProducts": {
             "type": "object",
             "properties": {
@@ -3976,6 +4243,26 @@
                 }
             }
         },
+        "purchaserequest.GetQualityInspectionInfo": {
+            "type": "object",
+            "properties": {
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "array",
+                    "items": {
+                        "type": "integer"
+                    }
+                },
+                "times": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
+                }
+            }
+        },
         "purchaserequest.Purchase": {
             "type": "object",
             "properties": {
@@ -4088,6 +4375,47 @@
                 }
             }
         },
+        "purchaserequest.PurchaseProductConfirmInfo": {
+            "type": "object",
+            "properties": {
+                "amount": {
+                    "type": "number"
+                },
+                "notReceiveAmount": {
+                    "type": "number"
+                },
+                "nowReceiveAmount": {
+                    "type": "number"
+                },
+                "overReceiveAmount": {
+                    "type": "number"
+                },
+                "principal": {
+                    "type": "string"
+                },
+                "productId": {
+                    "type": "string"
+                },
+                "productName": {
+                    "type": "string"
+                },
+                "purchaseNumber": {
+                    "type": "string"
+                },
+                "specs": {
+                    "type": "string"
+                },
+                "surplusReceiveAmount": {
+                    "type": "number"
+                },
+                "type": {
+                    "type": "string"
+                },
+                "unit": {
+                    "type": "string"
+                }
+            }
+        },
         "purchaserequest.PurchaseType": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index bdcf9a0..b8e9d72 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -400,19 +400,28 @@
     - 3
     - 4
     - 5
+    - 6
+    - 7
+    - 8
     type: integer
     x-enum-comments:
       OrderStatusCanceled: 宸插彇娑�
       OrderStatusCompleted: 宸插畬鎴�
       OrderStatusConfirmed: 寰呯‘璁�
+      OrderStatusPartReceive: 閮ㄥ垎鏀惰揣
       OrderStatusReceived: 寰呭叆搴�
       OrderStatusStored: 宸插叆搴�
+      OrderStatusWaitQuality: 寰呰川妫�
+      OrderStatusWaitReceive: 寰呮敹璐�
     x-enum-varnames:
     - OrderStatusConfirmed
     - OrderStatusReceived
     - OrderStatusStored
     - OrderStatusCompleted
     - OrderStatusCanceled
+    - OrderStatusWaitReceive
+    - OrderStatusPartReceive
+    - OrderStatusWaitQuality
   purchase.PriceAdjustmentType:
     enum:
     - 1
@@ -531,6 +540,42 @@
         - $ref: '#/definitions/purchase.WholeDiscountType'
         description: 鏁村崟鎶樻墸绫诲瀷
     type: object
+  purchase.PurchaseProductConfirm:
+    properties:
+      amount:
+        type: number
+      created_at:
+        type: string
+      id:
+        description: 涓婚敭ID
+        example: "0"
+        type: string
+      notReceiveAmount:
+        type: number
+      nowReceiveAmount:
+        description: 鏈鏀惰揣鏁伴噺
+        type: number
+      overReceiveAmount:
+        type: number
+      principal:
+        type: string
+      productId:
+        type: string
+      productName:
+        type: string
+      purchaseNumber:
+        type: string
+      specs:
+        type: string
+      surplusReceiveAmount:
+        type: number
+      type:
+        type: string
+      unit:
+        type: string
+      updated_at:
+        type: string
+    type: object
   purchase.PurchaseProducts:
     properties:
       amount:
@@ -618,6 +663,19 @@
       purchase:
         $ref: '#/definitions/purchaserequest.Purchase'
     type: object
+  purchaserequest.GetQualityInspectionInfo:
+    properties:
+      purchaseNumber:
+        type: string
+      status:
+        items:
+          type: integer
+        type: array
+      times:
+        items:
+          type: string
+        type: array
+    type: object
   purchaserequest.Purchase:
     properties:
       contact:
@@ -695,6 +753,33 @@
         allOf:
         - $ref: '#/definitions/purchase.WholeDiscountType'
         description: 鏁村崟鎶樻墸绫诲瀷
+    type: object
+  purchaserequest.PurchaseProductConfirmInfo:
+    properties:
+      amount:
+        type: number
+      notReceiveAmount:
+        type: number
+      nowReceiveAmount:
+        type: number
+      overReceiveAmount:
+        type: number
+      principal:
+        type: string
+      productId:
+        type: string
+      productName:
+        type: string
+      purchaseNumber:
+        type: string
+      specs:
+        type: string
+      surplusReceiveAmount:
+        type: number
+      type:
+        type: string
+      unit:
+        type: string
     type: object
   purchaserequest.PurchaseType:
     properties:
@@ -2037,6 +2122,65 @@
       summary: 鑾峰彇鎿嶄綔淇℃伅
       tags:
       - Purchase
+  /purchase/getPurchaseProductConfirmInfo/{number}:
+    get:
+      consumes:
+      - application/json
+      parameters:
+      - description: 閲囪喘鍗曠紪鐮�
+        in: path
+        name: number
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鑾峰彇纭淇℃伅
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/purchase.PurchaseProductConfirm'
+                  type: array
+              type: object
+      security:
+      - ApiKeyAuth: []
+      summary: 鑾峰彇纭淇℃伅
+      tags:
+      - Purchase
+  /purchase/getPurchaseQualityInspectionInfo:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: 鍙傛暟
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/purchaserequest.GetQualityInspectionInfo'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鑾峰彇纭淇℃伅
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/purchase.PurchaseProductConfirm'
+                  type: array
+              type: object
+      security:
+      - ApiKeyAuth: []
+      summary: 鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅
+      tags:
+      - Purchase
   /purchase/getWarehouseInfo:
     get:
       consumes:
@@ -2058,6 +2202,33 @@
       security:
       - ApiKeyAuth: []
       summary: 鑾峰彇浠撳簱鍒楄〃
+      tags:
+      - Purchase
+  /purchase/newSubmit/{id}:
+    get:
+      consumes:
+      - application/json
+      parameters:
+      - description: 閲囪喘鍗旾D
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鏂扮増鎻愪氦
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                msg:
+                  type: string
+              type: object
+      security:
+      - ApiKeyAuth: []
+      summary: 鏂扮増鎻愪氦
       tags:
       - Purchase
   /purchase/purchase:
@@ -2305,6 +2476,36 @@
       summary: 鍒嗛〉鑾峰彇璐ㄦ鍗曞垪琛�
       tags:
       - QualityInspect
+  /purchase/savePurchaseProductConfirm:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: list
+        in: body
+        name: data
+        required: true
+        schema:
+          items:
+            $ref: '#/definitions/purchaserequest.PurchaseProductConfirmInfo'
+          type: array
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 纭鏀惰揣
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                msg:
+                  type: string
+              type: object
+      security:
+      - ApiKeyAuth: []
+      summary: 纭鏀惰揣
+      tags:
+      - Purchase
   /purchase/submit:
     post:
       consumes:
diff --git a/initialize/gorm.go b/initialize/gorm.go
index 42ae347..d0ef90c 100644
--- a/initialize/gorm.go
+++ b/initialize/gorm.go
@@ -37,6 +37,8 @@
 		test.SupplierMaterial{},
 		purchase.Purchase{},
 		purchase.PurchaseProducts{},
+		purchase.PurchaseProductConfirm{},
+		purchase.PurchaseQualityInspection{},
 	)
 	if err != nil {
 		global.GVA_LOG.Error("register table failed", zap.Error(err))
diff --git a/model/purchase/purchase.go b/model/purchase/purchase.go
index 79d8203..634202a 100644
--- a/model/purchase/purchase.go
+++ b/model/purchase/purchase.go
@@ -48,11 +48,14 @@
 type OrderStatus int
 
 const (
-	OrderStatusConfirmed OrderStatus = 1 //寰呯‘璁�
-	OrderStatusReceived  OrderStatus = 2 //寰呭叆搴�
-	OrderStatusStored    OrderStatus = 3 //宸插叆搴�
-	OrderStatusCompleted OrderStatus = 4 //宸插畬鎴�
-	OrderStatusCanceled  OrderStatus = 5 //宸插彇娑�
+	OrderStatusConfirmed   OrderStatus = 1 //寰呯‘璁�
+	OrderStatusReceived    OrderStatus = 2 //寰呭叆搴�
+	OrderStatusStored      OrderStatus = 3 //宸插叆搴�
+	OrderStatusCompleted   OrderStatus = 4 //宸插畬鎴�
+	OrderStatusCanceled    OrderStatus = 5 //宸插彇娑�
+	OrderStatusWaitReceive OrderStatus = 6 //寰呮敹璐�
+	OrderStatusPartReceive OrderStatus = 7 //閮ㄥ垎鏀惰揣
+	OrderStatusWaitQuality OrderStatus = 8 //寰呰川妫�
 )
 
 type WholeDiscountType int
diff --git a/model/purchase/purchase_product_confirm.go b/model/purchase/purchase_product_confirm.go
new file mode 100644
index 0000000..6c07f45
--- /dev/null
+++ b/model/purchase/purchase_product_confirm.go
@@ -0,0 +1,27 @@
+package purchase
+
+import (
+	"github.com/shopspring/decimal"
+	"srm/global"
+)
+
+// PurchaseProductConfirm 閲囪喘鍗曚骇鍝佺‘璁よ〃
+type PurchaseProductConfirm struct {
+	global.GVA_MODEL_INT
+	PurchaseNumber       string          `json:"purchaseNumber" gorm:"type:varchar(255);comment:閲囪喘鍗曠紪鍙�"`
+	ProductId            string          `json:"productId"  gorm:"type:varchar(255);comment:浜у搧缂栫爜"`
+	ProductName          string          `json:"productName"  gorm:"type:varchar(255);comment:浜у搧鍚�"`
+	Principal            string          `json:"principal" gorm:"type:varchar(255);comment:鏀惰揣浜�"`
+	Unit                 string          `json:"unit" gorm:"type:varchar(255);comment:璁¢噺鍗曚綅"`
+	Specs                string          `json:"specs" gorm:"type:varchar(255);comment:瑙勬牸"`
+	Type                 string          `json:"type" gorm:"type:varchar(255);comment:鍨嬪彿"`
+	Amount               decimal.Decimal `json:"amount" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"`
+	OverReceiveAmount    decimal.Decimal `json:"overReceiveAmount" gorm:"type:decimal(12,4);comment:宸叉敹璐ф暟閲�"`
+	NotReceiveAmount     decimal.Decimal `json:"notReceiveAmount" gorm:"type:decimal(12,4);comment:鏈敹璐ф暟閲�"`
+	NowReceiveAmount     decimal.Decimal `json:"nowReceiveAmount" gorm:"-"` //鏈鏀惰揣鏁伴噺
+	SurplusReceiveAmount decimal.Decimal `json:"surplusReceiveAmount" gorm:"type:decimal(12,4);comment:鍓╀綑鏀惰揣鏁伴噺"`
+}
+
+func (PurchaseProductConfirm) TableName() string {
+	return "srm_purchase_product_confirm"
+}
diff --git a/model/purchase/purchase_quality_inspection.go b/model/purchase/purchase_quality_inspection.go
new file mode 100644
index 0000000..78e9ab6
--- /dev/null
+++ b/model/purchase/purchase_quality_inspection.go
@@ -0,0 +1,31 @@
+package purchase
+
+import (
+	"github.com/shopspring/decimal"
+	"srm/global"
+)
+
+// PurchaseQualityInspection 閲囪喘浜у搧璐ㄦ琛�
+type PurchaseQualityInspection struct {
+	global.GVA_MODEL_INT
+	PurchaseNumber string          `json:"purchaseNumber" gorm:"type:varchar(255);comment:閲囪喘鍗曠紪鍙�"`
+	ProductId      string          `json:"productId"  gorm:"type:varchar(255);comment:浜у搧缂栫爜"`
+	ProductName    string          `json:"productName"  gorm:"type:varchar(255);comment:浜у搧鍚�"`
+	Principal      string          `json:"principal" gorm:"type:varchar(255);comment:鏀惰揣浜�"`
+	Unit           string          `json:"unit" gorm:"type:varchar(255);comment:璁¢噺鍗曚綅"`
+	Specs          string          `json:"specs" gorm:"type:varchar(255);comment:瑙勬牸"`
+	Type           string          `json:"type" gorm:"type:varchar(255);comment:鍨嬪彿"`
+	Amount         decimal.Decimal `json:"amount" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"`
+	Status         int             `json:"status"  gorm:"type:int;comment:鐘舵��,1寰呰川妫�,2宸插叆搴�,3涓嶅悎鏍�"`
+	CreateTime     string          `json:"createTime" gorm:"type:varchar(255);comment:鍒涘缓鏃堕棿"`
+}
+
+func (PurchaseQualityInspection) TableName() string {
+	return "srm_purchase_quality_inspection"
+}
+
+const (
+	WaitInspection = iota + 1 //寰呰川妫�
+	InWarehouse               //宸插叆搴�
+	Unqualified               //涓嶅悎鏍�
+)
diff --git a/model/purchase/request/purchase.go b/model/purchase/request/purchase.go
index 3315919..1612ce1 100644
--- a/model/purchase/request/purchase.go
+++ b/model/purchase/request/purchase.go
@@ -51,3 +51,30 @@
 	Principal           string                       `json:"principal" form:"principal" gorm:"type:varchar(255);not null;default '';comment:浠撳簱璐熻矗浜�"`                      //浠撳簱璐熻矗浜�
 	SourceOrder         string                       `json:"sourceOrder" gorm:"type:varchar(255);comment:鏉ユ簮鍗曟嵁"`                                                          //鏉ユ簮鍗曟嵁
 }
+
+type PurchaseProductConfirmInfo struct {
+	PurchaseNumber       string          `json:"purchaseNumber" gorm:"type:varchar(255);comment:閲囪喘鍗曠紪鍙�"`
+	ProductId            string          `json:"productId"  gorm:"type:varchar(255);comment:浜у搧缂栫爜"`
+	ProductName          string          `json:"productName"  gorm:"type:varchar(255);comment:浜у搧鍚�"`
+	Principal            string          `json:"principal" gorm:"type:varchar(255);comment:鏀惰揣浜�"`
+	Unit                 string          `json:"unit" gorm:"type:varchar(255);comment:璁¢噺鍗曚綅"`
+	Specs                string          `json:"specs" gorm:"type:varchar(255);comment:瑙勬牸"`
+	Type                 string          `json:"type" gorm:"type:varchar(255);comment:鍨嬪彿"`
+	Amount               decimal.Decimal `json:"amount" gorm:"type:decimal(12,4);not null;comment:閲囪喘鏁伴噺"`
+	OverReceiveAmount    decimal.Decimal `json:"overReceiveAmount" gorm:"type:decimal(12,4);comment:宸叉敹璐ф暟閲�"`
+	NotReceiveAmount     decimal.Decimal `json:"notReceiveAmount" gorm:"type:decimal(12,4);comment:鏈敹璐ф暟閲�"`
+	NowReceiveAmount     decimal.Decimal `json:"nowReceiveAmount" gorm:"type:decimal(12,4);comment:鏈鏀惰揣鏁伴噺"`
+	SurplusReceiveAmount decimal.Decimal `json:"surplusReceiveAmount" gorm:"type:decimal(12,4);comment:鍓╀綑鏀惰揣鏁伴噺"`
+}
+
+type GetQualityInspectionInfo struct {
+	PurchaseNumber string   `json:"purchaseNumber"`
+	Status         []int    `json:"status"`
+	Times          []string `json:"times"`
+}
+
+type SaveQualityInspectionInfo struct {
+	PurchaseId uint  `json:"purchaseId"`
+	Ids        []int `json:"ids"`
+	Status     int   `json:"status"`
+}
diff --git a/proto/purchase_wms.proto b/proto/purchase_wms.proto
index 5c9c5cf..0ac4a1b 100644
--- a/proto/purchase_wms.proto
+++ b/proto/purchase_wms.proto
@@ -23,9 +23,11 @@
 
 message PurchaseToWmsRequest {
   string Number = 1; //閲囪喘缂栧彿
-  string SupplierName = 2; //渚涘簲鍟�
+  string SupplierName = 2; //渚涘簲鍟嗗悕绉�
   string Source = 3;//鏉ユ簮
-  repeated PurchaseProduct Product = 4;
+  int64 SupplierId = 4;//渚涘簲鍟唅d
+  string WarehouseName = 5;//浠撳簱鍚嶇О
+  repeated PurchaseProduct Product = 6;
 }
 
 message PurchaseToWmsResponse {
diff --git a/proto/purchase_wms/purchase_wms.pb.go b/proto/purchase_wms/purchase_wms.pb.go
index 0c09b8c..1c15413 100644
--- a/proto/purchase_wms/purchase_wms.pb.go
+++ b/proto/purchase_wms/purchase_wms.pb.go
@@ -80,10 +80,12 @@
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Number       string             `protobuf:"bytes,1,opt,name=Number,proto3" json:"Number,omitempty"`             //閲囪喘缂栧彿
-	SupplierName string             `protobuf:"bytes,2,opt,name=SupplierName,proto3" json:"SupplierName,omitempty"` //渚涘簲鍟�
-	Source       string             `protobuf:"bytes,3,opt,name=Source,proto3" json:"Source,omitempty"`             //鏉ユ簮
-	Product      []*PurchaseProduct `protobuf:"bytes,4,rep,name=Product,proto3" json:"Product,omitempty"`
+	Number        string             `protobuf:"bytes,1,opt,name=Number,proto3" json:"Number,omitempty"`               //閲囪喘缂栧彿
+	SupplierName  string             `protobuf:"bytes,2,opt,name=SupplierName,proto3" json:"SupplierName,omitempty"`   //渚涘簲鍟嗗悕绉�
+	Source        string             `protobuf:"bytes,3,opt,name=Source,proto3" json:"Source,omitempty"`               //鏉ユ簮
+	SupplierId    int64              `protobuf:"varint,4,opt,name=SupplierId,proto3" json:"SupplierId,omitempty"`      //渚涘簲鍟唅d
+	WarehouseName string             `protobuf:"bytes,5,opt,name=WarehouseName,proto3" json:"WarehouseName,omitempty"` //浠撳簱鍚嶇О
+	Product       []*PurchaseProduct `protobuf:"bytes,6,rep,name=Product,proto3" json:"Product,omitempty"`
 }
 
 func (x *PurchaseToWmsRequest) Reset() {
@@ -135,6 +137,20 @@
 func (x *PurchaseToWmsRequest) GetSource() string {
 	if x != nil {
 		return x.Source
+	}
+	return ""
+}
+
+func (x *PurchaseToWmsRequest) GetSupplierId() int64 {
+	if x != nil {
+		return x.SupplierId
+	}
+	return 0
+}
+
+func (x *PurchaseToWmsRequest) GetWarehouseName() string {
+	if x != nil {
+		return x.WarehouseName
 	}
 	return ""
 }
@@ -1335,190 +1351,195 @@
 	0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20,
 	0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e,
 	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22,
-	0x96, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d,
+	0xdc, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d,
 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x75, 0x6d, 0x62,
 	0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
 	0x12, 0x22, 0x0a, 0x0c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72,
 	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x07,
-	0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,
-	0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52,
-	0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x63, 0x0a, 0x15, 0x50, 0x75, 0x72, 0x63,
-	0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
-	0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
-	0x1c, 0x0a, 0x09, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x09, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x22, 0x35, 0x0a,
-	0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06,
-	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4e, 0x75,
-	0x6d, 0x62, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75,
-	0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x22, 0x41, 0x0a, 0x21, 0x47, 0x65,
-	0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50,
-	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x22, 0x78, 0x0a,
-	0x0c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a,
-	0x0a, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x0a, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a,
-	0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d,
-	0x65, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69,
-	0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61,
-	0x73, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x53, 0x75,
-	0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x64,
-	0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a,
-	0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x43, 0x6f, 0x64,
-	0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-	0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74,
-	0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x8a, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65,
-	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x53, 0x75, 0x70, 0x70, 0x6c,
-	0x69, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
-	0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,
-	0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53,
-	0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x6f, 0x75,
-	0x72, 0x63, 0x65, 0x22, 0x6b, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72,
-	0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x75, 0x72, 0x63,
-	0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-	0x22, 0x42, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x75,
-	0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x0f, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d,
-	0x62, 0x65, 0x72, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0c, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73,
-	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73,
-	0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70,
-	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x22, 0x0a,
-	0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d,
-	0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d,
-	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65,
-	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a,
-	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
-	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64,
-	0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75,
-	0x63, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64,
-	0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x70, 0x65, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75,
-	0x6e, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12,
-	0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x41, 0x6d, 0x6f,
-	0x75, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61,
-	0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23,
-	0x0a, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
-	0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x49, 0x6e,
-	0x66, 0x6f, 0x73, 0x22, 0x34, 0x0a, 0x14, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70,
-	0x6c, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50,
-	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09,
-	0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x15, 0x45, 0x78, 0x69,
-	0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x05, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x72, 0x6d, 0x47,
-	0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x10, 0x53, 0x72, 0x6d, 0x57, 0x61, 0x72,
-	0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18,
-	0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e,
-	0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69,
-	0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x44, 0x0a, 0x1b, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74,
-	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x72, 0x6d, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
-	0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x34, 0x0a, 0x1a,
-	0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75,
-	0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62,
-	0x65, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x0c, 0x53, 0x72, 0x6d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x77,
-	0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0d, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x4e, 0x61, 0x6d,
-	0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e,
-	0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49,
-	0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x76, 0x65,
-	0x72, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x76, 0x65,
-	0x72, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x67, 0x6e,
-	0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x67,
-	0x6e, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4c, 0x0a, 0x1b, 0x53,
-	0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
-	0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x6f, 0x70,
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d,
-	0x2e, 0x53, 0x72, 0x6d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f,
-	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6d, 0x0a, 0x1a, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x41, 0x70, 0x73,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x71,
-	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
-	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x32, 0xeb, 0x05, 0x0a, 0x0f, 0x50, 0x75, 0x72,
-	0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x0d,
-	0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d, 0x73, 0x12, 0x15, 0x2e,
-	0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54,
-	0x6f, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x14,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a,
+	0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0a, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0d, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x50, 0x72,
+	0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x63,
+	0x0a, 0x15, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75,
+	0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x22, 0x35, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72,
 	0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68,
-	0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69,
-	0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49,
-	0x64, 0x12, 0x22, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c,
+	0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x1c, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f,
+	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10,
+	0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67,
+	0x22, 0x41, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c,
 	0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c,
-	0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
-	0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x13,
-	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79,
-	0x57, 0x6d, 0x73, 0x12, 0x1b, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63,
-	0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x1c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73,
-	0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49,
-	0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73,
-	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x47,
-	0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0d, 0x45, 0x78, 0x69, 0x73,
-	0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x45, 0x78, 0x69, 0x73,
-	0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x16, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x13, 0x53, 0x72,
-	0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66,
-	0x6f, 0x12, 0x1b, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
-	0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c,
-	0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65,
-	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52,
-	0x0a, 0x13, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70,
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+	0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,
+	0x74, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x0c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c,
+	0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65,
+	0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c,
+	0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68,
+	0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d,
+	0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x6d, 0x0a,
+	0x22, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74,
+	0x42, 0x79, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x04, 0x4c, 0x69, 0x73,
+	0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69,
+	0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x8a, 0x01, 0x0a,
+	0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42,
+	0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53,
+	0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0a, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50,
+	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x6d, 0x6f,
+	0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e,
+	0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x6b, 0x0a, 0x1b, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03,
+	0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x26,
+	0x0a, 0x0e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65,
+	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72,
+	0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x28, 0x0a, 0x0f, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62,
+	0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x50, 0x75, 0x72, 0x63, 0x68,
+	0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0c, 0x50,
+	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x70,
+	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6d,
+	0x62, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68,
+	0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c,
+	0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73,
+	0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61,
+	0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f,
+	0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70,
+	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a,
+	0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73,
+	0x70, 0x65, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x70, 0x65, 0x63,
+	0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x41,
+	0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e,
+	0x69, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x17, 0x47, 0x65, 0x74,
+	0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e,
+	0x66, 0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x34, 0x0a, 0x14, 0x45, 0x78, 0x69,
+	0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x22,
+	0x2d, 0x0a, 0x15, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x69, 0x73,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0x1c,
+	0x0a, 0x1a, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73,
+	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x10,
+	0x53, 0x72, 0x6d, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c,
+	0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x44, 0x0a, 0x1b,
+	0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x69,
+	0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x72, 0x6d, 0x57,
+	0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e,
+	0x66, 0x6f, 0x22, 0x34, 0x0a, 0x1a, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x0c, 0x53, 0x72, 0x6d,
+	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d,
+	0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+	0x72, 0x12, 0x24, 0x0a, 0x0d, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x4e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75,
+	0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72,
+	0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f,
+	0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72,
+	0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+	0x1a, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63,
+	0x6f, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x63, 0x6f, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x22, 0x4c, 0x0a, 0x1b, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61,
 	0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x2d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x72, 0x6d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+	0x6d, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73,
+	0x65, 0x42, 0x79, 0x41, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a,
+	0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12,
+	0x2d, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57,
+	0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x32, 0xeb,
+	0x05, 0x0a, 0x0f, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f,
+	0x57, 0x6d, 0x73, 0x12, 0x15, 0x2e, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f,
+	0x57, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x50, 0x75, 0x72,
+	0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x55, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63,
+	0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x1a, 0x47, 0x65, 0x74,
+	0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72,
+	0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70,
+	0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x64, 0x75,
+	0x63, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x47, 0x65,
+	0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x50,
+	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 	0x22, 0x00, 0x12, 0x52, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63,
-	0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x41, 0x70, 0x73, 0x12, 0x1b, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x41, 0x70, 0x73, 0x52,
+	0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x12, 0x1b, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
 	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x10, 0x5a, 0x0e, 0x2e, 0x2f, 0x70, 0x75, 0x72, 0x63,
-	0x68, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72,
+	0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x18, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40,
+	0x0a, 0x0d, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12,
+	0x15, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x53, 0x75,
+	0x70, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x52, 0x0a, 0x13, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72, 0x65, 0x68, 0x6f,
+	0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74,
+	0x57, 0x61, 0x72, 0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x57, 0x61, 0x72,
+	0x65, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x13, 0x53, 0x72, 0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x2e, 0x53, 0x72,
+	0x6d, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x53, 0x72, 0x6d, 0x47, 0x65,
+	0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x41, 0x70, 0x73, 0x12,
+	0x1b, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65,
+	0x42, 0x79, 0x41, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x42, 0x79, 0x57,
+	0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x10, 0x5a, 0x0e,
+	0x2e, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x6d, 0x73, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/router/purchase/purchase.go b/router/purchase/purchase.go
index 3273abd..740c698 100644
--- a/router/purchase/purchase.go
+++ b/router/purchase/purchase.go
@@ -9,16 +9,21 @@
 	purchaseRouter := Router.Group("purchase")
 	PurchaseApi := purchase.PurchaseApi{}
 	{
-		purchaseRouter.POST("purchase", PurchaseApi.CreatePurchase)              // 鍒涘缓閲囪喘鍗�
-		purchaseRouter.PUT("purchase", PurchaseApi.UpdatePurchase)               // 鏇存柊閲囪喘鍗�
-		purchaseRouter.DELETE("purchase/:id", PurchaseApi.DeletePurchase)        // 鍒犻櫎閲囪喘鍗�
-		purchaseRouter.GET("purchase/:id", PurchaseApi.GetPurchase)              // 鑾峰彇鍗曚竴閲囪喘鍗曚俊鎭�
-		purchaseRouter.GET("purchaseList", PurchaseApi.GetPurchaseList)          // 鑾峰彇閲囪喘鍗曞垪琛�
-		purchaseRouter.POST("submit", PurchaseApi.Submit)                        // 鎻愪氦閲囪喘鍗�
-		purchaseRouter.POST("purchaseType", PurchaseApi.SavePurchaseType)        // 淇濆瓨閲囪喘绫诲瀷
-		purchaseRouter.GET("purchaseTypeList", PurchaseApi.GetPurchaseTypeList)  // 鏌ヨ閲囪喘绫诲瀷
-		purchaseRouter.GET("getWarehouseInfo", PurchaseApi.GetWarehouseInfo)     // 鑾峰彇浠撳簱鍒楄〃
-		purchaseRouter.GET("getOperationInfo/:id", PurchaseApi.GetOperationInfo) // 鑾峰彇鎿嶄綔淇℃伅
+		purchaseRouter.POST("purchase", PurchaseApi.CreatePurchase)                                             // 鍒涘缓閲囪喘鍗�
+		purchaseRouter.PUT("purchase", PurchaseApi.UpdatePurchase)                                              // 鏇存柊閲囪喘鍗�
+		purchaseRouter.DELETE("purchase/:id", PurchaseApi.DeletePurchase)                                       // 鍒犻櫎閲囪喘鍗�
+		purchaseRouter.GET("purchase/:id", PurchaseApi.GetPurchase)                                             // 鑾峰彇鍗曚竴閲囪喘鍗曚俊鎭�
+		purchaseRouter.GET("purchaseList", PurchaseApi.GetPurchaseList)                                         // 鑾峰彇閲囪喘鍗曞垪琛�
+		purchaseRouter.POST("submit", PurchaseApi.Submit)                                                       // 鎻愪氦閲囪喘鍗�
+		purchaseRouter.POST("purchaseType", PurchaseApi.SavePurchaseType)                                       // 淇濆瓨閲囪喘绫诲瀷
+		purchaseRouter.GET("purchaseTypeList", PurchaseApi.GetPurchaseTypeList)                                 // 鏌ヨ閲囪喘绫诲瀷
+		purchaseRouter.GET("getWarehouseInfo", PurchaseApi.GetWarehouseInfo)                                    // 鑾峰彇浠撳簱鍒楄〃
+		purchaseRouter.GET("getOperationInfo/:id", PurchaseApi.GetOperationInfo)                                // 鑾峰彇鎿嶄綔淇℃伅
+		purchaseRouter.GET("newSubmit/:id", PurchaseApi.NewSubmit)                                              // 鏂扮増鎻愪氦
+		purchaseRouter.GET("getPurchaseProductConfirmInfo/:number", PurchaseApi.GetPurchaseProductConfirmInfo)  // 鑾峰彇纭淇℃伅
+		purchaseRouter.POST("savePurchaseProductConfirm", PurchaseApi.SavePurchaseProductConfirm)               // 纭鏀惰揣
+		purchaseRouter.POST("getPurchaseQualityInspectionInfo", PurchaseApi.GetPurchaseQualityInspectionInfo)   // 鑾峰彇閲囪喘璐ㄦ淇℃伅淇℃伅
+		purchaseRouter.POST("savePurchaseQualityInspectionInfo", PurchaseApi.SavePurchaseQualityInspectionInfo) // 淇濆瓨閲囪喘璐ㄦ淇℃伅淇℃伅
 	}
 
 	qualityInspectRouter := Router.Group("purchase")
diff --git a/service/purchase/purchase.go b/service/purchase/purchase.go
index de89020..cafe909 100644
--- a/service/purchase/purchase.go
+++ b/service/purchase/purchase.go
@@ -11,6 +11,8 @@
 	purchaserequest "srm/model/purchase/request"
 	"srm/proto/qualityinspect"
 	"srm/service/test"
+	"srm/utils"
+	"time"
 )
 
 type PurchaseService struct{}
@@ -291,3 +293,111 @@
 	err := global.GVA_DB.Model(&purchase.Purchase{}).Count(&total).Error
 	return int(total), err
 }
+
+func (slf *PurchaseService) SavePurchaseProductConfirm(list []*purchase.PurchaseProductConfirm) (err error) {
+	if len(list) == 0 {
+		return errors.New("浜у搧鍒楄〃涓嶈兘涓虹┖")
+	}
+	purchaseNumber := list[0].PurchaseNumber
+	var pur purchase.Purchase
+	err = global.GVA_DB.Where("number = ?", purchaseNumber).First(&pur).Error
+	if err != nil {
+		return err
+	}
+
+	m := make(map[string]interface{})
+	now := int64(0)
+	yu := int64(0)
+	for _, confirm := range list {
+		if !confirm.NowReceiveAmount.IsZero() {
+			now = confirm.NowReceiveAmount.IntPart()
+		}
+		if !confirm.SurplusReceiveAmount.IsZero() {
+			yu = confirm.SurplusReceiveAmount.IntPart()
+		}
+		confirm.OverReceiveAmount = confirm.OverReceiveAmount.Add(confirm.NowReceiveAmount)
+		confirm.NotReceiveAmount = confirm.Amount.Sub(confirm.OverReceiveAmount)
+	}
+	if now == 0 && yu > 0 {
+		m["status"] = purchase.OrderStatusWaitReceive
+	}
+	if now > 0 && yu > 0 {
+		m["status"] = purchase.OrderStatusPartReceive
+	}
+	if now > 0 && yu == 0 {
+		m["status"] = purchase.OrderStatusWaitQuality
+	}
+
+	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		err = tx.Where("purchase_number = ?", purchaseNumber).Delete(&purchase.PurchaseProductConfirm{}).Error
+		if err != nil {
+			return err
+		}
+
+		err = tx.Create(list).Error
+		if err != nil {
+			return err
+		}
+		err = tx.Where("number = ?", purchaseNumber).Model(&purchase.Purchase{}).Updates(m).Error
+		if err != nil {
+			return err
+		}
+
+		return nil
+	})
+	return err
+}
+
+func (slf *PurchaseService) GetPurchaseProductConfirmInfo(number string) ([]*purchase.PurchaseProductConfirm, error) {
+	var list []*purchase.PurchaseProductConfirm
+	err := global.GVA_DB.Model(&purchase.PurchaseProductConfirm{}).Where("purchase_number = ?", number).Find(&list).Error
+	return list, err
+}
+
+func (slf *PurchaseService) SavePurchaseQualityInspection(list []*purchase.PurchaseProductConfirm) (err error) {
+	if len(list) == 0 {
+		return errors.New("浜у搧鍒楄〃涓嶈兘涓虹┖")
+	}
+	purchaseNumber := list[0].PurchaseNumber
+	qualityList := make([]*purchase.PurchaseQualityInspection, 0)
+	for _, confirm := range list {
+		var pqi purchase.PurchaseQualityInspection
+		pqi.PurchaseNumber = purchaseNumber
+		pqi.Principal = confirm.Principal
+		pqi.ProductId = confirm.ProductId
+		pqi.ProductName = confirm.ProductName
+		pqi.Amount = confirm.NowReceiveAmount
+		pqi.Status = purchase.WaitInspection
+		pqi.CreateTime = utils.TimeToString(time.Now())
+		pqi.Unit = confirm.Unit
+		pqi.Specs = confirm.Specs
+		pqi.Type = confirm.Type
+		qualityList = append(qualityList, &pqi)
+	}
+	err = global.GVA_DB.Model(purchase.PurchaseQualityInspection{}).Create(qualityList).Error
+	return err
+}
+
+func (slf *PurchaseService) GetPurchaseQualityInspection(params purchaserequest.GetQualityInspectionInfo) ([]*purchase.PurchaseQualityInspection, error) {
+	var list []*purchase.PurchaseQualityInspection
+	db := global.GVA_DB.Model(&purchase.PurchaseQualityInspection{}).Where("purchase_number = ?", params.PurchaseNumber)
+	if len(params.Status) > 0 {
+		db = db.Where("status in (?)", params.Status)
+	}
+	if len(params.Times) > 0 {
+		db = db.Where("create_time in (?)", params.Times)
+	}
+	err := db.Find(&list).Error
+	return list, err
+}
+
+func (slf *PurchaseService) UpdatePurchaseQualityInspection(ids []int, status int) error {
+	err := global.GVA_DB.Model(&purchase.PurchaseQualityInspection{}).Where("id in (?)", ids).Updates(map[string]interface{}{"status": status}).Error
+	return err
+}
+
+func (slf *PurchaseService) GetPurchaseQualityInspectionList(ids []int) ([]*purchase.PurchaseQualityInspection, error) {
+	var list []*purchase.PurchaseQualityInspection
+	err := global.GVA_DB.Model(&purchase.PurchaseQualityInspection{}).Where("id in (?)", ids).Find(&list).Error
+	return list, err
+}
diff --git a/utils/timex.go b/utils/timex.go
new file mode 100644
index 0000000..5e32afd
--- /dev/null
+++ b/utils/timex.go
@@ -0,0 +1,91 @@
+package utils
+
+import (
+	"time"
+)
+
+func StringToTime(timeStr string) (time.Time, error) {
+	return time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
+}
+
+func StringToTime2(timeStr string) (time.Time, error) {
+	return time.ParseInLocation("2006-01-02", timeStr, time.Local)
+}
+
+func StringToTime3(timeStr string) (time.Time, error) {
+	return time.ParseInLocation("2006-01-02 15:04", timeStr, time.Local)
+}
+
+func StringToClock(timeStr string) (time.Time, error) {
+	return time.ParseInLocation("15:04", timeStr, time.Local)
+}
+
+func TimeToString(time time.Time) string {
+	return time.Format("2006-01-02 15:04:05")
+}
+
+func TimeToString2(time time.Time) string {
+	return time.Format("2006-01-02")
+}
+
+func TimeToString3(time time.Time) string {
+	return time.Format("15:04")
+}
+
+func TimeToMonthDay(time time.Time) string {
+	return time.Format("01-02")
+}
+
+func UnixTimeToString(_t int64) string {
+	return time.Unix(_t, 0).In(time.Local).Format("2006-01-02 15:04:05")
+}
+func UnixTimeToDate(_t int64) string {
+	return time.Unix(_t, 0).In(time.Local).Format("2006-01-02")
+}
+
+func DayStartTime(_t int64) int64 {
+	l := time.Unix(_t, 0).In(time.Local)
+	k := time.Date(l.Year(), l.Month(), l.Day(), 0, 0, 0, 0, time.Local).Unix()
+	return k
+}
+
+func DayStart(_t time.Time) time.Time {
+	l := _t.In(time.Local)
+	k := time.Date(l.Year(), l.Month(), l.Day(), 0, 0, 0, 0, time.Local)
+	return k
+}
+
+func DayStartTimeDateStr(_t int64) string {
+	l := time.Unix(_t, 0).In(time.Local)
+	k := time.Date(l.Year(), l.Month(), l.Day(), 0, 0, 0, 0, time.Local)
+	return TimeToString2(k)
+}
+
+const timeLayout = "2006-01-02 15:04:05"
+
+func GetCurrentTime() string {
+	return time.Now().Format(timeLayout)
+}
+
+// WeekdayCount 鏍规嵁寮�濮嬫椂闂存埑锛岀粨鏉熸椂闂存埑(涓嶅惈)杩斿洖宸ヤ綔鏃ュぉ鏁�
+func WeekdayCount(startTs, endTs int64) (workDays int64) {
+	for startTs < endTs {
+		startDate := time.Unix(startTs, 0).In(time.Local)
+		weekday := startDate.Weekday()
+		if weekday >= time.Monday && weekday <= time.Friday {
+			workDays++
+		}
+		startTs += 86400
+	}
+	return workDays
+}
+
+func TodayStartTime() time.Time {
+	l := time.Now().In(time.Local)
+	k := time.Date(l.Year(), l.Month(), l.Day(), 0, 0, 0, 0, time.Local)
+	return k
+}
+
+func TodayStartTs() int64 {
+	return TodayStartTime().Unix()
+}

--
Gitblit v1.8.0