constvar/const.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
controllers/location_product.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
controllers/location_product_amount.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
controllers/operation.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
docs/docs.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
docs/swagger.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
docs/swagger.yaml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/location_product.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
request/location_product.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
constvar/const.go
@@ -184,3 +184,10 @@ PostType_Soon PostType = iota + 1 //尽快 PostType_AfterReady //当所有产品就绪时 ) type RuleType int const ( RuleType_Product RuleType = iota + 1 //产品上架规则 RuleType_ProductCategory //产品类别上架规则 ) controllers/location_product.go
@@ -1,8 +1,11 @@ package controllers import ( "errors" "github.com/gin-gonic/gin" "gorm.io/gorm" "strconv" "wms/constvar" "wms/extend/code" "wms/extend/util" "wms/models" @@ -40,14 +43,43 @@ util.ResponseFormat(c, code.RequestParamError, "请选择位置") return } if params.ProductId == "" { util.ResponseFormat(c, code.RequestParamError, "请选择产品") if params.RuleType != constvar.RuleType_Product && params.RuleType != constvar.RuleType_ProductCategory { util.ResponseFormat(c, code.RequestParamError, "ruleType异常") return } //if params.ProductCategoryID == 0 { // util.ResponseFormat(c, code.RequestParamError, "请选择产品类别") // return //} if params.RuleType == constvar.RuleType_Product { if params.ProductId == "" { util.ResponseFormat(c, code.RequestParamError, "请选择产品") return } if _, err := models.NewLocationProductSearch().SetProductId(params.ProductId).SetLocationId(params.LocationId).SetAreaId(params.AreaId).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { util.ResponseFormat(c, code.RequestParamError, err.Error()) return } } else { util.ResponseFormat(c, code.RequestParamError, "已存在该上家规则,请勿重复添加") return } } if params.RuleType == constvar.RuleType_ProductCategory { if params.ProductCategoryID == 0 { util.ResponseFormat(c, code.RequestParamError, "请选择产品类别") return } if _, err := models.NewLocationProductSearch().SetProductCategoryId(params.ProductCategoryID).SetLocationId(params.LocationId).SetAreaId(params.AreaId).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { util.ResponseFormat(c, code.RequestParamError, err.Error()) return } } else { util.ResponseFormat(c, code.RequestParamError, "已存在该上家规则,请勿重复添加") return } } if err := models.NewLocationProductSearch().Create(¶ms); err != nil { logx.Errorf("Operation create err: %v", err) @@ -116,14 +148,44 @@ util.ResponseFormat(c, code.RequestParamError, "请选择位置") return } if params.ProductId == "" { util.ResponseFormat(c, code.RequestParamError, "请选择产品") if params.RuleType != constvar.RuleType_Product && params.RuleType != constvar.RuleType_ProductCategory { util.ResponseFormat(c, code.RequestParamError, "ruleType异常") return } if params.ProductCategoryID == 0 { util.ResponseFormat(c, code.RequestParamError, "请选择产品类别") return if params.RuleType == constvar.RuleType_Product { if params.ProductId == "" { util.ResponseFormat(c, code.RequestParamError, "请选择产品") return } if rule, err := models.NewLocationProductSearch().SetProductId(params.ProductId).SetLocationId(params.LocationId).SetAreaId(params.AreaId).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { util.ResponseFormat(c, code.RequestParamError, err.Error()) return } } else if params.Id != rule.Id { util.ResponseFormat(c, code.RequestParamError, "已存在该上家规则,请勿重复添加") return } } if params.RuleType == constvar.RuleType_ProductCategory { if params.ProductCategoryID == 0 { util.ResponseFormat(c, code.RequestParamError, "请选择产品类别") return } if rule, err := models.NewLocationProductSearch().SetProductCategoryId(params.ProductCategoryID).SetLocationId(params.LocationId).SetAreaId(params.AreaId).First(); err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { util.ResponseFormat(c, code.RequestParamError, err.Error()) return } } else if params.Id != rule.Id { util.ResponseFormat(c, code.RequestParamError, "已存在该上家规则,请勿重复添加") return } } if err := models.NewLocationProductSearch().SetID(params.Id).Update(¶ms); err != nil { logx.Errorf("LocationProduct update err: %v", err) util.ResponseFormat(c, code.SaveFail, "修改失败:"+err.Error()) controllers/location_product_amount.go
@@ -60,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 && !errors.Is(err, gorm.ErrRecordNotFound) { if err := search.Orm.Order("wms_location_product_amount.updated_at desc").Find(&records).Error; err != nil { util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err)) return } controllers/operation.go
@@ -74,7 +74,7 @@ } func CheckDetailsRepeat(details []*models.OperationDetails) bool { detailIDs := []string{} var detailIDs []string var tempID string for _, v := range details { detailIDs = append(detailIDs, v.ProductId) @@ -349,7 +349,7 @@ } if operation.BaseOperationType == constvar.BaseOperationTypeIncoming { operationInputs := []*models.Operation{} var operationInputs []*models.Operation for k, v := range listProdt { value, ok := mapProdt[v.ID] if !ok { @@ -365,6 +365,7 @@ if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } if err == nil { operationTransfer := &models.Operation{ Number: operation.Number, @@ -382,20 +383,10 @@ Comment: operation.Comment, BaseOperationType: constvar.BaseOperationTypeInternal, 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) @@ -420,20 +411,70 @@ return res.Error } } else { //TODO:出入库的finish和报废的finish都要增加对location_product_amount表数量的更新,因为此表有ProductCategory字段,所以operation_details表中要增加ProductCategoryId字段 locAmount, err := models.NewLocationProductAmountSearch(). SetProductId(v.ID). SetLocationId(operation.ToLocationID). First() locationRule, err = models.NewLocationProductSearch().SetProductCategoryId(v.CategoryId).SetAreaId(operation.ToLocationID).First() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } 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 if err == nil { operationTransfer := &models.Operation{ Number: operation.Number, SourceNumber: operation.SourceNumber, OperationTypeId: 0, 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: constvar.BaseOperationTypeInternal, Details: []*models.OperationDetails{ { ProductId: v.ID, Amount: value, }, }, } operationInputs = append(operationInputs, operationTransfer) //if err := tx.Create(&operationTransfer).Error; err != nil { // return err //} //TODO:出入库的finish和报废的finish都要增加对location_product_amount表数量的更新,因为此表有ProductCategory字段,所以operation_details表中要增加ProductCategoryId字段 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 res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { return res.Error } } else { //TODO:出入库的finish和报废的finish都要增加对location_product_amount表数量的更新,因为此表有ProductCategory字段,所以operation_details表中要增加ProductCategoryId字段 locAmount, err := models.NewLocationProductAmountSearch(). SetProductId(v.ID). SetLocationId(operation.ToLocationID). First() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } 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 } } } } @@ -486,7 +527,9 @@ } } } if operation.BaseOperationType == constvar.BaseOperationTypeInternal { var operationInputs []*models.Operation for _, v := range listProdt { value, ok := mapProdt[v.ID] if !ok { @@ -511,15 +554,122 @@ return err } toLocAmount, res := models.NewLocationProductAmountSearch(). SetProductId(v.ID). SetLocationId(operation.ToLocationID). FirstRes() if res.Error != nil { locationRule, err := models.NewLocationProductSearch().SetProductId(v.ID).SetAreaId(operation.ToLocationID).First() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } toLocAmount.Amount = toLocAmount.Amount.Add(value) if err := models.NewLocationProductAmountSearch().SetID(toLocAmount.Id).Update(toLocAmount); err != nil { if err == nil { operationTransfer := &models.Operation{ Number: operation.Number, SourceNumber: operation.SourceNumber, OperationTypeId: 0, 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: constvar.BaseOperationTypeInternal, Details: []*models.OperationDetails{ { ProductId: v.ID, Amount: value, }, }, } operationInputs = append(operationInputs, operationTransfer) //if err := tx.Create(&operationTransfer).Error; err != nil { // return err //} 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 res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { return res.Error } } else { locationRule, err = models.NewLocationProductSearch().SetProductCategoryId(v.CategoryId).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: 0, 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: constvar.BaseOperationTypeInternal, Details: []*models.OperationDetails{ { ProductId: v.ID, Amount: value, }, }, } operationInputs = append(operationInputs, operationTransfer) //if err := tx.Create(&operationTransfer).Error; err != nil { // return err //} 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 res := models.NewLocationProductAmountSearch().Orm.Where("id=?", locAmount.ID).Save(locAmount); res.Error != nil { return res.Error } } else { locAmount, err := models.NewLocationProductAmountSearch(). SetProductId(v.ID). SetLocationId(operation.ToLocationID). First() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } 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 } } } } if len(operationInputs) > 0 { if err := tx.Create(&operationInputs).Error; err != nil { return err } } docs/docs.go
@@ -2353,6 +2353,21 @@ "ReservationMethodByDate" ] }, "constvar.RuleType": { "type": "integer", "enum": [ 1, 2 ], "x-enum-comments": { "RuleType_Product": "产品上架规则", "RuleType_ProductCategory": "产品类别上架规则" }, "x-enum-varnames": [ "RuleType_Product", "RuleType_ProductCategory" ] }, "constvar.WhetherType": { "type": "integer", "enum": [ @@ -3073,6 +3088,14 @@ "productId": { "description": "产品id", "type": "string" }, "ruleType": { "description": "上架规则类型 1:产品类型;2:产品类别类型", "allOf": [ { "$ref": "#/definitions/constvar.RuleType" } ] } } }, @@ -3652,6 +3675,14 @@ "productId": { "description": "产品id", "type": "string" }, "ruleType": { "description": "上架规则类型 1:产品类型;2:产品类别类型", "allOf": [ { "$ref": "#/definitions/constvar.RuleType" } ] } } }, docs/swagger.json
@@ -2341,6 +2341,21 @@ "ReservationMethodByDate" ] }, "constvar.RuleType": { "type": "integer", "enum": [ 1, 2 ], "x-enum-comments": { "RuleType_Product": "产品上架规则", "RuleType_ProductCategory": "产品类别上架规则" }, "x-enum-varnames": [ "RuleType_Product", "RuleType_ProductCategory" ] }, "constvar.WhetherType": { "type": "integer", "enum": [ @@ -3061,6 +3076,14 @@ "productId": { "description": "产品id", "type": "string" }, "ruleType": { "description": "上架规则类型 1:产品类型;2:产品类别类型", "allOf": [ { "$ref": "#/definitions/constvar.RuleType" } ] } } }, @@ -3640,6 +3663,14 @@ "productId": { "description": "产品id", "type": "string" }, "ruleType": { "description": "上架规则类型 1:产品类型;2:产品类别类型", "allOf": [ { "$ref": "#/definitions/constvar.RuleType" } ] } } }, docs/swagger.yaml
@@ -178,6 +178,17 @@ - ReservationMethodAtConfirm - ReservationMethodManual - ReservationMethodByDate constvar.RuleType: enum: - 1 - 2 type: integer x-enum-comments: RuleType_Product: 产品上架规则 RuleType_ProductCategory: 产品类别上架规则 x-enum-varnames: - RuleType_Product - RuleType_ProductCategory constvar.WhetherType: enum: - 1 @@ -687,6 +698,10 @@ productId: description: 产品id type: string ruleType: allOf: - $ref: '#/definitions/constvar.RuleType' description: 上架规则类型 1:产品类型;2:产品类别类型 type: object request.AddOperation: properties: @@ -1087,6 +1102,10 @@ productId: description: 产品id type: string ruleType: allOf: - $ref: '#/definitions/constvar.RuleType' description: 上架规则类型 1:产品类型;2:产品类别类型 type: object request.UpdateLocationProductAmount: properties: models/location_product.go
@@ -3,21 +3,23 @@ import ( "fmt" "gorm.io/gorm" "wms/constvar" "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"` 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"` RuleType constvar.RuleType `json:"ruleType" gorm:"type:int(11);not null;comment:上架规则类型 1:产品类型;2:产品类别类型"` } LocationProductSearch struct { @@ -90,6 +92,11 @@ return slf } func (slf *LocationProductSearch) SetProductCategoryId(productCategoryID int) *LocationProductSearch { slf.ProductCategoryID = productCategoryID return slf } func (slf *LocationProductSearch) build() *gorm.DB { var db = slf.Orm.Model(&LocationProduct{}) @@ -130,6 +137,10 @@ db = db.Where("area_id = ?", slf.AreaId) } if slf.ProductCategoryID != 0 { db = db.Where("product_category_id = ?", slf.ProductCategoryID) } return db } request/location_product.go
@@ -1,16 +1,20 @@ package request import "wms/constvar" type AddLocationProduct struct { LocationId int `json:"locationId"` //位置id ProductId string `json:"productId"` //产品id ProductCategoryId int `json:"productCategoryId"` //产品种类id AreaId int `json:"areaId"` //区域id LocationId int `json:"locationId"` //位置id ProductId string `json:"productId"` //产品id ProductCategoryId int `json:"productCategoryId"` //产品种类id AreaId int `json:"areaId"` //区域id RuleType constvar.RuleType `json:"ruleType"` //上架规则类型 1:产品类型;2:产品类别类型 } 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 Id int `json:"id"` LocationId int `json:"locationId"` //位置id ProductId string `json:"productId"` //产品id ProductCategoryId int `json:"productCategoryId"` //产品种类id AreaId int `json:"areaId"` //区域id RuleType constvar.RuleType `json:"ruleType"` //上架规则类型 1:产品类型;2:产品类别类型 }