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 | 82 ++++++++++++++++++++++++++-------------- 1 files changed, 53 insertions(+), 29 deletions(-) diff --git a/service/operation.go b/service/operation.go index 8b5bd2e..6c9fa72 100644 --- a/service/operation.go +++ b/service/operation.go @@ -4,6 +4,7 @@ "errors" "fmt" "github.com/gin-gonic/gin" + "github.com/mitchellh/mapstructure" "github.com/shopspring/decimal" "gorm.io/gorm" "strconv" @@ -90,6 +91,7 @@ LocationID: output.LocationID, OperationSource: constvar.OperationSourceSaleDelivery, SalesDetailsNumber: output.SaleDetailsNumber, + WarehouseId: output.WarehouseID, } operations = append(operations, operation) autoCode = models.GetAutoCode(maxAutoIncr, codeStandard) @@ -127,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, @@ -138,22 +140,23 @@ if locAmount, aok := mapLocAmount[strconv.Itoa(roleProduct.LocationId)+v.ProductId]; aok { locAmount.Amount = locAmount.Amount.Add(v.Amount) - if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { - return res.Error + if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil { + return err } } else { - if err := models.NewLocationProductAmountSearch().Create(&models.LocationProductAmount{ + if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&models.LocationProductAmount{ LocationId: roleProduct.LocationId, 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 } } } 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, @@ -164,33 +167,36 @@ if locAmount, aok := mapLocAmount[strconv.Itoa(roleCategory.LocationId)+v.ProductId]; aok { locAmount.Amount = locAmount.Amount.Add(v.Amount) - if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { - return res.Error + if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil { + return err } } else { - if err := models.NewLocationProductAmountSearch().Create(&models.LocationProductAmount{ + if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&models.LocationProductAmount{ LocationId: roleCategory.LocationId, 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 } } } 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) - if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { - return res.Error + locAmount.ID = uint(locAmount.Id) + if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil { + return err } } else { - if err := models.NewLocationProductAmountSearch().Create(&models.LocationProductAmount{ - LocationId: operation.LocationID, + if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&models.LocationProductAmount{ + 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 } @@ -214,6 +220,7 @@ BaseOperationType: constvar.BaseOperationTypeInternal, Details: details, CheckedBy: userInfo.Username, + WarehouseId: operation.WarehouseId, }).Error; err != nil { return err } @@ -239,18 +246,22 @@ return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Product.Name, locAmount.Amount.String(), v.Amount.String())) } locAmount.Amount = locAmount.Amount.Sub(v.Amount) - if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(locAmount); err != nil { + if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(locAmount.Id).Save(locAmount); err != nil { return err } } else { return errors.New("褰撳墠浠撳簱娌℃湁璇ヤ骇鍝�,璇峰厛鍏ュ簱") } if v.IsInternalOutput { - internalInputDetails = append(internalInputDetails, v) + var inputDetail models.OperationDetails + mapstructure.Decode(v, &inputDetail) + inputDetail.Id = 0 + inputDetail.OperationID = 0 + internalInputDetails = append(internalInputDetails, &inputDetail) } } if len(internalInputDetails) > 0 { - opTypeId, err := GetTargetOperationTypeIdByOperation(originOperation, constvar.BaseOperationTypeIncoming) + opTypeId, err := GetTargetOperationTypeIdByWarehouseId(originOperation.ToLocation.WarehouseId, constvar.BaseOperationTypeIncoming) if err != nil { return err } @@ -262,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 @@ -305,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 @@ -323,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, @@ -344,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, @@ -381,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 @@ -401,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 @@ -411,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