zhangqian
2024-06-15 821b6a55dc8f64fce65e51a4d6aaf5511a88855e
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