zhangqian
2024-06-15 821b6a55dc8f64fce65e51a4d6aaf5511a88855e
库存内部调拨验证后先生成出库单,出库单验证后生成入库单
3个文件已修改
109 ■■■■■ 已修改文件
models/operation.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation_details.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/operation.go 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation.go
@@ -59,6 +59,8 @@
        Custodian    string `json:"custodian" gorm:"type:varchar(255);comment:保管员名称"`
        CreatedBy    string `json:"createBy" gorm:"type:varchar(255);comment:创建者UserId"`
        CheckedBy    string `json:"checkedBy" gorm:"type:varchar(255);comment:验证者UserId"`
        IsInternalOutput bool `json:"isInternalOutput"` //是否调拨产生的出库
    }
    OperationSearch struct {
models/operation_details.go
@@ -28,6 +28,7 @@
        AuxiliaryAmount  decimal.Decimal `json:"auxiliaryAmount" gorm:"type:decimal(20,3);comment:辅助数量"`
        AuxiliaryUnit    string          `json:"auxiliaryUnit" gorm:"type:varchar(191);comment:辅助单位"`
        Remark           string          `gorm:"type:varchar(1024);comment:备注" json:"remark"`
        IsInternalOutput bool            `json:"isInternalOutput"` //是否调拨产生的出库
    }
    OperationDetailsSearch struct {
service/operation.go
@@ -224,6 +224,7 @@
// FinishOperationOutput 完成出库或报废
func FinishOperationOutput(tx *gorm.DB, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
    var internalInputDetails []*models.OperationDetails //内部调拨产生的出库验证后,生成入库单
    for k, v := range listDetails {
        if v.Product.Amount.LessThan(v.Amount) {
            return errors.New(fmt.Sprintf("产品:%v,库存:%v,出库:%v,数量不够,无法完成出库操作", v.Product.Name, v.Product.Amount.String(), v.Amount.String()))
@@ -244,39 +245,57 @@
        } else {
            return errors.New("当前仓库没有该产品,请先入库")
        }
        if v.IsInternalOutput {
            internalInputDetails = append(internalInputDetails, v)
        }
    }
    if len(internalInputDetails) > 0 {
        operation := &models.Operation{
            Number:            strconv.FormatInt(time.Now().Unix(), 10),
            Status:            constvar.OperationStatus_Ready,
            OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
            Comment:           "库存调拨入库",
            BaseOperationType: constvar.BaseOperationTypeIncoming,
            Details:           internalInputDetails,
            LocationID:        internalInputDetails[0].ToLocationID,
            OperationTypeName: "库存调拨入库",
        }
        if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
            return err
        }
    }
    return nil
}
// FinishOperationInternal 完成内部调拨
func FinishOperationInternal(tx *gorm.DB, listDetails []*models.OperationDetails, mapLocAmount map[string]*models.LocationProductAmount) (err error) {
// FinishOperationInternal 验证内部调拨生成出库单
func FinishOperationInternal(tx *gorm.DB, listDetails []*models.OperationDetails) (err error) {
    var outputDetails []*models.OperationDetails
    for _, v := range listDetails {
        if fromLocAmount, aok := mapLocAmount[strconv.Itoa(v.FromLocationID)+v.ProductId]; aok {
            if fromLocAmount.Amount.LessThan(v.Amount) {
                return errors.New(fmt.Sprintf("产品:%v,库存:%v,出库:%v,数量不够,无法完成出库操作", v.Product.Name, fromLocAmount.Amount.String(), v.Amount.String()))
        outputDetails = append(outputDetails, &models.OperationDetails{
            FromLocationID:   v.FromLocationID,
            ToLocationID:     v.ToLocationID,
            Amount:           v.Amount,
            TotalGrossWeight: v.TotalGrossWeight,
            TotalNetWeight:   v.TotalNetWeight,
            AuxiliaryAmount:  v.AuxiliaryAmount,
            AuxiliaryUnit:    v.AuxiliaryUnit,
            Remark:           v.Remark,
            IsInternalOutput: true,
        })
        if len(outputDetails) > 0 {
            operation := &models.Operation{
                Number:            strconv.FormatInt(time.Now().Unix(), 10),
                Status:            constvar.OperationStatus_Ready,
                OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
                Comment:           "库存调拨出库",
                BaseOperationType: constvar.BaseOperationTypeOutgoing,
                Details:           outputDetails,
                LocationID:        outputDetails[0].FromLocationID,
                OperationTypeName: "库存调拨出库",
                IsInternalOutput:  true,
            }
            fromLocAmount.Amount = fromLocAmount.Amount.Sub(v.Amount)
            if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(fromLocAmount.Id).Update(fromLocAmount); err != nil {
                return err
            }
        } else {
            return errors.New("当前仓库没有该产品,请先入库")
        }
        if toLocAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
            toLocAmount.Amount = toLocAmount.Amount.Add(v.Amount)
            if err := models.NewLocationProductAmountSearch().SetOrm(tx).SetID(toLocAmount.Id).Update(toLocAmount); err != nil {
                return err
            }
        } else {
            if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&models.LocationProductAmount{
                LocationId:        v.ToLocationID,
                ProductCategoryID: v.Product.CategoryId,
                ProductId:         v.ProductId,
                Amount:            v.Amount,
                CreateDate:        time.Now().Format("2006-01-02 15:04:05"),
            }); err != nil {
            if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
                return err
            }
        }
@@ -297,17 +316,27 @@
            }
            if v.Amount.GreaterThan(locAmount.Amount) {
                inputDetails = append(inputDetails, &models.OperationDetails{
                    ProductId:      v.ProductId,
                    Amount:         v.Amount.Sub(locAmount.Amount),
                    FromLocationID: v.FromLocationID,
                    ToLocationID:   v.ToLocationID,
                    ProductId:        v.ProductId,
                    Amount:           v.Amount.Sub(locAmount.Amount),
                    FromLocationID:   v.FromLocationID,
                    ToLocationID:     v.ToLocationID,
                    TotalGrossWeight: v.TotalGrossWeight,
                    TotalNetWeight:   v.TotalNetWeight,
                    AuxiliaryAmount:  v.AuxiliaryAmount,
                    AuxiliaryUnit:    v.AuxiliaryUnit,
                    Remark:           v.Remark,
                })
            } else {
                outputDetails = append(outputDetails, &models.OperationDetails{
                    ProductId:      v.ProductId,
                    Amount:         locAmount.Amount.Sub(v.Amount),
                    FromLocationID: v.ToLocationID,
                    ToLocationID:   v.FromLocationID,
                    ProductId:        v.ProductId,
                    Amount:           locAmount.Amount.Sub(v.Amount),
                    FromLocationID:   v.ToLocationID,
                    ToLocationID:     v.FromLocationID,
                    TotalGrossWeight: v.TotalGrossWeight,
                    TotalNetWeight:   v.TotalNetWeight,
                    AuxiliaryAmount:  v.AuxiliaryAmount,
                    AuxiliaryUnit:    v.AuxiliaryUnit,
                    Remark:           v.Remark,
                })
            }
        } else {
@@ -316,6 +345,7 @@
                Amount:         v.Amount,
                FromLocationID: v.FromLocationID,
                ToLocationID:   v.ToLocationID,
                Remark:         v.Remark,
            })
        }
        //if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok {
@@ -340,11 +370,11 @@
                Number:            strconv.FormatInt(time.Now().Unix(), 10),
                Status:            constvar.OperationStatus_Ready,
                OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
                Comment:           "库存盘点",
                Comment:           "库存调整入库",
                BaseOperationType: constvar.BaseOperationTypeIncoming,
                Details:           inputDetails,
                LocationID:        inputDetails[0].FromLocationID,
                OperationTypeName: "库存调整",
                OperationTypeName: "库存调整入库",
            }
            if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
                return err
@@ -355,11 +385,11 @@
                Number:            strconv.FormatInt(time.Now().Unix(), 10),
                Status:            constvar.OperationStatus_Ready,
                OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
                Comment:           "库存盘点",
                Comment:           "库存调整出库",
                BaseOperationType: constvar.BaseOperationTypeOutgoing,
                Details:           outputDetails,
                LocationID:        outputDetails[0].FromLocationID,
                OperationTypeName: "库存调整",
                OperationTypeName: "库存调整出库",
            }
            if err := models.NewOperationSearch().SetOrm(tx).Create(operation); err != nil {
                return err