From ce1fa8cf1f560df02f68f69d3a9d992d75ee031e Mon Sep 17 00:00:00 2001 From: qiezi <15576055375@163.com> Date: Thu, 6 Mar 2025 17:39:00 +0800 Subject: [PATCH] 2025-03-06 --- .../service/impl/QuoteDetailServiceImpl.java | 66 +++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java index 914a5a2d..8d987d6b 100644 --- a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java +++ b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java @@ -17,7 +17,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; @Service @Slf4j @@ -211,20 +213,60 @@ public class QuoteDetailServiceImpl extends ServiceImpl list = quoteDetailBomTreeService.lambdaQuery() + .eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId()) + .orderByDesc(QuoteDetailBomTree::getLevel) + .orderByDesc(QuoteDetailBomTree::getId) + .list(); + // 判断 报价BomTree是否存在 if (Objects.nonNull(one)) { -// 工艺 - QuoteDetailRouting routing = new QuoteDetailRouting(); - routing.setQuoteDetailId(quoteDetail.getId()); - routing.setIsAllRouting(true); - routing.setTreeId(one.getId()); - List routingList = quoteDetailRoutingService.queryQuoteDetailRouting(routing); -// routingMap = routingList.stream().collect(Collectors.groupingBy(QuoteDetailRouting::getTreeId)); - for (QuoteDetailRouting detailRouting : routingList) { - labourCost = labourCost.add(detailRouting.getTotalLaborCost()); - machineCost = machineCost.add(detailRouting.getTotalMachCost()); + Map> routingMap = new HashMap<>(); + //工艺 + QuoteDetailRouting queryRouting = new QuoteDetailRouting(); + queryRouting.setQuoteDetailId(quoteDetail.getId()); + queryRouting.setIsAllRouting(true); + queryRouting.setTreeId(one.getId()); + List routingList = quoteDetailRoutingService.queryQuoteDetailRouting(queryRouting); + routingMap = routingList.stream().collect(Collectors.groupingBy(QuoteDetailRouting::getTreeId)); + // 第一层BOM + for (QuoteDetailBomTree bomTree : list) { + // 计算具体人工成本 + List routings = routingMap.get(bomTree.getId()); + if (Objects.isNull(routings) || routings.isEmpty()) { + continue; + } + BigDecimal bomLabourCost = BigDecimal.ZERO; + BigDecimal bomMachineCost = BigDecimal.ZERO; + // 获得 BomTree的 人工和制造成本 + for (QuoteDetailRouting routing : routings) { + bomLabourCost = bomLabourCost.add(routing.getTotalLaborCost()); + bomMachineCost = bomMachineCost.add(routing.getTotalMachCost()); + } + log.info("当前BOM:{}", bomTree.getPartNo()); + // 第二层BOM 目的是遍历所有的 BOM中 的 Part用量 + long parentId = bomTree.getParentId(); + for (QuoteDetailBomTree tree : list) { + if (tree.getLevel() > bomTree.getLevel() || tree.getId() != parentId) { + continue; + } + parentId = tree.getParentId(); + // 获取 层级比自己高的Bom 来获得BOM信息 用量和损耗 + List bomList = quoteDetailBomService.lambdaQuery().eq(QuoteDetailBom::getTreeId, tree.getParentId()).eq(QuoteDetailBom::getComponentPart, tree.getPartNo()).list(); + BigDecimal qtyPerAssembly = BigDecimal.ONE; + for (QuoteDetailBom bom : bomList) { + BigDecimal yield = BigDecimal.ONE.subtract(bom.getShrinkageFactor().divide( BigDecimal.valueOf(100),16,RoundingMode.HALF_UP)); + BigDecimal decimal = bom.getQtyPerAssembly().divide(yield, 16, RoundingMode.HALF_UP); + qtyPerAssembly = qtyPerAssembly.multiply(decimal); + } + // 计算 损耗和用量得到的差异 + bomLabourCost = bomLabourCost.multiply(qtyPerAssembly); + bomMachineCost = bomMachineCost.multiply(qtyPerAssembly); + } + labourCost = labourCost.add(bomLabourCost); + machineCost = machineCost.add(bomMachineCost); } // Bom计算 QuoteDetailBom bom = new QuoteDetailBom();