|
|
@ -167,6 +167,7 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote |
|
|
.list(); |
|
|
.list(); |
|
|
// 计算 |
|
|
// 计算 |
|
|
updateQuoteDetailBomTree(list); |
|
|
updateQuoteDetailBomTree(list); |
|
|
|
|
|
Long id = list.get(list.size() - 1).getId(); |
|
|
// 开始计算 Routing |
|
|
// 开始计算 Routing |
|
|
for (QuoteDetailBomTree bomTree : list) { |
|
|
for (QuoteDetailBomTree bomTree : list) { |
|
|
if (bomTree.getParentId().equals(0L)){ |
|
|
if (bomTree.getParentId().equals(0L)){ |
|
|
@ -180,22 +181,31 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote |
|
|
} |
|
|
} |
|
|
BigDecimal usage = BigDecimal.ONE; |
|
|
BigDecimal usage = BigDecimal.ONE; |
|
|
BigDecimal yield = BigDecimal.ONE; |
|
|
BigDecimal yield = BigDecimal.ONE; |
|
|
|
|
|
log.info("当前BOM:{}",bomTree.getPartNo()); |
|
|
for (QuoteDetailBomTree tree : list) { |
|
|
for (QuoteDetailBomTree tree : list) { |
|
|
if (tree.getLevel() >= bomTree.getLevel()){ |
|
|
|
|
|
|
|
|
if (tree.getLevel() > bomTree.getLevel() || tree.getParentId().equals(0L)){ |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
List<QuoteDetailBom> boms = quoteDetailBomService.lambdaQuery().eq(QuoteDetailBom::getTreeId, tree.getParentId()).eq(QuoteDetailBom::getComponentPart, tree.getPartNo()).list(); |
|
|
|
|
|
for (QuoteDetailBom bom : boms) { |
|
|
|
|
|
usage = usage.multiply(bom.getQtyPerAssembly()); |
|
|
|
|
|
|
|
|
if (!tree.getParentId().equals(id)){ |
|
|
|
|
|
List<QuoteDetailBom> boms = quoteDetailBomService.lambdaQuery().eq(QuoteDetailBom::getTreeId, tree.getParentId()).eq(QuoteDetailBom::getComponentPart, tree.getPartNo()).list(); |
|
|
|
|
|
BigDecimal qtyPerAssembly = BigDecimal.ZERO; |
|
|
|
|
|
for (QuoteDetailBom bom : boms) { |
|
|
|
|
|
qtyPerAssembly = qtyPerAssembly.add(bom.getQtyPerAssembly()); |
|
|
|
|
|
} |
|
|
|
|
|
log.info("在BOM:{} 作为子料 单位用量{}",tree.getPartNo(),qtyPerAssembly); |
|
|
|
|
|
usage = usage.multiply(qtyPerAssembly); |
|
|
} |
|
|
} |
|
|
if (Objects.isNull(tree.getYield()) || tree.getYield().compareTo(BigDecimal.ZERO) == 0){ |
|
|
|
|
|
|
|
|
if (Objects.isNull(tree.getYield()) || tree.getYield().compareTo(BigDecimal.ZERO) == 0 || tree.getId().equals(bomTree.getId())){ |
|
|
|
|
|
log.info("在BOM:{} 作为子料 报废率为空",tree.getPartNo()); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
yield = yield.divide(tree.getYield().divide(BigDecimal.valueOf(100),6,RoundingMode.HALF_UP),6,RoundingMode.HALF_UP); |
|
|
|
|
|
|
|
|
BigDecimal bomYield = tree.getYield().divide(BigDecimal.valueOf(100),6,RoundingMode.HALF_UP); |
|
|
|
|
|
log.info("在BOM:{} 作为子料 报废率{}",tree.getPartNo(),bomYield); |
|
|
|
|
|
yield = yield.multiply(bomYield); |
|
|
} |
|
|
} |
|
|
cost1 = cost1.multiply(usage); |
|
|
cost1 = cost1.multiply(usage); |
|
|
cost1 = cost1.divide(yield,6,RoundingMode.HALF_UP); |
|
|
cost1 = cost1.divide(yield,6,RoundingMode.HALF_UP); |
|
|
|
|
|
|
|
|
|
|
|
log.info("BOM:{},cost:{}",bomTree.getPartNo(),cost1); |
|
|
labourCost = labourCost.add(cost1); |
|
|
labourCost = labourCost.add(cost1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -310,23 +320,25 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote |
|
|
BigDecimal yieldRate = quoteDetailBomTreeService.queryYieldRate(tree); |
|
|
BigDecimal yieldRate = quoteDetailBomTreeService.queryYieldRate(tree); |
|
|
// 获取Bom unYield |
|
|
// 获取Bom unYield |
|
|
// 1、查询 当前tree的物料 |
|
|
// 1、查询 当前tree的物料 |
|
|
List<QuoteDetailBom> bomList = quoteDetailBomService.lambdaQuery() |
|
|
|
|
|
.eq(QuoteDetailBom::getTreeId, tree.getId()) |
|
|
|
|
|
.list(); |
|
|
|
|
|
BigDecimal bomUnYield = new BigDecimal(0); |
|
|
|
|
|
|
|
|
QuoteDetailBom detailBom = new QuoteDetailBom(); |
|
|
|
|
|
detailBom.setQuoteDetailId(tree.getQuoteDetailId()); |
|
|
|
|
|
detailBom.setTreeId(tree.getId()); |
|
|
|
|
|
List<QuoteDetailBom> bomList = quoteDetailBomService.queryQuoteDetailBom(detailBom); |
|
|
|
|
|
// BomUnYield |
|
|
|
|
|
BigDecimal bomUnYield = BigDecimal.ZERO; |
|
|
for (QuoteDetailBom bom : bomList) { |
|
|
for (QuoteDetailBom bom : bomList) { |
|
|
bomUnYield = bomUnYield.add(bom.getQtyPerAssembly()); |
|
|
|
|
|
|
|
|
bomUnYield = bomUnYield.add(bom.getActualQuotePrice()); |
|
|
} |
|
|
} |
|
|
// BomUnYield |
|
|
|
|
|
BigDecimal bomYield = null; |
|
|
BigDecimal bomYield = null; |
|
|
if (bomUnYield.compareTo(BigDecimal.ZERO) != 0 && Objects.nonNull(yieldRate) && yieldRate.compareTo(BigDecimal.ZERO) != 0) { |
|
|
if (bomUnYield.compareTo(BigDecimal.ZERO) != 0 && Objects.nonNull(yieldRate) && yieldRate.compareTo(BigDecimal.ZERO) != 0) { |
|
|
bomYield = bomUnYield.divide(yieldRate, 6, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); |
|
|
|
|
|
|
|
|
bomYield = bomUnYield.divide(yieldRate, 6, RoundingMode.HALF_UP).divide(BigDecimal.valueOf(100),6,RoundingMode.HALF_UP); |
|
|
} |
|
|
} |
|
|
// ProcessTime |
|
|
// ProcessTime |
|
|
BigDecimal processTime = new BigDecimal(0); |
|
|
|
|
|
|
|
|
BigDecimal processTime = BigDecimal.ZERO; |
|
|
List<QuoteDetailRouting> routingList = quoteDetailRoutingService.lambdaQuery().eq(QuoteDetailRouting::getTreeId, tree.getId()).list(); |
|
|
List<QuoteDetailRouting> routingList = quoteDetailRoutingService.lambdaQuery().eq(QuoteDetailRouting::getTreeId, tree.getId()).list(); |
|
|
for (QuoteDetailRouting quoteDetailRouting : routingList) { |
|
|
for (QuoteDetailRouting quoteDetailRouting : routingList) { |
|
|
processTime = processTime.add(quoteDetailRouting.getLaborCycleTime()); |
|
|
|
|
|
|
|
|
BigDecimal laborCycleTime = quoteDetailRouting.getLaborCycleTime(); |
|
|
|
|
|
processTime = processTime.add(Objects.isNull(laborCycleTime)?BigDecimal.ZERO:laborCycleTime); |
|
|
} |
|
|
} |
|
|
tree.setYield(yieldRate); |
|
|
tree.setYield(yieldRate); |
|
|
tree.setBomUnYield(bomUnYield); |
|
|
tree.setBomUnYield(bomUnYield); |
|
|
|