From 5083f183f6f2695198c02027640c0f98e067522e Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 15 三月 2024 16:36:31 +0800
Subject: [PATCH] 获取出入库信息grpc接口

---
 proto/product_inventory/server.go |  217 +++++++++++++++++++++++++++++++++--------------------
 1 files changed, 135 insertions(+), 82 deletions(-)

diff --git a/proto/product_inventory/server.go b/proto/product_inventory/server.go
index 14fa029..e76b520 100644
--- a/proto/product_inventory/server.go
+++ b/proto/product_inventory/server.go
@@ -5,6 +5,7 @@
 	"errors"
 	"github.com/shopspring/decimal"
 	"strconv"
+	"strings"
 	"time"
 	"wms/constvar"
 	"wms/models"
@@ -17,14 +18,12 @@
 }
 
 type ProductAndLocationInfo struct {
-	ProductId      string          `json:"productId"`
-	Amount         decimal.Decimal `json:"amount"`
-	LocationId     int             `json:"locationId"`
-	FromLocationId int             `json:"fromLocationId"`
-	ToLocationId   int             `json:"toLocationId"`
-	Number         string          `json:"number"`
-	WaybillNumber  string          `json:"waybillNumber"`
-	Name           string          `json:"name"`
+	ProductId     string          `json:"productId"`
+	Amount        decimal.Decimal `json:"amount"`
+	LocationId    int             `json:"locationId"`
+	Number        string          `json:"number"`
+	WaybillNumber string          `json:"waybillNumber"`
+	Name          string          `json:"name"`
 }
 
 func (s *Server) GetInventoryProductInfo(ctx context.Context, req *GetInventoryProductInfoRequest) (*GetInventoryProductInfoResponse, error) {
@@ -35,47 +34,49 @@
 	var details []ProductAndLocationInfo
 	var productIds []string
 	resp := new(GetInventoryProductInfoResponse)
-	search := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
-		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation_details.from_location_id,wms_operation_details.to_location_id"+
+	err := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
+		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation_details.from_location_id as location_id,"+
 			"wms_operation.number,wms_operation.waybill_number, logistic_company.name").
 		Joins("left join wms_operation on wms_operation.id = wms_operation_details.operation_id").
 		Joins("left join logistic_company on logistic_company.id = wms_operation.logistic_company_id").
-		Where("wms_operation.source_number = ?", req.Number)
-	if req.IsInput {
-		search.Where("wms_operation.base_operation_type = ?", constvar.BaseOperationTypeIncoming)
-	}
-	if req.IsOutput {
-		search.Where("wms_operation.base_operation_type = ?", constvar.BaseOperationTypeOutgoing)
-	}
-	err := search.Find(&details).Error
+		Where("wms_operation.source_number = ?", req.Number).Find(&details).Error
 	if err != nil {
 		return nil, err
 	}
 	if len(details) == 0 {
 		return resp, nil
 	}
-	var locationIds []int
 	var locationId int
 	for _, detail := range details {
 		productIds = append(productIds, detail.ProductId)
-		if req.IsInput { //鍙煡鍏ュ簱
-			locationIds = append(locationIds, detail.ToLocationId)
-		} else if req.IsOutput { //鍙煡鍑哄簱
-			locationIds = append(locationIds, detail.FromLocationId)
-		}
-		locationId = detail.FromLocationId
+		locationId = detail.LocationId
 	}
 	//鏌ヨ浜у搧淇℃伅
 	materials, err := models.NewMaterialSearch().SetIDs(productIds).FindNotTotal()
 	if err != nil {
 		return nil, err
 	}
-	locationHouseMap, houseLocations, houseMap, err := service.GetWarehouseByLocationIds(locationIds)
+	//鏌ヨ浣嶇疆淇℃伅
+	location, err := models.NewLocationSearch().SetID(locationId).First()
 	if err != nil {
 		return nil, err
 	}
-	warehouse := locationHouseMap[locationId]
-	amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).SetPreload(true).Find()
+	//鏍规嵁浠撳簱缂╁啓鏌ヨ浠撳簱
+	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()
 	if err != nil {
 		return nil, err
 	}
@@ -135,60 +136,6 @@
 		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
 }
 
@@ -256,3 +203,109 @@
 	resp := new(CreateOperationResponse)
 	return resp, err
 }
+
+type InputAndOutputDetails struct {
+	ProductId         string                     `json:"productId"`
+	Amount            decimal.Decimal            `json:"amount"`
+	FromLocationId    int                        `json:"fromLocationId"`
+	ToLocationId      int                        `json:"toLocationId"`
+	Number            string                     `json:"number"`
+	WaybillNumber     string                     `json:"waybillNumber"`
+	Name              string                     `json:"name"`
+	BaseOperationType constvar.BaseOperationType `json:"baseOperationType"`
+	Status            constvar.OperationStatus   `json:"status"`
+	CreatedAt         time.Time
+}
+
+func (s *Server) GetOrderInputAndOutputInfo(ctx context.Context, req *GetOrderInputAndOutputInfoRequest) (*GetOrderInputAndOutputInfoResponse, error) {
+	if req.Number == "" {
+		return nil, errors.New("鍙傛暟涓嶈兘涓虹┖")
+	}
+	var details []InputAndOutputDetails
+	var productIds []string
+	resp := new(GetOrderInputAndOutputInfoResponse)
+
+	search := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
+		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation_details.from_location_id,wms_operation_details.to_location_id,"+
+			"wms_operation.number,wms_operation.waybill_number, logistic_company.name, wms_operation.base_operation_type, wms_operation.status, wms_operation.created_at").
+		Joins("left join wms_operation on wms_operation.id = wms_operation_details.operation_id").
+		Joins("left join logistic_company on logistic_company.id = wms_operation.logistic_company_id").
+		Where("wms_operation.source_number = ?", req.Number).
+		Where("wms_operation.base_operation_type in ?", []constvar.BaseOperationType{
+			constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeOutgoing}).
+		Where("wms_operation.status in ?", []constvar.OperationStatus{constvar.OperationStatus_Ready, constvar.OperationStatus_Finish})
+
+	err := search.Find(&details).Error
+	if err != nil {
+		return nil, err
+	}
+	if len(details) == 0 {
+		return resp, nil
+	}
+	var locationIds []int
+	productInputMap := make(map[string]decimal.Decimal)
+	productOutputMap := make(map[string]decimal.Decimal)
+	for _, detail := range details {
+		productIds = append(productIds, detail.ProductId)
+		if detail.BaseOperationType == constvar.BaseOperationTypeIncoming {
+			productInputMap[detail.ProductId] = productInputMap[detail.ProductId].Add(detail.Amount)
+			locationIds = append(locationIds, detail.ToLocationId) //鍏ュ簱浣嶇疆
+		}
+		if detail.BaseOperationType == constvar.BaseOperationTypeOutgoing {
+			productOutputMap[detail.ProductId] = productOutputMap[detail.ProductId].Add(detail.Amount)
+		}
+	}
+	//鏌ヨ浜у搧淇℃伅
+	materials, err := models.NewMaterialSearch().SetIDs(productIds).FindNotTotal()
+	if err != nil {
+		return nil, err
+	}
+	locationHouseMap, _, _, err := service.GetWarehouseByLocationIds(locationIds)
+	if err != nil {
+		return nil, err
+	}
+	materialsMap := service.MaterialMap(materials)
+
+	inputList := make([]*InputAndOutputInfo, 0)
+	outputList := make([]*InputAndOutputInfo, 0)
+
+	for _, detail := range details {
+		if materialsMap[detail.ProductId] == nil {
+			continue
+		}
+		material := materialsMap[detail.ProductId]
+		var info InputAndOutputInfo
+		info.Number = material.ID
+		info.Name = material.Name
+		info.OrderAmount = detail.Amount.String()
+		info.Valorem = detail.Amount.Mul(material.SalePrice).String()
+		info.Invoice = detail.Number
+		info.Carrier = detail.Name
+		info.Waybill = detail.WaybillNumber
+		info.Unit = material.Unit
+		info.SalePrice = material.SalePrice.String()
+		info.Amount = detail.Amount.String()
+		info.CreateTime = detail.CreatedAt.Format("2006-01-02 15:04")
+		if detail.Status == constvar.OperationStatus_Finish { //鏄惁瀹屾垚
+			info.Status = FinishStatus_Finish
+		} else {
+			info.Status = FinishStatus_Ready
+		}
+
+		if detail.BaseOperationType == constvar.BaseOperationTypeIncoming && detail.Status == constvar.OperationStatus_Finish {
+			if locationHouseMap[detail.ToLocationId] != nil {
+				info.Warehouse = locationHouseMap[detail.ToLocationId].Name //鍏ュ簱浠撳簱鍚�
+			}
+			inputList = append(inputList, &info)
+		} else if detail.BaseOperationType == constvar.BaseOperationTypeOutgoing {
+			if locationHouseMap[detail.FromLocationId] != nil {
+				info.Warehouse = locationHouseMap[detail.FromLocationId].Name //鍙戣揣浠撳簱鍚�
+			}
+			outputList = append(outputList, &info)
+		}
+	}
+	resp.InputList = inputList
+	resp.OutputList = outputList
+
+	return resp, nil
+}

--
Gitblit v1.8.0