zhangqian
2024-08-01 35d641adccfd2aa2bcd0090415ff7fdb18e9773d
service/inventory_report_forms.go
@@ -1,6 +1,7 @@
package service
import (
   "encoding/json"
   "fmt"
   "github.com/shopspring/decimal"
   "github.com/xuri/excelize/v2"
@@ -13,10 +14,11 @@
)
type Detail struct {
   ProductId string                   `json:"productId"`
   Amount    decimal.Decimal          `json:"amount"`
   Status    constvar.OperationStatus `json:"status"`
   //ProductName string                   `json:"productName"`
   ProductId     string                   `json:"productId"`
   Amount        decimal.Decimal          `json:"amount"`
   Status        constvar.OperationStatus `json:"status"`
   MoreUnitValue string                   `json:"-" gorm:"type:varchar(255);comment:多单位值"`
   MoreUnitList  []models.UnitItems       `json:"moreUnitList" gorm:"-"`
}
type InventoryReportFormsService struct{}
@@ -55,12 +57,12 @@
   var inHouse []Detail
   var outHouse []Detail
   dbIn := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
      Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
      Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
      Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
      Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}).
      Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Finish})
   dbOut := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
      Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
      Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
      Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
      Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse}).
      Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Ready, constvar.OperationStatus_Finish})
@@ -76,10 +78,34 @@
   if err != nil {
      return
   }
   for _, in := range inHouse {
      var arr []models.UnitItems
      if len(in.MoreUnitValue) != 0 {
         err := json.Unmarshal([]byte(in.MoreUnitValue), &arr)
         if err != nil {
            return nil, err
         }
         in.MoreUnitList = arr
      }
   }
   err = dbOut.Find(&outHouse).Error
   if err != nil {
      return
   }
   for _, out := range outHouse {
      var arr []models.UnitItems
      if len(out.MoreUnitValue) != 0 {
         err := json.Unmarshal([]byte(out.MoreUnitValue), &arr)
         if err != nil {
            return nil, err
         }
         out.MoreUnitList = arr
      }
   }
   for _, material := range materials {
      data := new(response.InventoryForms)
      data.ProduceId = material.ID
@@ -93,31 +119,30 @@
      for _, amount := range productAmounts {
         if material.ID == amount.ProductId {
            data.Amount = data.Amount.Add(amount.Amount)
            data.AmountMoreUnits = AddMoreUnit(data.AmountMoreUnits, amount.MoreUnitList)
         }
      }
      for _, details := range inHouse {
         if material.ID == details.ProductId {
            data.In = data.In.Add(details.Amount)
            data.InMoreUnits = AddMoreUnit(data.InMoreUnits, details.MoreUnitList)
         }
      }
      available := decimal.NewFromInt(0)
      readyOutAmount := decimal.NewFromInt(0)
      readyOutAmountMoreUnitList := make([]models.UnitItems, 0)
      for _, details := range outHouse {
         if material.ID == details.ProductId {
            if details.Status == constvar.OperationStatus_Ready {
               available = available.Add(details.Amount)
               readyOutAmount = readyOutAmount.Add(details.Amount)
               readyOutAmountMoreUnitList = AddMoreUnit(readyOutAmountMoreUnitList, details.MoreUnitList)
            } else {
               data.Out = data.Out.Add(details.Amount)
               data.OutMoreUnits = AddMoreUnit(data.OutMoreUnits, details.MoreUnitList)
            }
         }
      }
      data.AvailableNumber = data.Amount.Sub(available)
      if *material.MoreUnit {
         data.AmountMoreUnits = CreateMoreUnit(data.Amount, material.MoreUnitList)
         data.AvailableNumberMoreUnits = CreateMoreUnit(data.AvailableNumber, material.MoreUnitList)
         data.InMoreUnits = CreateMoreUnit(data.In, material.MoreUnitList)
         data.OutMoreUnits = CreateMoreUnit(data.Out, material.MoreUnitList)
      }
      data.AvailableNumber = data.Amount.Sub(readyOutAmount)                                        //可用数量等于库存数量减待出库数量
      data.AvailableNumberMoreUnits = SubMoreUnit(data.AmountMoreUnits, readyOutAmountMoreUnitList) //可用多单位等于剩余数量减待出库数量
      result = append(result, data)
   }