From 398551392afc2ab879f837f60f95f9c9d8cf3c98 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 27 四月 2026 13:08:24 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro

---
 src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java                                  |    5 
 src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java          |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java                |    1 
 src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml                       |    8 
 src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java                           |   31 +++++
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java |   86 +++-----------
 src/main/resources/mapper/production/ProductionOrderMapper.xml                                       |    6 +
 src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java    |   10 -
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java                       |    2 
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java                    |    3 
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                                   |    9 -
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java               |   93 ++++++++++++++
 src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java                        |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java      |   34 +++++
 src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java                  |   12 +
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java                      |   15 --
 src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java                         |    5 
 src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java                    |    8 
 18 files changed, 216 insertions(+), 116 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/bean/vo/ProductionOrderRoutingOperationVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java
index 8126f67..4333814 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java
@@ -20,4 +20,7 @@
 
     @Schema(description = "鍩虹宸ュ簭ID")
     private Long technologyOperationId;
+
+    @Schema(description = "鍩虹宸ュ簭ID")
+    private Long productionOrderRoutingOperationId;
 }
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/controller/ProductionOrderRoutingOperationParamController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
index db37dbb..fd229ef 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
@@ -4,12 +4,11 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
-import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
 import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
 import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService;
-import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
@@ -51,7 +50,7 @@
     @PutMapping
     @Operation(summary = "淇敼鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
     public R<Boolean> edit(@RequestBody ProductionOrderRoutingOperationParam item) {
-        return R.ok(productionOrderRoutingOperationParamService.saveProductionOrderRoutingOperationParam(item));
+        return R.ok(productionOrderRoutingOperationParamService.updateById(item));
     }
 
     @DeleteMapping("/{id}")
@@ -60,9 +59,4 @@
         return R.ok(productionOrderRoutingOperationParamService.removeProductionOrderRoutingOperationParam(id));
     }
 
-    @PostMapping("/sync")
-    @Operation(summary = "鎸夎鍗曞伐鑹鸿矾绾垮伐搴忓悓姝ュ伐搴忓弬鏁�")
-    public R<Integer> sync(@RequestBody ProductionOrderRoutingOperationParamSyncDto syncDto) {
-        return R.ok(productionOrderRoutingOperationParamService.syncProductionOrderRoutingOperationParam(syncDto));
-    }
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
index df83127..fc36725 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
@@ -28,7 +28,7 @@
     @Schema(description = "鐢熶骇璁㈠崟id")
     private Long productionOrderId;
 
-    @Schema(description = "宸ヨ壓璺嚎宸ュ簭琛╥d")
+    @Schema(description = "宸ヨ壓璺嚎宸ュ簭琛╥d(棰濆鏂板鐨勬椂鍊欒繖涓瓧娈垫槸绌虹殑)")
     private Long technologyRoutingOperationId;
 
     @Schema(description = "鐢熶骇璁㈠崟宸ヨ壓璺嚎id")
@@ -64,4 +64,7 @@
 
     @Schema(description = "宸ュ簭鍚嶇О")
     private String operationName;
+
+    @Schema(description = "宸ュ簭琛╥d")
+    private Long technologyOperationId;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
index d1b7c3a..ef0df4d 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
@@ -3,8 +3,6 @@
 import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -84,9 +82,9 @@
     @Schema(description = "宸ュ簭鍙傛暟ID")
     private Long technologyOperationParamId;
 
-    @Schema(description = "宸ヨ壓璺嚎宸ュ簭ID")
-    private Long technologyRoutingOperationId;
-
     @Schema(description = "鏍囧噯鍊�")
     private String standardValue;
+
+    @Schema(description = "鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭ID")
+    private Long productionOrderRoutingOperationId;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 0002b5b..0fa00eb 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -26,12 +26,6 @@
     @Schema(description = "鎶ュ伐浜哄憳")
     private String userName;
 
-    @Schema(description = "鐢熶骇椤圭洰id")
-    private Long productProcessRouteItemId;
-
-    @Schema(description = "宸ュ崟id")
-    private Long workOrderId;
-
     @Schema(description = "鐢熶骇宸ュ簭宸ュ崟id")
     private Long productionOperationTaskId;
 
@@ -51,9 +45,6 @@
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
-    @Schema(description = "绉熸埛ID")
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
     @Schema(description = "鍒涘缓鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
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/ProductionOrderRoutingOperationParamService.java b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java
index 0376c7a..25efddb 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java
@@ -4,7 +4,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
-import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
 import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
 
@@ -31,5 +30,4 @@
 
     boolean removeProductionOrderRoutingOperationParam(Long id);
 
-    int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto);
 }
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/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
index 048519b..59094be 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
@@ -8,7 +8,6 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
-import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
 import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
 import com.ruoyi.production.mapper.ProductionOrderMapper;
 import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
@@ -17,7 +16,9 @@
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
 import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService;
+import com.ruoyi.technology.mapper.TechnologyParamMapper;
 import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
+import com.ruoyi.technology.pojo.TechnologyParam;
 import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -34,6 +35,7 @@
     private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
     private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
     private final ProductionOrderMapper productionOrderMapper;
+    private final TechnologyParamMapper technologyParamMapper;
     private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
 
     @Override
@@ -57,7 +59,7 @@
 
     @Override
     public boolean saveProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParam item) {
-        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getTechnologyRoutingOperationId());
+        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getProductionOrderRoutingOperationId());
         fillFromSourceParam(item, routingOperation);
         validateManualFields(item);
         checkDuplicate(item);
@@ -69,62 +71,12 @@
         return this.removeById(id);
     }
 
-    @Override
-    public int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto) {
-        if (syncDto == null || syncDto.getProductionOrderRoutingOperationId() == null) {
-            throw new ServiceException("productionOrderRoutingOperationId is required");
-        }
-        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(syncDto.getProductionOrderRoutingOperationId());
-        List<TechnologyRoutingOperationParam> sourceParamList = technologyRoutingOperationParamMapper.selectList(
-                Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
-                        .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getTechnologyRoutingOperationId())
-                        .orderByAsc(TechnologyRoutingOperationParam::getId)
-        );
-        boolean replaceExisting = syncDto.getReplaceExisting() == null || syncDto.getReplaceExisting();
-        if (replaceExisting) {
-            productionOrderRoutingOperationParamMapper.delete(
-                    Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
-                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
-            );
-        }
-        int successCount = 0;
-        for (TechnologyRoutingOperationParam sourceParam : sourceParamList) {
-            boolean exists = productionOrderRoutingOperationParamMapper.selectCount(
-                    Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
-                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
-                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, sourceParam.getId())
-            ) > 0;
-            if (!replaceExisting && exists) {
-                continue;
-            }
-            ProductionOrderRoutingOperationParam target = new ProductionOrderRoutingOperationParam();
-            target.setTechnologyRoutingOperationId(routingOperation.getId());
-            target.setTechnologyRoutingOperationParamId(sourceParam.getId());
-            target.setProductionOrderId(routingOperation.getProductionOrderId());
-            target.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
-            target.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId());
-            target.setParamId(sourceParam.getParamId());
-            target.setParamCode(sourceParam.getParamCode());
-            target.setParamName(sourceParam.getParamName());
-            target.setParamType(sourceParam.getParamType());
-            target.setParamFormat(sourceParam.getParamFormat());
-            target.setUnit(sourceParam.getUnit());
-            target.setIsRequired(sourceParam.getIsRequired());
-            target.setRemark(sourceParam.getRemark());
-            target.setStandardValue(sourceParam.getStandardValue());
-            productionOrderRoutingOperationParamMapper.insert(target);
-            successCount++;
-        }
-        return successCount;
-    }
-
     private LambdaQueryWrapper<ProductionOrderRoutingOperationParam> buildQueryWrapper(ProductionOrderRoutingOperationParamDto dto) {
         ProductionOrderRoutingOperationParam query = dto == null ? new ProductionOrderRoutingOperationParam() : dto;
         return Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                 .eq(query.getId() != null, ProductionOrderRoutingOperationParam::getId, query.getId())
                 .eq(query.getProductionOrderId() != null, ProductionOrderRoutingOperationParam::getProductionOrderId, query.getProductionOrderId())
-                .eq(query.getTechnologyRoutingOperationId() != null,
-                        ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, query.getTechnologyRoutingOperationId())
+                .eq(query.getProductionOrderRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, query.getProductionOrderRoutingOperationId())
                 .eq(query.getTechnologyOperationId() != null,
                         ProductionOrderRoutingOperationParam::getTechnologyOperationId, query.getTechnologyOperationId())
                 .eq(query.getTechnologyRoutingOperationParamId() != null,
@@ -135,7 +87,7 @@
                         ProductionOrderRoutingOperationParam::getParamCode, query.getParamCode())
                 .like(query.getParamName() != null && !query.getParamName().trim().isEmpty(),
                         ProductionOrderRoutingOperationParam::getParamName, query.getParamName())
-                .orderByAsc(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId)
+                .orderByAsc(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId)
                 .orderByAsc(ProductionOrderRoutingOperationParam::getId);
     }
 
@@ -151,25 +103,28 @@
     }
 
     private void fillFromSourceParam(ProductionOrderRoutingOperationParam item, ProductionOrderRoutingOperation routingOperation) {
-        item.setTechnologyRoutingOperationId(routingOperation.getId());
         item.setProductionOrderId(routingOperation.getProductionOrderId());
+        item.setProductionOrderRoutingOperationId(routingOperation.getId());
         ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId());
         if (productionOrder == null) {
             throw new ServiceException("Production order not found");
         }
-        if (item.getTechnologyRoutingOperationParamId() == null) {
+        if (item.getParamId() == null) {
             return;
         }
-        TechnologyRoutingOperationParam sourceParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyRoutingOperationParamId());
+        TechnologyParam sourceParam = technologyParamMapper.selectById(item.getParamId());
         if (sourceParam == null) {
-            throw new ServiceException("Technology routing operation param not found");
+            throw new ServiceException("Technology  param not found");
         }
-        if (!routingOperation.getTechnologyRoutingOperationId().equals(sourceParam.getTechnologyRoutingOperationId())) {
-            throw new ServiceException("Source param does not belong to routing operation");
+        if (item.getTechnologyOperationParamId() != null) {
+            TechnologyRoutingOperationParam sourceRoutingOperationParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyOperationParamId());
+            item.setTechnologyOperationId(sourceRoutingOperationParam.getTechnologyOperationId());
+            item.setTechnologyOperationParamId(sourceRoutingOperationParam.getTechnologyOperationParamId());
+            if (item.getStandardValue() == null) {
+                item.setStandardValue(sourceRoutingOperationParam.getStandardValue());
+            }
         }
-        item.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
-        item.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId());
-        item.setParamId(sourceParam.getParamId());
+        item.setParamId(sourceParam.getId());
         item.setParamCode(sourceParam.getParamCode());
         item.setParamName(sourceParam.getParamName());
         item.setParamType(sourceParam.getParamType());
@@ -178,9 +133,6 @@
         item.setIsRequired(sourceParam.getIsRequired());
         if (item.getRemark() == null || item.getRemark().trim().isEmpty()) {
             item.setRemark(sourceParam.getRemark());
-        }
-        if (item.getStandardValue() == null) {
-            item.setStandardValue(sourceParam.getStandardValue());
         }
     }
 
@@ -196,7 +148,7 @@
     private void checkDuplicate(ProductionOrderRoutingOperationParam item) {
         boolean duplicate = productionOrderRoutingOperationParamMapper.selectCount(
                 Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
-                        .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId())
+                        .eq(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, item.getProductionOrderRoutingOperationId())
                         .eq(item.getTechnologyRoutingOperationParamId() != null,
                                 ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, item.getTechnologyRoutingOperationParamId())
                         .eq(item.getTechnologyRoutingOperationParamId() == null && item.getParamCode() != null,
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
index 489fc30..9b5953b 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
@@ -1,17 +1,24 @@
 package com.ruoyi.production.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
 import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
+import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
 import com.ruoyi.production.pojo.ProductionOperationTask;
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
+import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
 import com.ruoyi.production.pojo.ProductionProductMain;
 import com.ruoyi.production.service.ProductionOrderRoutingOperationService;
 import com.ruoyi.production.service.ProductionProductMainService;
+import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
+import com.ruoyi.technology.mapper.TechnologyParamMapper;
+import com.ruoyi.technology.pojo.TechnologyOperationParam;
+import com.ruoyi.technology.pojo.TechnologyParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,6 +26,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
@@ -31,10 +39,36 @@
     private final ProductionOperationTaskMapper productionOperationTaskMapper;
     private final ProductionProductMainMapper productionProductMainMapper;
     private final ProductionProductMainService productionProductMainService;
+    private final TechnologyOperationParamMapper technologyOperationParamMapper;
+    private final TechnologyParamMapper technologyParamMapper;
+    private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
 
     @Override
     public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) {
         int insert = productionOrderRoutingOperationMapper.insert(productionOrderRoutingOperation);
+        //宸ュ簭鍏宠仈鐨勫弬鏁伴渶瑕佸悓姝ユ柊澧�
+        List<TechnologyOperationParam> technologyOperationParams = technologyOperationParamMapper.selectList(Wrappers.<TechnologyOperationParam>lambdaQuery()
+                .eq(TechnologyOperationParam::getTechnologyOperationId, productionOrderRoutingOperation.getTechnologyOperationId()));
+        if (CollectionUtils.isNotEmpty(technologyOperationParams)){
+            ArrayList<ProductionOrderRoutingOperationParam> productionOrderRoutingOperationParams = new ArrayList<>();
+            for (TechnologyOperationParam technologyOperationParam : technologyOperationParams) {
+                TechnologyParam technologyParam = technologyParamMapper.selectById(technologyOperationParam.getTechnologyParamId());
+                ProductionOrderRoutingOperationParam productionOrderRoutingOperationParam = new ProductionOrderRoutingOperationParam();
+                productionOrderRoutingOperationParam.setProductionOrderId(productionOrderRoutingOperation.getProductionOrderId());
+                productionOrderRoutingOperationParam.setProductionOrderRoutingOperationId(productionOrderRoutingOperation.getId());
+                productionOrderRoutingOperationParam.setParamCode(technologyParam.getParamCode());
+                productionOrderRoutingOperationParam.setParamName(technologyParam.getParamName());
+                productionOrderRoutingOperationParam.setParamType(technologyParam.getParamType());
+                productionOrderRoutingOperationParam.setParamFormat(technologyParam.getParamFormat());
+                productionOrderRoutingOperationParam.setUnit(technologyParam.getUnit());
+                productionOrderRoutingOperationParam.setIsRequired(technologyParam.getIsRequired());
+                productionOrderRoutingOperationParam.setRemark(technologyParam.getRemark());
+                productionOrderRoutingOperationParam.setParamId(technologyParam.getId());
+                productionOrderRoutingOperationParam.setTechnologyOperationId(productionOrderRoutingOperation.getTechnologyOperationId());
+                productionOrderRoutingOperationParams.add(productionOrderRoutingOperationParam);
+            }
+            productionOrderRoutingOperationParamMapper.insert(productionOrderRoutingOperationParams);
+        }
         String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         if (insert > 0) {
             ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne(
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index 9be6ae2..bb56608 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -237,6 +237,7 @@
             targetOperation.setDragSort(sourceOperation.getDragSort());
             targetOperation.setIsQuality(sourceOperation.getIsQuality());
             targetOperation.setOperationName(operationNameMap.get(sourceOperation.getTechnologyOperationId()));
+            targetOperation.setTechnologyOperationId(sourceOperation.getTechnologyOperationId());
             productionOrderRoutingOperationMapper.insert(targetOperation);
 
             ProductionOperationTask task = new ProductionOperationTask();
@@ -256,7 +257,7 @@
                 // 宸ュ簭鎵ц鍙傛暟鍚屾牱鍋氬揩鐓э紝閬垮厤宸ヨ壓鍙傛暟璋冩暣褰卞搷宸蹭笅杈捐鍗曘��
                 ProductionOrderRoutingOperationParam targetParam = new ProductionOrderRoutingOperationParam();
                 targetParam.setProductionOrderId(productionOrder.getId());
-                targetParam.setTechnologyRoutingOperationId(targetOperation.getId());
+                targetParam.setProductionOrderRoutingOperationId(targetOperation.getId());
                 targetParam.setTechnologyRoutingOperationParamId(sourceParam.getId());
                 targetParam.setParamId(sourceParam.getParamId());
                 targetParam.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
@@ -312,7 +313,7 @@
             target.setProductModelId(source.getProductModelId());
             target.setTechnologyOperationId(source.getOperationId());
             target.setUnitQuantity(source.getUnitQuantity());
-            target.setDemandedQuantity(resolveBomDemandQuantity(source, orderQuantity));
+            target.setDemandedQuantity(source.getUnitQuantity().multiply(orderQuantity));
             target.setUnit(source.getUnit());
             productionBomStructureMapper.insert(target);
             idMap.put(source.getId(), target.getId());
@@ -571,16 +572,6 @@
         } else {
             productionOrderPickMapper.updateById(orderPick);
         }
-    }
-
-    private BigDecimal resolveBomDemandQuantity(TechnologyBomStructure source, BigDecimal orderQuantity) {
-        // 宸ヨ壓 BOM 涓殑闇�姹傞噺鎸夆�滃崟浠堕渶姹� * 璁㈠崟鏁伴噺鈥濆睍寮�鎴愯鍗曠骇闇�姹傘��
-        BigDecimal baseQuantity = source.getDemandedQuantity() != null ? source.getDemandedQuantity() : source.getUnitQuantity();
-        baseQuantity = baseQuantity == null ? BigDecimal.ZERO : baseQuantity;
-        if (baseQuantity.compareTo(BigDecimal.ZERO) <= 0) {
-            return BigDecimal.ZERO;
-        }
-        return baseQuantity.multiply(orderQuantity);
     }
 
     private List<Long> parsePlanIds(String productionPlanIds) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index c148955..044998a 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -136,7 +136,6 @@
         productionProductMain.setUserId(dto.getUserId());
         productionProductMain.setUserName(dto.getUserName());
         productionProductMain.setProductionOperationTaskId(productionOperationTask.getId());
-        productionProductMain.setWorkOrderId(productionOperationTask.getId());
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
 
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
index f7fc0d6..e433efa 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -66,4 +66,6 @@
     public R remove(@RequestBody List<Long> ids) {
         return R.ok(technologyRoutingService.removeTechnologyRouting(ids));
     }
+
+    //TODO 澧炲姞宸ヨ壓璺嚎闄勪欢涓婁紶 @闄堟捣鏉�
 }
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>
diff --git a/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml b/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
index 7bfc539..55739db 100644
--- a/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
@@ -7,7 +7,7 @@
         <id column="id" property="id" />
         <result column="production_order_id" property="productionOrderId" />
         <result column="technology_routing_operation_id" property="technologyRoutingOperationId" />
-        <result column="technology_routing_id" property="technologyRoutingId" />
+        <result column="order_routing_id" property="orderRoutingId" />
         <result column="product_model_id" property="productModelId" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
@@ -19,6 +19,7 @@
 
     <resultMap id="OperationVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationVo" extends="BaseResultMap">
         <result column="technologyOperationId" property="technologyOperationId" />
+        <result column="productionOrderRoutingOperationId" property="productionOrderRoutingOperationId" />
         <result column="productName" property="productName" />
         <result column="model" property="model" />
         <result column="unit" property="unit" />
@@ -26,13 +27,14 @@
 
     <select id="selectVoListByOrderId" resultMap="OperationVoResultMap">
         SELECT
+        poro.id AS productionOrderRoutingOperationId,
         poro.*,
-        tro.technology_operation_id AS technologyOperationId,
+        too.id AS technologyOperationId,
         p.product_name AS productName,
         pm.model AS model,
         pm.unit AS unit
         FROM production_order_routing_operation poro
-        LEFT JOIN technology_routing_operation tro ON poro.technology_routing_operation_id = tro.id
+        LEFT JOIN technology_operation too ON poro.technology_operation_id = too.id
         LEFT JOIN product_model pm ON poro.product_model_id = pm.id
         LEFT JOIN product p ON pm.product_id = p.id
         WHERE poro.production_order_id = #{orderId}

--
Gitblit v1.9.3