diff --git a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java index 809011e0..e6e0410a 100644 --- a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java +++ b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java @@ -552,9 +552,18 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl queryDetailBomTree(QuoteDetail detail) { List list = baseMapper.queryDetailBomTree(detail); + long rootCount = list.stream() + .filter(node -> Objects.isNull(node.getParentId()) || Long.valueOf(0L).equals(node.getParentId())) + .count(); + if (rootCount > 1) { + log.warn("[BOM_TREE] QuoteDetailId={} has {} root nodes, fallback to latest root node by id.", + detail.getId(), rootCount); + } QuoteDetailBomTree quoteDetailBomTree = buildTree(list); List treeList = new ArrayList<>(); if (Objects.nonNull(quoteDetailBomTree)) { + log.info("[BOM_TREE] QuoteDetailId={} selected root treeId={} for tree display/query.", + detail.getId(), quoteDetailBomTree.getId()); treeList.add(quoteDetailBomTree); } return treeList; @@ -919,13 +928,12 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl nodes) { - QuoteDetailBomTree root = null; - for (QuoteDetailBomTree node : nodes) { - if (node.getParentId() == null || node.getParentId() == 0) { - root = node; - root.addChildren(nodes); - break; - } + QuoteDetailBomTree root = nodes.stream() + .filter(node -> Objects.isNull(node.getParentId()) || Long.valueOf(0L).equals(node.getParentId())) + .max(Comparator.comparing(QuoteDetailBomTree::getId, Comparator.nullsLast(Long::compareTo))) + .orElse(null); + if (Objects.nonNull(root)) { + root.addChildren(nodes); } return root; } 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 b1ac173f..a2a8b97f 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 @@ -233,6 +233,11 @@ public class QuoteDetailServiceImpl extends ServiceImpl 1) { + log.warn("[COST_CALC] QuoteDetailId={} has {} root nodes, use latest root treeId={} for calculation.", + quoteDetail.getId(), roots.size(), rootTreeId); + } // 3、工艺成本 BigDecimal labourCost = BigDecimal.ZERO;// 人工成本 @@ -243,11 +248,22 @@ public class QuoteDetailServiceImpl extends ServiceImpl list = quoteDetailBomTreeService.lambdaQuery() + List allTreeNodes = quoteDetailBomTreeService.lambdaQuery() .eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId()) .orderByDesc(QuoteDetailBomTree::getLevel) .orderByDesc(QuoteDetailBomTree::getId) .list(); + List list = new ArrayList<>(); + if (Objects.nonNull(rootTreeId)) { + List subtreeTreeIds = quoteDetailBomTreeService.getAllChildIds(quoteDetail, rootTreeId); + subtreeTreeIds.add(rootTreeId); + Set subtreeTreeIdSet = new HashSet<>(subtreeTreeIds); + list = allTreeNodes.stream() + .filter(node -> subtreeTreeIdSet.contains(node.getId())) + .collect(Collectors.toList()); + log.info("[COST_CALC] Root treeId={} selected, subtree node count={}, all node count={}", + rootTreeId, list.size(), allTreeNodes.size()); + } log.info("[COST_CALC] [PERF_LOG] Fetching {} BomTree nodes took {} ms", list.size(), (System.currentTimeMillis() - perfTreeStartTime)); @@ -275,7 +291,6 @@ public class QuoteDetailServiceImpl extends ServiceImpl> bomMap = bomList.stream().collect(Collectors.groupingBy(QuoteDetailBom::getTreeId)); log.info("[COST_CALC] [PERF_LOG] Fetching and grouping {} BOM component records took {} ms", bomList.size(), (System.currentTimeMillis() - perfBomStartTime)); - long treeId = 0; int nodeIndex = 0; long perfConvolutionStartTime = System.currentTimeMillis(); @@ -288,7 +303,6 @@ public class QuoteDetailServiceImpl extends ServiceImpl boms = bomMap.get(treeId); - if (Objects.nonNull(boms)){ - for (QuoteDetailBom bom : boms) { - unitQuotePrice = unitQuotePrice.add(bom.getQuoteUnitPrice()); - actualQuotePrice = actualQuotePrice.add(bom.getActualQuotePrice()); + if (Objects.nonNull(rootTreeId)) { + List boms = bomMap.get(rootTreeId); + if (Objects.nonNull(boms)) { + for (QuoteDetailBom bom : boms) { + unitQuotePrice = unitQuotePrice.add(bom.getQuoteUnitPrice()); + actualQuotePrice = actualQuotePrice.add(bom.getActualQuotePrice()); + } } } log.info("[COST_CALC] [PERF_LOG] Main convolution loop took {} ms, out of which DB updates took {} ms", (System.currentTimeMillis() - perfConvolutionStartTime), totalUpdateDbTime);