From 4738292c4762419696bee8962db7b7b7a0057c57 Mon Sep 17 00:00:00 2001
From: jiangshuai <291802688@qq.com>
Date: 星期二, 26 九月 2023 19:30:12 +0800
Subject: [PATCH] 1.二期一部分代码

---
 controllers/product_controller.go      |   21 
 controllers/operation.go               |   12 
 models/location_product_amount.go      |  176 +++++++++++++
 models/operation.go                    |    9 
 controllers/location_product.go        |  160 ++++++++++++
 request/operation.go                   |   37 +-
 router/router.go                       |    9 
 constvar/const.go                      |    2 
 models/location_product.go             |  174 +++++++++++++
 request/location_product.go            |   16 +
 request/location_product_amount.go     |   15 +
 request/product_request.go             |   21 
 controllers/location_product_amount.go |  102 +++++++
 13 files changed, 704 insertions(+), 50 deletions(-)

diff --git a/constvar/const.go b/constvar/const.go
index 42221db..f92ca9a 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -6,6 +6,8 @@
 	BaseOperationTypeIncoming BaseOperationType = iota + 1 //鏀惰揣
 	BaseOperationTypeOutgoing                              //浜よ揣
 	BaseOperationTypeInternal                              //鍐呴儴璋冩嫧
+	BaseOperationTypeDisuse                                //鎶ュ簾
+	BaseOperationTypeAdjust                                //搴撳瓨鐩樼偣
 )
 
 func (slf BaseOperationType) IsValid() bool {
diff --git a/controllers/location_product.go b/controllers/location_product.go
new file mode 100644
index 0000000..07d012b
--- /dev/null
+++ b/controllers/location_product.go
@@ -0,0 +1,160 @@
+package controllers
+
+import (
+	"github.com/gin-gonic/gin"
+	"strconv"
+	"wms/extend/code"
+	"wms/extend/util"
+	"wms/models"
+	"wms/pkg/logx"
+	"wms/pkg/structx"
+	"wms/request"
+)
+
+type LocationProductController struct {
+}
+
+// Add
+// @Tags      涓婃灦瑙勫垯
+// @Summary   娣诲姞涓婃灦瑙勫垯
+// @Produce   application/json
+// @Param     object  body  request.AddLocationProduct true  "鏂板涓婃灦瑙勫垯"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/locationProduct/add [post]
+func (slf LocationProductController) Add(c *gin.Context) {
+	var reqParams request.AddLocationProduct
+	var params models.LocationProduct
+	if err := c.BindJSON(&reqParams); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	if err := structx.AssignTo(reqParams, &params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏁版嵁杞崲閿欒"+err.Error())
+		return
+	}
+	if params.AreaId == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨鍖哄煙")
+		return
+	}
+	if params.LocationId == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浣嶇疆")
+		return
+	}
+	if params.ProductId == "" {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浜у搧")
+		return
+	}
+	if params.ProductCategoryID == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浜у搧绫诲埆")
+		return
+	}
+	if err := models.NewLocationProductSearch().Create(&params); err != nil {
+		logx.Errorf("Operation create err: %v", err)
+		util.ResponseFormat(c, code.SaveFail, "娣诲姞澶辫触锛�"+err.Error())
+		return
+	}
+	util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
+}
+
+// List
+// @Tags      涓婃灦瑙勫垯
+// @Summary   涓婃灦瑙勫垯鍒楄〃
+// @Produce   application/json
+// @Param		 object  body  request.PageInfo true  "鏌ヨ鍙傛暟"
+// @Success   200 {object} util.Response	"鎴愬姛"
+// @Router    /api-wms/v1/locationProduct/list [post]
+func (slf LocationProductController) List(c *gin.Context) {
+	var params request.PageInfo
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�:"+err.Error())
+		return
+	}
+	if params.Check() {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟寮傚父")
+		return
+	}
+
+	search := models.NewLocationProductSearch()
+	search.SetPage(params.Page, params.PageSize)
+	list, total, err := search.SetPreload(true).SetOrder("created_at desc").FindByPage()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestError, "鏌ユ壘澶辫触:"+err.Error())
+		return
+	}
+
+	util.ResponseFormatListWithPage(c, code.Success, list, int(total), params.Page, params.PageSize)
+}
+
+// Update
+// @Tags      涓婃灦瑙勫垯
+// @Summary   淇敼涓婃灦瑙勫垯
+// @Produce   application/json
+// @Param     object  body request.UpdateLocationProduct true  "鍏ュ簱淇℃伅"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/locationProduct/update [post]
+func (slf LocationProductController) Update(c *gin.Context) {
+	var reqParams request.UpdateLocationProduct
+	var params models.LocationProduct
+	if err := c.BindJSON(&reqParams); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇細"+err.Error())
+		return
+	}
+	if reqParams.Id == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "id涓�0")
+		return
+	}
+	if err := structx.AssignTo(reqParams, &params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏁版嵁杞崲閿欒"+err.Error())
+		return
+	}
+	if params.AreaId == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨鍖哄煙")
+		return
+	}
+	if params.LocationId == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浣嶇疆")
+		return
+	}
+	if params.ProductId == "" {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浜у搧")
+		return
+	}
+	if params.ProductCategoryID == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "璇烽�夋嫨浜у搧绫诲埆")
+		return
+	}
+	if err := models.NewLocationProductSearch().SetID(params.Id).Update(&params); err != nil {
+		logx.Errorf("LocationProduct update err: %v", err)
+		util.ResponseFormat(c, code.SaveFail, "淇敼澶辫触锛�"+err.Error())
+		return
+	}
+
+	util.ResponseFormat(c, code.Success, "淇敼鎴愬姛")
+}
+
+// Delete
+//
+//	@Tags		涓婃灦瑙勫垯
+//	@Summary	鍒犻櫎涓婃灦瑙勫垯
+//	@Produce	application/json
+//	@Param		id	path		int			true	"id"
+//	@Success	200	{object}	util.Response	"鎴愬姛"
+//	@Router		/api-wms/v1/locationProduct/delete/{id} [delete]
+func (slf LocationProductController) Delete(c *gin.Context) {
+	id, err := strconv.Atoi(c.Param("id"))
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "閿欒鐨刬d鍊�")
+		return
+	}
+	if id == 0 {
+		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())
+		return
+	}
+	util.ResponseFormat(c, code.Success, "鍒犻櫎鎴愬姛")
+}
diff --git a/controllers/location_product_amount.go b/controllers/location_product_amount.go
new file mode 100644
index 0000000..701a205
--- /dev/null
+++ b/controllers/location_product_amount.go
@@ -0,0 +1,102 @@
+package controllers
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"wms/constvar"
+	"wms/extend/code"
+	"wms/extend/util"
+	"wms/models"
+	"wms/request"
+)
+
+type LocationProductAmountController struct {
+}
+
+// List
+// @Tags      搴撳瓨鐩樼偣
+// @Summary   搴撳瓨鐩樼偣鍒楄〃
+// @Produce   application/json
+// @Param		 object  body  request.PageInfo true  "鏌ヨ鍙傛暟"
+// @Success   200 {object} util.Response	"鎴愬姛"
+// @Router    /api-wms/v1/locationProduct/list [post]
+func (slf LocationProductAmountController) List(c *gin.Context) {
+	var params request.PageInfo
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�:"+err.Error())
+		return
+	}
+	if params.Check() {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟寮傚父")
+		return
+	}
+
+	search := models.NewLocationProductAmountSearch()
+	search.SetPage(params.Page, params.PageSize)
+
+	search.Orm = search.Orm.Model(&models.LocationProductAmountWithOperation{}).Table("wms_location_product_amount").Select("wms_location_product_amount.*,wms_operation.amount as adjust_amount").InnerJoins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").InnerJoins("inner join wms_operation_details on wms_operation_details.product_id=wms_location_product.product_id").InnerJoins("inner join wms_operation on wms_operation.id=wms_operation_details.operation_id").Where("wms_operation.base_operation_type=?", constvar.BaseOperationTypeAdjust)
+
+	var (
+		records = make([]*models.ResponseDisuseList, 0)
+		total   int64
+	)
+
+	if err := search.Orm.Count(&total).Error; err != nil {
+		util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err))
+		return
+	}
+	search.Orm = search.Orm.Preload("LocationProduct").Preload("LocationProduct.Location").Preload("LocationProduct.Product")
+	if params.Page*params.PageSize > 0 {
+		search.Orm = search.Orm.Offset((params.Page - 1) * params.PageSize).Limit(params.PageSize)
+	}
+	if err := search.Orm.Find(&records).Error; err != nil {
+		util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err))
+		return
+	}
+
+	util.ResponseFormatListWithPage(c, code.Success, records, int(total), params.Page, params.PageSize)
+}
+
+// Add
+// @Tags      搴撳瓨鐩樼偣
+// @Summary   娣诲姞搴撳瓨鐩樼偣淇℃伅
+// @Produce   application/json
+// @Param     object  body  request.AddLocationProductAmount true  "鍏ュ簱/鍑哄簱淇℃伅"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/operation/operation [post]
+//func (slf LocationProductAmountController) Add(c *gin.Context) {
+//	var reqParams request.AddLocationProductAmount
+//	if err := c.BindJSON(&reqParams); err != nil {
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+//		return
+//	}
+//	if reqParams.LocationProductAmountId==0 {
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟寮傚父锛宭ocationProductAmountId涓�0")
+//		return
+//	}
+//	locAmount:=models.LocationProductAmount{
+//		LocationProductId: reqParams.LocationProductAmountId
+//	}
+//	operationType, err := models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
+//	if err != nil {
+//		util.ResponseFormat(c, code.RequestParamError, err.Error())
+//		return
+//	}
+//	//////
+//	if location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First(); err != nil {
+//		return err
+//	} else {
+//		params.ToLocationID = location.Id
+//	}
+//
+//
+//	params.Status = constvar.OperationStatus_Ready
+//	params.Number = strconv.FormatInt(time.Now().Unix(), 10)
+//	params.BaseOperationType = operationType.BaseOperationType
+//	if err := models.NewOperationSearch().Create(&params); err != nil {
+//		logx.Errorf("Operation create err: %v", err)
+//		util.ResponseFormat(c, code.SaveFail, "娣诲姞澶辫触锛�"+err.Error())
+//		return
+//	}
+//	util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
+//}
diff --git a/controllers/operation.go b/controllers/operation.go
index 872fb4c..9a87ab0 100644
--- a/controllers/operation.go
+++ b/controllers/operation.go
@@ -46,9 +46,15 @@
 		util.ResponseFormat(c, code.RequestParamError, err.Error())
 		return
 	}
+	operationType, err := models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, err.Error())
+		return
+	}
 
 	params.Status = constvar.OperationStatus_Ready
 	params.Number = strconv.FormatInt(time.Now().Unix(), 10)
+	params.BaseOperationType = operationType.BaseOperationType
 	if err := models.NewOperationSearch().Create(&params); err != nil {
 		logx.Errorf("Operation create err: %v", err)
 		util.ResponseFormat(c, code.SaveFail, "娣诲姞澶辫触锛�"+err.Error())
@@ -323,8 +329,14 @@
 						if err := tx.Save(listProdt[k]).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_produt_amount").Joins("inner join wms_location_product on wms_location_produt.id=wms_location_produt_amount.location_product_id").Where("wms_location_produt.product_id=? and wms_location_produt.location_id=?",operation.ToLocationID,v.ID).First(&locAmount).Error;err!=nil {
+						//	return err
+						//}
 					}
 				}
+
 			}
 			if operationType.BaseOperationType == constvar.BaseOperationTypeOutgoing {
 				for k, v := range listProdt {
diff --git a/controllers/product_controller.go b/controllers/product_controller.go
index c5d99a2..c1f3d00 100644
--- a/controllers/product_controller.go
+++ b/controllers/product_controller.go
@@ -360,19 +360,18 @@
 	}
 	detail := &models.OperationDetails{
 		ProductId: params.ProductId,
-		//ProductName: params.ProductName,
-		Amount: params.Amount,
-		//Unit:        params.Unit,
+		Amount:    params.Amount,
 	}
 	operation := models.Operation{
-		Number:          strconv.FormatInt(time.Now().Unix(), 10),
-		SourceNumber:    params.SourceNumber,
-		OperationTypeId: 0,
-		Status:          constvar.OperationStatus_Ready,
-		FromLocationID:  params.FromLocationId,
-		ToLocationID:    params.ToLocationId,
-		OperationDate:   time.Now().Format("2006-01-02 15:04:05"),
-		Details:         []*models.OperationDetails{detail},
+		Number:            strconv.FormatInt(time.Now().Unix(), 10),
+		SourceNumber:      params.SourceNumber,
+		OperationTypeId:   0,
+		Status:            constvar.OperationStatus_Ready,
+		FromLocationID:    params.FromLocationId,
+		ToLocationID:      params.ToLocationId,
+		OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
+		Details:           []*models.OperationDetails{detail},
+		BaseOperationType: constvar.BaseOperationTypeDisuse,
 	}
 	if err := models.NewOperationSearch().Create(&operation); err != nil {
 		logx.Errorf("Operation create err: %v", err)
diff --git a/models/location_product.go b/models/location_product.go
new file mode 100644
index 0000000..b3edb61
--- /dev/null
+++ b/models/location_product.go
@@ -0,0 +1,174 @@
+package models
+
+import (
+	"fmt"
+	"gorm.io/gorm"
+	"wms/pkg/mysqlx"
+)
+
+type (
+	LocationProduct struct {
+		WmsModel
+		Id                int             `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		LocationId        int             `json:"locationId" gorm:"type:int;not null;comment:浣嶇疆id"` //浣嶇疆id
+		Location          Location        `json:"location" gorm:"foreignKey:LocationId;references:id"`
+		AreaId            int             `json:"areaId" grom:"type:int;not null;comment:鍖哄煙id"` //鍖哄煙id
+		Area              Location        `json:"area" gorm:"foreignKey:AreaId;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"`
+	}
+
+	LocationProductSearch struct {
+		LocationProduct
+		Order    string
+		PageNum  int
+		PageSize int
+		Keyword  string
+		Orm      *gorm.DB
+		Preload  bool
+	}
+)
+
+func (slf *LocationProduct) TableName() string {
+	return "wms_location_product"
+}
+
+func NewLocationProductSearch() *LocationProductSearch {
+	return &LocationProductSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *LocationProductSearch) SetOrm(tx *gorm.DB) *LocationProductSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *LocationProductSearch) SetPage(page, size int) *LocationProductSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *LocationProductSearch) SetOrder(order string) *LocationProductSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *LocationProductSearch) SetID(id int) *LocationProductSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *LocationProductSearch) SetKeyword(keyword string) *LocationProductSearch {
+	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *LocationProductSearch) SetPreload(preload bool) *LocationProductSearch {
+	slf.Preload = preload
+	return slf
+}
+
+func (slf *LocationProductSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&LocationProduct{})
+
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	if slf.Keyword != "" {
+		db = db.Where("product_name like ?", fmt.Sprintf("%%%v%%", slf.Keyword))
+	}
+
+	if slf.Preload {
+		db = db.Model(&LocationProduct{}).Preload("Location").Preload("Area").Preload("ProductCategory").Preload("Product")
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *LocationProductSearch) Create(record *LocationProduct) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *LocationProductSearch) CreateBatch(records []*LocationProduct) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+func (slf *LocationProductSearch) Update(record *LocationProduct) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Updates(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *LocationProductSearch) Delete() error {
+	var db = slf.build()
+	return db.Unscoped().Delete(&LocationProduct{}).Error
+}
+
+func (slf *LocationProductSearch) First() (*LocationProduct, error) {
+	var (
+		record = new(LocationProduct)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+func (slf *LocationProductSearch) FindByPage() ([]*LocationProduct, int64, error) {
+	var (
+		records = make([]*LocationProduct, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+func (slf *LocationProductSearch) Find() ([]*LocationProduct, error) {
+	var (
+		records = make([]*LocationProduct, 0)
+		db      = slf.build()
+	)
+
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
diff --git a/models/location_product_amount.go b/models/location_product_amount.go
new file mode 100644
index 0000000..e8e0e7e
--- /dev/null
+++ b/models/location_product_amount.go
@@ -0,0 +1,176 @@
+package models
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"wms/pkg/mysqlx"
+)
+
+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"`
+		Amount            decimal.Decimal `json:"amount" gorm:"type:decimal(20,2);not null;comment:搴撳瓨鏁伴噺"` //搴撳瓨鏁伴噺
+	}
+
+	LocationProductAmountSearch struct {
+		LocationProductAmount
+		Order    string
+		PageNum  int
+		PageSize int
+		Keyword  string
+		Orm      *gorm.DB
+		Preload  bool
+	}
+
+	LocationProductAmountWithOperation struct {
+		LocationProductAmount LocationProductAmount `json:"locationProductAmount"`
+		AdjustAmount          decimal.Decimal       `json:"adjustAmount" gorm:"column:adjust_amount"`
+		DifferenceAmount      decimal.Decimal       `json:"difference_amount"`
+	}
+)
+
+func (slf *LocationProductAmount) TableName() string {
+	return "wms_location_product_amount"
+}
+
+func NewLocationProductAmountSearch() *LocationProductAmountSearch {
+	return &LocationProductAmountSearch{Orm: mysqlx.GetDB()}
+}
+
+func (slf *LocationProductAmountSearch) SetOrm(tx *gorm.DB) *LocationProductAmountSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) SetPage(page, size int) *LocationProductAmountSearch {
+	slf.PageNum, slf.PageSize = page, size
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) SetOrder(order string) *LocationProductAmountSearch {
+	slf.Order = order
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) SetID(id int) *LocationProductAmountSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) SetKeyword(keyword string) *LocationProductAmountSearch {
+	slf.Keyword = keyword
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) SetPreload(preload bool) *LocationProductAmountSearch {
+	slf.Preload = preload
+	return slf
+}
+
+func (slf *LocationProductAmountSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&LocationProductAmount{})
+
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+	if slf.Order != "" {
+		db = db.Order(slf.Order)
+	}
+
+	if slf.Keyword != "" {
+		db = db.Where("product_name like ?", fmt.Sprintf("%%%v%%", slf.Keyword))
+	}
+
+	if slf.Preload {
+		db = db.Model(&LocationProductAmount{}).Preload("LocationProduct").Preload("LocationProduct.Location").Preload("LocationProduct.Product")
+	}
+
+	return db
+}
+
+// Create 鍗曟潯鎻掑叆
+func (slf *LocationProductAmountSearch) Create(record *LocationProductAmount) error {
+	var db = slf.build()
+
+	if err := db.Create(record).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// CreateBatch 鎵归噺鎻掑叆
+func (slf *LocationProductAmountSearch) CreateBatch(records []*LocationProductAmount) error {
+	var db = slf.build()
+
+	if err := db.Create(&records).Error; err != nil {
+		return fmt.Errorf("create batch err: %v, records: %+v", err, records)
+	}
+
+	return nil
+}
+
+func (slf *LocationProductAmountSearch) Update(record *LocationProductAmount) error {
+	var db = slf.build()
+
+	if err := db.Omit("CreatedAt").Updates(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *LocationProductAmountSearch) Delete() error {
+	var db = slf.build()
+	return db.Unscoped().Delete(&LocationProductAmount{}).Error
+}
+
+func (slf *LocationProductAmountSearch) First() (*LocationProductAmount, error) {
+	var (
+		record = new(LocationProductAmount)
+		db     = slf.build()
+	)
+
+	if err := db.First(record).Error; err != nil {
+		return record, err
+	}
+
+	return record, nil
+}
+
+func (slf *LocationProductAmountSearch) FindByPage() ([]*LocationProductAmount, int64, error) {
+	var (
+		records = make([]*LocationProductAmount, 0)
+		total   int64
+		db      = slf.build()
+	)
+
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, fmt.Errorf("find count err: %v", err)
+	}
+	if slf.PageNum*slf.PageSize > 0 {
+		db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
+	}
+	if err := db.Find(&records).Error; err != nil {
+		return records, total, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, total, nil
+}
+
+func (slf *LocationProductAmountSearch) Find() ([]*LocationProductAmount, error) {
+	var (
+		records = make([]*LocationProductAmount, 0)
+		db      = slf.build()
+	)
+
+	if err := db.Find(&records).Error; err != nil {
+		return records, fmt.Errorf("find records err: %v", err)
+	}
+
+	return records, nil
+}
diff --git a/models/operation.go b/models/operation.go
index 7f17d4a..5f20228 100644
--- a/models/operation.go
+++ b/models/operation.go
@@ -28,13 +28,8 @@
 		CompanyName       string                   `json:"companyName" gorm:"type:varchar(127);comment:鍏徃鍚嶇О-瀹㈡埛"`
 		Comment           string                   `json:"comment" gorm:"type:text;comment:澶囨敞"`
 
-		Details []*OperationDetails `json:"details" gorm:"foreignKey:OperationID;references:Id"`
-
-		//Weight          decimal.Decimal          `json:"weight" gorm:"type:decimal(20,2);comment:閲嶉噺(kg)"`
-		//TransferWeight  decimal.Decimal          `json:"transferWeight" gorm:"type:decimal(20,2);comment:鐗╂祦閲嶉噺(kg)"`
-		//CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:鎵胯繍鍟咺D"`
-		//CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:鎵胯繍鍟嗗悕绉�"`
-		//Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:杩借釜鍙傝��"`
+		Details           []*OperationDetails        `json:"details" gorm:"foreignKey:OperationID;references:Id"`
+		BaseOperationType constvar.BaseOperationType `json:"baseOperationType" gorm:"type:tinyint;not null;comment:鍩虹浣滀笟绫诲瀷"` //鍩虹浣滀笟绫诲瀷
 	}
 
 	OperationSearch struct {
diff --git a/request/location_product.go b/request/location_product.go
new file mode 100644
index 0000000..feccc4f
--- /dev/null
+++ b/request/location_product.go
@@ -0,0 +1,16 @@
+package request
+
+type AddLocationProduct struct {
+	LocationId        int    `json:"locationId"`        //浣嶇疆id
+	ProductId         string `json:"productId"`         //浜у搧id
+	ProductCategoryId int    `json:"productCategoryId"` //浜у搧绉嶇被id
+	AreaId            int    `json:"areaId"`            //鍖哄煙id
+}
+
+type UpdateLocationProduct struct {
+	Id                int    `json:"id"`
+	LocationId        int    `json:"locationId"`        //浣嶇疆id
+	ProductId         string `json:"productId"`         //浜у搧id
+	ProductCategoryId int    `json:"productCategoryId"` //浜у搧绉嶇被id
+	AreaId            int    `json:"areaId"`            //鍖哄煙id
+}
diff --git a/request/location_product_amount.go b/request/location_product_amount.go
new file mode 100644
index 0000000..bc7fa2d
--- /dev/null
+++ b/request/location_product_amount.go
@@ -0,0 +1,15 @@
+package request
+
+import "github.com/shopspring/decimal"
+
+type AddLocationProductAmount struct {
+	LocationProductAmountId int             `json:"locationProductAmountId"` //搴撳瓨鐩樼偣id
+	AdjustAmount            decimal.Decimal `json:"adjustAmount" `           //宸��
+	DifferenceAmount        decimal.Decimal `json:"difference_amount"`       //璁℃暟鏁伴噺
+}
+
+type UpdateLocationProductAmount struct {
+	LocationProductAmountId int             `json:"locationProductAmountId"` //搴撳瓨鐩樼偣id
+	AdjustAmount            decimal.Decimal `json:"adjustAmount" `           //宸��
+	DifferenceAmount        decimal.Decimal `json:"difference_amount"`       //璁℃暟鏁伴噺
+}
diff --git a/request/operation.go b/request/operation.go
index 5f17078..cf73ffa 100644
--- a/request/operation.go
+++ b/request/operation.go
@@ -46,27 +46,22 @@
 }
 
 type UpdateOperation struct {
-	ID                int                      `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-	Number            string                   `json:"number" gorm:"column:number;type:varchar(255)"`             //鍗曞彿
-	SourceNumber      string                   `json:"sourceNumber" gorm:"type:varchar(255)"`                     //婧愬崟鍙�
-	OperationTypeId   int                      `json:"operationTypeId" gorm:"type:int;not null;comment:浣滀笟绫诲瀷id"`   //浣滀笟绫诲瀷id
-	OperationTypeName string                   `json:"operationTypeName" gorm:"type:varchar(127);comment:浣滀笟绫诲瀷鍚嶇О"` //浣滀笟绫诲瀷鍚嶇О
-	Status            constvar.OperationStatus `json:"status" gorm:"type:int(11);not null;comment:鐘舵��"`            //鐘舵��
-	FromLocationId    int                      `json:"fromLocationId"   gorm:"type:int;not null;comment:婧愪綅缃甶d"`   //婧愪綅缃甶d
-	ToLocationId      int                      `json:"toLocationId"    gorm:"type:int;not null;comment:鐩爣浣嶇疆id"`   //鐩爣浣嶇疆id
-	OperationDate     string                   `json:"operationDate" gorm:"type:varchar(31);comment:瀹夋帓鏃ユ湡"`        //瀹夋帓鏃ユ湡
-	Details           []*OperationDetails      `json:"details"`
-	ContacterID       int                      `json:"contacterID" gorm:"type:int;comment:鑱旂郴浜篒D"`           //鑱旂郴浜篒D-闈炲繀濉�
-	ContacterName     string                   `json:"contacterName" gorm:"type:varchar(63);comment:鑱旂郴浜哄鍚�"` //鑱旂郴浜哄鍚�-闈炲繀濉�
-	CompanyID         int                      `json:"companyID" gorm:"type:int;comment:鍏徃ID"`              //鍏徃ID-瀹㈡埛
-	CompanyName       string                   `json:"companyName" gorm:"type:varchar(127);comment:鍏徃鍚嶇О"`   //鍏徃鍚嶇О-瀹㈡埛鍚嶇О
-	Comment           string                   `json:"comment" gorm:"type:text;comment:澶囨敞"`                 //澶囨敞
-
-	//CarrierID      int             `json:"carrierID" gorm:"type:int;comment:鎵胯繍鍟咺D"`                   //鎵胯繍鍟咺D-闈炲繀濉�
-	//CarrierName    string          `json:"carrierName" gorm:"type:varchar(63);comment:鎵胯繍鍟嗗悕绉�"`         //鎵胯繍鍟嗗悕绉�-闈炲繀濉�
-	//Tracking       string          `json:"tracking" gorm:"type:varchar(127);comment:杩借釜鍙傝��"`            //杩借釜鍙傝��-闈炲繀濉�
-	//Weight         decimal.Decimal `json:"weight" gorm:"type:decimal(20,2);comment:閲嶉噺(kg)"`           //閲嶉噺(kg)-闈炲繀濉�
-	//TransferWeight decimal.Decimal `json:"transferWeight" gorm:"type:decimal(20,2);comment:鐗╂祦閲嶉噺(kg)"` //鐗╂祦閲嶉噺(kg)-闈炲繀濉�
+	ID                int                        `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+	Number            string                     `json:"number" gorm:"column:number;type:varchar(255)"`             //鍗曞彿
+	SourceNumber      string                     `json:"sourceNumber" gorm:"type:varchar(255)"`                     //婧愬崟鍙�
+	OperationTypeId   int                        `json:"operationTypeId" gorm:"type:int;not null;comment:浣滀笟绫诲瀷id"`   //浣滀笟绫诲瀷id
+	OperationTypeName string                     `json:"operationTypeName" gorm:"type:varchar(127);comment:浣滀笟绫诲瀷鍚嶇О"` //浣滀笟绫诲瀷鍚嶇О
+	Status            constvar.OperationStatus   `json:"status" gorm:"type:int(11);not null;comment:鐘舵��"`            //鐘舵��
+	FromLocationId    int                        `json:"fromLocationId"   gorm:"type:int;not null;comment:婧愪綅缃甶d"`   //婧愪綅缃甶d
+	ToLocationId      int                        `json:"toLocationId"    gorm:"type:int;not null;comment:鐩爣浣嶇疆id"`   //鐩爣浣嶇疆id
+	OperationDate     string                     `json:"operationDate" gorm:"type:varchar(31);comment:瀹夋帓鏃ユ湡"`        //瀹夋帓鏃ユ湡
+	Details           []*OperationDetails        `json:"details"`
+	ContacterID       int                        `json:"contacterID" gorm:"type:int;comment:鑱旂郴浜篒D"`           //鑱旂郴浜篒D-闈炲繀濉�
+	ContacterName     string                     `json:"contacterName" gorm:"type:varchar(63);comment:鑱旂郴浜哄鍚�"` //鑱旂郴浜哄鍚�-闈炲繀濉�
+	CompanyID         int                        `json:"companyID" gorm:"type:int;comment:鍏徃ID"`              //鍏徃ID-瀹㈡埛
+	CompanyName       string                     `json:"companyName" gorm:"type:varchar(127);comment:鍏徃鍚嶇О"`   //鍏徃鍚嶇О-瀹㈡埛鍚嶇О
+	Comment           string                     `json:"comment" gorm:"type:text;comment:澶囨敞"`                 //澶囨敞
+	BaseOperationType constvar.BaseOperationType `json:"baseOperationType"`                                   //鍩虹浣滀笟绫诲瀷
 }
 
 type OperationAllList struct {
diff --git a/request/product_request.go b/request/product_request.go
index 2c91b79..c0e7ea7 100644
--- a/request/product_request.go
+++ b/request/product_request.go
@@ -33,15 +33,14 @@
 }
 
 type UpdateDisuse struct {
-	Id        int    `json:"id"`
-	ProductId string `json:"productId"`
-	//ProductName    string                   `json:"productName"`
-	Amount         decimal.Decimal `json:"amount"`
-	FromLocationId int             `json:"fromLocationId"`
-	ToLocationId   int             `json:"toLocationId"`
-	SourceNumber   string          `json:"sourceNumber"`
-	//Unit           string                   `json:"unit"`
-	Number        string                   `json:"number"`
-	Status        constvar.OperationStatus `json:"status"`
-	OperationDate string                   `json:"operationDate"`
+	Id                int                        `json:"id"`
+	ProductId         string                     `json:"productId"`
+	Amount            decimal.Decimal            `json:"amount"`
+	FromLocationId    int                        `json:"fromLocationId"`
+	ToLocationId      int                        `json:"toLocationId"`
+	SourceNumber      string                     `json:"sourceNumber"`
+	Number            string                     `json:"number"`
+	Status            constvar.OperationStatus   `json:"status"`
+	OperationDate     string                     `json:"operationDate"`
+	BaseOperationType constvar.BaseOperationType `json:"baseOperationType"`
 }
diff --git a/router/router.go b/router/router.go
index e912304..c23bd3d 100644
--- a/router/router.go
+++ b/router/router.go
@@ -107,7 +107,16 @@
 		productAPI.POST("listDisuse", productController.ListDisuse)        //鏌ョ湅浜у搧鐨勫巻鍙插嚭鍏ュ簱淇℃伅
 		productAPI.PUT("finishDisuse/:id", productController.FinishDisuse) //鎶ュ簾楠岃瘉
 		productAPI.POST("updateDisuse", productController.UpdateDisuse)    //淇敼鎶ュ簾淇℃伅
+	}
 
+	// 涓婃灦瑙勫垯
+	locationProductController := new(controllers.LocationProductController)
+	locationProductAPI := r.Group(urlPrefix + "/locationProduct")
+	{
+		locationProductAPI.GET("operationType", locationProductController.List)          // 鑾峰彇涓婃灦瑙勫垯鍒楄〃
+		locationProductAPI.POST("operationType", locationProductController.Add)          // 鏂板涓婃灦瑙勫垯
+		locationProductAPI.PUT("operationType/:id", locationProductController.Update)    // 淇敼涓婃灦瑙勫垯
+		locationProductAPI.DELETE("operationType/:id", locationProductController.Delete) // 鍒犻櫎涓婃灦瑙勫垯
 	}
 
 	return r

--
Gitblit v1.8.0