|
|
|
@ -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<QuoteDetailBomMapper, |
|
|
|
@Override |
|
|
|
public List<QuoteDetailBom> 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<QuoteDetailBom> bomList = new ArrayList<>(); |
|
|
|
// 查询的集合 |
|
|
|
List<QuoteDetailBom> list = new ArrayList<>(); |
|
|
|
// 获取所有子节点 |
|
|
|
QuoteDetail quoteDetail = new QuoteDetail(); |
|
|
|
quoteDetail.setId(quoteDetailBom.getQuoteDetailId()); |
|
|
|
// 所有子节点 |
|
|
|
List<Long> 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<Long> 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<QuoteDetailBomTree> trees = quoteDetailBomTreeService.lambdaQuery() |
|
|
|
.eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId()) |
|
|
|
.orderByDesc(QuoteDetailBomTree::getLevel) |
|
|
|
.list(); |
|
|
|
// 转为Map |
|
|
|
Map<Long, List<QuoteDetailBom>> 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<QuoteDetailBom> 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<QuoteDetailBomTree> trees,Map<Long, List<QuoteDetailBom>> bomMap,Long treeId,QuoteDetail detail){ |
|
|
|
|
|
|
|
private List<QuoteDetailBom> queryQuoteDetailBomAll(QuoteDetailBom quoteDetailBom) { |
|
|
|
QuoteDetail quoteDetail = new QuoteDetail(); |
|
|
|
quoteDetail.setId(quoteDetailBom.getQuoteDetailId()); |
|
|
|
List<Long> ids = quoteDetailBomTreeService.getAllChildIds(quoteDetail, quoteDetailBom.getTreeId()); |
|
|
|
ids.add(quoteDetailBom.getTreeId()); |
|
|
|
Map<Long,List<QuoteDetailBomTree>> map = trees.stream().collect(Collectors.groupingBy(QuoteDetailBomTree::getParentId)); |
|
|
|
// 2、通过点击的获取 tree数据 |
|
|
|
List<QuoteDetailBomTree> 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<QuoteDetailBom> queryQuoteDetailBomAll(QuoteDetailBom quoteDetailBom,List<Long> 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<QuoteDetailBomMapper, |
|
|
|
return needQty.multiply(unitPrice).setScale(4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal calculateActualQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { |
|
|
|
public BigDecimal calculateActualQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { |
|
|
|
// 计算单位报价 |
|
|
|
// 1、单位成本 |
|
|
|
BigDecimal actualPrice = quoteDetailBom.getActualPrice(); |
|
|
|
@ -117,7 +191,7 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper, |
|
|
|
return needQty.multiply(actualPrice).setScale(4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal calculateBOMQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { |
|
|
|
public BigDecimal calculateBOMQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) { |
|
|
|
// 计算单位报价 |
|
|
|
// 1、报价成本 |
|
|
|
BigDecimal quotePrice = quoteDetailBom.getQuotePrice(); |
|
|
|
|