From bd33bea0f3b44e608fcb4d9aa9d1f51a2f5bcf17 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期日, 07 四月 2024 19:26:17 +0800
Subject: [PATCH] 新增按仓库分组的发货准备接口

---
 api/v1/salesDetails.go         |  128 ++++++++++++++++++++++++++++++++
 model/response/salesDetails.go |    6 +
 router/salesDetails.go         |    9 +-
 docs/swagger.yaml              |   21 +++++
 docs/docs.go                   |   33 ++++++++
 docs/swagger.json              |   33 ++++++++
 6 files changed, 226 insertions(+), 4 deletions(-)

diff --git a/api/v1/salesDetails.go b/api/v1/salesDetails.go
index 910847a..4f00785 100644
--- a/api/v1/salesDetails.go
+++ b/api/v1/salesDetails.go
@@ -290,6 +290,7 @@
 type GetWarehouseProductInfoReq struct {
 	SaleDetailID     int    `json:"saleDetailID,omitempty"`
 	SaleDetailNumber string `json:"saleDetailNumber,omitempty"`
+	GroupByWarehouse bool   `json:"groupByWarehouse"`
 }
 
 // GetDeliveryPrepareInfo
@@ -396,6 +397,133 @@
 	ctx.OkWithDetailed(storeList)
 }
 
+// GetDeliveryPrepareInfoByWarehouse
+// @Tags		SalesDetails
+// @Summary	鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�
+// @Produce	application/json
+// @Param		object 	body GetWarehouseProductInfoReq	true	"鏄庣粏缂栫爜"
+// @Success	200	{object}	response.ListResponse
+// @Router		/api/salesDetails/getDeliveryPrepareInfoByWarehouse [post]
+func (s *SalesDetailsApi) GetDeliveryPrepareInfoByWarehouse(c *gin.Context) {
+	var params GetWarehouseProductInfoReq
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+	if params.SaleDetailID == 0 {
+		ctx.FailWithMsg(ecode.ParamsErr, "鍙傛暟缂哄け")
+		return
+	}
+
+	salesDetails, err := salesDetailsService.GetSalesDetails(params.SaleDetailID)
+	if err == gorm.ErrRecordNotFound || salesDetails.Number != params.SaleDetailNumber {
+		ctx.FailWithMsg(ecode.ParamsErr, "閿�鍞鍗曚笉瀛樺湪")
+		return
+	}
+
+	productMap := model.ProductMap(salesDetails.Products)
+	client := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn)
+	grpcResp, err := client.GetOrderInputAndOutputInfo(ctx.GetCtx(), &product_inventory.GetOrderInputAndOutputInfoRequest{
+		Number: params.SaleDetailNumber,
+	})
+	if err != nil {
+		if strings.Contains(err.Error(), "record not found") {
+			ctx.Ok()
+			return
+		}
+		logx.Errorf("GetOrderInputAndOutputInfo err: %v", err.Error())
+		ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒")
+		return
+	}
+
+	grpcOutputList := grpcResp.OutputList
+	grpcInputList := grpcResp.InputList
+	inputProductMap := make(map[int64]map[string]*response.StoreInfo)
+	outputProductMap := make(map[int64]map[string]*response.OutputSimpleInfo)
+	warehouseIds := make([]int64, 0)
+	warehouseIdMap := make(map[int64]string, 0)
+	for _, v := range grpcOutputList {
+		if productMap[v.Number] == nil {
+			continue
+		}
+		if outputProductMap[v.WareHouseID] == nil {
+			outputProductMap[v.WareHouseID] = make(map[string]*response.OutputSimpleInfo)
+		}
+		if outputProductMap[v.WareHouseID][v.Number] == nil {
+			simpleInfo := &response.OutputSimpleInfo{
+				Number: v.Number,
+			}
+			amount, _ := decimal.NewFromString(v.Amount)
+			simpleInfo.Amount = amount
+			outputProductMap[v.WareHouseID][v.Number] = simpleInfo
+		} else {
+			amount, _ := decimal.NewFromString(v.Amount)
+			outputProductMap[v.WareHouseID][v.Number].Amount = outputProductMap[v.WareHouseID][v.Number].Amount.Add(amount)
+		}
+	}
+
+	for _, v := range grpcInputList {
+		if _, ok := warehouseIdMap[v.WareHouseID]; !ok {
+			warehouseIds = append(warehouseIds, v.WareHouseID)
+			warehouseIdMap[v.WareHouseID] = v.Warehouse
+		}
+		if productMap[v.Number] == nil {
+			continue
+		}
+		if inputProductMap[v.WareHouseID] == nil {
+			inputProductMap[v.WareHouseID] = make(map[string]*response.StoreInfo)
+		}
+		if inputProductMap[v.WareHouseID][v.Number] == nil {
+			storeInfo := &response.StoreInfo{
+				Number:      v.Number,
+				Name:        v.Name,
+				OrderAmount: productMap[v.Number].Amount,
+			}
+			finishAmount, _ := decimal.NewFromString(v.Amount)
+			storeInfo.FinishAmount = finishAmount
+			storeInfo.AvailableAmount = finishAmount
+			storeInfo.LeftAmount = storeInfo.OrderAmount
+			inputProductMap[v.WareHouseID][v.Number] = storeInfo
+		} else {
+			finishAmount, _ := decimal.NewFromString(v.Amount)
+			inputProductMap[v.WareHouseID][v.Number].FinishAmount = inputProductMap[v.WareHouseID][v.Number].FinishAmount.Add(finishAmount)
+			inputProductMap[v.WareHouseID][v.Number].AvailableAmount = inputProductMap[v.WareHouseID][v.Number].FinishAmount
+		}
+	}
+
+	data := make([]*response.StoreInfoWithWarehouse, 0)
+	for _, houseId := range warehouseIds {
+		storeList := make([]*response.StoreInfo, 0, len(salesDetails.Products))
+		for _, product := range salesDetails.Products {
+			storeInfo := inputProductMap[houseId][product.Number]
+			if storeInfo == nil { //娌℃湁鍏ュ簱淇℃伅
+				storeInfo = &response.StoreInfo{
+					Name:            product.Name,
+					Number:          product.Number,
+					OrderAmount:     product.Amount,
+					FinishAmount:    decimal.Decimal{},
+					LeftAmount:      product.Amount,
+					AvailableAmount: decimal.Decimal{},
+				}
+			} else { //鏈夊叆搴撴暟閲忓啀鏌ュ嚭搴擄紝绠楀嚭鏈彂璐ф暟閲�
+				if outputProductMap[houseId][product.Number] != nil {
+					outputInfo := outputProductMap[houseId][product.Number]
+					storeInfo.LeftAmount = storeInfo.LeftAmount.Sub(outputInfo.Amount)           //鍓╀綑鍙戣揣鏁伴噺 = 璁㈠崟鏁伴噺 - 宸插彂璐ф暟閲�
+					storeInfo.AvailableAmount = storeInfo.AvailableAmount.Sub(outputInfo.Amount) //鍙敤鏁伴噺 = 鍏ュ簱瀹屾垚鏁伴噺 - 宸插彂璐ф暟閲�
+				}
+			}
+			storeList = append(storeList, storeInfo)
+		}
+		data = append(data, &response.StoreInfoWithWarehouse{
+			WarehouseId:   houseId,
+			WarehouseName: warehouseIdMap[houseId],
+			StoreInfoList: storeList,
+		})
+	}
+
+	ctx.OkWithDetailed(data)
+}
+
 // ConfirmOutput
 // @Tags		SalesDetails
 // @Summary	纭鍙戣揣
diff --git a/docs/docs.go b/docs/docs.go
index 875b1b9..ef7fd5c 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -7205,6 +7205,36 @@
                 }
             }
         },
+        "/api/salesDetails/getDeliveryPrepareInfoByWarehouse": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SalesDetails"
+                ],
+                "summary": "鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�",
+                "parameters": [
+                    {
+                        "description": "鏄庣粏缂栫爜",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/v1.GetWarehouseProductInfoReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.ListResponse"
+                        }
+                    }
+                }
+            }
+        },
         "/api/salesDetails/getProductInventoryInfo/{number}": {
             "get": {
                 "produces": [
@@ -20159,6 +20189,9 @@
         "v1.GetWarehouseProductInfoReq": {
             "type": "object",
             "properties": {
+                "groupByWarehouse": {
+                    "type": "boolean"
+                },
                 "saleDetailID": {
                     "type": "integer"
                 },
diff --git a/docs/swagger.json b/docs/swagger.json
index a2f030c..0616a95 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -7193,6 +7193,36 @@
                 }
             }
         },
+        "/api/salesDetails/getDeliveryPrepareInfoByWarehouse": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "SalesDetails"
+                ],
+                "summary": "鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�",
+                "parameters": [
+                    {
+                        "description": "鏄庣粏缂栫爜",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/v1.GetWarehouseProductInfoReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.ListResponse"
+                        }
+                    }
+                }
+            }
+        },
         "/api/salesDetails/getProductInventoryInfo/{number}": {
             "get": {
                 "produces": [
@@ -20147,6 +20177,9 @@
         "v1.GetWarehouseProductInfoReq": {
             "type": "object",
             "properties": {
+                "groupByWarehouse": {
+                    "type": "boolean"
+                },
                 "saleDetailID": {
                     "type": "integer"
                 },
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index a7535cd..544bb9c 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -6578,6 +6578,8 @@
     type: object
   v1.GetWarehouseProductInfoReq:
     properties:
+      groupByWarehouse:
+        type: boolean
       saleDetailID:
         type: integer
       saleDetailNumber:
@@ -11015,6 +11017,25 @@
       summary: 鑾峰彇浜у搧鍏ュ簱淇℃伅
       tags:
       - SalesDetails
+  /api/salesDetails/getDeliveryPrepareInfoByWarehouse:
+    post:
+      parameters:
+      - description: 鏄庣粏缂栫爜
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/v1.GetWarehouseProductInfoReq'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.ListResponse'
+      summary: 鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�
+      tags:
+      - SalesDetails
   /api/salesDetails/getProductInventoryInfo/{number}:
     get:
       parameters:
diff --git a/model/response/salesDetails.go b/model/response/salesDetails.go
index b348199..98e4d06 100644
--- a/model/response/salesDetails.go
+++ b/model/response/salesDetails.go
@@ -134,3 +134,9 @@
 	Margin                  string          `json:"margin"`                  //姣涘埄鐜�
 
 }
+
+type StoreInfoWithWarehouse struct {
+	WarehouseId   int64        `json:"warehouseId,omitempty"`
+	WarehouseName string       `json:"warehouseName,omitempty"`
+	StoreInfoList []*StoreInfo `json:"storeInfoList,omitempty"`
+}
diff --git a/router/salesDetails.go b/router/salesDetails.go
index 0ab6f54..67f4360 100644
--- a/router/salesDetails.go
+++ b/router/salesDetails.go
@@ -22,10 +22,11 @@
 		salesDetailsRouter.GET("getApsProjectList", salesDetailsApi.GetApsProjectList)                          // 鑾峰彇aps椤圭洰鍒楄〃
 		salesDetailsRouter.POST("sendSalesDetailsToOtherSystem", salesDetailsApi.SendSalesDetailsToOtherSystem) // 鎺ㄩ�侀攢鍞槑缁嗕俊鎭埌鍏朵粬绯荤粺                    // 鍒涘缓浜у搧鍑哄簱淇℃伅
 
-		salesDetailsRouter.POST("getDeliveryPrepareInfo", salesDetailsApi.GetDeliveryPrepareInfo) // 鍙戣揣鍑嗗
-		salesDetailsRouter.POST("getDeliveryList", salesDetailsApi.GetDeliveryList)               // 鍙戣揣鏄庣粏
-		salesDetailsRouter.POST("confirmOutput", salesDetailsApi.ConfirmOutput)                   // 纭鍙戣揣
-		salesDetailsRouter.POST("confirmOutputOver", salesDetailsApi.ConfirmOutputOver)           // 鍙戣揣瀹屾垚
+		salesDetailsRouter.POST("getDeliveryPrepareInfo", salesDetailsApi.GetDeliveryPrepareInfo)                       // 鍙戣揣鍑嗗
+		salesDetailsRouter.POST("getDeliveryPrepareInfoByWarehouse", salesDetailsApi.GetDeliveryPrepareInfoByWarehouse) // 鍙戣揣鍑嗗,鎸変粨搴撳垎缁�
+		salesDetailsRouter.POST("getDeliveryList", salesDetailsApi.GetDeliveryList)                                     // 鍙戣揣鏄庣粏
+		salesDetailsRouter.POST("confirmOutput", salesDetailsApi.ConfirmOutput)                                         // 纭鍙戣揣
+		salesDetailsRouter.POST("confirmOutputOver", salesDetailsApi.ConfirmOutputOver)                                 // 鍙戣揣瀹屾垚
 
 	}
 }

--
Gitblit v1.8.0