From 73e8632e1082843e1736d86d3e5fa6a4ee0b4e7d Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 08 五月 2026 13:35:42 +0800
Subject: [PATCH] fix:1.领料,补料,退料,增加库存出入库记录

---
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java |  136 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
index 5340433..35cdb27 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -1,10 +1,18 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
+import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
 import com.ruoyi.production.mapper.ProductionBomStructureMapper;
 import com.ruoyi.production.pojo.ProductionBomStructure;
 import com.ruoyi.production.service.ProductionBomStructureService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
 
 /**
  * <p>
@@ -15,6 +23,134 @@
  * @since 2026-04-21 03:55:52
  */
 @Service
+@RequiredArgsConstructor()
 public class ProductionBomStructureServiceImpl extends ServiceImpl<ProductionBomStructureMapper, ProductionBomStructure> implements ProductionBomStructureService {
 
+    private  final ProductionBomStructureMapper productionBomStructureMapper;
+
+    /**
+     * 鏍规嵁BOM鏌ヨ骞剁粍瑁呯粨鏋勬爲銆�
+     */
+    @Override
+    public List<ProductionBomStructureVo> listByBomId(Long bomId) {
+        // 鎸塀OMID鏌ヨ鐢熶骇缁撴瀯鏁版嵁
+        List<ProductionBomStructureVo> list = productionBomStructureMapper.listByBomId(bomId);
+        Map<Long, ProductionBomStructureVo> map = new HashMap<>();
+        for (ProductionBomStructureVo node : list) {
+            node.setChildren(new ArrayList<>());
+            map.put(node.getId(), node);
+        }
+
+        List<ProductionBomStructureVo> tree = new ArrayList<>();
+        for (ProductionBomStructureVo node : list) {
+            Long parentId = node.getParentId();
+            if (parentId == null || parentId == 0L) {
+                tree.add(node);
+                continue;
+            }
+            ProductionBomStructureVo parent = map.get(parentId);
+            if (parent != null) {
+                parent.getChildren().add(node);
+            }
+        }
+        return tree;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addProductionBomStructure(ProductionBomStructureDto dto) {
+        // 鏂板鐢熶骇BOM缁撴瀯
+        // 璇诲彇褰撳墠璁㈠崟BOM涓婚敭锛屽苟鎶婂墠绔爲缁撴瀯鎷嶅钩鎴愬垪琛�
+        Long orderBomId = dto.getProductionOrderBomId();
+        List<ProductionBomStructureDto> flatDtoList = new ArrayList<>();
+        flattenTree(dto.getChildren(), flatDtoList);
+
+        // 鏌ヨ鏁版嵁搴撳凡鏈夌粨鏋勶紝鐢ㄤ簬鍚庣画鍋氬鍒犳敼瀵规瘮
+        List<ProductionBomStructure> dbList = this.list(new LambdaQueryWrapper<ProductionBomStructure>()
+                .eq(ProductionBomStructure::getProductionOrderBomId, orderBomId));
+
+        // 鏀堕泦鍓嶇浠嶇劧瀛樺湪鐨勮妭鐐笽D
+        Set<Long> frontendIds = new HashSet<>();
+        for (ProductionBomStructureDto item : flatDtoList) {
+            if (item.getId() != null) {
+                frontendIds.add(item.getId());
+            }
+        }
+
+        // 璁$畻闇�瑕佸垹闄ょ殑鑺傜偣锛堟暟鎹簱鏈夈�佸墠绔凡鍒犻櫎锛�
+        Set<Long> deleteIds = new HashSet<>();
+        for (ProductionBomStructure dbItem : dbList) {
+            if (!frontendIds.contains(dbItem.getId())) {
+                deleteIds.add(dbItem.getId());
+            }
+        }
+        // 鍏堝垹鎺夊墠绔凡缁忕Щ闄ょ殑鑺傜偣
+        if (!deleteIds.isEmpty()) {
+            this.removeByIds(deleteIds);
+        }
+
+        // 鎸夋槸鍚︽湁ID鎷嗗垎涓烘柊澧炲拰鏇存柊锛屽悓鏃剁紦瀛樻柊澧炶妭鐐圭殑涓存椂ID鏄犲皠
+        List<ProductionBomStructure> insertList = new ArrayList<>();
+        List<ProductionBomStructure> updateList = new ArrayList<>();
+        Map<String, ProductionBomStructure> tempEntityMap = new HashMap<>();
+
+        for (ProductionBomStructureDto item : flatDtoList) {
+            ProductionBomStructure entity = new ProductionBomStructure();
+            BeanUtils.copyProperties(item, entity);
+            entity.setProductionOrderBomId(orderBomId);
+            if (item.getId() == null) {
+                entity.setParentId(null);
+                insertList.add(entity);
+                tempEntityMap.put(item.getTempId(), entity);
+            } else {
+                updateList.add(entity);
+            }
+        }
+
+        // 鎵归噺鏂板锛屾嬁鍒版暟鎹簱鐢熸垚鐨勭湡瀹濱D
+        if (!insertList.isEmpty()) {
+            this.saveBatch(insertList);
+        }
+
+        // 鏂板鑺傜偣浜屾鍥炲啓鐖禝D锛堝墠绔紶鐨勬槸涓存椂鐖禝D锛�
+        List<ProductionBomStructure> parentFixList = new ArrayList<>();
+        for (ProductionBomStructureDto item : flatDtoList) {
+            if (item.getId() == null && item.getParentTempId() != null) {
+                ProductionBomStructure child = tempEntityMap.get(item.getTempId());
+                if (child == null) {
+                    continue;
+                }
+                ProductionBomStructure parent = tempEntityMap.get(item.getParentTempId());
+                // 鐖惰妭鐐规槸鏈鏂板鏃讹紝鐩存帴鐢ㄦ柊澧炲悗鐨勭湡瀹濱D锛涘惁鍒欏洖閫�涓哄墠绔紶鍏ョ埗ID
+                Long realParentId = parent != null ? parent.getId() : Long.valueOf(item.getParentTempId());
+                child.setParentId(realParentId);
+                parentFixList.add(child);
+            }
+        }
+
+        // 鍥炲啓鏂板鑺傜偣鐨勭埗瀛愬叧绯�
+        if (!parentFixList.isEmpty()) {
+            this.updateBatchById(parentFixList);
+        }
+        // 鎵归噺鏇存柊宸叉湁鑺傜偣
+        if (!updateList.isEmpty()) {
+            this.updateBatchById(updateList);
+        }
+        return true;
+    }
+
+    /**
+     * 灏嗘爲褰㈢粨鏋勬媿骞虫垚鍒楄〃锛屼究浜庣粺涓�淇濆瓨銆�
+     */
+    private void flattenTree(List<ProductionBomStructureDto> source, List<ProductionBomStructureDto> result) {
+        // 鎵佸钩鍖栧鐞嗘爲
+        if (source == null) {
+            return;
+        }
+        for (ProductionBomStructureDto node : source) {
+            result.add(node);
+            flattenTree(node.getChildren(), result);
+        }
+    }
+
 }

--
Gitblit v1.9.3