From eae158f8d95df5f49c4e36d5b9ad00b62dbad9ec Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期一, 29 七月 2024 21:51:47 +0800
Subject: [PATCH] 产品库存增加多单位存储,完成出入库操作时更改多单位剩余数量

---
 models/location_product_amount.go      |   36 +++++++++++++++++
 service/more_units.go                  |   44 ++++++++++++++++++++++
 service/operation.go                   |   18 +++++++++
 controllers/location_product_amount.go |    1 
 router/router.go                       |   10 ++--
 5 files changed, 103 insertions(+), 6 deletions(-)

diff --git a/controllers/location_product_amount.go b/controllers/location_product_amount.go
index 12807dd..cdc75a1 100644
--- a/controllers/location_product_amount.go
+++ b/controllers/location_product_amount.go
@@ -371,6 +371,7 @@
 }
 
 // Finish
+// deprecated
 //
 //	@Tags	搴撳瓨鐩樼偣
 //	@Summary	搴旂敤銆侀獙璇�
diff --git a/models/location_product_amount.go b/models/location_product_amount.go
index 2c59969..81cc55b 100644
--- a/models/location_product_amount.go
+++ b/models/location_product_amount.go
@@ -1,6 +1,7 @@
 package models
 
 import (
+	"encoding/json"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
@@ -21,7 +22,9 @@
 		ProductId         string          `json:"productId" gorm:"type:varchar(191);not null;comment:浜у搧id"` //浜у搧id
 		Product           Material        `json:"product" gorm:"foreignKey:ProductId;references:ID"`
 		Amount            decimal.Decimal `json:"amount" gorm:"type:decimal(20,2);not null;comment:搴撳瓨鏁伴噺"` //搴撳瓨鏁伴噺
-		CreateDate        string          `json:"createDate" gorm:"type:varchar(63);comment:鏃ユ湡"`          //鏃ユ湡
+		MoreUnitList      []UnitItems     `json:"amountMoreUnits" gorm:"-"`                               //鍦ㄥ簱鏁伴噺澶氬崟浣�
+		MoreUnitValue     string          `json:"-" gorm:"type:varchar(255);comment:澶氬崟浣嶅��"`
+		CreateDate        string          `json:"createDate" gorm:"type:varchar(63);comment:鏃ユ湡"` //鏃ユ湡
 	}
 
 	LocationProductAmountSearch struct {
@@ -64,6 +67,37 @@
 	return "wms_location_product_amount"
 }
 
+func (slf *LocationProductAmount) AfterFind(tx *gorm.DB) (err error) {
+	if slf.MoreUnitValue != "" {
+		var arr []UnitItems
+		err := json.Unmarshal([]byte(slf.MoreUnitValue), &arr)
+		if err != nil {
+			return err
+		}
+		slf.MoreUnitList = arr
+	}
+
+	return
+}
+
+func (slf *LocationProductAmount) BeforeCreate(tx *gorm.DB) (err error) {
+	if len(slf.MoreUnitList) != 0 {
+		items := make([]UnitItems, 0)
+		for k, item := range slf.MoreUnitList {
+			if item.Unit != "" && !item.Amount.IsZero() {
+				items = append(items, slf.MoreUnitList[k])
+			}
+		}
+
+		str, err := json.Marshal(items)
+		if err != nil {
+			return err
+		}
+		slf.MoreUnitValue = string(str)
+	}
+	return
+}
+
 func NewLocationProductAmountSearch() *LocationProductAmountSearch {
 	return &LocationProductAmountSearch{Orm: mysqlx.GetDB()}
 }
diff --git a/router/router.go b/router/router.go
index a14168c..6799806 100644
--- a/router/router.go
+++ b/router/router.go
@@ -158,11 +158,11 @@
 	locationProductAmountController := new(controllers.LocationProductAmountController)
 	locationProductAmountAPI := r.Group(urlPrefix + "/locationProductAmount")
 	{
-		locationProductAmountAPI.POST("add", locationProductAmountController.Add)                                           //娣诲姞搴撳瓨鐩樼偣淇℃伅
-		locationProductAmountAPI.POST("list", locationProductAmountController.List)                                         //鏌ョ湅搴撳瓨鐩樼偣鍒楄〃
-		locationProductAmountAPI.POST("locationProductList", locationProductAmountController.LocationProductList)           //鏌ョ湅浜у搧搴撳瓨鍒楄〃
-		locationProductAmountAPI.POST("update", locationProductAmountController.Update)                                     //淇敼搴撳瓨鐩樼偣淇℃伅
-		locationProductAmountAPI.POST("finish", locationProductAmountController.Finish)                                     //搴旂敤銆侀獙璇佸簱瀛樼洏鐐逛俊鎭�
+		locationProductAmountAPI.POST("add", locationProductAmountController.Add)                                 //娣诲姞搴撳瓨鐩樼偣淇℃伅
+		locationProductAmountAPI.POST("list", locationProductAmountController.List)                               //鏌ョ湅搴撳瓨鐩樼偣鍒楄〃
+		locationProductAmountAPI.POST("locationProductList", locationProductAmountController.LocationProductList) //鏌ョ湅浜у搧搴撳瓨鍒楄〃
+		locationProductAmountAPI.POST("update", locationProductAmountController.Update)                           //淇敼搴撳瓨鐩樼偣淇℃伅
+		//locationProductAmountAPI.POST("finish", locationProductAmountController.Finish)                                     //搴旂敤銆侀獙璇佸簱瀛樼洏鐐逛俊鎭�
 		locationProductAmountAPI.POST("getRuleList", locationProductAmountController.GetRuleList)                           //鑾峰彇涓婃灦瑙勫垯
 		locationProductAmountAPI.POST("getLocationProductAmount", locationProductAmountController.GetLocationProductAmount) //鑾峰彇浣嶇疆浜у搧淇℃伅
 	}
diff --git a/service/more_units.go b/service/more_units.go
index 5abdb09..1e01506 100644
--- a/service/more_units.go
+++ b/service/more_units.go
@@ -23,6 +23,50 @@
 	return moreValueArr
 }
 
+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,
+				})
+			}
+		}
+	}
+	return moreValueArr
+}
+
+// MoreUnitIsEnough 澶氬崟浣嶅簱瀛樻槸鍚﹁冻澶�
+func MoreUnitIsEnough(units []models.UnitItems, units2 []models.UnitItems) bool {
+	for _, unitItem1 := range units {
+		for _, unitItem2 := range units2 {
+			if unitItem1.Amount.LessThan(unitItem2.Amount) {
+				return false
+			}
+		}
+	}
+	return true
+}
+
+func SubMoreUnit(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.Sub(unitItem2.Amount),
+					Unit:     unitItem1.Unit,
+					Floating: unitItem1.Floating,
+				})
+			}
+		}
+	}
+	return moreValueArr
+}
+
 func FillMoreUnitToExcel(amount decimal.Decimal, units []models.UnitItems, startIndex int, column int, f *excelize.File) {
 	columnStr := strconv.Itoa(column)
 	for _, v := range units {
diff --git a/service/operation.go b/service/operation.go
index 6c9fa72..514bdc8 100644
--- a/service/operation.go
+++ b/service/operation.go
@@ -125,6 +125,7 @@
 	var details []*models.OperationDetails
 	for k, v := range listDetails {
 		listDetails[k].Product.Amount = listDetails[k].Product.Amount.Add(v.Amount)
+		listDetails[k].Product.MoreUnitList = AddMoreUnit(listDetails[k].Product.MoreUnitList, v.MoreUnitList)
 		if err := tx.Save(&listDetails[k].Product).Error; err != nil {
 			return err
 		}
@@ -133,6 +134,7 @@
 			detail := &models.OperationDetails{
 				ProductId:      v.ProductId,
 				Amount:         v.Amount,
+				MoreUnitList:   v.MoreUnitList,
 				FromLocationID: roleProduct.AreaId,
 				ToLocationID:   roleProduct.LocationId,
 			}
@@ -140,6 +142,7 @@
 
 			if locAmount, aok := mapLocAmount[strconv.Itoa(roleProduct.LocationId)+v.ProductId]; aok {
 				locAmount.Amount = locAmount.Amount.Add(v.Amount)
+				locAmount.MoreUnitList = AddMoreUnit(locAmount.MoreUnitList, v.MoreUnitList)
 				if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil {
 					return err
 				}
@@ -149,6 +152,7 @@
 					ProductCategoryID: v.Product.CategoryId,
 					ProductId:         v.ProductId,
 					Amount:            v.Amount,
+					MoreUnitList:      v.MoreUnitList,
 					CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
 					WarehouseId:       operation.WarehouseId,
 				}); err != nil {
@@ -160,6 +164,7 @@
 				detail := &models.OperationDetails{
 					ProductId:      v.ProductId,
 					Amount:         v.Amount,
+					MoreUnitList:   v.MoreUnitList,
 					FromLocationID: roleCategory.AreaId,
 					ToLocationID:   roleCategory.LocationId,
 				}
@@ -167,6 +172,7 @@
 
 				if locAmount, aok := mapLocAmount[strconv.Itoa(roleCategory.LocationId)+v.ProductId]; aok {
 					locAmount.Amount = locAmount.Amount.Add(v.Amount)
+					locAmount.MoreUnitList = AddMoreUnit(locAmount.MoreUnitList, v.MoreUnitList)
 					if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil {
 						return err
 					}
@@ -176,6 +182,7 @@
 						ProductCategoryID: v.Product.CategoryId,
 						ProductId:         v.ProductId,
 						Amount:            v.Amount,
+						MoreUnitList:      v.MoreUnitList,
 						CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
 						WarehouseId:       operation.WarehouseId,
 					}); err != nil {
@@ -185,6 +192,7 @@
 			} else {
 				if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
 					locAmount.Amount = locAmount.Amount.Add(v.Amount)
+					locAmount.MoreUnitList = AddMoreUnit(locAmount.MoreUnitList, v.MoreUnitList)
 					locAmount.ID = uint(locAmount.Id)
 					if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(int(locAmount.ID)).Save(locAmount); err != nil {
 						return err
@@ -195,6 +203,7 @@
 						ProductCategoryID: v.Product.CategoryId,
 						ProductId:         v.ProductId,
 						Amount:            v.Amount,
+						MoreUnitList:      v.MoreUnitList,
 						CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
 						WarehouseId:       operation.WarehouseId,
 					}); err != nil {
@@ -236,6 +245,9 @@
 		if v.Product.Amount.LessThan(v.Amount) {
 			return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Product.Name, v.Product.Amount.String(), v.Amount.String()))
 		}
+		if !MoreUnitIsEnough(v.Product.MoreUnitList, v.MoreUnitList) {
+			return errors.New(fmt.Sprintf("浜у搧锛�%v, 澶氬崟浣嶆暟閲忎笉澶燂紝鏃犳硶瀹屾垚鍑哄簱鎿嶄綔", v.Product.Name))
+		}
 		listDetails[k].Product.Amount = listDetails[k].Product.Amount.Sub(v.Amount)
 		if err := models.NewMaterialSearch().SetOrm(tx).Save(&listDetails[k].Product); err != nil {
 			return err
@@ -245,7 +257,11 @@
 			if locAmount.Amount.LessThan(v.Amount) {
 				return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Product.Name, locAmount.Amount.String(), v.Amount.String()))
 			}
+			if !MoreUnitIsEnough(locAmount.MoreUnitList, v.MoreUnitList) {
+				return errors.New(fmt.Sprintf("浜у搧锛�%v, 澶氬崟浣嶆暟閲忎笉澶燂紝鏃犳硶瀹屾垚鍑哄簱鎿嶄綔", v.Product.Name))
+			}
 			locAmount.Amount = locAmount.Amount.Sub(v.Amount)
+			locAmount.MoreUnitList = SubMoreUnit(locAmount.MoreUnitList, v.MoreUnitList)
 			if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(locAmount.Id).Save(locAmount); err != nil {
 				return err
 			}
@@ -293,6 +309,8 @@
 		outputDetails = append(outputDetails, &models.OperationDetails{
 			ProductId:        v.ProductId,
 			Amount:           v.Amount,
+			MoreUnitList:     v.MoreUnitList,
+			DealerType:       v.DealerType,
 			FromLocationID:   v.FromLocationID,
 			ToLocationID:     v.ToLocationID,
 			TotalGrossWeight: v.TotalGrossWeight,

--
Gitblit v1.8.0