From eaf6548902e9472fc9b876d531db8508e16c4f2f Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 20 三月 2026 13:49:43 +0800
Subject: [PATCH] feat: 生产订单的撤回、删除;BOM的子集新增/修改统一使用临时ID处理

---
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java             |   84 ++++++++++++--------
 src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java                     |    9 ++
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                      |    4 
 src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java         |   34 +++----
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java |   22 ++---
 src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java            |    5 +
 src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java    |    6 
 src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java         |    2 
 src/main/java/com/ruoyi/production/controller/ProductStructureController.java            |    7 +
 src/main/java/com/ruoyi/production/service/ProductStructureService.java                  |    2 
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java                |   16 ++-
 src/main/resources/mapper/production/ProductionOrderStructureMapper.xml                  |   16 ++++
 src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java                  |    8 ++
 13 files changed, 129 insertions(+), 86 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index fd32aeb..0bfbfec 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -48,8 +48,14 @@
 
     @PostMapping("/revoke")
     @ApiOperation("鎾ゅ洖鐢熶骇璁″垝")
-    public R revoke(@RequestBody ProductOrder productOrder) {
-        return R.ok(productOrderService.revoke(productOrder));
+    public R revoke(@RequestBody List<Long> ids) {
+        return R.ok(productOrderService.revoke(ids));
+    }
+
+    @ApiOperation("鍒犻櫎鐢熶骇璁㈠崟")
+    @DeleteMapping("/{id}")
+    public R delete(@PathVariable("id") Long ids) {
+        return R.ok(productOrderService.delete(ids));
     }
 
     /**
@@ -76,9 +82,5 @@
         return R.ok(productOrderService.addProductOrder(productOrder));
     }
 
-    @ApiOperation("鍒犻櫎鐢熶骇璁㈠崟")
-    @DeleteMapping("/{ids}")
-    public R delete(@PathVariable("ids") Long[] ids) {
-        return R.ok(productOrderService.delete(ids));
-    }
+
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
index 59fb707..ad2b36c 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -17,6 +17,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Arrays;
+import java.util.List;
 
 @RequestMapping("productStructure")
 @RestController
@@ -27,9 +28,9 @@
 
 
     @ApiOperation("鏂板BOM瀛愰泦")
-    @PostMapping()
-    public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){
-        return R.ok(productStructureService.addProductStructureDto(productStructureDto));
+    @PostMapping("/{bomId}")
+    public R addOrUpdate(@PathVariable Integer bomId, @RequestBody List<ProductStructureDto> list){
+        return R.ok(productStructureService.addProductStructureDto(bomId, list));
     }
 
     @ApiOperation("BOM鏌ョ湅瀛愰泦璇︽儏")
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
index 912e99f..42e80f3 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
@@ -33,10 +33,10 @@
         return AjaxResult.success(list);
     }
 
-    @PutMapping("/addOrUpdateBomStructs")
+    @PutMapping("/addOrUpdateBomStructs/{orderId}")
     @ApiOperation("鏂板/鏇存柊BOM瀛愰泦缁撴瀯")
-    public AjaxResult addOrUpdateBomStructs(@RequestBody ProductionOrderStructureDto instanceDto) {
-        productionOrderStructureService.addOrUpdateBomStructs(instanceDto);
+    public AjaxResult addOrUpdateBomStructs(@PathVariable Long orderId, @RequestBody List<ProductionOrderStructureDto> list) {
+        productionOrderStructureService.addOrUpdateBomStructs(orderId, list);
         return AjaxResult.success();
     }
 
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java b/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
index a0757ac..b9f58e8 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
@@ -31,4 +31,12 @@
     @ApiModelProperty("鐖惰妭鐐逛复鏃禝D")
     private String parentTempId;
 
+    @ApiModelProperty("宸ュ簭鍚嶇О")
+    private String processName;
+
+    @ApiModelProperty("浜у搧鍚嶇О")
+    private String productName;
+
+    @ApiModelProperty("浜у搧瑙勬牸")
+    private String model;
 }
diff --git a/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java b/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
index 6175f2f..5ad55c3 100644
--- a/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
+++ b/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
@@ -43,13 +43,20 @@
     }
 
     /**
-     * 鍒ゆ柇鏄惁鍏佽鍒犻櫎锛�1銆�4锛�
+     * 鍒ゆ柇鏄惁鍏佽鍒犻櫎锛�4锛�
      */
     public static boolean canDelete(Integer code) {
         return WAIT.getCode().equals(code) || CANCEL.getCode().equals(code);
     }
 
     /**
+     * 鍒ゆ柇鏄惁鍏佽鎾ゅ洖锛�1锛�
+     */
+    public static boolean canRevoke(Integer code) {
+        return WAIT.getCode().equals(code);
+    }
+
+    /**
      * 鍒ゆ柇鏄惁宸插紑濮嬬敓浜э紙2銆�3锛�
      */
     public static boolean isStarted(Integer code) {
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
index 191fbdd..35d44ad 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
@@ -1,7 +1,10 @@
 package com.ruoyi.production.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.production.dto.ProductionOrderStructureDto;
 import com.ruoyi.production.pojo.ProductionOrderStructure;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,6 @@
  */
 public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> {
 
+    List<ProductionOrderStructureDto> listByOrderId(Long orderId);
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java b/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
index 9b74d02..70239cc 100644
--- a/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
+++ b/src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
@@ -18,5 +18,5 @@
 
     List<ProductionOrderStructureDto> listByOrderId(Long orderId);
 
-    void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto);
+    void addOrUpdateBomStructs(Long orderId, List<ProductionOrderStructureDto> list);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index abd84b7..612ecd8 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -21,7 +21,7 @@
     /**
      * 鎾ゅ洖鐢熶骇璁″垝
      */
-    Boolean revoke(ProductOrder productOrder);
+    Boolean revoke(List<Long> ids);
 
     List<ProcessRoute> listProcessRoute(Long productModelId);
 
@@ -31,5 +31,5 @@
 
     Long insertProductOrder(ProductOrder productOrder);
 
-    Boolean delete(Long[] id);
+    Boolean delete(Long id);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductStructureService.java b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
index 760ca6e..e86c3da 100644
--- a/src/main/java/com/ruoyi/production/service/ProductStructureService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -10,7 +10,7 @@
 public interface ProductStructureService extends IService<ProductStructure> {
 
 
-    Boolean addProductStructureDto(ProductStructureDto productStructureDto);
+    Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list);
 
     List<ProductStructureDto> listByBomId(Integer bomId);
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index f3031c7..094d016 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,6 +1,5 @@
 package com.ruoyi.production.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -137,25 +136,48 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean revoke(ProductOrder productOrder) {
-        // todo 鍒ゆ柇鏄惁浜х敓鎶ュ伐淇℃伅
-
-        // 鏌ヨ鍚堝苟鐨勭敓浜ц鍒�
-        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId()));
-        if (productOrderPlans.isEmpty()) {
-            throw new RuntimeException("鍚堝苟鐨勭敓浜ц鍒掍笉瀛樺湪");
+    public Boolean revoke(List<Long> ids) {
+        List<ProductOrder> orders = productOrderMapper.selectBatchIds(ids);
+        if (orders.isEmpty()) {
+            throw new RuntimeException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
         }
+        for (ProductOrder order : orders) {
+            if (!ProductOrderStatusEnum.canRevoke(order.getStatus())) {
+                throw new RuntimeException("鍙湁銆愬緟寮�濮嬨�戠姸鎬佺殑璁㈠崟鎵嶅彲浠ユ挙鍥�");
+            }
+        }
+
+        // 鍥為��鐢熶骇璁″垝
+        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
         for (ProductOrderPlan productOrderPlan : productOrderPlans) {
             ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId());
-            productionPlan.setAssignedQuantity(productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity()));
-            productionPlanMapper.updateById(productionPlan);
+            if (productionPlan != null) {
+                BigDecimal newAssigned = productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity());
+                if (newAssigned.compareTo(BigDecimal.ZERO) < 0) {
+                    newAssigned = BigDecimal.ZERO;
+                }
+                productionPlan.setAssignedQuantity(newAssigned);
+                BigDecimal volume = productionPlan.getVolume() == null ? BigDecimal.ZERO : productionPlan.getVolume();
+                int status;
+                if (newAssigned.compareTo(BigDecimal.ZERO) == 0) {
+                    status = 0; // 鏈笅鍙�
+                } else if (newAssigned.compareTo(volume) < 0) {
+                    status = 1; // 閮ㄥ垎涓嬪彂
+                } else {
+                    status = 2; // 宸蹭笅鍙�
+                }
+                productionPlan.setStatus(status);
+                productionPlanMapper.updateById(productionPlan);
+            }
         }
-        // 鍒犻櫎鍏宠仈鍏崇郴
-        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId()));
-        // 鍒犻櫎璁㈠崟
-        productOrderMapper.deleteById(productOrder.getId());
-        // todo 鍒犻櫎璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
-        return null;
+
+        // 灏嗚鍗曠姸鎬佹敼涓哄凡鍙栨秷
+        for (ProductOrder order : orders) {
+            order.setStatus(ProductOrderStatusEnum.CANCEL.getCode());
+        }
+        updateBatchById(orders);
+
+        return true;
     }
 
     @Override
@@ -192,20 +214,18 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean delete(Long[] ids) {
-        List<ProductOrder> orders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getId, ids));
+    public Boolean delete(Long id) {
+        ProductOrder order = productOrderMapper.selectById(id);
 
-        if (orders.isEmpty()) {
+        if (order == null) {
             throw new RuntimeException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
         }
-        for (ProductOrder order : orders) {
-            if (!ProductOrderStatusEnum.canDelete(order.getStatus())) {
-                throw new RuntimeException("鍙湁銆愬緟寮�濮嬨�佸凡鍙栨秷銆戠姸鎬佺殑璁㈠崟鎵嶅彲浠ュ垹闄�");
-            }
+        if (!ProductOrderStatusEnum.canDelete(order.getStatus())) {
+            throw new RuntimeException("鍙湁銆愬緟寮�濮嬨�佸凡鍙栨秷銆戠姸鎬佺殑璁㈠崟鎵嶅彲浠ュ垹闄�");
         }
 
         //  鏄惁宸茬敓浜�
-        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
+        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id));
 
         if (!productWorkOrders.isEmpty()) {
             List<Long> workOrderIds = productWorkOrders.stream()
@@ -218,11 +238,11 @@
             }
 
             //  鍒犻櫎宸ュ崟
-            productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
+            productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id));
         }
 
         //  鍥為��鐢熶骇璁″垝
-        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
+        List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id));
 
         for (ProductOrderPlan productOrderPlan : productOrderPlans) {
             ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId());
@@ -253,19 +273,13 @@
         }
 
         // 鍒犻櫎涓棿琛�
-        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids));
+        productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id));
 
         //  鍒犻櫎闄勮〃鐨勫伐鑹鸿矾绾夸笌BOM
-        for (Long id : ids) {
-            ProductOrder productOrder = baseMapper.selectById(id);
-            productionOrderAppendixService.deleteData(productOrder.getId(), productOrder.getRouteId());
-        }
-
-//        productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids));
-//        productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids));
+        productionOrderAppendixService.deleteData(order.getId(), order.getRouteId());
 
         //  鍒犻櫎璁㈠崟
-        productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().in(ProductOrder::getId, ids));
+        productOrderMapper.deleteById(id);
 
         return true;
     }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
index 22f248e..f694dad 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -25,13 +25,14 @@
 
     @Override
     @Transactional
-    public Boolean addProductStructureDto(ProductStructureDto dto) {
+    public Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list) {
 
-        Integer bomId = dto.getBomId();
-
-        //  灏嗘爲鎵佸钩鍖�
+        // 鎵佸钩鍖栦紶鍏ョ殑鏍�
         List<ProductStructureDto> flatDtoList = new ArrayList<>();
-        flattenTree(dto.getChildren(), flatDtoList);
+        for (ProductStructureDto root : list) {
+            flatDtoList.add(root);
+            flattenTree(root.getChildren(), flatDtoList);
+        }
 
         //  鏌ヨ鏁版嵁搴撲腑宸叉湁鐨� BOM 鏁版嵁
         List<ProductStructure> dbList = this.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, bomId));
@@ -65,13 +66,13 @@
             entity.setBomId(bomId);
 
             if (psDto.getId() == null) {
-                // 鏂板
                 entity.setId(null);
                 entity.setParentId(null);
                 insertList.add(entity);
-                tempEntityMap.put(psDto.getTempId(), entity);
+                if (psDto.getTempId() != null) {
+                    tempEntityMap.put(psDto.getTempId(), entity);
+                }
             } else {
-                // 鏇存柊
                 updateList.add(entity);
             }
         }
@@ -83,32 +84,27 @@
 
         //  鍥炲啓鏂板鑺傜偣 parentId
         List<ProductStructure> parentFixList = new ArrayList<>();
-        //  鐪熷疄鐨勭埗鑺傜偣 ID
         Long realParentId;
         for (ProductStructureDto psDto : flatDtoList) {
+            if (psDto.getId() != null) continue;
+            ProductStructure child = tempEntityMap.get(psDto.getTempId());
+            if (child == null) continue;
             String parentTempId = psDto.getParentTempId();
-            if (psDto.getId() == null && parentTempId != null && !parentTempId.isEmpty()) {
-                ProductStructure child = tempEntityMap.get(psDto.getTempId());
+            if (parentTempId != null && !parentTempId.isEmpty()) {
                 if (tempEntityMap.containsKey(parentTempId)) {
-                    // 鐖惰妭鐐规槸鏂拌妭鐐�
                     realParentId = tempEntityMap.get(parentTempId).getId();
                 } else {
-                    // 鐖惰妭鐐规槸鑰佽妭鐐�
                     try {
                         realParentId = Long.valueOf(parentTempId);
                     } catch (NumberFormatException e) {
                         realParentId = 0L;
                     }
                 }
-
                 child.setParentId(realParentId);
-                parentFixList.add(child);
-            } else if (psDto.getId() == null) {
-                // 濡傛灉 parentTempId 涓虹┖锛屽垯鏄《绾ц妭鐐�
-                ProductStructure child = tempEntityMap.get(psDto.getTempId());
+            } else {
                 child.setParentId(0L);
-                parentFixList.add(child);
             }
+            parentFixList.add(child);
         }
 
         if (!parentFixList.isEmpty()) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
index 21f14df..a063566 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
@@ -2,7 +2,6 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.production.dto.ProductionOrderStructureDto;
 import com.ruoyi.production.mapper.ProductionOrderStructureMapper;
 import com.ruoyi.production.pojo.ProductionOrderStructure;
@@ -32,13 +31,7 @@
 
     @Override
     public List<ProductionOrderStructureDto> listByOrderId(Long orderId) {
-        List<ProductionOrderStructure> list = list(new LambdaQueryWrapper<ProductionOrderStructure>().eq(ProductionOrderStructure::getOrderId, orderId));
-
-        List<ProductionOrderStructureDto> dtoList = list.stream().map(item -> {
-            ProductionOrderStructureDto dto = new ProductionOrderStructureDto();
-            BeanUtils.copyProperties(item, dto);
-            return dto;
-        }).collect(Collectors.toList());
+        List<ProductionOrderStructureDto> dtoList = baseMapper.listByOrderId(orderId);
 
         Map<Long, ProductionOrderStructureDto> map = new HashMap<>();
         for (ProductionOrderStructureDto node : dtoList) {
@@ -58,12 +51,13 @@
     }
 
     @Override
-    public void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto) {
-        Long orderId = instanceDto.getOrderId();
-
+    public void addOrUpdateBomStructs(Long orderId, List<ProductionOrderStructureDto> list) {
         // 鎵佸钩鍖栧墠绔紶鍏ョ殑鏍�
         List<ProductionOrderStructureDto> flatList = new ArrayList<>();
-        flattenTree(instanceDto.getChildren(), flatList);
+        for (ProductionOrderStructureDto root : list) {
+            flatList.add(root);
+            flattenTree(root.getChildren(), flatList);
+        }
 
         // 鏌ヨ鏁版嵁搴撳凡鏈夋暟鎹�
         List<ProductionOrderStructure> dbList = list(new LambdaQueryWrapper<ProductionOrderStructure>()
@@ -90,7 +84,7 @@
 
         for (ProductionOrderStructureDto dto : flatList) {
             ProductionOrderStructure entity = new ProductionOrderStructure();
-            BeanUtils.copyProperties(dto, entity);
+            org.springframework.beans.BeanUtils.copyProperties(dto, entity);
             entity.setOrderId(orderId);
             if (dto.getId() == null) {
                 entity.setId(null);
@@ -110,13 +104,13 @@
 
         // 鍥炲啓鏂板鑺傜偣鐨� parentId
         List<ProductionOrderStructure> parentFixList = new ArrayList<>();
+        Long realParentId;
         for (ProductionOrderStructureDto dto : flatList) {
             if (dto.getId() != null) continue;
             ProductionOrderStructure child = tempEntityMap.get(dto.getTempId());
             if (child == null) continue;
             String parentTempId = dto.getParentTempId();
             if (parentTempId != null && !parentTempId.isEmpty()) {
-                Long realParentId;
                 if (tempEntityMap.containsKey(parentTempId)) {
                     realParentId = tempEntityMap.get(parentTempId).getId();
                 } else {
diff --git a/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml b/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
index 4bbafbe..1864054 100644
--- a/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
@@ -16,4 +16,20 @@
         <result column="bom_id" property="bomId"/>
     </resultMap>
 
+    <select id="listByOrderId" resultType="com.ruoyi.production.dto.ProductionOrderStructureDto"
+            parameterType="java.lang.Long">
+
+        SELECT s.*,
+               pp.name        AS process_name,
+               pm.product_name AS product_name,
+               sku.model       AS model
+        FROM production_order_structure s
+                 LEFT JOIN product_process pp ON pp.id = s.process_id
+                 LEFT JOIN product_material_sku sku ON sku.id = s.product_model_id
+                 LEFT JOIN product_material pm ON pm.id = sku.product_id
+        WHERE s.order_id = #{orderId}
+
+    </select>
+
+
 </mapper>

--
Gitblit v1.9.3