Browse Source

20240926

java8
qiezi 1 year ago
parent
commit
90799612dc
  1. 20
      src/main/java/com/xujie/sys/modules/quote/entity/QuoteDetailRouting.java
  2. 4
      src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailBomServiceImpl.java
  3. 83
      src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailRoutingServiceImpl.java
  4. 21
      src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailServiceImpl.java
  5. 18
      src/main/resources/mapper/quote/QuoteDetailRoutingMapper.xml

20
src/main/java/com/xujie/sys/modules/quote/entity/QuoteDetailRouting.java

@ -92,6 +92,12 @@ public class QuoteDetailRouting {
private Integer resourceNum;
private BigDecimal laborClassCost;
private BigDecimal setupLaborClassCost;
private BigDecimal workCenterCost;
@TableField(exist = false)
private String partDesc;
@ -103,4 +109,18 @@ public class QuoteDetailRouting {
@TableField(exist = false)
private Boolean isAllRouting;
@TableField(exist = false)
private Date quoteDate;
@TableField(exist = false)
private BigDecimal totalLaborCost;
@TableField(exist = false)
private BigDecimal totalManCost;
@TableField(exist = false)
private BigDecimal totalMachCost;
@TableField(exist = false)
private BigDecimal totalCost;
}

4
src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailBomServiceImpl.java

@ -77,7 +77,7 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper,
qtyPerAssembly.multiply(BigDecimal.valueOf(1).add((shrinkageFactor.divide(BigDecimal.valueOf(100),4, RoundingMode.HALF_UP))))
.add(componentUnitScrap);
return needQty.multiply(unitPrice);
return needQty.multiply(unitPrice).setScale(4, RoundingMode.HALF_UP);
}
private BigDecimal calculateActualQuotePrice(QuoteDetailBom quoteDetailBom, QuoteDetail detail) {
@ -102,6 +102,6 @@ public class QuoteDetailBomServiceImpl extends ServiceImpl<QuoteDetailBomMapper,
qtyPerAssembly.multiply(BigDecimal.valueOf(1).add((shrinkageFactor.divide(BigDecimal.valueOf(100),4, RoundingMode.HALF_UP))))
.add(componentUnitScrap);
return needQty.multiply(actualPrice);
return needQty.multiply(actualPrice).setScale(4, RoundingMode.HALF_UP);
}
}

83
src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailRoutingServiceImpl.java

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

21
src/main/java/com/xujie/sys/modules/quote/service/impl/QuoteDetailServiceImpl.java

@ -182,7 +182,14 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
QuoteDetailBomTree one = quoteDetailBomTreeService.lambdaQuery()
.eq(QuoteDetailBomTree::getQuoteDetailId, quoteDetail.getId())
.eq(QuoteDetailBomTree::getParentId, 0L).one();
// 4 工艺成本
BigDecimal labourCost = BigDecimal.ZERO;
BigDecimal machineCost = BigDecimal.ZERO;
BigDecimal manufactureCost = BigDecimal.ZERO;
if (Objects.nonNull(one)){
// 材料
QuoteDetailBom bom = new QuoteDetailBom();
bom.setQuoteDetailId(quoteDetail.getId());
bom.setAllTree(true);
@ -192,6 +199,17 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
unitQuotePrice = unitQuotePrice.add(quoteDetailBom.getQuotePrice());
actualQuotePrice = actualQuotePrice.add(quoteDetailBom.getActualQuotePrice());
}
// 工艺
QuoteDetailRouting routing = new QuoteDetailRouting();
routing.setQuoteDetailId(quoteDetail.getId());
routing.setIsAllRouting(true);
routing.setTreeId(one.getId());
List<QuoteDetailRouting> routingList = quoteDetailRoutingService.queryQuoteDetailRouting(routing);
for (QuoteDetailRouting quoteDetailRouting : routingList) {
labourCost = labourCost.add(quoteDetailRouting.getTotalLaborCost());
machineCost = machineCost.add(quoteDetailRouting.getTotalMachCost());
manufactureCost = manufactureCost.add(quoteDetailRouting.getTotalManCost());
}
}
// 传入map
map.put("toolCost", toolCost);
@ -200,6 +218,9 @@ public class QuoteDetailServiceImpl extends ServiceImpl<QuoteDetailMapper, Quote
map.put("otherCost", packCost.add(shippingCost));
map.put("unitQuotePrice",unitQuotePrice);
map.put("actualQuotePrice",actualQuotePrice);
map.put("labourCost",labourCost);
map.put("machineCost",machineCost);
map.put("manufactureCost",manufactureCost);
return map;
}

18
src/main/resources/mapper/quote/QuoteDetailRoutingMapper.xml

@ -10,7 +10,8 @@
setup_crew_size, outside_op_item, machine_no, work_center_no,
labor_class_no, setup_labor_class_no, overlap, note_text, operation_id,
operation_name, create_by, create_date, tree_id, mach_cycle_time,
labor_cycle_time, resource_num)
labor_cycle_time, resource_num, labor_class_cost, setup_labor_class_cost,
work_center_cost)
select #{quoteId},
#{quoteDetailId},
#{quoteDetailItemNo},
@ -45,7 +46,10 @@
#{treeId},
mach_cycle_time,
labor_cycle_time,
dbo.get_work_center_resource_num(site, work_center_no)
dbo.get_work_center_resource_num(site, work_center_no),
dbo.get_labor_class_cost(site, bu_no, labor_class_no, #{quoteDate}),
dbo.get_labor_class_cost(site, bu_no, setup_labor_class_no, #{quoteDate}),
dbo.get_work_center_cost(site, bu_no, work_center_no, #{quoteDate}, 'D')
from plm_routing_component
where part_no = #{partNo}
and routing_revision = #{routingRevision}
@ -97,7 +101,10 @@
wc.work_center_desc,
qdr.mach_cycle_time,
qdr.labor_cycle_time,
qdr.resource_num
qdr.resource_num,
qdr.labor_class_cost,
qdr.setup_labor_class_cost,
qdr.work_center_cost
from plm_quote_detail_routing qdr
left join part p on qdr.part_no = p.part_no and qdr.site = p.site
left join work_center wc
@ -149,7 +156,10 @@
wc.work_center_desc,
qdr.mach_cycle_time,
qdr.labor_cycle_time,
qdr.resource_num
qdr.resource_num,
qdr.labor_class_cost,
qdr.setup_labor_class_cost,
qdr.work_center_cost
from plm_quote_detail_routing qdr
left join part p on qdr.part_no = p.part_no and qdr.site = p.site
left join work_center wc

Loading…
Cancel
Save