From 72b4fcd52bd82427b3932a5a5c01ced2c0dee201 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 14 六月 2024 17:28:51 +0800
Subject: [PATCH] finish operation code refactor
---
controllers/operation.go | 246 +--------------------------
service/move_history.go | 40 ++++
models/location_product_amount.go | 10 +
models/operation.go | 17 -
conf/config.yaml | 2
service/operation.go | 216 ++++++++++++++++++++++++
6 files changed, 284 insertions(+), 247 deletions(-)
diff --git a/conf/config.yaml b/conf/config.yaml
index 4664ec9..ffb9178 100644
--- a/conf/config.yaml
+++ b/conf/config.yaml
@@ -11,7 +11,7 @@
companyName: jialian
db:
# dsn: root:c++java123@tcp(192.168.20.119:3306)/wms?charset=utf8&parseTime=True&loc=Local
- dsn: root:c++java123@tcp(192.168.20.119:3306)/aps_server2?charset=utf8&parseTime=True&loc=Local
+ dsn: root:c++java123@tcp(127.0.0.1:3306)/aps_server2?charset=utf8&parseTime=True&loc=Local
logMode: true
maxIdleCon: 20
maxOpenCon: 100
diff --git a/controllers/operation.go b/controllers/operation.go
index 8193fa9..d59b86b 100644
--- a/controllers/operation.go
+++ b/controllers/operation.go
@@ -3,7 +3,6 @@
import (
"context"
"errors"
- "fmt"
"github.com/gin-gonic/gin"
uuid "github.com/satori/go.uuid"
"github.com/shopspring/decimal"
@@ -435,231 +434,38 @@
}
}
userInfo := middleware.GetUserInfo(c)
-
err = models.WithTransaction(func(tx *gorm.DB) error {
if err := models.NewOperationSearch().SetOrm(tx).SetID(id).Update(&models.Operation{
Status: constvar.OperationStatus_Finish,
CheckedBy: userInfo.Username,
- CheckedAt: time.Now(),
AuditDate: time.Now().Format("2006-01-02 15:04:05")}); err != nil {
return err
}
- if err := AddMoveHistory([]*models.Operation{operation}, tx); err != nil {
+ if err := service.AddMoveHistory([]*models.Operation{operation}, tx); err != nil {
return err
}
if operation.BaseOperationType == constvar.BaseOperationTypeIncoming {
- locationRoleList, err := models.NewLocationProductSearch().Find()
- if err != nil {
- return errors.New("鑾峰彇涓婃灦瑙勫垯淇℃伅澶辫触")
+ if err := service.FinishOperationInput(c, tx, operation, listDetails, mapLocAmount); err != nil {
+ return err
}
- var mapLocationRoleProduct, mapLocationRoleCategory map[string]*models.LocationProduct
- if len(locationRoleList) > 0 {
- mapLocationRoleProduct = make(map[string]*models.LocationProduct)
- mapLocationRoleCategory = make(map[string]*models.LocationProduct)
- for _, v := range locationRoleList {
- if v.RuleType == constvar.RuleType_Product {
- mapLocationRoleProduct[strconv.Itoa(v.AreaId)+v.ProductId] = v
- }
- if v.RuleType == constvar.RuleType_ProductCategory {
- mapLocationRoleCategory[strconv.Itoa(v.AreaId)+strconv.Itoa(v.ProductCategoryID)] = v
- }
- }
- }
-
- var details []*models.OperationDetails
- for k, v := range listDetails {
- listDetails[k].Product.Amount = listDetails[k].Product.Amount.Add(v.Amount)
- if err := tx.Save(&listDetails[k].Product).Error; err != nil {
- return err
- }
-
- if roleProduct, ok := mapLocationRoleProduct[strconv.Itoa(operation.LocationID)+v.ProductId]; ok {
- detail := &models.OperationDetails{
- ProductId: v.ProductId,
- Amount: v.Amount,
- FromLocationID: roleProduct.AreaId,
- ToLocationID: roleProduct.LocationId,
- }
- details = append(details, detail)
-
- 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
- }
- } else {
- if err := models.NewLocationProductAmountSearch().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"),
- }); err != nil {
- return err
- }
- }
- } else {
- if roleCategory, cok := mapLocationRoleCategory[strconv.Itoa(operation.LocationID)+strconv.Itoa(v.Product.CategoryId)]; cok {
- detail := &models.OperationDetails{
- ProductId: v.ProductId,
- Amount: v.Amount,
- FromLocationID: roleCategory.AreaId,
- ToLocationID: roleCategory.LocationId,
- }
- details = append(details, detail)
-
- 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
- }
- } else {
- if err := models.NewLocationProductAmountSearch().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"),
- }); err != nil {
- return err
- }
- }
- } else {
- if locAmount, aok := mapLocAmount[strconv.Itoa(operation.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
- }
- } else {
- if err := models.NewLocationProductAmountSearch().Create(&models.LocationProductAmount{
- LocationId: operation.LocationID,
- ProductCategoryID: v.Product.CategoryId,
- ProductId: v.ProductId,
- Amount: v.Amount,
- CreateDate: time.Now().Format("2006-01-02 15:04:05"),
- }); err != nil {
- return err
- }
- }
- }
- }
- }
- if len(details) > 0 {
- if err := tx.Create(&models.Operation{
- Number: operation.Number,
- SourceNumber: operation.SourceNumber,
- OperationTypeId: 0,
- OperationTypeName: operation.OperationTypeName,
- Status: constvar.OperationStatus_Finish,
- OperationDate: operation.OperationDate,
- ContacterID: operation.ContacterID,
- ContacterName: operation.ContacterName,
- CompanyID: operation.CompanyID,
- CompanyName: operation.CompanyName,
- Comment: operation.Comment,
- BaseOperationType: constvar.BaseOperationTypeInternal,
- Details: details,
- CheckedAt: time.Now(),
- CheckedBy: userInfo.Username,
- }).Error; err != nil {
- return err
- }
- }
-
}
if operation.BaseOperationType == constvar.BaseOperationTypeOutgoing || operation.BaseOperationType == constvar.BaseOperationTypeDisuse {
- for k, v := range listDetails {
- //todo 婕旂ず娴嬭瘯鏁版嵁
- //data, err := os.ReadFile("conf/input.json")
- //if err != nil {
- // return errors.New("鏂囦欢璇诲彇澶辫触")
- //}
- //m := make(map[string]interface{})
- //err = json.Unmarshal(data, &m)
- //if err != nil {
- // return errors.New("鏍煎紡杞崲澶辫触")
- //}
- //if opa.OpaCheck(c, m, "operation") {
- // 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()))
- // }
- //}
- //todo ================end===============================
- 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()))
- }
- listDetails[k].Product.Amount = listDetails[k].Product.Amount.Sub(v.Amount)
- if err := tx.Save(&listDetails[k].Product).Error; err != nil {
- return err
- }
-
- if locAmount, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
- if locAmount.Amount.LessThan(v.Amount) {
- 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 {
- return err
- }
- } else {
- return errors.New("褰撳墠浠撳簱娌℃湁璇ヤ骇鍝�,璇峰厛鍏ュ簱")
- }
+ if err := service.FinishOperationOutput(tx, listDetails, mapLocAmount); err != nil {
+ return err
}
}
if operation.BaseOperationType == constvar.BaseOperationTypeInternal {
- for _, v := range listDetails {
- if fromLocAmount, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
- if fromLocAmount.Amount.LessThan(v.Amount) {
- return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Product.Name, fromLocAmount.Amount.String(), v.Amount.String()))
- }
- fromLocAmount.Amount = fromLocAmount.Amount.Sub(v.Amount)
- if err := models.NewLocationProductAmountSearch().SetID(fromLocAmount.Id).Update(fromLocAmount); err != nil {
- return err
- }
- } else {
- return errors.New("褰撳墠浠撳簱娌℃湁璇ヤ骇鍝�,璇峰厛鍏ュ簱")
- }
-
- if toLocAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
- toLocAmount.Amount = toLocAmount.Amount.Add(v.Amount)
- if err := models.NewLocationProductAmountSearch().SetID(toLocAmount.Id).Update(toLocAmount); err != nil {
- return err
- }
- } else {
- if err := models.NewLocationProductAmountSearch().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"),
- }); err != nil {
- return err
- }
- }
+ if err := service.FinishOperationInternal(tx, listDetails, mapLocAmount); err != nil {
+ return err
}
}
if operation.BaseOperationType == constvar.BaseOperationTypeAdjust {
- for _, v := range listDetails {
- if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
- locAmount.Amount = v.Amount
- if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil {
- return res.Error
- }
- } else {
- if err := models.NewLocationProductAmountSearch().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"),
- }); err != nil {
- return err
- }
- }
+ if err := service.FinishOperationAdjust(tx, listDetails, mapLocAmount); err != nil {
+ return err
}
}
return nil
@@ -682,40 +488,6 @@
}
util.ResponseFormat(c, code.Success, "鎿嶄綔鎴愬姛")
-}
-
-func AddMoveHistory(operationList []*models.Operation, db *gorm.DB) error {
- var histories []*models.MoveHistory
- operationMap := make(map[int]*models.Operation, len(operationList))
- for _, operation := range operationList {
- for _, v := range operation.Details {
- history := &models.MoveHistory{
- Number: operation.Number,
- BaseOperationType: operation.BaseOperationType,
- OperationTypeId: operation.OperationTypeId,
- OperationTypeName: operation.OperationTypeName,
- OperationId: operation.Id,
- ProductId: v.ProductId,
- ProductName: v.Product.Name,
- Amount: v.Amount,
- Unit: v.Product.Unit,
- Weight: operation.Weight,
- FromLocationId: v.FromLocationID,
- FromLocation: v.FromLocation.Name,
- ToLocationId: v.ToLocationID,
- ToLocation: v.ToLocation.Name,
- }
- histories = append(histories, history)
- }
- operationMap[operation.Id] = operation
- }
- if err := db.Model(&models.MoveHistory{}).Create(&histories).Error; err != nil {
- return err
- }
- for _, history := range histories {
- service.AddNewHistoryReportRecord(history, operationMap[history.OperationId])
- }
- return nil
}
//var (
diff --git a/models/location_product_amount.go b/models/location_product_amount.go
index efa1205..62c2ac8 100644
--- a/models/location_product_amount.go
+++ b/models/location_product_amount.go
@@ -314,3 +314,13 @@
}
return result, nil
}
+
+func (slf *LocationProductAmountSearch) Save(record *LocationProductAmount) error {
+ var db = slf.build()
+
+ if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
+ return fmt.Errorf("save err: %v, record: %+v", err, record)
+ }
+
+ return nil
+}
diff --git a/models/operation.go b/models/operation.go
index a4f9900..1d84f86 100644
--- a/models/operation.go
+++ b/models/operation.go
@@ -51,15 +51,14 @@
ToLocation Location `json:"toLocation" gorm:"foreignKey:ToLocationID;references:Id"` //鐩爣浣嶇疆
SalesDetailsNumber string `gorm:"type:varchar(191);comment:閿�鍞槑缁嗙紪鐮�" json:"salesDetailsNumber"`
- ManagerId string `json:"managerId" gorm:"type:varchar(255);comment:涓荤id"`
- Manager string `json:"manager" gorm:"type:varchar(255);comment:涓荤鍚嶇О"`
- AccountantId string `json:"accountantId" gorm:"type:varchar(255);comment:浼氳id"`
- Accountant string `json:"accountant" gorm:"type:varchar(255);comment:浼氳鍚嶇О"`
- CustodianId string `json:"custodianId" gorm:"type:varchar(255);comment:淇濈鍛榠d"`
- Custodian string `json:"custodian" gorm:"type:varchar(255);comment:淇濈鍛樺悕绉�"`
- CreatedBy string `json:"createBy" gorm:"type:varchar(255);comment:鍒涘缓鑰匲serId"`
- CheckedBy string `json:"checkedBy" gorm:"type:varchar(255);comment:楠岃瘉鑰匲serId"`
- CheckedAt time.Time `json:"checkedAt" gorm:"type:datetime;default:null;comment:楠岃瘉鑰呴獙璇佹搷浣滄椂闂�"`
+ ManagerId string `json:"managerId" gorm:"type:varchar(255);comment:涓荤id"`
+ Manager string `json:"manager" gorm:"type:varchar(255);comment:涓荤鍚嶇О"`
+ AccountantId string `json:"accountantId" gorm:"type:varchar(255);comment:浼氳id"`
+ Accountant string `json:"accountant" gorm:"type:varchar(255);comment:浼氳鍚嶇О"`
+ CustodianId string `json:"custodianId" gorm:"type:varchar(255);comment:淇濈鍛榠d"`
+ Custodian string `json:"custodian" gorm:"type:varchar(255);comment:淇濈鍛樺悕绉�"`
+ CreatedBy string `json:"createBy" gorm:"type:varchar(255);comment:鍒涘缓鑰匲serId"`
+ CheckedBy string `json:"checkedBy" gorm:"type:varchar(255);comment:楠岃瘉鑰匲serId"`
}
OperationSearch struct {
diff --git a/service/move_history.go b/service/move_history.go
new file mode 100644
index 0000000..7aabc70
--- /dev/null
+++ b/service/move_history.go
@@ -0,0 +1,40 @@
+package service
+
+import (
+ "gorm.io/gorm"
+ "wms/models"
+)
+
+func AddMoveHistory(operationList []*models.Operation, db *gorm.DB) error {
+ var histories []*models.MoveHistory
+ operationMap := make(map[int]*models.Operation, len(operationList))
+ for _, operation := range operationList {
+ for _, v := range operation.Details {
+ history := &models.MoveHistory{
+ Number: operation.Number,
+ BaseOperationType: operation.BaseOperationType,
+ OperationTypeId: operation.OperationTypeId,
+ OperationTypeName: operation.OperationTypeName,
+ OperationId: operation.Id,
+ ProductId: v.ProductId,
+ ProductName: v.Product.Name,
+ Amount: v.Amount,
+ Unit: v.Product.Unit,
+ Weight: operation.Weight,
+ FromLocationId: v.FromLocationID,
+ FromLocation: v.FromLocation.Name,
+ ToLocationId: v.ToLocationID,
+ ToLocation: v.ToLocation.Name,
+ }
+ histories = append(histories, history)
+ }
+ operationMap[operation.Id] = operation
+ }
+ if err := db.Model(&models.MoveHistory{}).Create(&histories).Error; err != nil {
+ return err
+ }
+ for _, history := range histories {
+ AddNewHistoryReportRecord(history, operationMap[history.OperationId])
+ }
+ return nil
+}
diff --git a/service/operation.go b/service/operation.go
index e3a187a..1d8e8a1 100644
--- a/service/operation.go
+++ b/service/operation.go
@@ -1,9 +1,15 @@
package service
import (
+ "errors"
+ "fmt"
+ "github.com/gin-gonic/gin"
"github.com/shopspring/decimal"
+ "gorm.io/gorm"
+ "strconv"
"time"
"wms/constvar"
+ "wms/middleware"
"wms/models"
)
@@ -92,3 +98,213 @@
return models.NewOperationSearch().CreateBatch(operations)
}
+
+// FinishOperationInput 瀹屾垚鍏ュ簱
+func FinishOperationInput(c *gin.Context, tx *gorm.DB, operation *models.Operation, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
+ userInfo := middleware.GetUserInfo(c)
+ locationRoleList, err := models.NewLocationProductSearch().Find()
+ if err != nil {
+ return errors.New("鑾峰彇涓婃灦瑙勫垯淇℃伅澶辫触")
+ }
+ var mapLocationRoleProduct, mapLocationRoleCategory map[string]*models.LocationProduct
+ if len(locationRoleList) > 0 {
+ mapLocationRoleProduct = make(map[string]*models.LocationProduct)
+ mapLocationRoleCategory = make(map[string]*models.LocationProduct)
+ for _, v := range locationRoleList {
+ if v.RuleType == constvar.RuleType_Product {
+ mapLocationRoleProduct[strconv.Itoa(v.AreaId)+v.ProductId] = v
+ }
+ if v.RuleType == constvar.RuleType_ProductCategory {
+ mapLocationRoleCategory[strconv.Itoa(v.AreaId)+strconv.Itoa(v.ProductCategoryID)] = v
+ }
+ }
+ }
+
+ var details []*models.OperationDetails
+ for k, v := range listDetails {
+ listDetails[k].Product.Amount = listDetails[k].Product.Amount.Add(v.Amount)
+ if err := tx.Save(&listDetails[k].Product).Error; err != nil {
+ return err
+ }
+
+ if roleProduct, ok := mapLocationRoleProduct[strconv.Itoa(operation.LocationID)+v.ProductId]; ok {
+ detail := &models.OperationDetails{
+ ProductId: v.ProductId,
+ Amount: v.Amount,
+ FromLocationID: roleProduct.AreaId,
+ ToLocationID: roleProduct.LocationId,
+ }
+ details = append(details, detail)
+
+ 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
+ }
+ } else {
+ if err := models.NewLocationProductAmountSearch().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"),
+ }); err != nil {
+ return err
+ }
+ }
+ } else {
+ if roleCategory, cok := mapLocationRoleCategory[strconv.Itoa(operation.LocationID)+strconv.Itoa(v.Product.CategoryId)]; cok {
+ detail := &models.OperationDetails{
+ ProductId: v.ProductId,
+ Amount: v.Amount,
+ FromLocationID: roleCategory.AreaId,
+ ToLocationID: roleCategory.LocationId,
+ }
+ details = append(details, detail)
+
+ 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
+ }
+ } else {
+ if err := models.NewLocationProductAmountSearch().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"),
+ }); err != nil {
+ return err
+ }
+ }
+ } else {
+ if locAmount, aok := mapLocAmount[strconv.Itoa(operation.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
+ }
+ } else {
+ if err := models.NewLocationProductAmountSearch().Create(&models.LocationProductAmount{
+ LocationId: operation.LocationID,
+ ProductCategoryID: v.Product.CategoryId,
+ ProductId: v.ProductId,
+ Amount: v.Amount,
+ CreateDate: time.Now().Format("2006-01-02 15:04:05"),
+ }); err != nil {
+ return err
+ }
+ }
+ }
+ }
+ }
+ if len(details) > 0 {
+ if err := tx.Create(&models.Operation{
+ Number: operation.Number,
+ SourceNumber: operation.SourceNumber,
+ OperationTypeId: 0,
+ OperationTypeName: operation.OperationTypeName,
+ Status: constvar.OperationStatus_Finish,
+ OperationDate: operation.OperationDate,
+ ContacterID: operation.ContacterID,
+ ContacterName: operation.ContacterName,
+ CompanyID: operation.CompanyID,
+ CompanyName: operation.CompanyName,
+ Comment: operation.Comment,
+ BaseOperationType: constvar.BaseOperationTypeInternal,
+ Details: details,
+ CheckedBy: userInfo.Username,
+ }).Error; err != nil {
+ return err
+ }
+ }
+ return nil
+
+}
+
+// FinishOperationOutput 瀹屾垚鍑哄簱鎴栨姤搴�
+func FinishOperationOutput(tx *gorm.DB, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
+ for k, v := range listDetails {
+ 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()))
+ }
+ 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
+ }
+
+ if locAmount, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
+ if locAmount.Amount.LessThan(v.Amount) {
+ 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 {
+ return err
+ }
+ } else {
+ return errors.New("褰撳墠浠撳簱娌℃湁璇ヤ骇鍝�,璇峰厛鍏ュ簱")
+ }
+ }
+ return nil
+
+}
+
+// FinishOperationInternal 瀹屾垚鍐呴儴璋冩嫧
+func FinishOperationInternal(tx *gorm.DB, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
+ for _, v := range listDetails {
+ if fromLocAmount, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
+ if fromLocAmount.Amount.LessThan(v.Amount) {
+ return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Product.Name, fromLocAmount.Amount.String(), v.Amount.String()))
+ }
+ fromLocAmount.Amount = fromLocAmount.Amount.Sub(v.Amount)
+ if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(fromLocAmount.Id).Update(fromLocAmount); err != nil {
+ return err
+ }
+ } else {
+ return errors.New("褰撳墠浠撳簱娌℃湁璇ヤ骇鍝�,璇峰厛鍏ュ簱")
+ }
+
+ if toLocAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
+ toLocAmount.Amount = toLocAmount.Amount.Add(v.Amount)
+ if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(toLocAmount.Id).Update(toLocAmount); err != nil {
+ return err
+ }
+ } else {
+ 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"),
+ }); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+
+}
+
+// FinishOperationAdjust 瀹屾垚搴撳瓨璋冩暣
+func FinishOperationAdjust(tx *gorm.DB, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
+ for _, v := range listDetails {
+ if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
+ locAmount.Amount = v.Amount
+ if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(locAmount.Id).Save(locAmount); err != nil {
+ return err
+ }
+ } else {
+ 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"),
+ }); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+
+}
--
Gitblit v1.8.0