From 1749ebc2387b71629385df7803416c2cff4a6922 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Fri, 26 Sep 2025 13:17:25 +0800 Subject: [PATCH] =?UTF-8?q?2025-09-26=20=E6=8A=A5=E4=BB=B7=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E6=98=8E=E7=BB=86=E5=A4=8D=E5=88=B6=20=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E5=92=8C=E6=9C=BA=E5=99=A8=E6=88=90=E6=9C=AC=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/QuoteDetailBomTreeServiceImpl.java | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) 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) { // 测试料号使用