From 527bc709815b9ea0f2ed14450262c9a5832c141f Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 14 三月 2024 16:09:26 +0800
Subject: [PATCH] 根据仓库返回产品剩余数量

---
 proto/product_inventory/server.go |   79 ++++++++++++++++++++++++++++++---------
 1 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/proto/product_inventory/server.go b/proto/product_inventory/server.go
index 14bf8cd..6fb93ca 100644
--- a/proto/product_inventory/server.go
+++ b/proto/product_inventory/server.go
@@ -5,11 +5,11 @@
 	"errors"
 	"github.com/shopspring/decimal"
 	"strconv"
-	"strings"
 	"time"
 	"wms/constvar"
 	"wms/models"
 	"wms/pkg/timex"
+	"wms/service"
 )
 
 type Server struct {
@@ -45,9 +45,11 @@
 	if len(details) == 0 {
 		return resp, nil
 	}
+	var locationIds []int
 	var locationId int
 	for _, detail := range details {
 		productIds = append(productIds, detail.ProductId)
+		locationIds = append(locationIds, detail.LocationId)
 		locationId = detail.LocationId
 	}
 	//鏌ヨ浜у搧淇℃伅
@@ -55,27 +57,12 @@
 	if err != nil {
 		return nil, err
 	}
-	//鏌ヨ浣嶇疆淇℃伅
-	location, err := models.NewLocationSearch().SetID(locationId).First()
+	locationHouseMap, houseLocations, houseMap, err := service.GetWarehouseByLocationIds(locationIds)
 	if err != nil {
 		return nil, err
 	}
-	//鏍规嵁浠撳簱缂╁啓鏌ヨ浠撳簱
-	code := strings.Split(location.JointName, "/")[0]
-	warehouse, err := models.NewWarehouseSearch().SetCode(code).First()
-	if err != nil {
-		return nil, err
-	}
-	//缁熻浠撳簱涓嬫墍鏈変綅缃殑浜у搧鍦ㄥ簱鏁伴噺
-	locations, err := models.NewLocationSearch().SetJointName(code).FindNotTotal()
-	if err != nil {
-		return nil, err
-	}
-	var locationIds []int
-	for _, l := range locations {
-		locationIds = append(locationIds, l.Id)
-	}
-	amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find()
+	warehouse := locationHouseMap[locationId]
+	amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).SetPreload(true).Find()
 	if err != nil {
 		return nil, err
 	}
@@ -135,6 +122,60 @@
 		products = append(products, &p)
 	}
 	resp.ProductList = products
+
+	if req.GroupByWarehouse {
+		canUseMap := make(map[int]map[string]decimal.Decimal) //map[locationID]map[productID]decimal
+		for _, v := range canUse {
+			if canUseMap[v.LocationId] == nil {
+				canUseMap[v.LocationId] = make(map[string]decimal.Decimal)
+			}
+			canUseMap[v.LocationId][v.ProductId] = canUseMap[v.LocationId][v.ProductId].Add(v.Amount)
+		}
+		locationProductAmounts := make(map[int][]*models.LocationProductAmount)
+		for _, v := range amounts {
+			if locationProductAmounts[v.LocationId] == nil {
+				locationProductAmounts[v.LocationId] = make([]*models.LocationProductAmount, 0)
+			}
+			locationProductAmounts[v.LocationId] = append(locationProductAmounts[v.LocationId], v)
+		}
+
+		materialMap := service.MaterialMap(materials)
+
+		var warehouseProductsList []*WarehouseProducts
+		for houseID, locationIDs := range houseLocations {
+			house := houseMap[houseID]
+			productAmountMap := make(map[string]decimal.Decimal, 0)
+			productAvailableNumberMap := make(map[string]decimal.Decimal, 0)
+			productInfoList := make([]*ProductInfo, 0)
+
+			houseProductAmounts := make([]*models.LocationProductAmount, 0)
+			for _, lid := range locationIDs {
+				houseProductAmounts = append(houseProductAmounts, locationProductAmounts[lid]...)
+			}
+			for _, v := range houseProductAmounts {
+				productAmountMap[v.ProductId] = productAmountMap[v.ProductId].Add(v.Amount)
+				productAvailableNumberMap[v.ProductId] = productAvailableNumberMap[v.ProductId].Add(canUseMap[v.LocationId][v.ProductId])
+			}
+			for productID, amount := range productAvailableNumberMap {
+				productInfoList = append(productInfoList, &ProductInfo{
+					Number:          productID,
+					Name:            materialMap[productID].Name,
+					Unit:            materialMap[productID].Unit,
+					Amount:          productAmountMap[productID].String(),
+					AvailableNumber: amount.String(),
+				})
+			}
+
+			warehouseProducts := &WarehouseProducts{
+				WarehouseID:   house.Code,
+				WarehouseName: house.Name,
+				ProductList:   productInfoList,
+			}
+			warehouseProductsList = append(warehouseProductsList, warehouseProducts)
+		}
+		resp.WarehouseProductsList = warehouseProductsList
+	}
+
 	return resp, nil
 }
 

--
Gitblit v1.8.0