jiangshuai
2023-10-30 3f1fb8181a80624ec3f77412040777892a462fdc
上架规则支持产品类别
9个文件已修改
437 ■■■■ 已修改文件
constvar/const.go 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/location_product.go 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/location_product_amount.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/operation.go 212 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/location_product.go 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
request/location_product.go 22 ●●●●● 补丁 | 查看 | 原始文档 | 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(&params); 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(&params); 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
@@ -71,7 +71,7 @@
}
func CheckDetailsRepeat(details []*models.OperationDetails) bool {
    detailIDs := []string{}
    var detailIDs []string
    var tempID string
    for _, v := range details {
        detailIDs = append(detailIDs, v.ProductId)
@@ -346,7 +346,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 {
@@ -362,6 +362,7 @@
                if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
                    return err
                }
                if err == nil {
                    operationTransfer := &models.Operation{
                        Number:            operation.Number,
@@ -379,20 +380,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)
@@ -417,20 +408,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
                        }
                    }
                }
            }
@@ -471,7 +512,9 @@
                }
            }
        }
        if operation.BaseOperationType == constvar.BaseOperationTypeInternal {
            var operationInputs []*models.Operation
            for _, v := range listProdt {
                value, ok := mapProdt[v.ID]
                if !ok {
@@ -496,15 +539,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
@@ -2172,6 +2172,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": [
@@ -2836,6 +2851,14 @@
                "productId": {
                    "description": "产品id",
                    "type": "string"
                },
                "ruleType": {
                    "description": "上架规则类型 1:产品类型;2:产品类别类型",
                    "allOf": [
                        {
                            "$ref": "#/definitions/constvar.RuleType"
                        }
                    ]
                }
            }
        },
@@ -3388,6 +3411,14 @@
                "productId": {
                    "description": "产品id",
                    "type": "string"
                },
                "ruleType": {
                    "description": "上架规则类型 1:产品类型;2:产品类别类型",
                    "allOf": [
                        {
                            "$ref": "#/definitions/constvar.RuleType"
                        }
                    ]
                }
            }
        },
docs/swagger.json
@@ -2160,6 +2160,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": [
@@ -2824,6 +2839,14 @@
                "productId": {
                    "description": "产品id",
                    "type": "string"
                },
                "ruleType": {
                    "description": "上架规则类型 1:产品类型;2:产品类别类型",
                    "allOf": [
                        {
                            "$ref": "#/definitions/constvar.RuleType"
                        }
                    ]
                }
            }
        },
@@ -3376,6 +3399,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
@@ -647,6 +658,10 @@
      productId:
        description: 产品id
        type: string
      ruleType:
        allOf:
        - $ref: '#/definitions/constvar.RuleType'
        description: 上架规则类型 1:产品类型;2:产品类别类型
    type: object
  request.AddOperation:
    properties:
@@ -1029,6 +1044,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:产品类别类型
}