From 62a8267fe595c5d1b404e4a821f2e5d93f949320 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期六, 25 四月 2026 17:34:52 +0800
Subject: [PATCH] feat(production): 生产订单的bom的增删改

---
 src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java                    |    5 +
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java |   93 +++++++++++++++++++++++++++++-
 src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java             |   31 ++++++++++
 src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java          |    2 
 src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java    |   12 ++-
 src/main/resources/mapper/production/ProductionOrderMapper.xml                         |    6 ++
 6 files changed, 141 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java
new file mode 100644
index 0000000..c898c56
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.production.bean.dto;
+
+import com.ruoyi.production.pojo.ProductionBomStructure;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ProductionBomStructureDto extends ProductionBomStructure {
+
+    @Schema(description = "宸ュ簭鍚嶇О")
+    private String operationName;
+
+    @Schema(description = "浜у搧鍚嶇О")
+    private String productName;
+
+    @Schema(description = "浜у搧ID")
+    private Long productId;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
+
+    private String tempId;
+
+    private String parentTempId;
+
+    private List<ProductionBomStructureDto> children;
+}
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
index 9921344..4b0a711 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
@@ -9,4 +9,9 @@
 @Data
 @Schema(name = "ProductionOrderDto", description = "鐢熶骇璁㈠崟鏌ヨ瀵硅薄")
 public class ProductionOrderDto extends ProductionOrder {
+    @Schema(description = "浜у搧鍚嶇О")
+    private String productName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
index 2ff08ba..dd1d50e 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
@@ -1,14 +1,12 @@
 package com.ruoyi.production.controller;
 
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
 import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
 import com.ruoyi.production.service.ProductionBomStructureService;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -33,4 +31,10 @@
         return R.ok(productionBomStructureService.listByBomId(bomId));
     }
 
+    @PostMapping("/addOrUpdateBomStructs")
+    @Operation(summary = "鏂板鎴栦慨鏀笲OM缁撴瀯")
+    public R addProductionBomStructure(@RequestBody ProductionBomStructureDto productionBomStructureDto) {
+        return R.ok(productionBomStructureService.addProductionBomStructure(productionBomStructureDto));
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java b/src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java
index f102cbd..6e63dfe 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.production.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
 import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
 import com.ruoyi.production.pojo.ProductionBomStructure;
 
@@ -18,4 +19,5 @@
 
     List<ProductionBomStructureVo> listByBomId(Long bomId);
 
+    Boolean addProductionBomStructure(ProductionBomStructureDto productionBomStructureDto);
 }
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 00ab057..cbae0dc 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -1,17 +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.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -54,4 +55,88 @@
         return tree;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addProductionBomStructure(ProductionBomStructureDto dto) {
+        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));
+
+        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);
+        }
+
+        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);
+            }
+        }
+
+        if (!insertList.isEmpty()) {
+            this.saveBatch(insertList);
+        }
+
+        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());
+                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);
+        }
+    }
+
 }
diff --git a/src/main/resources/mapper/production/ProductionOrderMapper.xml b/src/main/resources/mapper/production/ProductionOrderMapper.xml
index 8166dad..c799d3d 100644
--- a/src/main/resources/mapper/production/ProductionOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -65,6 +65,12 @@
                 <if test="c.id != null">
                     and po.id = #{c.id}
                 </if>
+                <if test="c.productName != null and c.productName != ''">
+                    and p.product_name like concat('%', #{c.productName}, '%')
+                </if>
+                <if test="c.model != null and c.model != ''">
+                    and pm.model like concat('%', #{c.model}, '%')
+                </if>
                 <if test="c.productModelId != null">
                     and po.product_model_id = #{c.productModelId}
                 </if>

--
Gitblit v1.9.3