diff --git a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java index 0fc55776..9c070b56 100644 --- a/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java +++ b/src/main/java/com/spring/modules/quote/service/impl/QuoteDetailBomTreeServiceImpl.java @@ -374,7 +374,13 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl list = queryDetailBomTree(detail); - loopTree(list,quoteDetail,0L); + + // 创建老ID到新ID的映射关系 + Map oldToNewIdMapping = new HashMap<>(); + loopTree(list, quoteDetail, 0L, oldToNewIdMapping); + + // 复制完成后,更新BOM明细中的bomId引用 + updateBomIdReferencesWithCorrectLogic(quoteDetail.getId(), oldToNewIdMapping); } private void loopTree (List list,QuoteDetail quoteDetail,Long parentId){ @@ -389,15 +395,64 @@ public class QuoteDetailBomTreeServiceImpl extends ServiceImpl list, QuoteDetail quoteDetail, Long parentId, Map oldToNewIdMapping) { + if (!list.isEmpty()) { + for (QuoteDetailBomTree tree : list) { + tree.setQuoteId(quoteDetail.getQuoteId()); + tree.setQuoteDetailId(quoteDetail.getId()); + tree.setQuoteNo(quoteDetail.getQuoteNo()); + tree.setVersionNo(quoteDetail.getVersionNo()); + tree.setParentId(parentId); + + long oldId = tree.getId(); + tree.setId(null); + save(tree); + + // 记录老ID到新ID的映射关系 + oldToNewIdMapping.put(oldId, tree.getId()); + + // 调用Bom的again方 + quoteDetailBomService.againQuoteDetailBom(tree, oldId); + // 调用Routing的again方法 + quoteDetailRoutingService.againQuoteDetailRouting(tree, oldId); + loopTree(tree.getList(), quoteDetail, tree.getId(), oldToNewIdMapping); + } + } + } + + /** + * 根据正确的业务逻辑更新BOM明细中的bomId引用 + * bomId应该指向子BOM树节点的ID,而不是根节点ID + */ + private void updateBomIdReferencesWithCorrectLogic(Long quoteDetailId, Map oldToNewIdMapping) { + // 查询新复制的所有BOM明细 + List bomList = quoteDetailBomService.lambdaQuery() + .eq(QuoteDetailBom::getQuoteDetailId, quoteDetailId) + .isNotNull(QuoteDetailBom::getBomId) // 只处理有bomId的记录 + .list(); + + for (QuoteDetailBom bom : bomList) { + // 获取原来的bomId + Long oldBomId = bom.getBomId(); + // 根据老ID找到新ID + Long newBomId = oldToNewIdMapping.get(oldBomId); + if (newBomId != null) { + bom.setBomId(newBomId); + quoteDetailBomService.updateById(bom); + } + } + } + @Override public String queryPart(QuoteDetailBom bom) { // 测试料号使用