|
|
@ -60,6 +60,7 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
detail.setPartNo(part.getPartNo()); |
|
|
detail.setPartNo(part.getPartNo()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
// 获取BOM信息 |
|
|
QuoteDetailBomTree bom = baseMapper.queryPartBom(detail); |
|
|
QuoteDetailBomTree bom = baseMapper.queryPartBom(detail); |
|
|
if (Objects.isNull(bom)){ |
|
|
if (Objects.isNull(bom)){ |
|
|
return 0; |
|
|
return 0; |
|
|
@ -69,6 +70,7 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
// 2、通过Bom查询 Bom子物料 |
|
|
// 2、通过Bom查询 Bom子物料 |
|
|
log.info("BOM信息:{}",bom); |
|
|
log.info("BOM信息:{}",bom); |
|
|
save(bom); |
|
|
save(bom); |
|
|
|
|
|
// 查BOM对应Routing |
|
|
QuoteDetailRouting routing = baseMapper.queryPartBomRouting(detail); |
|
|
QuoteDetailRouting routing = baseMapper.queryPartBomRouting(detail); |
|
|
if (Objects.nonNull(routing)) { |
|
|
if (Objects.nonNull(routing)) { |
|
|
routing.setTreeId(bom.getId()); |
|
|
routing.setTreeId(bom.getId()); |
|
|
@ -76,50 +78,15 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
routing.setCreateDate(new Date()); |
|
|
routing.setCreateDate(new Date()); |
|
|
quoteDetailRoutingService.saveQuoteDetailRouting(routing); |
|
|
quoteDetailRoutingService.saveQuoteDetailRouting(routing); |
|
|
} |
|
|
} |
|
|
|
|
|
// 当为顶级BOM 需要插入对应Routing的工具信息 |
|
|
if (parentId.equals(0L)){ |
|
|
if (parentId.equals(0L)){ |
|
|
// 1、清空工具信息 |
|
|
|
|
|
quoteDetailToolService.lambdaUpdate() |
|
|
|
|
|
.eq(QuoteDetailTool::getQuoteDetailId, detail.getId()) |
|
|
|
|
|
.remove(); |
|
|
|
|
|
if (Objects.nonNull(routing)){ |
|
|
|
|
|
// 处理工具 |
|
|
|
|
|
// 2、根据routing 生成工具信息 |
|
|
|
|
|
quoteDetailToolService.saveToolByRouting(routing); |
|
|
|
|
|
// 3、插入一条其他工具信息 |
|
|
|
|
|
quoteDetailToolService.saveQuoteDetailOtherTool(routing); |
|
|
|
|
|
}else { |
|
|
|
|
|
quoteDetailToolService.saveQuoteDetailOtherTool(detail); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleTool(detail, routing); |
|
|
} |
|
|
} |
|
|
|
|
|
// 查询BOM的子物料 |
|
|
List<QuoteDetailBom> componentParts = baseMapper.queryBomComponentPart(bom); |
|
|
List<QuoteDetailBom> componentParts = baseMapper.queryBomComponentPart(bom); |
|
|
// 判断BOM Type是否是Purse |
|
|
|
|
|
|
|
|
// 判断BOM Type是否是Purse Purse 需要将自己当成自己的子物料,用于计算成本 |
|
|
if ("Purchase".equals(bom.getBomType())) { |
|
|
if ("Purchase".equals(bom.getBomType())) { |
|
|
QuoteDetailBom purchase = new QuoteDetailBom(); |
|
|
|
|
|
purchase.setQuoteDetailId(detail.getId()); |
|
|
|
|
|
purchase.setQuoteId(detail.getQuoteId()); |
|
|
|
|
|
purchase.setQuoteDetailItemNo(detail.getItemNo()); |
|
|
|
|
|
purchase.setSite(detail.getSite()); |
|
|
|
|
|
purchase.setBuNo(detail.getBuNo()); |
|
|
|
|
|
purchase.setQuoteNo(detail.getQuoteNo()); |
|
|
|
|
|
purchase.setVersionNo(detail.getVersionNo()); |
|
|
|
|
|
purchase.setPartNo(bom.getPartNo()); |
|
|
|
|
|
purchase.setEngChgLevel(bom.getEngChgLevel()); |
|
|
|
|
|
purchase.setBomType(bom.getBomType()); |
|
|
|
|
|
purchase.setAlternativeNo(bom.getAlternativeNo()); |
|
|
|
|
|
purchase.setComponentPart(bom.getPartNo()); |
|
|
|
|
|
purchase.setPrintUnit(bom.getUmName()); |
|
|
|
|
|
purchase.setQtyPerAssembly(BigDecimal.ONE); |
|
|
|
|
|
purchase.setComponentScrap(BigDecimal.ZERO); |
|
|
|
|
|
purchase.setIssueType(""); |
|
|
|
|
|
purchase.setShrinkageFactor(BigDecimal.ZERO); |
|
|
|
|
|
BigDecimal price = baseMapper.getPartCost(purchase.getSite(),purchase.getPartNo()); |
|
|
|
|
|
purchase.setUnitPrice(price); |
|
|
|
|
|
purchase.setActualPrice(price); |
|
|
|
|
|
purchase.setQuotePrice(price); |
|
|
|
|
|
purchase.setLineSequence(componentParts.size()+1); |
|
|
|
|
|
purchase.setBomFlag("N"); |
|
|
|
|
|
purchase.setStatus(bom.getStatus()); |
|
|
|
|
|
|
|
|
QuoteDetailBom purchase = getPurchaseComponentPart(detail, bom, componentParts.size()+1); |
|
|
componentParts.add(purchase); |
|
|
componentParts.add(purchase); |
|
|
} |
|
|
} |
|
|
log.info("BOM子物料:{}",componentParts); |
|
|
log.info("BOM子物料:{}",componentParts); |
|
|
@ -128,10 +95,6 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
component.setCreateBy(detail.getCreateBy()); |
|
|
component.setCreateBy(detail.getCreateBy()); |
|
|
component.setCreateDate(detail.getCreateDate()); |
|
|
component.setCreateDate(detail.getCreateDate()); |
|
|
QuoteDetail quoteDetail = createQuoteDetail(detail, component); |
|
|
QuoteDetail quoteDetail = createQuoteDetail(detail, component); |
|
|
// 如过存在表示是Purchase |
|
|
|
|
|
if (StringUtils.isEmpty(component.getBomFlag())){ |
|
|
|
|
|
component.setBomFlag("Y"); |
|
|
|
|
|
} |
|
|
|
|
|
// 物料是半成品 |
|
|
// 物料是半成品 |
|
|
QuoteDetailBomTree bomTree = isComponentBom(quoteDetail); |
|
|
QuoteDetailBomTree bomTree = isComponentBom(quoteDetail); |
|
|
if (Objects.nonNull(bomTree) && "Y".equals(component.getBomFlag())) { |
|
|
if (Objects.nonNull(bomTree) && "Y".equals(component.getBomFlag())) { |
|
|
@ -145,39 +108,8 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
}else{ |
|
|
}else{ |
|
|
component.setBomFlag("N"); |
|
|
component.setBomFlag("N"); |
|
|
} |
|
|
} |
|
|
if ("Y".equals(component.getStatus())){ |
|
|
|
|
|
// SysUserEntity user = (SysUserEntity)SecurityUtils.getSubject().getPrincipal(); |
|
|
|
|
|
// 获取用户信息 |
|
|
|
|
|
// SysUserEntity sysUser = sysUserService.getById(user.getUserId()); |
|
|
|
|
|
PartInformationEntity part = new PartInformationEntity(); |
|
|
|
|
|
part.setSite(component.getSite()); |
|
|
|
|
|
part.setPartNo(component.getComponentPart()); |
|
|
|
|
|
Map<String, String> map = baseSearchBean.getInventoryValueByPartNo(ifsServer.getIfsServer(ifsUsername,ifsPassword), part); |
|
|
|
|
|
if (Objects.equals(map.get("resultCode"),"200")){ |
|
|
|
|
|
// 返回成功 将成本 |
|
|
|
|
|
InventoryPartUnitCostSumVo unitCostSumVo = JSONObject.parseObject(map.get("obj"), InventoryPartUnitCostSumVo.class); |
|
|
|
|
|
try { |
|
|
|
|
|
BigDecimal unitCost = new BigDecimal(unitCostSumVo.getInventoryValue()); |
|
|
|
|
|
component.setUnitPrice(unitCost); |
|
|
|
|
|
component.setActualPrice(unitCost); |
|
|
|
|
|
component.setQuotePrice(unitCost); |
|
|
|
|
|
}catch (Exception e){ |
|
|
|
|
|
component.setUnitPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setActualPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setQuotePrice(BigDecimal.ZERO); |
|
|
|
|
|
log.error("PartNo:{},Site:{},成本信息异常:{}",component.getPartNo(),component.getSite(),e.getMessage()); |
|
|
|
|
|
} |
|
|
|
|
|
}else { |
|
|
|
|
|
// 接口返回异常,处理成本数据为0 |
|
|
|
|
|
log.error("接口返回400"); |
|
|
|
|
|
component.setUnitPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setActualPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setQuotePrice(BigDecimal.ZERO); |
|
|
|
|
|
String resultMsg = map.get("resultMsg"); |
|
|
|
|
|
if (resultMsg.contains("You have entered an invalid username and/or password")){ |
|
|
|
|
|
throw new RuntimeException(resultMsg); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if ("Y".equals(component.getStatus())) { |
|
|
|
|
|
getFinalPartCost(component); |
|
|
} |
|
|
} |
|
|
//新增子物料信息 |
|
|
//新增子物料信息 |
|
|
component.setTreeId(bom.getId()); |
|
|
component.setTreeId(bom.getId()); |
|
|
@ -186,6 +118,83 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl<QuoteDetailBomTre |
|
|
return bom.getId(); |
|
|
return bom.getId(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void handleTool(QuoteDetail detail, QuoteDetailRouting routing) { |
|
|
|
|
|
// 1、清空工具信息 |
|
|
|
|
|
quoteDetailToolService.lambdaUpdate() |
|
|
|
|
|
.eq(QuoteDetailTool::getQuoteDetailId, detail.getId()) |
|
|
|
|
|
.remove(); |
|
|
|
|
|
if (Objects.nonNull(routing)){ |
|
|
|
|
|
// 处理工具 |
|
|
|
|
|
// 2、根据routing 生成工具信息 |
|
|
|
|
|
quoteDetailToolService.saveToolByRouting(routing); |
|
|
|
|
|
// 3、插入一条其他工具信息 |
|
|
|
|
|
quoteDetailToolService.saveQuoteDetailOtherTool(routing); |
|
|
|
|
|
}else { |
|
|
|
|
|
quoteDetailToolService.saveQuoteDetailOtherTool(detail); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private QuoteDetailBom getPurchaseComponentPart(QuoteDetail detail, QuoteDetailBomTree bom,Integer lineSequence ) { |
|
|
|
|
|
QuoteDetailBom purchase = new QuoteDetailBom(); |
|
|
|
|
|
purchase.setQuoteDetailId(detail.getId()); |
|
|
|
|
|
purchase.setQuoteId(detail.getQuoteId()); |
|
|
|
|
|
purchase.setQuoteDetailItemNo(detail.getItemNo()); |
|
|
|
|
|
purchase.setSite(detail.getSite()); |
|
|
|
|
|
purchase.setBuNo(detail.getBuNo()); |
|
|
|
|
|
purchase.setQuoteNo(detail.getQuoteNo()); |
|
|
|
|
|
purchase.setVersionNo(detail.getVersionNo()); |
|
|
|
|
|
purchase.setPartNo(bom.getPartNo()); |
|
|
|
|
|
purchase.setEngChgLevel(bom.getEngChgLevel()); |
|
|
|
|
|
purchase.setBomType(bom.getBomType()); |
|
|
|
|
|
purchase.setAlternativeNo(bom.getAlternativeNo()); |
|
|
|
|
|
purchase.setComponentPart(bom.getPartNo()); |
|
|
|
|
|
purchase.setPrintUnit(bom.getUmName()); |
|
|
|
|
|
purchase.setQtyPerAssembly(BigDecimal.ONE); |
|
|
|
|
|
purchase.setComponentScrap(BigDecimal.ZERO); |
|
|
|
|
|
purchase.setIssueType(""); |
|
|
|
|
|
purchase.setShrinkageFactor(BigDecimal.ZERO); |
|
|
|
|
|
BigDecimal price = baseMapper.getPartCost(purchase.getSite(),purchase.getPartNo()); |
|
|
|
|
|
purchase.setUnitPrice(price); |
|
|
|
|
|
purchase.setActualPrice(price); |
|
|
|
|
|
purchase.setQuotePrice(price); |
|
|
|
|
|
purchase.setLineSequence(lineSequence); |
|
|
|
|
|
purchase.setBomFlag("N"); |
|
|
|
|
|
purchase.setStatus(bom.getStatus()); |
|
|
|
|
|
return purchase; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void getFinalPartCost(QuoteDetailBom component) { |
|
|
|
|
|
PartInformationEntity part = new PartInformationEntity(); |
|
|
|
|
|
part.setSite(component.getSite()); |
|
|
|
|
|
part.setPartNo(component.getComponentPart()); |
|
|
|
|
|
Map<String, String> map = baseSearchBean.getInventoryValueByPartNo(ifsServer.getIfsServer(ifsUsername,ifsPassword), part); |
|
|
|
|
|
if (Objects.equals(map.get("resultCode"),"200")){ |
|
|
|
|
|
// 返回成功 将成本 |
|
|
|
|
|
InventoryPartUnitCostSumVo unitCostSumVo = JSONObject.parseObject(map.get("obj"), InventoryPartUnitCostSumVo.class); |
|
|
|
|
|
try { |
|
|
|
|
|
BigDecimal unitCost = new BigDecimal(unitCostSumVo.getInventoryValue()); |
|
|
|
|
|
component.setUnitPrice(unitCost); |
|
|
|
|
|
component.setActualPrice(unitCost); |
|
|
|
|
|
component.setQuotePrice(unitCost); |
|
|
|
|
|
}catch (Exception e){ |
|
|
|
|
|
component.setUnitPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setActualPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setQuotePrice(BigDecimal.ZERO); |
|
|
|
|
|
log.error("PartNo:{},Site:{},成本信息异常:{}", component.getPartNo(), component.getSite(),e.getMessage()); |
|
|
|
|
|
} |
|
|
|
|
|
}else { |
|
|
|
|
|
// 接口返回异常,处理成本数据为0 |
|
|
|
|
|
log.error("接口返回400"); |
|
|
|
|
|
component.setUnitPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setActualPrice(BigDecimal.ZERO); |
|
|
|
|
|
component.setQuotePrice(BigDecimal.ZERO); |
|
|
|
|
|
String resultMsg = map.get("resultMsg"); |
|
|
|
|
|
if (resultMsg.contains("You have entered an invalid username and/or password")){ |
|
|
|
|
|
throw new RuntimeException(resultMsg); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private QuoteDetailBomTree isComponentBom(QuoteDetail component) { |
|
|
private QuoteDetailBomTree isComponentBom(QuoteDetail component) { |
|
|
// 根据子物料信息检查是否有BOM信息 |
|
|
// 根据子物料信息检查是否有BOM信息 |
|
|
return baseMapper.queryPartBom(component); |
|
|
return baseMapper.queryPartBom(component); |
|
|
|