jiangshuai
2023-09-20 de66fdb29ff38924a235d366a73642c60a509ce6
1.出入库一部分代码
8个文件已修改
254 ■■■■ 已修改文件
constvar/const.go 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/operation.go 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/operation_type.go 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation.go 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation_details.go 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation_type.go 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
request/operation.go 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/router.go 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
constvar/const.go
@@ -173,3 +173,10 @@
    OperationStatus_Ready                              //就绪
    OperationStatus_Finish                             //完成
)
type PostType int
const (
    PostType_Soon       PostType = iota + 1 //尽快
    PostType_AfterReady                     //当所有产品就绪时
)
controllers/operation.go
@@ -6,6 +6,7 @@
    "github.com/spf13/cast"
    "gorm.io/gorm"
    "strconv"
    "wms/constvar"
    "wms/extend/code"
    "wms/extend/util"
    "wms/models"
@@ -39,12 +40,54 @@
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
    if err := slf.FormatLocation(&params); err != nil {
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
    params.Status = constvar.OperationStatus_Ready
    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, "添加成功")
}
func (slf OperationController) FormatLocation(params *models.Operation) error {
    operationType, err := models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
    if err != nil {
        return err
    }
    if operationType.BaseOperationType == constvar.BaseOperationTypeIncoming {
        if location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First(); err != nil {
            return err
        } else {
            params.FromLocationId = location.Id
        }
        if params.ToLocationId == 0 {
            return errors.New("请选择目标位置")
        }
    }
    if operationType.BaseOperationType == constvar.BaseOperationTypeOutgoing {
        if location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First(); err != nil {
            return err
        } else {
            params.ToLocationId = location.Id
        }
        if params.FromLocationId == 0 {
            return errors.New("请选择源位置")
        }
    }
    if operationType.BaseOperationType == constvar.BaseOperationTypeInternal {
        if params.ToLocationId == 0 {
            return errors.New("请选择目标位置")
        }
        if params.FromLocationId == 0 {
            return errors.New("请选择源位置")
        }
    }
    return nil
}
func (slf OperationController) CheckParams(params models.Operation) error {
@@ -54,14 +97,6 @@
    if params.OperationTypeId == 0 {
        return errors.New("operationTypeId为0")
    }
    if params.FromLocationId == 0 {
        return errors.New("请选择源位置")
    }
    if params.ToLocationId == 0 {
        return errors.New("请选择目标位置")
    }
    if params.OperationDate == "" {
@@ -74,16 +109,13 @@
    //检查明细部分
    for _, v := range params.Details {
        if v.ProductId == 0 {
        if v.ProductId == "" {
            return errors.New("productID为0")
        }
        if v.ProductName == "" {
            return errors.New("产品名称异常")
        }
        if v.Quantity.IsNegative() {
            return errors.New("产品数量出错")
        }
        if v.FinishQuantity.IsNegative() {
            return errors.New("产品数量出错")
        }
    }
@@ -151,11 +183,19 @@
        util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误:"+err.Error())
        return
    }
    if reqParams.Status != constvar.OperationStatus_Ready {
        util.ResponseFormat(c, code.RequestParamError, "该入库信息已完成,无法进行修改")
        return
    }
    if err := structx.AssignTo(reqParams, &params); err != nil {
        util.ResponseFormat(c, code.RequestParamError, "数据转换错误"+err.Error())
        return
    }
    if err := slf.CheckParams(params); err != nil {
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
    if err := slf.FormatLocation(&params); err != nil {
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
@@ -190,7 +230,16 @@
        return
    }
    if id == 0 {
        util.ResponseFormat(c, code.RequestParamError, "空的记录id")
        util.ResponseFormat(c, code.RequestParamError, "id为0")
        return
    }
    operation, err := models.NewOperationSearch().SetID(id).First()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, "未找到相关出入库信息:"+err.Error())
        return
    }
    if operation.Status != constvar.OperationStatus_Ready {
        util.ResponseFormat(c, code.RequestError, "该入库信息无法进行删除")
        return
    }
    if err := models.WithTransaction(func(tx *gorm.DB) error {
@@ -207,3 +256,61 @@
    }
    util.ResponseFormat(c, code.Success, "删除成功")
}
// DeleteDevice
//
//    @Tags        入库/出库
//    @Summary    更改记录状态
//    @Produce    application/json
//    @Param        id    path        int            true    "id"
//    @Success    200    {object}    util.Response    "成功"
//    @Router        /api-wms/v1/operation/finish/{id} [put]
func (slf OperationController) Finish(c *gin.Context) {
    id, err := strconv.Atoi(c.Param("id"))
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, "错误的id值")
        return
    }
    if id == 0 {
        util.ResponseFormat(c, code.RequestParamError, "id为0")
        return
    }
    operation, err := models.NewOperationSearch().SetID(id).First()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, "未找到相关出入库信息:"+err.Error())
        return
    }
    if operation.Status != constvar.OperationStatus_Ready {
        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 operationType.BaseOperationType == constvar.BaseOperationTypeIncoming {
    //    if location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First(); err != nil {
    //        return err
    //    } else {
    //        params.FromLocationId = location.Id
    //    }
    //    if params.ToLocationId == 0 {
    //        return errors.New("请选择目标位置")
    //    }
    //}
    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 err := models.NewMaterialSearch().Orm.Exec("update material INNER JOIN wms_operation_details on wms_operation_details.product_id=material.id INNER JOIN wms_operation on wms_operation.id=wms_operation_details.operation_id set material.amount=material.amount + wms_operation_details.quantity where wms_operation.id=?", id).Error; err != nil {
            return err
        }
        return nil
    }); err != nil {
        util.ResponseFormat(c, code.RequestError, err.Error())
        return
    }
    util.ResponseFormat(c, code.Success, "操作成功")
}
controllers/operation_type.go
@@ -17,12 +17,12 @@
type OperationTypeController struct{}
// Add
// @Tags      作业类型
// @Tags      业务类型
// @Summary   添加作业类型
// @Produce   application/json
// @Param     object  body  request.AddOperationType true  "作业类型信息"
// @Success   200 {object} util.Response "成功"
// @Router    /api-wms/v1/warehouse/operationType [post]
// @Router    /api-wms/v1/operationType/operationType [post]
func (slf OperationTypeController) Add(c *gin.Context) {
    var reqParams request.AddOperationType
    var params models.OperationType
@@ -49,13 +49,13 @@
}
// Update
// @Tags      作业类型
// @Tags      业务类型
// @Summary   编辑作业类型
// @Produce   application/json
// @Param     object  body request.UpdateOperationType true  "作业类型信息"
// @Param     id  path string true  "作业类型id"
// @Success   200 {object} util.Response "成功"
// @Router    /api-wms/v1/warehouse/operationType/{id} [put]
// @Router    /api-wms/v1/operationType/operationType/{id} [put]
func (slf OperationTypeController) Update(c *gin.Context) {
    id := cast.ToUint(c.Param("id"))
    if id == 0 {
@@ -102,12 +102,12 @@
}
// List
// @Tags      作业类型
// @Tags      业务类型
// @Summary   查询作业类型列表
// @Produce   application/json
// @Param     object  query    request.GetOperationTypeList true  "查询参数"
// @Success   200   {object}  util.ResponseList{data=[]models.OperationType}  "成功"
// @Router    /api-wms/v1/warehouse/operationType [get]
// @Router    /api-wms/v1/operationType/operationType [get]
func (slf OperationTypeController) List(c *gin.Context) {
    var params request.GetOperationTypeList
    if err := c.ShouldBindQuery(&params); err != nil {
@@ -124,12 +124,12 @@
}
// Delete
// @Tags      作业类型
// @Tags      业务类型
// @Summary   删除作业类型
// @Produce   application/json
// @Param     id  path string true  "作业类型id"
// @Success   200 {object} util.Response "成功"
// @Router    /api-wms/v1/warehouse/operationType/{id} [delete]
// @Router    /api-wms/v1/operationType/operationType/{id} [delete]
func (slf OperationTypeController) Delete(c *gin.Context) {
    id := cast.ToUint(c.Param("id"))
    if id == 0 {
models/operation.go
@@ -2,7 +2,6 @@
import (
    "fmt"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "wms/constvar"
    "wms/pkg/mysqlx"
@@ -22,16 +21,19 @@
        ToLocationId    int                      `json:"toLocationId"    gorm:"type:int;not null;comment:目标位置id"` //目标位置id
        ToLocation      Location                 `json:"toLocation"      gorm:"foreignKey:ToLocationId"`          //目标位置
        OperationDate   string                   `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"`
        CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:承运商ID"`
        CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`
        Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`
        ContacterID     int                      `json:"contacterID" gorm:"type:int;comment:联系人ID"`
        ContacterName   string                   `json:"contacterName" gorm:"type:varchar(63);comment:联系人姓名"`
        Weight          decimal.Decimal          `json:"weight" gorm:"type:decimal(20,2);comment:重量(kg)"`
        TransferWeight  decimal.Decimal          `json:"transferWeight" gorm:"type:decimal(20,2);comment:物流重量(kg)"`
        CompanyID       int                      `json:"companyID" gorm:"type:int;comment:公司ID"`
        CompanyName     string                   `json:"companyName" gorm:"type:varchar(127);comment:公司名称(kg)"`
        Details         []*OperationDetails      `json:"details"`
        CompanyID       int                      `json:"companyID" gorm:"type:int;comment:公司ID-客户"`
        CompanyName     string                   `json:"companyName" gorm:"type:varchar(127);comment:公司名称-客户"`
        Comment         string                   `json:"comment" gorm:"type:text;comment:备注"`
        Details []*OperationDetails `json:"details"`
        //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:承运商ID"`
        //CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`
        //Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`
    }
    OperationSearch struct {
@@ -73,10 +75,10 @@
    return slf
}
//func (slf *OperationSearch) SetKeyword(keyword string) *OperationSearch {
//    slf.Keyword = keyword
//    return slf
//}
func (slf *OperationSearch) SetKeyword(keyword string) *OperationSearch {
    slf.Keyword = keyword
    return slf
}
func (slf *OperationSearch) SetOperationTypeId(operationTypeId int) *OperationSearch {
    slf.OperationTypeId = operationTypeId
models/operation_details.go
@@ -12,12 +12,12 @@
    OperationDetails struct {
        WmsModel
        Id             int             `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        OperationId    int             `json:"OperationId" gorm:"type:int;not null;comment:操作记录id"`          //操作id
        ProductId      int             `json:"productId" gorm:"type:int;not null;comment:产品id"`              //产品id
        ProductName    string          `json:"productName" gorm:"type:varchar(255);not null;comment:产品名称"`   //产品名称
        Quantity       decimal.Decimal `json:"quantity" gorm:"type:decimal(20,2);not null;comment:数量"`       //数量
        FinishQuantity decimal.Decimal `json:"finishQuantity" gorm:"type:decimal(20,2);not null;comment:数量"` //完成数量
        Id          int             `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        OperationId int             `json:"OperationId" gorm:"type:int;not null;comment:操作记录id"`        //操作id
        ProductId   string          `json:"productId" gorm:"type:varchar(191);not null;comment:产品id"`   //产品id
        ProductName string          `json:"productName" gorm:"type:varchar(255);not null;comment:产品名称"` //产品名称
        Quantity    decimal.Decimal `json:"quantity" gorm:"type:decimal(20,2);not null;comment:数量"`     //数量
        Unit        string          `json:"unit" gorm:"type:varchar(31);comment:单位"`
    }
    OperationDetailsSearch struct {
models/operation_type.go
@@ -88,6 +88,11 @@
    return slf
}
func (slf *OperationTypeSearch) SetBaseOperationType(baseOperationType constvar.BaseOperationType) *OperationTypeSearch {
    slf.BaseOperationType = baseOperationType
    return slf
}
func (slf *OperationTypeSearch) build() *gorm.DB {
    var db = slf.Orm.Model(&OperationType{})
request/operation.go
@@ -13,24 +13,26 @@
    Status          constvar.OperationStatus `json:"status" gorm:"type:int(11);not null;comment:状态"`          //状态
    FromLocationId  int                      `json:"fromLocationId"   gorm:"type:int;not null;comment:源位置id"` //源位置id
    ToLocationId    int                      `json:"toLocationId"    gorm:"type:int;not null;comment:目标位置id"` //目标位置id
    OperationDate   string                   `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"`
    OperationDate   string                   `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"`      //安排日期
    Details         []*OperationDetails      `json:"details"`
    CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:承运商ID"`
    CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`
    Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`
    ContacterID     int                      `json:"contacterID" gorm:"type:int;comment:联系人ID"`
    ContacterName   string                   `json:"contacterName" gorm:"type:varchar(63);comment:联系人姓名"`
    Weight          decimal.Decimal          `json:"weight" gorm:"type:decimal(20,2);comment:重量(kg)"`
    TransferWeight  decimal.Decimal          `json:"transferWeight" gorm:"type:decimal(20,2);comment:物流重量(kg)"`
    CompanyID       int                      `json:"companyID" gorm:"type:int;comment:公司ID"`
    CompanyName     string                   `json:"companyName" gorm:"type:varchar(127);comment:公司名称(kg)"`
    ContacterID     int                      `json:"contacterID" gorm:"type:int;comment:联系人ID"`           //联系人ID-非必填
    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:备注"`
    //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)-非必填
    //CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:承运商ID"`                   //承运商ID-非必填
    //CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`         //承运商名称-非必填
    //Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`            //追踪参考-非必填
}
type OperationDetails struct {
    ProductId      int             `json:"productId" gorm:"type:int;not null;comment:产品id"`              //产品id
    ProductName    string          `json:"productName" gorm:"type:varchar(255);not null;comment:产品名称"`   //产品名称
    Quantity       decimal.Decimal `json:"quantity" gorm:"type:decimal(20,2);not null;comment:数量"`       //数量
    FinishQuantity decimal.Decimal `json:"finishQuantity" gorm:"type:decimal(20,2);not null;comment:数量"` //完成数量
    ProductId   int             `json:"productId" gorm:"type:int;not null;comment:产品id"`            //产品id
    ProductName string          `json:"productName" gorm:"type:varchar(255);not null;comment:产品名称"` //产品名称
    Quantity    decimal.Decimal `json:"quantity" gorm:"type:decimal(20,2);not null;comment:数量"`     //数量
    Unit        string          `json:"unit" gorm:"type:varchar(31);comment:单位"`
}
type OperationList struct {
@@ -46,15 +48,15 @@
    Status          constvar.OperationStatus `json:"status" gorm:"type:int(11);not null;comment:状态"`          //状态
    FromLocationId  int                      `json:"fromLocationId"   gorm:"type:int;not null;comment:源位置id"` //源位置id
    ToLocationId    int                      `json:"toLocationId"    gorm:"type:int;not null;comment:目标位置id"` //目标位置id
    OperationDate   string                   `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"`
    OperationDate   string                   `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"`      //安排日期
    Details         []*OperationDetails      `json:"details"`
    CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:承运商ID"`
    CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`
    Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`
    ContacterID     int                      `json:"contacterID" gorm:"type:int;comment:联系人ID"`
    ContacterName   string                   `json:"contacterName" gorm:"type:varchar(63);comment:联系人姓名"`
    Weight          decimal.Decimal          `json:"weight" gorm:"type:decimal(20,2);comment:重量(kg)"`
    TransferWeight  decimal.Decimal          `json:"transferWeight" gorm:"type:decimal(20,2);comment:物流重量(kg)"`
    CompanyID       int                      `json:"companyID" gorm:"type:int;comment:公司ID"`
    CompanyName     string                   `json:"companyName" gorm:"type:varchar(127);comment:公司名称(kg)"`
    CarrierID       int                      `json:"carrierID" gorm:"type:int;comment:承运商ID"`                   //承运商ID-非必填
    CarrierName     string                   `json:"carrierName" gorm:"type:varchar(63);comment:承运商名称"`         //承运商名称-非必填
    Tracking        string                   `json:"tracking" gorm:"type:varchar(127);comment:追踪参考"`            //追踪参考-非必填
    ContacterID     int                      `json:"contacterID" gorm:"type:int;comment:联系人ID"`                 //联系人ID-非必填
    ContacterName   string                   `json:"contacterName" gorm:"type:varchar(63);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)-非必填
    CompanyID       int                      `json:"companyID" gorm:"type:int;comment:公司ID"`                    //公司ID-客户
    CompanyName     string                   `json:"companyName" gorm:"type:varchar(127);comment:公司名称"`         //公司名称-客户名称
}
router/router.go
@@ -51,7 +51,7 @@
        warehouseAPI.DELETE("warehouse/:id", warehouseController.Delete) // 删除仓库
    }
    // 作业类型
    // 业务类型
    operationTypeController := new(controllers.OperationTypeController)
    operationTypeAPI := r.Group(urlPrefix + "/operationType")
    {
@@ -69,6 +69,7 @@
        operationAPI.POST("operation", operationController.Add)
        operationAPI.PUT("operation/:id", operationController.Update)
        operationAPI.DELETE("operation/:id", operationController.Delete)
        operationAPI.PUT("Finish/:id", operationController.Finish)
    }
    //产品