zhangqian
2024-03-14 527bc709815b9ea0f2ed14450262c9a5832c141f
proto/product_inventory/server.go
@@ -5,11 +5,11 @@
   "errors"
   "github.com/shopspring/decimal"
   "strconv"
   "strings"
   "time"
   "wms/constvar"
   "wms/models"
   "wms/pkg/timex"
   "wms/service"
)
type Server struct {
@@ -45,9 +45,11 @@
   if len(details) == 0 {
      return resp, nil
   }
   var locationIds []int
   var locationId int
   for _, detail := range details {
      productIds = append(productIds, detail.ProductId)
      locationIds = append(locationIds, detail.LocationId)
      locationId = detail.LocationId
   }
   //查询产品信息
@@ -55,27 +57,12 @@
   if err != nil {
      return nil, err
   }
   //查询位置信息
   location, err := models.NewLocationSearch().SetID(locationId).First()
   locationHouseMap, houseLocations, houseMap, err := service.GetWarehouseByLocationIds(locationIds)
   if err != nil {
      return nil, err
   }
   //根据仓库缩写查询仓库
   code := strings.Split(location.JointName, "/")[0]
   warehouse, err := models.NewWarehouseSearch().SetCode(code).First()
   if err != nil {
      return nil, err
   }
   //统计仓库下所有位置的产品在库数量
   locations, err := models.NewLocationSearch().SetJointName(code).FindNotTotal()
   if err != nil {
      return nil, err
   }
   var locationIds []int
   for _, l := range locations {
      locationIds = append(locationIds, l.Id)
   }
   amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find()
   warehouse := locationHouseMap[locationId]
   amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).SetPreload(true).Find()
   if err != nil {
      return nil, err
   }
@@ -135,6 +122,60 @@
      products = append(products, &p)
   }
   resp.ProductList = products
   if req.GroupByWarehouse {
      canUseMap := make(map[int]map[string]decimal.Decimal) //map[locationID]map[productID]decimal
      for _, v := range canUse {
         if canUseMap[v.LocationId] == nil {
            canUseMap[v.LocationId] = make(map[string]decimal.Decimal)
         }
         canUseMap[v.LocationId][v.ProductId] = canUseMap[v.LocationId][v.ProductId].Add(v.Amount)
      }
      locationProductAmounts := make(map[int][]*models.LocationProductAmount)
      for _, v := range amounts {
         if locationProductAmounts[v.LocationId] == nil {
            locationProductAmounts[v.LocationId] = make([]*models.LocationProductAmount, 0)
         }
         locationProductAmounts[v.LocationId] = append(locationProductAmounts[v.LocationId], v)
      }
      materialMap := service.MaterialMap(materials)
      var warehouseProductsList []*WarehouseProducts
      for houseID, locationIDs := range houseLocations {
         house := houseMap[houseID]
         productAmountMap := make(map[string]decimal.Decimal, 0)
         productAvailableNumberMap := make(map[string]decimal.Decimal, 0)
         productInfoList := make([]*ProductInfo, 0)
         houseProductAmounts := make([]*models.LocationProductAmount, 0)
         for _, lid := range locationIDs {
            houseProductAmounts = append(houseProductAmounts, locationProductAmounts[lid]...)
         }
         for _, v := range houseProductAmounts {
            productAmountMap[v.ProductId] = productAmountMap[v.ProductId].Add(v.Amount)
            productAvailableNumberMap[v.ProductId] = productAvailableNumberMap[v.ProductId].Add(canUseMap[v.LocationId][v.ProductId])
         }
         for productID, amount := range productAvailableNumberMap {
            productInfoList = append(productInfoList, &ProductInfo{
               Number:          productID,
               Name:            materialMap[productID].Name,
               Unit:            materialMap[productID].Unit,
               Amount:          productAmountMap[productID].String(),
               AvailableNumber: amount.String(),
            })
         }
         warehouseProducts := &WarehouseProducts{
            WarehouseID:   house.Code,
            WarehouseName: house.Name,
            ProductList:   productInfoList,
         }
         warehouseProductsList = append(warehouseProductsList, warehouseProducts)
      }
      resp.WarehouseProductsList = warehouseProductsList
   }
   return resp, nil
}