From be19d957b591ad27a47057929c4a8694f0776a1a Mon Sep 17 00:00:00 2001
From: jiangshuai <291802688@qq.com>
Date: 星期四, 26 十月 2023 10:15:26 +0800
Subject: [PATCH] bug修改

---
 controllers/product_controller.go      |   32 +++-
 controllers/operation.go               |  226 ++++++++++++++++++---------
 models/location_product.go             |   17 ++
 controllers/report_forms_controller.go |   39 +---
 models/location_product_amount.go      |   76 +++++++--
 request/location_product_amount.go     |   13 
 controllers/location_product.go        |   13 -
 docs/swagger.yaml                      |    7 
 docs/docs.go                           |   12 +
 docs/swagger.json                      |   12 +
 controllers/location_product_amount.go |   29 +--
 11 files changed, 310 insertions(+), 166 deletions(-)

diff --git a/controllers/location_product.go b/controllers/location_product.go
index ca86491..854d451 100644
--- a/controllers/location_product.go
+++ b/controllers/location_product.go
@@ -2,9 +2,7 @@
 
 import (
 	"github.com/gin-gonic/gin"
-	"github.com/shopspring/decimal"
 	"strconv"
-	"time"
 	"wms/extend/code"
 	"wms/extend/util"
 	"wms/models"
@@ -52,16 +50,6 @@
 	//}
 
 	if err := models.NewLocationProductSearch().Create(&params); err != nil {
-		logx.Errorf("Operation create err: %v", err)
-		util.ResponseFormat(c, code.SaveFail, "娣诲姞澶辫触锛�"+err.Error())
-		return
-	}
-	locationProductAmount := &models.LocationProductAmount{
-		LocationProductId: params.Id,
-		Amount:            decimal.NewFromFloat(0),
-		CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
-	}
-	if err := models.NewLocationProductAmountSearch().Create(locationProductAmount); err != nil {
 		logx.Errorf("Operation create err: %v", err)
 		util.ResponseFormat(c, code.SaveFail, "娣诲姞澶辫触锛�"+err.Error())
 		return
@@ -163,7 +151,6 @@
 		util.ResponseFormat(c, code.RequestParamError, "id涓�0")
 		return
 	}
-	//TODO:姝ゅ鍙兘闇�瑕佸鍔犻檺鍒讹紝濡傛灉璇ヤ笂鏋惰鍒欏鏋滃凡缁忎骇鐢熶簡搴撳瓨鏁伴噺锛屽垹闄や細閫犳垚搴撳瓨鏌ヤ笉鍒扮殑褰卞搷
 	if err := models.NewLocationProductSearch().SetID(id).Delete(); err != nil {
 		logx.Errorf("LocationProduct delete err: %v", err)
 		util.ResponseFormat(c, code.SaveFail, "鍒犻櫎澶辫触锛�"+err.Error())
diff --git a/controllers/location_product_amount.go b/controllers/location_product_amount.go
index f895a6c..3f33ff3 100644
--- a/controllers/location_product_amount.go
+++ b/controllers/location_product_amount.go
@@ -44,11 +44,9 @@
 	search.Orm = search.Orm.
 		Table("wms_location_product_amount").
 		Select(`wms_location_product_amount.id as location_product_amount_id,wms_location.id as location_id,wms_location.name as location_name,material.id as product_id,material.name as product_name,wms_location_product_amount.amount,material.unit,wms_location_product_amount.create_date`).
-		InnerJoins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").
-		InnerJoins("inner join material on material.id=wms_location_product.product_id").
-		InnerJoins("inner join wms_location on wms_location.id=wms_location_product.location_id")
-	//Joins("inner join wms_operation_details on wms_operation_details.product_id=wms_location_product.product_id").
-	//Joins("inner join wms_operation on wms_operation.id=wms_operation_details.operation_id and wms_operation.base_operation_type=? and wms_operation.status=?", constvar.BaseOperationTypeAdjust, constvar.OperationStatus_Ready)
+		InnerJoins("inner join material on material.id=wms_location_product_amount.product_id").
+		InnerJoins("inner join wms_location on wms_location.id=wms_location_product_amount.location_id")
+
 	var (
 		records = make([]*models.LocationProductAmountWithOperation, 0)
 		total   int64
@@ -62,7 +60,7 @@
 	if params.Page*params.PageSize > 0 {
 		search.Orm = search.Orm.Offset((params.Page - 1) * params.PageSize).Limit(params.PageSize)
 	}
-	if err := search.Orm.Order("wms_location_product_amount.updated_at desc").Find(&records).Error; err != nil {
+	if err := search.Orm.Order("wms_location_product_amount.updated_at desc").Find(&records).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
 		util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err))
 		return
 	}
@@ -127,25 +125,22 @@
 		return errors.New("璇ュ晢鍝佸湪宸查�変腑鐨勪綅缃瓨鍦ㄦ湭楠岃瘉鐨勫簱瀛樼洏鐐逛俊鎭紝鏃犳硶缁х画娣诲姞鐩稿叧淇℃伅")
 	}
 
-	locProduct, err := models.NewLocationProductSearch().SetLocationId(reqParams.LocationId).SetProductId(reqParams.ProductId).First()
-	if err != nil {
-		return errors.New("鍙傛暟寮傚父锛屾湭鎵惧埌璇ヤ笂鏋惰鍒�")
-	}
-
-	existAmount, err := models.NewLocationProductAmountSearch().SetLocationProductId(locProduct.Id).First()
-	if err != nil {
-		return err
+	existAmount, res := models.NewLocationProductAmountSearch().SetLocationId(reqParams.LocationId).SetProductId(reqParams.ProductId).FirstRes()
+	if res.Error != nil && !errors.Is(res.Error, gorm.ErrRecordNotFound) {
+		return res.Error
 	}
 	location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeAdjust)).First()
 	if err != nil {
 		return err
 	}
-	//reqParams.AdjustAmount = reqParams.Amount.Sub(reqParams.DifferenceAmount)
 	reqParams.AdjustAmount = reqParams.DifferenceAmount.Sub(reqParams.Amount)
 	var locAmount models.LocationProductAmount
-	if existAmount.Id == 0 {
+	if res.Error != nil && errors.Is(res.Error, gorm.ErrRecordNotFound) {
 		locAmount = models.LocationProductAmount{
-			LocationProductId: locProduct.Id,
+			LocationId: reqParams.LocationId,
+			//TODO:姝ゅ鏂板浜哖roductCategoryId鍏ュ弬锛岀洰鍓嶄笉娓呮杩欎釜鍊肩殑鏉ユ簮
+			ProductCategoryID: reqParams.ProductCategoryId,
+			ProductId:         reqParams.ProductId,
 			Amount:            decimal.NewFromInt(0),
 			CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
 		}
diff --git a/controllers/operation.go b/controllers/operation.go
index 21b953d..c53ead6 100644
--- a/controllers/operation.go
+++ b/controllers/operation.go
@@ -314,7 +314,7 @@
 		util.ResponseFormat(c, code.RequestParamError, "id涓�0")
 		return
 	}
-	operation, err := models.NewOperationSearch().SetID(id).First()
+	operation, err := models.NewOperationSearch().SetPreload(true).SetID(id).First()
 	if err != nil {
 		util.ResponseFormat(c, code.RequestParamError, "鏈壘鍒扮浉鍏冲嚭鍏ュ簱淇℃伅:"+err.Error())
 		return
@@ -323,17 +323,12 @@
 		util.ResponseFormat(c, code.RequestError, "璇ュ嚭鍏ュ簱淇℃伅鏃犳硶瀹屾垚")
 		return
 	}
-	operationType, err := models.NewOperationTypeSearch().SetID(uint(operation.OperationTypeId)).First()
-	if err != nil {
-		util.ResponseFormat(c, code.RequestError, err.Error())
-		return
-	}
 	if err := models.WithTransaction(func(tx *gorm.DB) error {
 
 		if err := models.NewOperationSearch().SetOrm(tx).SetID(id).Update(&models.Operation{Status: constvar.OperationStatus_Finish}); err != nil {
 			return err
 		}
-		//if operationType.BaseOperationType != constvar.BaseOperationTypeInternal {
+
 		var listProdtId []string
 		var listProdt []*models.Material
 		mapProdt := make(map[string]decimal.Decimal)
@@ -345,96 +340,175 @@
 			listProdtId = append(listProdtId, v.ProductId)
 			mapProdt[v.ProductId] = v.Amount
 		}
+
 		if err := models.NewMaterialSearch().Orm.Where("id IN ?", listProdtId).Find(&listProdt).Error; err != nil {
 			return err
 		}
-		if operationType.BaseOperationType == constvar.BaseOperationTypeIncoming {
+
+		if operation.BaseOperationType == constvar.BaseOperationTypeIncoming {
+			operationInputs := []*models.Operation{}
 			for k, v := range listProdt {
-				if value, ok := mapProdt[v.ID]; !ok {
+				value, ok := mapProdt[v.ID]
+				if !ok {
 					return errors.New("浜у搧绉嶇被寮傚父")
-				} else {
-					listProdt[k].Amount = listProdt[k].Amount.Add(value)
-					if err := tx.Save(listProdt[k]).Error; err != nil {
-						return err
+				}
+
+				listProdt[k].Amount = listProdt[k].Amount.Add(value)
+				if err := tx.Save(listProdt[k]).Error; err != nil {
+					return err
+				}
+
+				locationRule, err := models.NewLocationProductSearch().SetProductId(v.ID).SetAreaId(operation.ToLocationID).First()
+				if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+					return err
+				}
+				if err == nil {
+					operationTransfer := &models.Operation{
+						Number:            operation.Number,
+						SourceNumber:      operation.SourceNumber,
+						OperationTypeId:   operation.OperationTypeId,
+						OperationTypeName: operation.OperationTypeName,
+						Status:            constvar.OperationStatus_Finish,
+						FromLocationID:    locationRule.AreaId,
+						ToLocationID:      locationRule.LocationId,
+						OperationDate:     operation.OperationDate,
+						ContacterID:       operation.ContacterID,
+						ContacterName:     operation.ContacterName,
+						CompanyID:         operation.CompanyID,
+						CompanyName:       operation.CompanyName,
+						Comment:           operation.Comment,
+						BaseOperationType: operation.BaseOperationType,
+						Details: []*models.OperationDetails{
+							&models.OperationDetails{
+								ProductId: v.ID,
+								Amount:    value,
+							},
+						},
 					}
+					operationTransfer.Id = 0
+					operationTransfer.FromLocationID = locationRule.AreaId
+					operationTransfer.ToLocationID = locationRule.LocationId
+					operationTransfer.Status = constvar.OperationStatus_Finish
+					operationTransfer.Details = []*models.OperationDetails{
+						&models.OperationDetails{
+							ProductId: v.ID,
+							Amount:    value,
+						},
+					}
+					operationInputs = append(operationInputs, operationTransfer)
+
+					//if err := tx.Create(&operationTransfer).Error; err != nil {
+					//	return err
+					//}
+
 					//TODO:鍑哄叆搴撶殑finish鍜屾姤搴熺殑finish閮借澧炲姞瀵筶ocation_product_amount琛ㄦ暟閲忕殑鏇存柊,鍥犱负姝よ〃鏈塒roductCategory瀛楁锛屾墍浠peration_details琛ㄤ腑瑕佸鍔燩roductCategoryId瀛楁
-					var locAmount models.LocationProductAmount
-					if err := models.NewLocationProductAmountSearch().Orm.
-						Table("wms_location_product_amount").
-						Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").
-						Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.ToLocationID).
-						First(&locAmount).Error; err != nil {
+					locAmount, err := models.NewLocationProductAmountSearch().
+						SetProductId(v.ID).
+						SetLocationId(locationRule.LocationId).
+						First()
+					if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
 						return err
 					}
+					locAmount.LocationId = locationRule.LocationId
+					locAmount.ProductId = v.ID
+					locAmount.CreateDate = time.Now().Format("2006-01-02 15:04:05")
 					locAmount.Amount = locAmount.Amount.Add(value)
-					if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(&locAmount); err != nil {
-						return err
+					if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil {
+						return res.Error
 					}
-				}
-			}
-
-		}
-		if operationType.BaseOperationType == constvar.BaseOperationTypeOutgoing {
-			for k, v := range listProdt {
-				if value, ok := mapProdt[v.ID]; !ok {
-					return errors.New("浜у搧绉嶇被寮傚父")
 				} else {
-					if v.Amount.LessThan(value) {
-						return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
-					}
-					listProdt[k].Amount = listProdt[k].Amount.Sub(value)
-					if err := tx.Save(listProdt[k]).Error; err != nil {
-						return err
-					}
-					var locAmount models.LocationProductAmount
-					if err := models.NewLocationProductAmountSearch().Orm.Table("wms_location_product_amount").Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.FromLocationID).First(&locAmount).Error; err != nil {
-						return err
-					}
-					if locAmount.Amount.LessThan(value) {
-						return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
-					}
-					locAmount.Amount = locAmount.Amount.Sub(value)
-					if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(&locAmount); err != nil {
-						return err
-					}
-				}
-			}
-		}
-		if operationType.BaseOperationType == constvar.BaseOperationTypeInternal {
-			for k, v := range listProdt {
-				if value, ok := mapProdt[v.ID]; !ok {
-					return errors.New("浜у搧绉嶇被寮傚父")
-				} else {
-					listProdt[k].Amount = listProdt[k].Amount.Add(value)
-					if err := tx.Save(listProdt[k]).Error; err != nil {
-						return err
-					}
 					//TODO:鍑哄叆搴撶殑finish鍜屾姤搴熺殑finish閮借澧炲姞瀵筶ocation_product_amount琛ㄦ暟閲忕殑鏇存柊,鍥犱负姝よ〃鏈塒roductCategory瀛楁锛屾墍浠peration_details琛ㄤ腑瑕佸鍔燩roductCategoryId瀛楁
-					var fromAmount, toAmount models.LocationProductAmount
-					if err := models.NewLocationProductAmountSearch().Orm.Table("wms_location_product_amount").Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.FromLocationID).Find(&fromAmount).Error; err != nil {
+					locAmount, err := models.NewLocationProductAmountSearch().
+						SetProductId(v.ID).
+						SetLocationId(operation.ToLocationID).
+						First()
+					if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
 						return err
 					}
-					if fromAmount.Amount.LessThan(value) {
-						return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,璋冩嫧锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愯皟鎷ㄦ搷浣�", v.Name, v.Amount.String(), value.String()))
+					locAmount.LocationId = operation.ToLocationID
+					locAmount.ProductId = v.ID
+					locAmount.CreateDate = time.Now().Format("2006-01-02 15:04:05")
+					locAmount.Amount = locAmount.Amount.Add(value)
+					if res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil {
+						return res.Error
 					}
-					fromAmount.Amount = fromAmount.Amount.Sub(value)
-					if err := models.NewLocationProductAmountSearch().SetID(fromAmount.Id).Update(&fromAmount); err != nil {
-						return err
-					}
-
-					if err := models.NewLocationProductAmountSearch().Orm.Table("wms_location_product_amount").Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.ToLocationID).Find(&toAmount).Error; err != nil {
-						return err
-					}
-					toAmount.Amount = toAmount.Amount.Add(value)
-					if err := models.NewLocationProductAmountSearch().SetID(toAmount.Id).Update(&toAmount); err != nil {
-						return err
-					}
+				}
+			}
+			if len(operationInputs) > 0 {
+				if err := tx.Create(&operationInputs).Error; err != nil {
+					return err
 				}
 			}
 
 		}
 
-		//}
+		if operation.BaseOperationType == constvar.BaseOperationTypeOutgoing {
+			for k, v := range listProdt {
+				value, ok := mapProdt[v.ID]
+				if !ok {
+					return errors.New("浜у搧绉嶇被寮傚父")
+				}
+				if v.Amount.LessThan(value) {
+					return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
+				}
+				listProdt[k].Amount = listProdt[k].Amount.Sub(value)
+				if err := tx.Save(listProdt[k]).Error; err != nil {
+					return err
+				}
+				locAmount, res := models.NewLocationProductAmountSearch().
+					SetProductId(v.ID).
+					SetLocationId(operation.ToLocationID).
+					FirstRes()
+				if res.Error != nil {
+					return err
+				}
+				if locAmount.Amount.LessThan(value) {
+					return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
+				}
+				locAmount.Amount = locAmount.Amount.Sub(value)
+				if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(locAmount); err != nil {
+					return err
+				}
+			}
+		}
+		if operation.BaseOperationType == constvar.BaseOperationTypeInternal {
+			for _, v := range listProdt {
+				value, ok := mapProdt[v.ID]
+				if !ok {
+					return errors.New("浜у搧绉嶇被寮傚父")
+				}
+				//listProdt[k].Amount = listProdt[k].Amount.Add(value)
+				//if err := tx.Save(listProdt[k]).Error; err != nil {
+				//	return err
+				//}
+				fromLocAmount, res := models.NewLocationProductAmountSearch().
+					SetProductId(v.ID).
+					SetLocationId(operation.FromLocationID).
+					FirstRes()
+				if res.Error != nil {
+					return err
+				}
+				if fromLocAmount.Amount.LessThan(value) {
+					return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,璋冩嫧锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愯皟鎷ㄦ搷浣�", v.Name, v.Amount.String(), value.String()))
+				}
+				fromLocAmount.Amount = fromLocAmount.Amount.Sub(value)
+				if err := models.NewLocationProductAmountSearch().SetID(fromLocAmount.Id).Update(fromLocAmount); err != nil {
+					return err
+				}
+
+				toLocAmount, res := models.NewLocationProductAmountSearch().
+					SetProductId(v.ID).
+					SetLocationId(operation.ToLocationID).
+					FirstRes()
+				if res.Error != nil {
+					return err
+				}
+				toLocAmount.Amount = toLocAmount.Amount.Add(value)
+				if err := models.NewLocationProductAmountSearch().SetID(toLocAmount.Id).Update(toLocAmount); err != nil {
+					return err
+				}
+			}
+		}
 		return nil
 	}); err != nil {
 		util.ResponseFormat(c, code.RequestError, err.Error())
diff --git a/controllers/product_controller.go b/controllers/product_controller.go
index 9dee846..da77f6c 100644
--- a/controllers/product_controller.go
+++ b/controllers/product_controller.go
@@ -475,19 +475,35 @@
 				if err := tx.Save(listProdt[k]).Error; err != nil {
 					return err
 				}
-				var locAmount models.LocationProductAmount
-				if err := models.NewLocationProductAmountSearch().Orm.
-					Table("wms_location_product_amount").
-					Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").
-					Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.FromLocationID).
-					First(&locAmount).Error; err != nil {
+
+				//var locAmount models.LocationProductAmount
+				//if err := models.NewLocationProductAmountSearch().Orm.
+				//	Table("wms_location_product_amount").
+				//	Joins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").
+				//	Where("wms_location_product.product_id=? and wms_location_product.location_id=?", v.ID, operation.FromLocationID).
+				//	First(&locAmount).Error; err != nil {
+				//	return err
+				//}
+				//if locAmount.Amount.LessThan(value) {
+				//	return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
+				//}
+				//locAmount.Amount = locAmount.Amount.Sub(value)
+				//if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(&locAmount); err != nil {
+				//	return err
+				//}
+
+				locAmount, res := models.NewLocationProductAmountSearch().
+					SetProductId(v.ID).
+					SetLocationId(operation.ToLocationID).
+					FirstRes()
+				if res.Error != nil {
 					return err
 				}
 				if locAmount.Amount.LessThan(value) {
-					return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鍑哄簱锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愬嚭搴撴搷浣�", v.Name, v.Amount.String(), value.String()))
+					return errors.New(fmt.Sprintf("浜у搧锛�%v,搴撳瓨锛�%v,鎶ュ簾锛�%v,鏁伴噺涓嶅锛屾棤娉曞畬鎴愭姤搴熸搷浣�", v.Name, v.Amount.String(), value.String()))
 				}
 				locAmount.Amount = locAmount.Amount.Sub(value)
-				if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(&locAmount); err != nil {
+				if err := models.NewLocationProductAmountSearch().SetID(locAmount.Id).Update(locAmount); err != nil {
 					return err
 				}
 			}
diff --git a/controllers/report_forms_controller.go b/controllers/report_forms_controller.go
index 79ee050..88dc93a 100644
--- a/controllers/report_forms_controller.go
+++ b/controllers/report_forms_controller.go
@@ -183,10 +183,7 @@
 		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
 		return
 	}
-	search := models.NewLocationProductSearch()
-	if params.PageInfo.Check() {
-		search.SetPage(params.Page, params.PageSize)
-	}
+
 	//鏌ヨ浣嶇疆
 	locations, err := models.NewLocationSearch().SetJointName(params.WareHouseCode).FindAll()
 	if err != nil {
@@ -198,36 +195,24 @@
 		ids = append(ids, location.Id)
 	}
 
-	find, total, err := search.SetKeyword(params.KeyWord).SetProductId(params.ProductId).SetLocationIds(ids).FindByPage()
-	if err != nil {
-		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ涓婃灦瑙勫垯澶辫触")
-		return
-	}
-	ruleIds := make([]int, 0)
-	for _, product := range find {
-		ruleIds = append(ruleIds, product.Id)
-	}
-	amounts, err := models.NewLocationProductAmountSearch().SetLocationProductIds(ruleIds).Find()
+	amounts, total, err := models.NewLocationProductAmountSearch().SetPage(params.Page, params.PageSize).SetPreload(true).SetKeyword(params.KeyWord).SetProductId(params.ProductId).SetLocationIds(ids).FindByPage()
 	if err != nil {
 		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鏁伴噺澶辫触")
 		return
 	}
+
 	var result []response.LocationForms
-	for _, product := range find {
+	for _, amount := range amounts {
 		var resp response.LocationForms
-		for _, amount := range amounts {
-			if product.Id == amount.LocationProductId {
-				resp.Amount = amount.Amount
-				break
-			}
-		}
-		resp.LocationName = product.Location.Name
-		resp.ProduceId = product.Product.ID
-		resp.ProductName = product.Product.Name
-		resp.ProductTypeName = product.ProductCategory.Name
-		resp.Unit = product.Product.Unit
-		resp.Value = resp.Amount.Mul(product.Product.Cost)
+		resp.Amount = amount.Amount
+		resp.LocationName = amount.Location.Name
+		resp.ProduceId = amount.Product.ID
+		resp.ProductName = amount.Product.Name
+		resp.ProductTypeName = amount.ProductCategory.Name
+		resp.Unit = amount.Product.Unit
+		resp.Value = resp.Amount.Mul(amount.Product.Cost)
 		result = append(result, resp)
 	}
+
 	util.ResponseFormatList(c, code.Success, result, int(total))
 }
diff --git a/docs/docs.go b/docs/docs.go
index 364970e..56f55bb 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -3086,6 +3086,14 @@
         "request.GetInventoryHistory": {
             "type": "object",
             "properties": {
+                "baseOperationType": {
+                    "description": "鍩虹浣滀笟绫诲瀷",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.BaseOperationType"
+                        }
+                    ]
+                },
                 "keyWord": {
                     "description": "鎼滅储鏉′欢",
                     "type": "string"
@@ -3406,6 +3414,10 @@
                     "description": "鍑哄叆搴搃d",
                     "type": "integer"
                 },
+                "productCategoryId": {
+                    "description": "浜у搧绉嶇被id",
+                    "type": "integer"
+                },
                 "productId": {
                     "description": "浜у搧id",
                     "type": "string"
diff --git a/docs/swagger.json b/docs/swagger.json
index aa533b1..03c0a38 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -3074,6 +3074,14 @@
         "request.GetInventoryHistory": {
             "type": "object",
             "properties": {
+                "baseOperationType": {
+                    "description": "鍩虹浣滀笟绫诲瀷",
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.BaseOperationType"
+                        }
+                    ]
+                },
                 "keyWord": {
                     "description": "鎼滅储鏉′欢",
                     "type": "string"
@@ -3394,6 +3402,10 @@
                     "description": "鍑哄叆搴搃d",
                     "type": "integer"
                 },
+                "productCategoryId": {
+                    "description": "浜у搧绉嶇被id",
+                    "type": "integer"
+                },
                 "productId": {
                     "description": "浜у搧id",
                     "type": "string"
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 4f54f49..c8df29e 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -820,6 +820,10 @@
     type: object
   request.GetInventoryHistory:
     properties:
+      baseOperationType:
+        allOf:
+        - $ref: '#/definitions/constvar.BaseOperationType'
+        description: 鍩虹浣滀笟绫诲瀷
       keyWord:
         description: 鎼滅储鏉′欢
         type: string
@@ -1044,6 +1048,9 @@
       operationId:
         description: 鍑哄叆搴搃d
         type: integer
+      productCategoryId:
+        description: 浜у搧绉嶇被id
+        type: integer
       productId:
         description: 浜у搧id
         type: string
diff --git a/models/location_product.go b/models/location_product.go
index f42e2fe..f737765 100644
--- a/models/location_product.go
+++ b/models/location_product.go
@@ -85,6 +85,11 @@
 	return slf
 }
 
+func (slf *LocationProductSearch) SetAreaId(areaId int) *LocationProductSearch {
+	slf.AreaId = areaId
+	return slf
+}
+
 func (slf *LocationProductSearch) build() *gorm.DB {
 	var db = slf.Orm.Model(&LocationProduct{})
 
@@ -119,6 +124,10 @@
 
 	if len(slf.LocationIds) > 0 {
 		db = db.Where("location_id in (?)", slf.LocationIds)
+	}
+
+	if slf.AreaId != 0 {
+		db = db.Where("area_id = ?", slf.AreaId)
 	}
 
 	return db
@@ -206,3 +215,11 @@
 
 	return records, nil
 }
+
+func (slf *LocationProductSearch) FirstRes() (*LocationProduct, *gorm.DB) {
+	var (
+		record = new(LocationProduct)
+		db     = slf.build()
+	)
+	return record, db.First(record)
+}
diff --git a/models/location_product_amount.go b/models/location_product_amount.go
index 0700984..00c7b92 100644
--- a/models/location_product_amount.go
+++ b/models/location_product_amount.go
@@ -11,22 +11,29 @@
 type (
 	LocationProductAmount struct {
 		WmsModel
-		Id                int             `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		LocationProductId int             `json:"locationProductId" gorm:"type:int;not null;comment:涓婃灦瑙勫垯id"` //涓婃灦瑙勫垯id
-		LocationProduct   LocationProduct `json:"locationProduct" gorm:"foreignKey:LocationProductId;references:Id"`
+		Id int `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		//LocationProductId int             `json:"locationProductId" gorm:"type:int;not null;comment:涓婃灦瑙勫垯id"` //涓婃灦瑙勫垯id
+		//LocationProduct   LocationProduct `json:"locationProduct" gorm:"foreignKey:LocationProductId;references:Id"`
+		LocationId        int             `json:"locationId" gorm:"type:int;not null;comment:浣嶇疆id"` //浣嶇疆id
+		Location          Location        `json:"location" gorm:"foreignKey:LocationId;references:id"`
+		ProductCategoryID int             `json:"productCategoryId" gorm:"type:int;not null;comment:浜у搧绉嶇被id"` //浜у搧绉嶇被id
+		ProductCategory   ProductCategory `json:"productCategory"`
+		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:鏃ユ湡"`          //鏃ユ湡
 	}
 
 	LocationProductAmountSearch struct {
 		LocationProductAmount
-		Order              string
-		PageNum            int
-		PageSize           int
-		Keyword            string
-		Orm                *gorm.DB
-		Preload            bool
-		LocationProductIds []int
+		Order    string
+		PageNum  int
+		PageSize int
+		Keyword  string
+		Orm      *gorm.DB
+		Preload  bool
+		//LocationProductIds []int
+		LocationIds []int
 	}
 
 	LocationProductAmountWithOperation struct {
@@ -85,13 +92,23 @@
 	return slf
 }
 
-func (slf *LocationProductAmountSearch) SetLocationProductId(id int) *LocationProductAmountSearch {
-	slf.LocationProductId = id
+func (slf *LocationProductAmountSearch) SetProductId(productId string) *LocationProductAmountSearch {
+	slf.ProductId = productId
 	return slf
 }
 
-func (slf *LocationProductAmountSearch) SetLocationProductIds(ids []int) *LocationProductAmountSearch {
-	slf.LocationProductIds = ids
+func (slf *LocationProductAmountSearch) SetLocationId(locationId int) *LocationProductAmountSearch {
+	slf.LocationId = locationId
+	return slf
+}
+
+//func (slf *LocationProductAmountSearch) SetLocationProductIds(ids []int) *LocationProductAmountSearch {
+//	slf.LocationProductIds = ids
+//	return slf
+//}
+
+func (slf *LocationProductAmountSearch) SetLocationIds(ids []int) *LocationProductAmountSearch {
+	slf.LocationIds = ids
 	return slf
 }
 
@@ -110,13 +127,25 @@
 	}
 
 	if slf.Preload {
-		db = db.Model(&LocationProductAmount{}).Preload("LocationProduct").Preload("LocationProduct.Location").Preload("LocationProduct.Product")
+		db = db.Model(&LocationProductAmount{}).Preload("Location").Preload("Product").Preload("ProductCategory")
 	}
-	if slf.LocationProductId != 0 {
-		db = db.Where("location_product_id=?", slf.LocationProductId)
+	//if slf.LocationProductId != 0 {
+	//	db = db.Where("location_product_id=?", slf.LocationProductId)
+	//}
+	//if len(slf.LocationProductIds) > 0 {
+	//	db = db.Where("location_product_id in (?)", slf.LocationProductIds)
+	//}
+
+	if len(slf.LocationIds) > 0 {
+		db = db.Where("location_id in (?)", slf.LocationIds)
 	}
-	if len(slf.LocationProductIds) > 0 {
-		db = db.Where("location_product_id in (?)", slf.LocationProductIds)
+
+	if slf.LocationId != 0 {
+		db = db.Where("location_id = ?", slf.LocationId)
+	}
+
+	if slf.ProductId != "" {
+		db = db.Where("product_id=?", slf.ProductId)
 	}
 
 	return db
@@ -204,3 +233,12 @@
 
 	return records, nil
 }
+
+func (slf *LocationProductAmountSearch) FirstRes() (*LocationProductAmount, *gorm.DB) {
+	var (
+		record = new(LocationProductAmount)
+		db     = slf.build()
+	)
+
+	return record, db.First(&record)
+}
diff --git a/request/location_product_amount.go b/request/location_product_amount.go
index d4c4e9d..6b34041 100644
--- a/request/location_product_amount.go
+++ b/request/location_product_amount.go
@@ -14,12 +14,13 @@
 
 type UpdateLocationProductAmount struct {
 	//LocationProductAmountId int             `json:"locationProductAmountId"` //搴撳瓨鐩樼偣id
-	AdjustAmount     decimal.Decimal `json:"adjustAmount" `    //宸��
-	DifferenceAmount decimal.Decimal `json:"differenceAmount"` //璁℃暟鏁伴噺
-	Amount           decimal.Decimal `json:"amount"`           //搴撳瓨鏁伴噺
-	ProductId        string          `json:"productId"`        //浜у搧id
-	OperationId      int             `json:"operationId"`      //鍑哄叆搴搃d
-	LocationId       int             `json:"locationId"`       //浣嶇疆id
+	AdjustAmount      decimal.Decimal `json:"adjustAmount" `     //宸��
+	DifferenceAmount  decimal.Decimal `json:"differenceAmount"`  //璁℃暟鏁伴噺
+	Amount            decimal.Decimal `json:"amount"`            //搴撳瓨鏁伴噺
+	ProductId         string          `json:"productId"`         //浜у搧id
+	OperationId       int             `json:"operationId"`       //鍑哄叆搴搃d
+	LocationId        int             `json:"locationId"`        //浣嶇疆id
+	ProductCategoryId int             `json:"productCategoryId"` //浜у搧绉嶇被id
 }
 
 type GetRuleList struct {

--
Gitblit v1.8.0