Browse Source

2026-05-19

【切换版本】优化
master
fengyuan_yang 4 weeks ago
parent
commit
5d156ba825
  1. 22
      src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java
  2. 32
      src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java

22
src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java

@ -552,9 +552,18 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre
@Override
public List<QuoteDetailBomTree> queryDetailBomTree(QuoteDetail detail) {
List<QuoteDetailBomTree> 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<QuoteDetailBomTree> 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<QuoteDetailBomTre
}
private QuoteDetailBomTree buildTree(List<QuoteDetailBomTree> 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;
}

32
src/main/java/com/spring/modules/quote/service/impl/QuoteDetailServiceImpl.java

@ -233,6 +233,11 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
.orderByDesc(QuoteDetailBomTree::getId)
.list();
QuoteDetailBomTree one = roots.isEmpty() ? null : roots.get(0);
Long rootTreeId = Objects.nonNull(one) ? one.getId() : null;
if (roots.size() > 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<QuoteDetailMapper, Quote
BigDecimal unitQuotePrice = BigDecimal.ZERO;
// 获取BomTree 根据层级倒序
List<QuoteDetailBomTree> list = quoteDetailBomTreeService.lambdaQuery()
List<QuoteDetailBomTree> allTreeNodes = quoteDetailBomTreeService.lambdaQuery()
.eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId())
.orderByDesc(QuoteDetailBomTree::getLevel)
.orderByDesc(QuoteDetailBomTree::getId)
.list();
List<QuoteDetailBomTree> list = new ArrayList<>();
if (Objects.nonNull(rootTreeId)) {
List<Long> subtreeTreeIds = quoteDetailBomTreeService.getAllChildIds(quoteDetail, rootTreeId);
subtreeTreeIds.add(rootTreeId);
Set<Long> 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<QuoteDetailMapper, Quote
Map<Long,List<QuoteDetailBom>> 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<QuoteDetailMapper, Quote
nodeIndex, list.size(), bomTree.getPartNo(), bomTree.getLevel(), bomTree.getId(), bomTree.getParentId(), bomTree.getBomType());
if (Long.valueOf(0L).equals(bomTree.getParentId())){
treeId = bomTree.getId();
log.info("[COST_CALC] This is ROOT node (ParentId=0)");
}
@ -433,11 +447,13 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
log.info("[COST_CALC] Accumulating to total - After: LabourCost={}, MachineCost={}", labourCost, machineCost);
}
// 计算最终成本
List<QuoteDetailBom> 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<QuoteDetailBom> 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);

Loading…
Cancel
Save