Просмотр исходного кода

BOM计算出库数量生成的待出库数据有误 问题处理

yzc 1 год назад
Родитель
Сommit
272c5073f9

+ 60 - 45
hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java

@@ -171,52 +171,10 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         workOrderDto.setCode(CodeEnum.WORK_ORDER.getCode());
         workOrderDto.setStatus(0);
         this.save(workOrderDto);
-        //获取产品信息
-        ProductInfo productInfo = productInfoService.getById(workOrderDto.getProductId());
-        if (ObjectUtil.isEmpty(productInfo)) {
-            throw new ServiceException("查询不到产品信息 产品id->" + workOrderDto.getProductId());
-        }
-        //搜索BOM明细并到冻结库存
-        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()).eq(BomInfo::getCurrentVersion, 1));
-        if (ObjectUtil.isEmpty(bomInfo)) {
-            throw new ServiceException("查询不到产品的BOM信息 产品名称->" + productInfo.getName());
-        }
-        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
-        if (ObjectUtil.isEmpty(bomDetailList)) {
-            throw new ServiceException("查询不到产品BOM明细 产品名称->" + productInfo.getName());
+        //根据BOM冻结物料库存
+        if(ObjectUtil.isNotEmpty(workOrderDto.getProductionQuantity())) {
+            freezeMaterial(workOrderDto);
         }
-        List<Long> productIds = bomDetailList.stream().map(BomDetail::getProductId).collect(Collectors.toList());
-        Map<Long, List<Stock>> productMap = stockService.mapKGroup(Stock::getProductId, q -> q.in(Stock::getProductId, productIds));
-        List<StockFrozen> stockFrozenList = new ArrayList<>();
-        for (BomDetail bomDetail : bomDetailList) {
-            Long productId = bomDetail.getProductId();
-            //计算总数量 需要的物料数量*工单数量
-            BigDecimal multiply = bomDetail.getQuantity().multiply(workOrderDto.getQuantity());
-            //添加冻结库存
-            List<Stock> stocks = productMap.get(productId);
-            if (ObjectUtil.isEmpty(stocks)) {
-                throw new ServiceException("物料库存不存在");
-            }
-            //计算库存是否充足(可用库存 - 冻结库存 - 所需的数量)是否大等于0
-            BigDecimal quantity = stocks.stream().map(Stock::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-            Map<Long, StockFrozen> stockFrozenMap = stockFrozenService.mapKEntity(StockFrozen::getProductId, q -> q.in(StockFrozen::getProductId, productIds));
-            StockFrozen stockFrozen = stockFrozenMap.get(bomDetail.getProductId());
-            if (ObjectUtil.isEmpty(stockFrozen)) {
-                stockFrozen = new StockFrozen();
-                stockFrozen.setProductId(bomDetail.getProductId());
-                stockFrozen.setFrozenQuantity(BigDecimal.ZERO);
-            }
-            BigDecimal subtract = quantity.subtract(stockFrozen.getFrozenQuantity()).subtract(multiply);
-            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
-                throw new ServiceException("物料库存不足");
-            }
-            //存在库存
-            BigDecimal add = stockFrozen.getFrozenQuantity().add(multiply);
-            stockFrozen.setFrozenQuantity(add);
-
-            stockFrozenList.add(stockFrozen);
-        }
-        stockFrozenService.saveOrUpdateBatch(stockFrozenList);
     }
 
     /**
@@ -390,6 +348,63 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             stockWaitDetails.setStatus(0);
             stockWaitDetailsService.save(stockWaitDetails);
         }
+
+        //根据BOM冻结物料库存
+        if(ObjectUtil.isNotEmpty(dto.getProductionQuantity())) {
+            freezeMaterial(dto);
+        }
+    }
+
+    /**
+     * 冻结工单BOM
+     */
+    private void freezeMaterial(WorkOrderDto workOrderDto){
+        //获取产品信息
+        ProductInfo productInfo = productInfoService.getById(workOrderDto.getProductId());
+        if (ObjectUtil.isEmpty(productInfo)) {
+            throw new ServiceException("查询不到产品信息 产品id->" + workOrderDto.getProductId());
+        }
+        //搜索BOM明细并到冻结库存
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()).eq(BomInfo::getCurrentVersion, 1));
+        if (ObjectUtil.isEmpty(bomInfo)) {
+            throw new ServiceException("查询不到产品的BOM信息 产品名称->" + productInfo.getName());
+        }
+        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+        if (ObjectUtil.isEmpty(bomDetailList)) {
+            throw new ServiceException("查询不到产品BOM明细 产品名称->" + productInfo.getName());
+        }
+        List<Long> productIds = bomDetailList.stream().map(BomDetail::getProductId).collect(Collectors.toList());
+        Map<Long, List<Stock>> productMap = stockService.mapKGroup(Stock::getProductId, q -> q.in(Stock::getProductId, productIds));
+        List<StockFrozen> stockFrozenList = new ArrayList<>();
+        for (BomDetail bomDetail : bomDetailList) {
+            Long productId = bomDetail.getProductId();
+            //计算总数量 需要的物料数量*工单生产数量
+            BigDecimal multiply = bomDetail.getQuantity().multiply(workOrderDto.getProductionQuantity());
+            //添加冻结库存
+            List<Stock> stocks = productMap.get(productId);
+            if (ObjectUtil.isEmpty(stocks)) {
+                throw new ServiceException("物料库存不存在");
+            }
+            //计算库存是否充足(可用库存 - 冻结库存 - 所需的数量)是否大等于0
+            BigDecimal quantity = stocks.stream().map(Stock::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            Map<Long, StockFrozen> stockFrozenMap = stockFrozenService.mapKEntity(StockFrozen::getProductId, q -> q.in(StockFrozen::getProductId, productIds));
+            StockFrozen stockFrozen = stockFrozenMap.get(bomDetail.getProductId());
+            if (ObjectUtil.isEmpty(stockFrozen)) {
+                stockFrozen = new StockFrozen();
+                stockFrozen.setProductId(bomDetail.getProductId());
+                stockFrozen.setFrozenQuantity(BigDecimal.ZERO);
+            }
+            BigDecimal subtract = quantity.subtract(stockFrozen.getFrozenQuantity()).subtract(multiply);
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("物料库存不足");
+            }
+            //存在库存
+            BigDecimal add = stockFrozen.getFrozenQuantity().add(multiply);
+            stockFrozen.setFrozenQuantity(add);
+
+            stockFrozenList.add(stockFrozen);
+        }
+        stockFrozenService.saveOrUpdateBatch(stockFrozenList);
     }
 
 }