From 5e2fcf3e55e66f5f6c91327d61b6722f76cba3c9 Mon Sep 17 00:00:00 2001 From: qiezi <15576055375@163.com> Date: Tue, 11 Mar 2025 15:19:24 +0800 Subject: [PATCH] 2025-03-11 --- .../quote/service/QuoteDetailBomService.java | 8 ++ .../impl/QuoteDetailBomServiceImpl.java | 128 ++++++++++++++---- .../impl/QuoteDetailBomTreeServiceImpl.java | 13 +- 3 files changed, 117 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java b/src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java index b5bd3ce7..a2f865ff 100644 --- a/src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java +++ b/src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java @@ -1,9 +1,11 @@ package com.spring.modules.quote.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.spring.modules.quote.entity.QuoteDetail; import com.spring.modules.quote.entity.QuoteDetailBom; import com.spring.modules.quote.entity.QuoteDetailBomTree; +import java.math.BigDecimal; import java.util.List; @@ -11,4 +13,10 @@ public interface QuoteDetailBomService extends IService { List queryQuoteDetailBom(QuoteDetailBom quoteDetailBom); void againQuoteDetailBom(QuoteDetailBomTree tree, long id); + + BigDecimal calculateQuotePrice(QuoteDetailBom component, QuoteDetail detail); + + BigDecimal calculateActualQuotePrice(QuoteDetailBom component, QuoteDetail detail); + + BigDecimal calculateBOMQuotePrice(QuoteDetailBom component, QuoteDetail detail); } diff --git a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomServiceImpl.java b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomServiceImpl.java index 45299456..c0ac5e0a 100644 --- a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomServiceImpl.java +++ b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomServiceImpl.java @@ -14,8 +14,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Service @@ -29,43 +28,118 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl queryQuoteDetailBom(QuoteDetailBom quoteDetailBom) { QuoteDetail detail = quoteDetailService.lambdaQuery().eq(QuoteDetail::getId, quoteDetailBom.getQuoteDetailId()).one(); - if (Objects.nonNull(quoteDetailBom.getAllTree()) && quoteDetailBom.getAllTree()) { - return Objects.requireNonNull(queryQuoteDetailBomAll(quoteDetailBom)).stream().map(item -> { - item.setQuoteUnitPrice(calculateQuotePrice(item, detail));// 单位标准成本 - item.setActualQuotePrice(calculateActualQuotePrice(item, detail));// 单位实际成本 - item.setAllQuotePrice(calculateBOMQuotePrice(item, detail));// 单位实际成本 - // levelCost - item.setLevelCost(calculateQuotePrice(item, detail)); - if ("Y".equals(item.getBomFlag())){ - item.setLevelCost(BigDecimal.ZERO); - } - return item; - }).collect(Collectors.toList()); - } - return baseMapper.queryQuoteDetailBom(quoteDetailBom).stream().map(item -> { - item.setQuoteUnitPrice(calculateQuotePrice(item, detail)); + + // 全级Bom + List bomList = new ArrayList<>(); + // 查询的集合 + List list = new ArrayList<>(); + // 获取所有子节点 + QuoteDetail quoteDetail = new QuoteDetail(); + quoteDetail.setId(quoteDetailBom.getQuoteDetailId()); + // 所有子节点 + List ids = quoteDetailBomTreeService.getAllChildIds(quoteDetail, quoteDetailBom.getTreeId()); + // 加上自己的数据 + ids.add(quoteDetailBom.getTreeId()); + + bomList = Objects.requireNonNull(queryQuoteDetailBomAll(quoteDetailBom,ids)); + bomList = bomList.stream().peek(item -> { + // 累计成本 + item.setQuoteUnitPrice(calculateQuotePrice(item, detail));// 三个字段都一样 item.setActualQuotePrice(calculateActualQuotePrice(item, detail)); item.setAllQuotePrice(calculateBOMQuotePrice(item, detail)); - // levelCost + // 本层成本 item.setLevelCost(calculateQuotePrice(item, detail)); if ("Y".equals(item.getBomFlag())){ item.setLevelCost(BigDecimal.ZERO); } - return item; }).collect(Collectors.toList()); + if (Objects.nonNull(quoteDetailBom.getAllTree()) && quoteDetailBom.getAllTree()) { + list = bomList; + }else { + list = baseMapper.queryQuoteDetailBom(quoteDetailBom); + Set idSet = list.stream() + .map(QuoteDetailBom::getId) + .collect(Collectors.toSet()); + list = bomList.stream().filter(bom->idSet.contains(bom.getId())).collect(Collectors.toList()); + } + // 计算成本 + // 对BomType为Purchase 的再次处理本层成本 + // 1、通过 level倒序 获取整Tree结构 + // 1-1、获取所有 BOM + if (!ids.isEmpty() && ids.size() > 1){ + List trees = quoteDetailBomTreeService.lambdaQuery() + .eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId()) + .orderByDesc(QuoteDetailBomTree::getLevel) + .list(); + // 转为Map + Map> bomMap = bomList.stream().collect(Collectors.groupingBy(QuoteDetailBom::getTreeId)); + // 单个计算 + for (QuoteDetailBomTree tree : trees) { + if (Objects.equals(tree.getParentId(),0L)){ + continue; + } + BigDecimal decimal = nodeTree(trees, bomMap, tree.getId(),detail); + // 全数据的List + List boms = bomMap.get(tree.getParentId()); + if (Objects.nonNull(boms)){ + for (QuoteDetailBom bom : boms) { + if (bom.getTreeId().equals(tree.getParentId()) && bom.getComponentPart().equals(tree.getPartNo())){ + if (bom.getQuoteUnitPrice().compareTo(BigDecimal.ZERO) == 0){ + bom.setLevelCost(BigDecimal.ZERO); + }else { + bom.setLevelCost(bom.getQuoteUnitPrice().subtract(decimal)); + } + } + } + } + // 查询的List + for (QuoteDetailBom bom : list) { + if (bom.getTreeId().equals(tree.getParentId()) && bom.getComponentPart().equals(tree.getPartNo())){ + if (bom.getQuoteUnitPrice().compareTo(BigDecimal.ZERO) == 0){ + bom.setLevelCost(BigDecimal.ZERO); + }else { + bom.setLevelCost(bom.getQuoteUnitPrice().subtract(decimal)); + } + } + } + } + } + return list; } + private BigDecimal nodeTree(List trees,Map> bomMap,Long treeId,QuoteDetail detail){ - private List queryQuoteDetailBomAll(QuoteDetailBom quoteDetailBom) { - QuoteDetail quoteDetail = new QuoteDetail(); - quoteDetail.setId(quoteDetailBom.getQuoteDetailId()); - List ids = quoteDetailBomTreeService.getAllChildIds(quoteDetail, quoteDetailBom.getTreeId()); - ids.add(quoteDetailBom.getTreeId()); + Map> map = trees.stream().collect(Collectors.groupingBy(QuoteDetailBomTree::getParentId)); + // 2、通过点击的获取 tree数据 + List treeList = map.get(treeId); + // 节点不为空 + BigDecimal price = BigDecimal.ZERO; + if (Objects.nonNull(treeList)){ + for (QuoteDetailBomTree tree : treeList) { + if ("Purchase".equals(tree.getBomType())){ + price = price.add(nodeTree(trees,bomMap,tree.getId(),detail)); + } + } + } + for (QuoteDetailBom bom : bomMap.get(treeId)) { +// if (Objects.isNull(bom.getLevelCost())){ +// bom.setLevelCost(calculateQuotePrice(bom, detail)); +// if ("Y".equals(bom.getBomFlag())){ +// bom.setLevelCost(BigDecimal.ZERO); +// } +// } + price = price.add(bom.getLevelCost()); + } + return price; + } + + + private List queryQuoteDetailBomAll(QuoteDetailBom quoteDetailBom,List ids) { return baseMapper.queryQuoteDetailBomByIds(ids, quoteDetailBom.getQuoteDetailId()); } - private BigDecimal calculateQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { + public BigDecimal calculateQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { // 计算单位报价 // 1、单位成本 BigDecimal unitPrice = quoteDetailBom.getUnitPrice(); @@ -91,7 +165,7 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl