소스 검색

新增采购入库方法

fgd 1 년 전
부모
커밋
81ba8ec4e4

+ 6 - 4
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java

@@ -1,7 +1,6 @@
 package com.sd.business.service.in.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -83,11 +82,14 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
         if (InOutTypeEnum.getInOutType(inOutStorageDto.getType()).equals(InOutTypeEnum.IN)) {
             // 赋值入库单号
             inOutStorageDto.setCode(CodeEnum.IN_CODE.getCode());
-            // 更新库存
-            inventoryService.in(inOutStorageDto.getDepartmentId(), inOutStorageDto.getWarehouseId(), inOutStorageBomList);
-            if (ObjectUtil.isNotEmpty(inOutStorageDto) && InDetailTypeEnum.PURCHASE.getKey().equals(inOutStorageDto.getDetailType())) {
+            if (InDetailTypeEnum.PURCHASE.getKey().equals(inOutStorageDto.getDetailType())) {
+                // 采购入库
+                inventoryService.purchaseInStorage(inOutStorageDto.getPurchaseId(), inOutStorageDto.getDepartmentId(), inOutStorageDto.getWarehouseId(), inOutStorageBomList);
                 // 更新采购到货数量
                 purchaseService.updatePurchaseBomArrivalQuantity(inOutStorageDto.getPurchaseId(), inOutStorageBomList);
+            } else {
+                // 更新库存
+                inventoryService.in(inOutStorageDto.getDepartmentId(), inOutStorageDto.getWarehouseId(), inOutStorageBomList);
             }
         } else {
             // 赋值出库单号

+ 5 - 0
sd-business/src/main/java/com/sd/business/service/inventory/InventoryService.java

@@ -85,4 +85,9 @@ public interface InventoryService extends BaseService<Inventory> {
      */
     void exportBackExcel(InventorySelectDto dto);
 
+    /**
+     * 采购入库
+     * @param
+     */
+    void purchaseInStorage(Long purchaseId, Long departmentId, Long warehouseId, List<? extends InOutFun> list);
 }

+ 64 - 0
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -22,10 +22,12 @@ import com.sd.business.entity.inventory.po.InventoryBackup;
 import com.sd.business.entity.inventory.vo.InventoryVo;
 import com.sd.business.entity.inventory.vo.QuantityByDepartmentVo;
 import com.sd.business.entity.inventory.vo.QuantityByWarehouseVo;
+import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.mapper.inventory.InventoryMapper;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.in.InOutStorageDetailsService;
 import com.sd.business.service.inventory.InventoryService;
+import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.framework.util.excel.util.ExcelUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,6 +63,9 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
     @Autowired
     private InOutStorageDetailsService inOutStorageDetailsService;
 
+    @Autowired
+    private PurchaseBomService purchaseBomService;
+
     @Override
     public Page<InventoryVo> getPage(InventorySelectDto dto, String tableName) {
         IWrapper<Inventory> wrapper = getDtoWrapper(dto);
@@ -328,6 +333,65 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                 "库存数据", list, InventoryVo.class);
     }
 
+    @Override
+    public void purchaseInStorage(Long purchaseId, Long departmentId, Long warehouseId, List<? extends InOutFun> list) {
+        List<Long> bomSpecIdList = list.stream().map(InOutFun::getBomSpecId).collect(Collectors.toList());
+        synchronized (this) {
+            // 通过事业部id和出库id获取bom规格库存
+            List<Inventory> inventoryList = getInventoryList(departmentId, warehouseId, bomSpecIdList);
+
+            // 通过bom规格分组
+            Map<Long, Inventory> map = inventoryList.stream().collect(Collectors.toMap(Inventory::getBomSpecId, Function.identity()));
+
+            Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(PurchaseBom::getBomSpecId, q -> q.eq(PurchaseBom::getPurchaseId, purchaseId).in(PurchaseBom::getBomSpecId, bomSpecIdList));
+
+            // 保存结存单价批次
+            List<InOutStorageDetails> inOutStorageDetailsList = list.stream().map(item -> {
+                // 获取入库单价
+                PurchaseBom purchaseBom = purchaseBomMap.get(item.getBomSpecId());
+                BigDecimal inUnitPrice = purchaseBom == null ? BigDecimal.ZERO : purchaseBom.getUnitPrice();
+
+                InOutStorageDetails inOutStorageDetails = new InOutStorageDetails();
+                inOutStorageDetails.setDepartmentId(departmentId);
+                inOutStorageDetails.setWarehouseId(warehouseId);
+                inOutStorageDetails.setBomSpecId(item.getBomSpecId());
+                inOutStorageDetails.setInUnitPrice(inUnitPrice);
+                inOutStorageDetails.setQuantity(item.getQuantity());
+                return inOutStorageDetails;
+            }).collect(Collectors.toList());
+            inOutStorageDetailsService.saveBatch(inOutStorageDetailsList);
+
+            for (InOutFun inOutFun : list) {
+
+                // 库存
+                Inventory inventory = map.computeIfAbsent(inOutFun.getBomSpecId(), item -> {
+                    Inventory tempInventory = new Inventory();
+                    tempInventory.setWarehouseId(warehouseId);
+                    tempInventory.setDepartmentId(departmentId);
+                    tempInventory.setBomSpecId(item);
+                    tempInventory.setQuantity(BigDecimal.ZERO);
+                    tempInventory.setBalanceUnitPrice(BigDecimal.ZERO);
+                    inventoryList.add(tempInventory);
+                    return tempInventory;
+                });
+                PurchaseBom purchaseBom = purchaseBomMap.get(inOutFun.getBomSpecId());
+                // 结存数量
+                BigDecimal sumQuantity = inventory.getQuantity().add(inOutFun.getQuantity());
+                // 结存金额
+                BigDecimal sumPrice = inventory.getQuantity().multiply(inventory.getBalanceUnitPrice())
+                        .add(inOutFun.getQuantity().multiply(purchaseBom.getUnitPrice()));
+
+                // 获取入库结存单价
+                BigDecimal balanceUnitPrice = sumPrice.divide(sumQuantity, 2, RoundingMode.HALF_UP);;
+
+                inventory.setQuantity(sumQuantity);
+                inventory.setBalanceUnitPrice(balanceUnitPrice);
+            }
+
+            saveOrUpdateBatch(inventoryList);
+        }
+    }
+
     /**
      * 通过事业部id和出库id获取bom规格库存
      */