Browse Source

2025-03-11

master
qiezi 1 year ago
parent
commit
5e2fcf3e55
  1. 8
      src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java
  2. 128
      src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomServiceImpl.java
  3. 11
      src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java

8
src/main/java/com/spring/modules/quote/service/QuoteDetailBomService.java

@ -1,9 +1,11 @@
package com.spring.modules.quote.service; package com.spring.modules.quote.service;
import com.baomidou.mybatisplus.extension.service.IService; 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.QuoteDetailBom;
import com.spring.modules.quote.entity.QuoteDetailBomTree; import com.spring.modules.quote.entity.QuoteDetailBomTree;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -11,4 +13,10 @@ public interface QuoteDetailBomService extends IService<QuoteDetailBom> {
List<QuoteDetailBom> queryQuoteDetailBom(QuoteDetailBom quoteDetailBom); List<QuoteDetailBom> queryQuoteDetailBom(QuoteDetailBom quoteDetailBom);
void againQuoteDetailBom(QuoteDetailBomTree tree, long id); void againQuoteDetailBom(QuoteDetailBomTree tree, long id);
BigDecimal calculateQuotePrice(QuoteDetailBom component, QuoteDetail detail);
BigDecimal calculateActualQuotePrice(QuoteDetailBom component, QuoteDetail detail);
BigDecimal calculateBOMQuotePrice(QuoteDetailBom component, QuoteDetail detail);
} }

128
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.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@ -29,43 +28,118 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper,
@Override @Override
public List<QuoteDetailBom> queryQuoteDetailBom(QuoteDetailBom quoteDetailBom) { public List<QuoteDetailBom> queryQuoteDetailBom(QuoteDetailBom quoteDetailBom) {
QuoteDetail detail = quoteDetailService.lambdaQuery().eq(QuoteDetail::getId, quoteDetailBom.getQuoteDetailId()).one(); 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.setActualQuotePrice(calculateActualQuotePrice(item, detail));
item.setAllQuotePrice(calculateBOMQuotePrice(item, detail)); item.setAllQuotePrice(calculateBOMQuotePrice(item, detail));
// levelCost
// 本层成本
item.setLevelCost(calculateQuotePrice(item, detail)); item.setLevelCost(calculateQuotePrice(item, detail));
if ("Y".equals(item.getBomFlag())){ if ("Y".equals(item.getBomFlag())){
item.setLevelCost(BigDecimal.ZERO); item.setLevelCost(BigDecimal.ZERO);
} }
return item;
}).collect(Collectors.toList()); }).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()); return baseMapper.queryQuoteDetailBomByIds(ids, quoteDetailBom.getQuoteDetailId());
} }
private BigDecimal calculateQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
public BigDecimal calculateQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
// 计算单位报价 // 计算单位报价
// 1单位成本 // 1单位成本
BigDecimal unitPrice = quoteDetailBom.getUnitPrice(); BigDecimal unitPrice = quoteDetailBom.getUnitPrice();
@ -91,7 +165,7 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper,
return needQty.multiply(unitPrice).setScale(4, RoundingMode.HALF_UP); return needQty.multiply(unitPrice).setScale(4, RoundingMode.HALF_UP);
} }
private BigDecimal calculateActualQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
public BigDecimal calculateActualQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
// 计算单位报价 // 计算单位报价
// 1单位成本 // 1单位成本
BigDecimal actualPrice = quoteDetailBom.getActualPrice(); BigDecimal actualPrice = quoteDetailBom.getActualPrice();
@ -117,7 +191,7 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper,
return needQty.multiply(actualPrice).setScale(4, RoundingMode.HALF_UP); return needQty.multiply(actualPrice).setScale(4, RoundingMode.HALF_UP);
} }
private BigDecimal calculateBOMQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
public BigDecimal calculateBOMQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
// 计算单位报价 // 计算单位报价
// 1报价成本 // 1报价成本
BigDecimal quotePrice = quoteDetailBom.getQuotePrice(); BigDecimal quotePrice = quoteDetailBom.getQuotePrice();

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

@ -123,20 +123,23 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre
// 该字段决定是否存在levelCost // 该字段决定是否存在levelCost
component.setBomFlag("N"); component.setBomFlag("N");
// 物料是半成品 // 物料是半成品
if (isComponentBom(quoteDetail)){
QuoteDetailBomTree bomTree = isComponentBom(quoteDetail);
if (Objects.nonNull(bomTree)){
initQuoteDetailBomTree(quoteDetail ,bom.getId(),level+1); initQuoteDetailBomTree(quoteDetail ,bom.getId(),level+1);
// 添加字段
// // 添加字段
if (!bomTree.getBomType().equals("Purchase")){
component.setBomFlag("Y"); component.setBomFlag("Y");
} }
}
//新增子物料信息 //新增子物料信息
component.setTreeId(bom.getId()); component.setTreeId(bom.getId());
quoteDetailBomService.save(component); quoteDetailBomService.save(component);
} }
} }
private boolean isComponentBom(QuoteDetail component) {
private QuoteDetailBomTree isComponentBom(QuoteDetail component) {
// 根据子物料信息检查是否有BOM信息 // 根据子物料信息检查是否有BOM信息
return Objects.nonNull(baseMapper.queryPartBom(component));
return baseMapper.queryPartBom(component);
} }
private QuoteDetail createQuoteDetail(QuoteDetail detail, QuoteDetailBom component) { private QuoteDetail createQuoteDetail(QuoteDetail detail, QuoteDetailBom component) {

Loading…
Cancel
Save