From 79aef24a785581d95343ccd99e9cb362b2bc9c97 Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期六, 06 七月 2024 21:31:59 +0800
Subject: [PATCH] 调整库存商品位置错误

---
 service/operation.go |   54 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/service/operation.go b/service/operation.go
index 47902e3..6c9fa72 100644
--- a/service/operation.go
+++ b/service/operation.go
@@ -91,6 +91,7 @@
 			LocationID:         output.LocationID,
 			OperationSource:    constvar.OperationSourceSaleDelivery,
 			SalesDetailsNumber: output.SaleDetailsNumber,
+			WarehouseId:        output.WarehouseID,
 		}
 		operations = append(operations, operation)
 		autoCode = models.GetAutoCode(maxAutoIncr, codeStandard)
@@ -128,7 +129,7 @@
 			return err
 		}
 
-		if roleProduct, ok := mapLocationRoleProduct[strconv.Itoa(operation.LocationID)+v.ProductId]; ok {
+		if roleProduct, ok := mapLocationRoleProduct[strconv.Itoa(v.ToLocationID)+v.ProductId]; ok {
 			detail := &models.OperationDetails{
 				ProductId:      v.ProductId,
 				Amount:         v.Amount,
@@ -149,12 +150,13 @@
 					ProductId:         v.ProductId,
 					Amount:            v.Amount,
 					CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
+					WarehouseId:       operation.WarehouseId,
 				}); err != nil {
 					return err
 				}
 			}
 		} else {
-			if roleCategory, cok := mapLocationRoleCategory[strconv.Itoa(operation.LocationID)+strconv.Itoa(v.Product.CategoryId)]; cok {
+			if roleCategory, cok := mapLocationRoleCategory[strconv.Itoa(v.ToLocationID)+strconv.Itoa(v.Product.CategoryId)]; cok {
 				detail := &models.OperationDetails{
 					ProductId:      v.ProductId,
 					Amount:         v.Amount,
@@ -175,12 +177,13 @@
 						ProductId:         v.ProductId,
 						Amount:            v.Amount,
 						CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
+						WarehouseId:       operation.WarehouseId,
 					}); err != nil {
 						return err
 					}
 				}
 			} else {
-				if locAmount, aok := mapLocAmount[strconv.Itoa(operation.LocationID)+v.ProductId]; aok {
+				if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
 					locAmount.Amount = locAmount.Amount.Add(v.Amount)
 					locAmount.ID = uint(locAmount.Id)
 					if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil {
@@ -188,11 +191,12 @@
 					}
 				} else {
 					if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&models.LocationProductAmount{
-						LocationId:        operation.LocationID,
+						LocationId:        v.ToLocationID,
 						ProductCategoryID: v.Product.CategoryId,
 						ProductId:         v.ProductId,
 						Amount:            v.Amount,
 						CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
+						WarehouseId:       operation.WarehouseId,
 					}); err != nil {
 						return err
 					}
@@ -216,6 +220,7 @@
 			BaseOperationType: constvar.BaseOperationTypeInternal,
 			Details:           details,
 			CheckedBy:         userInfo.Username,
+			WarehouseId:       operation.WarehouseId,
 		}).Error; err != nil {
 			return err
 		}
@@ -256,7 +261,7 @@
 		}
 	}
 	if len(internalInputDetails) > 0 {
-		opTypeId, err := GetTargetOperationTypeIdByOperation(originOperation, constvar.BaseOperationTypeIncoming)
+		opTypeId, err := GetTargetOperationTypeIdByWarehouseId(originOperation.ToLocation.WarehouseId, constvar.BaseOperationTypeIncoming)
 		if err != nil {
 			return err
 		}
@@ -268,8 +273,10 @@
 			Comment:           "搴撳瓨璋冩嫧鍏ュ簱",
 			BaseOperationType: constvar.BaseOperationTypeIncoming,
 			Details:           internalInputDetails,
-			LocationID:        internalInputDetails[0].ToLocationID,
+			LocationID:        originOperation.LocationID,
+			ToLocationID:      originOperation.ToLocationID,
 			OperationTypeName: "搴撳瓨璋冩嫧鍏ュ簱",
+			WarehouseId:       originOperation.ToLocation.WarehouseId,
 		}
 		if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
 			return err
@@ -311,9 +318,11 @@
 			Comment:           "搴撳瓨璋冩嫧鍑哄簱",
 			BaseOperationType: constvar.BaseOperationTypeOutgoing,
 			Details:           outputDetails,
-			LocationID:        outputDetails[0].FromLocationID,
+			LocationID:        originOperation.LocationID,
+			ToLocationID:      originOperation.ToLocationID,
 			OperationTypeName: "搴撳瓨璋冩嫧鍑哄簱",
 			IsInternalOutput:  true,
+			WarehouseId:       originOperation.WarehouseId,
 		}
 		if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
 			return err
@@ -329,16 +338,16 @@
 	var inputDetails []*models.OperationDetails
 	var outputDetails []*models.OperationDetails
 	for _, v := range listDetails {
-		if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
-			if locAmount.Amount.Equal(v.Amount) {
+		if _, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
+			if v.StockAmount.Equal(v.Amount) { //鐩樼偣鏁伴噺鍜屽墿浣欐暟閲忎竴鑷�
 				continue
 			}
-			if v.Amount.GreaterThan(locAmount.Amount) {
+			if v.Amount.GreaterThan(v.StockAmount) {
 				inputDetails = append(inputDetails, &models.OperationDetails{
 					ProductId:        v.ProductId,
-					Amount:           v.Amount.Sub(locAmount.Amount),
-					FromLocationID:   v.FromLocationID,
-					ToLocationID:     v.ToLocationID,
+					Amount:           v.Amount.Sub(v.StockAmount),
+					FromLocationID:   0,
+					ToLocationID:     v.FromLocationID,
 					TotalGrossWeight: v.TotalGrossWeight,
 					TotalNetWeight:   v.TotalNetWeight,
 					AuxiliaryAmount:  v.AuxiliaryAmount,
@@ -350,9 +359,9 @@
 			} else {
 				outputDetails = append(outputDetails, &models.OperationDetails{
 					ProductId:        v.ProductId,
-					Amount:           locAmount.Amount.Sub(v.Amount),
-					FromLocationID:   v.ToLocationID,
-					ToLocationID:     v.FromLocationID,
+					Amount:           v.StockAmount.Sub(v.Amount),
+					FromLocationID:   v.FromLocationID,
+					ToLocationID:     0,
 					TotalGrossWeight: v.TotalGrossWeight,
 					TotalNetWeight:   v.TotalNetWeight,
 					AuxiliaryAmount:  v.AuxiliaryAmount,
@@ -387,6 +396,7 @@
 			Details:           inputDetails,
 			LocationID:        inputDetails[0].FromLocationID,
 			OperationTypeName: "搴撳瓨璋冩暣鍏ュ簱",
+			WarehouseId:       originOperation.WarehouseId,
 		}
 		if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
 			return err
@@ -407,6 +417,7 @@
 			Details:           outputDetails,
 			LocationID:        outputDetails[0].FromLocationID,
 			OperationTypeName: "搴撳瓨璋冩暣鍑哄簱",
+			WarehouseId:       originOperation.WarehouseId,
 		}
 		if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
 			return err
@@ -417,11 +428,18 @@
 }
 
 func GetTargetOperationTypeIdByOperation(operation *models.Operation, baseOT constvar.BaseOperationType) (operationTypeId int, err error) {
-	oT, err := models.NewOperationTypeSearch().SetID(uint(operation.OperationTypeId)).First()
+	targetOT, err := models.NewOperationTypeSearch().SetBaseOperationType(baseOT).SetWarehouseId(operation.WarehouseId).First()
 	if err != nil {
 		return 0, err
 	}
-	targetOT, err := models.NewOperationTypeSearch().SetBaseOperationType(baseOT).SetWarehouseId(oT.WarehouseId).First()
+	return targetOT.Id, nil
+}
+
+func GetTargetOperationTypeIdByWarehouseId(warehouseId int, baseOT constvar.BaseOperationType) (operationTypeId int, err error) {
+	if warehouseId == 0 {
+		return 0, errors.New("warehouseId miss")
+	}
+	targetOT, err := models.NewOperationTypeSearch().SetBaseOperationType(baseOT).SetWarehouseId(warehouseId).First()
 	if err != nil {
 		return 0, err
 	}

--
Gitblit v1.8.0