@ -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 ) ;