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