|
|
|
@ -1,6 +1,7 @@ |
|
|
|
package com.xujie.sys.modules.quote.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
|
import com.xujie.sys.modules.quote.entity.Quote; |
|
|
|
import com.xujie.sys.modules.quote.entity.QuoteDetail; |
|
|
|
import com.xujie.sys.modules.quote.entity.QuoteDetailBomTree; |
|
|
|
import com.xujie.sys.modules.quote.entity.QuoteDetailRouting; |
|
|
|
@ -8,14 +9,18 @@ import com.xujie.sys.modules.quote.mapper.QuoteDetailRoutingMapper; |
|
|
|
import com.xujie.sys.modules.quote.service.QuoteDetailBomTreeService; |
|
|
|
import com.xujie.sys.modules.quote.service.QuoteDetailRoutingService; |
|
|
|
import com.xujie.sys.modules.quote.service.QuoteDetailService; |
|
|
|
import com.xujie.sys.modules.quote.service.QuoteService; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Objects; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
@Service |
|
|
|
@Slf4j |
|
|
|
@ -24,9 +29,15 @@ public class QuoteDetailRoutingServiceImpl extends ServiceImpl<QuoteDetailRoutin |
|
|
|
private QuoteDetailBomTreeService quoteDetailBomTreeService; |
|
|
|
@Autowired |
|
|
|
private QuoteDetailService quoteDetailService; |
|
|
|
@Autowired |
|
|
|
private QuoteService quoteService; |
|
|
|
|
|
|
|
@Override |
|
|
|
public void saveQuoteDetailRouting(QuoteDetailRouting quoteDetailRouting) { |
|
|
|
// 查询日期 |
|
|
|
Quote quote = quoteService.getById(quoteDetailRouting.getQuoteId()); |
|
|
|
quoteDetailRouting.setQuoteDate(quote.getQuoteDate()); |
|
|
|
|
|
|
|
baseMapper.saveQuoteDetailRouting(quoteDetailRouting); |
|
|
|
} |
|
|
|
|
|
|
|
@ -36,9 +47,77 @@ public class QuoteDetailRoutingServiceImpl extends ServiceImpl<QuoteDetailRoutin |
|
|
|
if (Objects.nonNull(quoteDetailRouting.getIsAllRouting()) && quoteDetailRouting.getIsAllRouting()){ |
|
|
|
List<Long> ids = quoteDetailBomTreeService.getAllChildIds(detail, quoteDetailRouting.getTreeId()); |
|
|
|
ids.add(quoteDetailRouting.getTreeId()); |
|
|
|
return baseMapper.queryQuoteDetailRoutingByTreeIds(ids); |
|
|
|
return baseMapper.queryQuoteDetailRoutingByTreeIds(ids).stream().map(o->{ |
|
|
|
o.setTotalLaborCost(laborCost(o,detail.getQty())); |
|
|
|
o.setTotalManCost(manufactureCost(o,detail.getQty())); |
|
|
|
o.setTotalMachCost(machineCost(o,detail.getQty())); |
|
|
|
|
|
|
|
o.setTotalCost(o.getTotalLaborCost().add(o.getTotalManCost()).add(o.getTotalMachCost())); |
|
|
|
return o; |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
} |
|
|
|
return baseMapper.queryQuoteDetailRouting(quoteDetailRouting).stream().map(o->{ |
|
|
|
o.setTotalLaborCost(laborCost(o,detail.getQty())); |
|
|
|
o.setTotalManCost(manufactureCost(o,detail.getQty())); |
|
|
|
o.setTotalMachCost(machineCost(o,detail.getQty())); |
|
|
|
|
|
|
|
o.setTotalCost(o.getTotalLaborCost().add(o.getTotalManCost()).add(o.getTotalMachCost())); |
|
|
|
return o; |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal laborCost(QuoteDetailRouting quoteDetailRouting,BigDecimal qty){ |
|
|
|
|
|
|
|
BigDecimal setupCost = BigDecimal.ZERO; |
|
|
|
if (Objects.nonNull(quoteDetailRouting.getSetupLaborClassCost()) && quoteDetailRouting.getSetupLaborClassCost().compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
BigDecimal setupLaborClassCost = quoteDetailRouting.getSetupLaborClassCost(); |
|
|
|
BigDecimal setupCrewSize = quoteDetailRouting.getSetupCrewSize(); |
|
|
|
BigDecimal laborSetupTime = quoteDetailRouting.getLaborSetupTime(); |
|
|
|
setupCost = setupLaborClassCost.multiply(setupCrewSize).multiply(laborSetupTime).divide(qty,4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
BigDecimal laborCost = BigDecimal.ZERO; |
|
|
|
if (Objects.nonNull(quoteDetailRouting.getLaborClassCost()) && quoteDetailRouting.getLaborClassCost().compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
BigDecimal laborClassCost = quoteDetailRouting.getLaborClassCost(); |
|
|
|
BigDecimal laborCycleTime = quoteDetailRouting.getLaborCycleTime(); |
|
|
|
BigDecimal efficiencyFactor = quoteDetailRouting.getEfficiencyFactor(); |
|
|
|
BigDecimal crewSize = quoteDetailRouting.getCrewSize(); |
|
|
|
// 人工生产时间/(效率*100) |
|
|
|
BigDecimal needTime = laborCycleTime.divide(efficiencyFactor.divide(BigDecimal.valueOf(100),6, RoundingMode.HALF_UP), 6, RoundingMode.HALF_UP); |
|
|
|
laborCost = needTime.multiply(laborClassCost).multiply(crewSize); |
|
|
|
} |
|
|
|
return setupCost.add(laborCost).setScale(4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal manufactureCost(QuoteDetailRouting quoteDetailRouting,BigDecimal qty){ |
|
|
|
BigDecimal setupCost = BigDecimal.ZERO; |
|
|
|
if (Objects.nonNull(quoteDetailRouting.getWorkCenterCost()) && quoteDetailRouting.getWorkCenterCost().compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
BigDecimal workCenterCost = quoteDetailRouting.getWorkCenterCost(); |
|
|
|
BigDecimal setupTime = quoteDetailRouting.getMachSetupTime(); |
|
|
|
setupCost = workCenterCost.multiply(setupTime.divide(qty,6, RoundingMode.HALF_UP)); |
|
|
|
|
|
|
|
BigDecimal manufactureCost = BigDecimal.ZERO; |
|
|
|
BigDecimal machCycleTime = quoteDetailRouting.getMachCycleTime(); |
|
|
|
BigDecimal efficiencyFactor = quoteDetailRouting.getEfficiencyFactor(); |
|
|
|
manufactureCost = workCenterCost.multiply(machCycleTime.divide(efficiencyFactor.divide(BigDecimal.valueOf(100),6, RoundingMode.HALF_UP),6, RoundingMode.HALF_UP).divide(qty,6, RoundingMode.HALF_UP)); |
|
|
|
setupCost = setupCost.add(manufactureCost); |
|
|
|
} |
|
|
|
return setupCost.setScale(4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal machineCost(QuoteDetailRouting quoteDetailRouting,BigDecimal qty){ |
|
|
|
BigDecimal setupCost = BigDecimal.ZERO; |
|
|
|
if (Objects.nonNull(quoteDetailRouting.getWorkCenterCost()) && quoteDetailRouting.getWorkCenterCost().compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
BigDecimal workCenterCost = quoteDetailRouting.getWorkCenterCost(); |
|
|
|
BigDecimal setupTime = quoteDetailRouting.getMachSetupTime(); |
|
|
|
setupCost = workCenterCost.multiply(setupTime.divide(qty,6, RoundingMode.HALF_UP)); |
|
|
|
|
|
|
|
BigDecimal manufactureCost = BigDecimal.ZERO; |
|
|
|
BigDecimal machCycleTime = quoteDetailRouting.getMachCycleTime(); |
|
|
|
BigDecimal efficiencyFactor = quoteDetailRouting.getEfficiencyFactor(); |
|
|
|
manufactureCost = workCenterCost.multiply(machCycleTime.divide(efficiencyFactor.divide(BigDecimal.valueOf(100),6, RoundingMode.HALF_UP),6, RoundingMode.HALF_UP).divide(qty,6, RoundingMode.HALF_UP)); |
|
|
|
setupCost = setupCost.add(manufactureCost); |
|
|
|
} |
|
|
|
return baseMapper.queryQuoteDetailRouting(quoteDetailRouting); |
|
|
|
return setupCost.setScale(4, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
|