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