| | |
| | | |
| | | // 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())) |
| | |
| | | } 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 |
| | | } |
| | | } |
| | |
| | | } |
| | | 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 { |
| | |
| | | Amount: v.Amount, |
| | | FromLocationID: v.FromLocationID, |
| | | ToLocationID: v.ToLocationID, |
| | | Remark: v.Remark, |
| | | }) |
| | | } |
| | | //if locAmount, aok := mapLocAmount[strconv.Itoa(v.ToLocationID)+v.ProductId]; aok { |
| | |
| | | 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 |
| | |
| | | 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 |