From 35d641adccfd2aa2bcd0090415ff7fdb18e9773d Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 01 八月 2024 14:40:56 +0800
Subject: [PATCH] 库存报表多单位数据查询修正

---
 service/inventory_report_forms.go |   57 ++++++++++++++++++++--------
 service/more_units.go             |   31 ++++++++++-----
 2 files changed, 62 insertions(+), 26 deletions(-)

diff --git a/service/inventory_report_forms.go b/service/inventory_report_forms.go
index eac7252..6623aea 100644
--- a/service/inventory_report_forms.go
+++ b/service/inventory_report_forms.go
@@ -1,6 +1,7 @@
 package service
 
 import (
+	"encoding/json"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"github.com/xuri/excelize/v2"
@@ -13,10 +14,11 @@
 )
 
 type Detail struct {
-	ProductId string                   `json:"productId"`
-	Amount    decimal.Decimal          `json:"amount"`
-	Status    constvar.OperationStatus `json:"status"`
-	//ProductName string                   `json:"productName"`
+	ProductId     string                   `json:"productId"`
+	Amount        decimal.Decimal          `json:"amount"`
+	Status        constvar.OperationStatus `json:"status"`
+	MoreUnitValue string                   `json:"-" gorm:"type:varchar(255);comment:澶氬崟浣嶅��"`
+	MoreUnitList  []models.UnitItems       `json:"moreUnitList" gorm:"-"`
 }
 
 type InventoryReportFormsService struct{}
@@ -55,12 +57,12 @@
 	var inHouse []Detail
 	var outHouse []Detail
 	dbIn := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
-		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
+		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
 		Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
 		Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}).
 		Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Finish})
 	dbOut := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
-		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
+		Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
 		Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
 		Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse}).
 		Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Ready, constvar.OperationStatus_Finish})
@@ -76,10 +78,34 @@
 	if err != nil {
 		return
 	}
+
+	for _, in := range inHouse {
+		var arr []models.UnitItems
+		if len(in.MoreUnitValue) != 0 {
+			err := json.Unmarshal([]byte(in.MoreUnitValue), &arr)
+			if err != nil {
+				return nil, err
+			}
+			in.MoreUnitList = arr
+		}
+	}
+
 	err = dbOut.Find(&outHouse).Error
 	if err != nil {
 		return
 	}
+
+	for _, out := range outHouse {
+		var arr []models.UnitItems
+		if len(out.MoreUnitValue) != 0 {
+			err := json.Unmarshal([]byte(out.MoreUnitValue), &arr)
+			if err != nil {
+				return nil, err
+			}
+			out.MoreUnitList = arr
+		}
+	}
+
 	for _, material := range materials {
 		data := new(response.InventoryForms)
 		data.ProduceId = material.ID
@@ -93,31 +119,30 @@
 		for _, amount := range productAmounts {
 			if material.ID == amount.ProductId {
 				data.Amount = data.Amount.Add(amount.Amount)
+				data.AmountMoreUnits = AddMoreUnit(data.AmountMoreUnits, amount.MoreUnitList)
 			}
 		}
 		for _, details := range inHouse {
 			if material.ID == details.ProductId {
 				data.In = data.In.Add(details.Amount)
+				data.InMoreUnits = AddMoreUnit(data.InMoreUnits, details.MoreUnitList)
 			}
 		}
-		available := decimal.NewFromInt(0)
+		readyOutAmount := decimal.NewFromInt(0)
+		readyOutAmountMoreUnitList := make([]models.UnitItems, 0)
 		for _, details := range outHouse {
 			if material.ID == details.ProductId {
 				if details.Status == constvar.OperationStatus_Ready {
-					available = available.Add(details.Amount)
+					readyOutAmount = readyOutAmount.Add(details.Amount)
+					readyOutAmountMoreUnitList = AddMoreUnit(readyOutAmountMoreUnitList, details.MoreUnitList)
 				} else {
 					data.Out = data.Out.Add(details.Amount)
+					data.OutMoreUnits = AddMoreUnit(data.OutMoreUnits, details.MoreUnitList)
 				}
 			}
 		}
-		data.AvailableNumber = data.Amount.Sub(available)
-
-		if *material.MoreUnit {
-			data.AmountMoreUnits = CreateMoreUnit(data.Amount, material.MoreUnitList)
-			data.AvailableNumberMoreUnits = CreateMoreUnit(data.AvailableNumber, material.MoreUnitList)
-			data.InMoreUnits = CreateMoreUnit(data.In, material.MoreUnitList)
-			data.OutMoreUnits = CreateMoreUnit(data.Out, material.MoreUnitList)
-		}
+		data.AvailableNumber = data.Amount.Sub(readyOutAmount)                                        //鍙敤鏁伴噺绛変簬搴撳瓨鏁伴噺鍑忓緟鍑哄簱鏁伴噺
+		data.AvailableNumberMoreUnits = SubMoreUnit(data.AmountMoreUnits, readyOutAmountMoreUnitList) //鍙敤澶氬崟浣嶇瓑浜庡墿浣欐暟閲忓噺寰呭嚭搴撴暟閲�
 
 		result = append(result, data)
 	}
diff --git a/service/more_units.go b/service/more_units.go
index b141c17..f4bfe42 100644
--- a/service/more_units.go
+++ b/service/more_units.go
@@ -24,18 +24,29 @@
 }
 
 func AddMoreUnit(units []models.UnitItems, units2 []models.UnitItems) []models.UnitItems {
-	moreValueArr := make([]models.UnitItems, 0, len(units))
-	for _, unitItem1 := range units {
-		for _, unitItem2 := range units2 {
-			if unitItem1.Unit == unitItem2.Unit {
-				moreValueArr = append(moreValueArr, models.UnitItems{
-					Amount:   unitItem1.Amount.Add(unitItem2.Amount),
-					Unit:     unitItem1.Unit,
-					Floating: unitItem1.Floating,
-				})
-			}
+	unitMap := make(map[string]models.UnitItems)
+
+	// 灏� units 涓殑鎵�鏈夊厓绱犳坊鍔犲埌 map 涓�
+	for _, unitItem := range units {
+		unitMap[unitItem.Unit] = unitItem
+	}
+
+	// 閬嶅巻 units2锛屽悎骞剁浉鍚屽崟浣嶇殑鏁伴噺锛屽苟灏� units2 涓笉瀛樺湪浜� units 涓殑鍗曚綅娣诲姞鍒� map 涓�
+	for _, unitItem2 := range units2 {
+		if unitItem1, exists := unitMap[unitItem2.Unit]; exists {
+			unitItem1.Amount = unitItem1.Amount.Add(unitItem2.Amount)
+			unitMap[unitItem2.Unit] = unitItem1
+		} else {
+			unitMap[unitItem2.Unit] = unitItem2
 		}
 	}
+
+	// 灏� map 杞崲鍥� slice
+	moreValueArr := make([]models.UnitItems, 0, len(unitMap))
+	for _, unitItem := range unitMap {
+		moreValueArr = append(moreValueArr, unitItem)
+	}
+
 	return moreValueArr
 }
 

--
Gitblit v1.8.0