From ada06626c3f81258e01837d09a10135f8ec3232f Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 28 三月 2026 16:06:30 +0800
Subject: [PATCH] refactor: 生产报工参数与投入表分离

---
 src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java |  151 +++++++++++++++++++++++++++++++++++---------------
 1 files changed, 106 insertions(+), 45 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
index 15c3392..0b85bbf 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
@@ -241,20 +241,12 @@
             throw new ServiceException("鎶ュ伐澶辫触,鏁版嵁瀛樺偍澶辫触");
         }
 
-        ProductionProductInput productionProductInput = new ProductionProductInput();
-        productionProductInput.setProductMainId(productionProductMain.getId());
-        productionProductInput.setProductModelId(dto.getProductId());
-        productionProductInput.setQuantity(dto.getQuantity());
-        result = productionProductInputService.save(productionProductInput);
-        if (!result) {
-            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇浜у嚭瀛樺偍澶辫触");
-        }
-
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
         productionProductOutput.setProductMainId(productionProductMain.getId());
         productionProductOutput.setProductModelId(dto.getProductId());
         productionProductOutput.setQuantity(dto.getQualifiedQuantity());
         productionProductOutput.setScrapQty(dto.getUnqualifiedQuantity());
+        productionProductOutput.setTotalQuantity(dto.getQuantity());
         result = productionProductOutputService.save(productionProductOutput);
         if (!result) {
             throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇浜у嚭瀛樺偍澶辫触");
@@ -276,19 +268,40 @@
             List<ProductionProductRouteItemParamDto> productionProductRouteItemParamDtoList = productRouteItemDto.getProductionProductRouteItemParamDtoList();
             if (productionProductRouteItemParamDtoList != null && !productionProductRouteItemParamDtoList.isEmpty()) {
                 for (ProductionProductRouteItemParamDto productRouteItemParamDto : productionProductRouteItemParamDtoList) {
-                    ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
-                    BeanUtils.copyProperties(productRouteItemParamDto, paramEntity, "id");
-                    paramEntity.setProductionProductRouteItemId(productRouteItemEntity.getId());
-                    paramEntity.setOrderItemParamId(productRouteItemParamDto.getId());
-                    if (paramEntity.getProductId() == null) {
-                        ProductionOrderRouteItemParam productionOrderRouteItemParam = productionOrderRouteItemParamService.getById(productRouteItemParamDto.getId());
-                        paramEntity.setParamName(productionOrderRouteItemParam.getParamName());
-                        paramEntity.setParamType(productionOrderRouteItemParam.getParamType());
-                        paramEntity.setParamFormat(productionOrderRouteItemParam.getParamFormat());
-                        paramEntity.setValueMode(productionOrderRouteItemParam.getValueMode());
-                    }
+                    if (productRouteItemParamDto.getProductId() != null) {
+                        // 濡傛灉鏈変骇鍝両D锛屽垯鏄姇鍏ョ墿鏂欙紝瀛樺叆鎶曞叆琛�
+                        ProductionProductInput inputEntity = new ProductionProductInput();
+                        inputEntity.setProductMainId(productionProductMain.getId());
+                        inputEntity.setRouteItemId(productRouteItemEntity.getId());
+                        inputEntity.setProductId(productRouteItemParamDto.getProductId());
+                        inputEntity.setBomId(productRouteItemParamDto.getBomId());
+                        BigDecimal qty = productRouteItemParamDto.getQuantity();
+                        if (qty == null) {
+                            qty = productRouteItemParamDto.getProductValue();
+                        }
+                        inputEntity.setQuantity(qty != null ? qty : BigDecimal.ZERO);
+                        inputEntity.setUnit(productRouteItemParamDto.getUnit());
+                        productionProductInputService.save(inputEntity);
+                    } else {
+                        // 鍚﹀垯鏄櫘閫氬弬鏁帮紝瀛樺叆鍙傛暟琛�
+                        ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
+                        BeanUtils.copyProperties(productRouteItemParamDto, paramEntity, "id");
+                        paramEntity.setProductionProductRouteItemId(productRouteItemEntity.getId());
+                        paramEntity.setOrderItemParamId(productRouteItemParamDto.getId());
 
-                    productionProductRouteItemParamService.save(paramEntity);
+                        // 浠庤鍗曞弬鏁拌〃琛ュ叏鍩虹淇℃伅锛堝悕绉般�佺被鍨嬨�佸崟浣嶇瓑锛�
+                        if (productRouteItemParamDto.getId() != null) {
+                            ProductionOrderRouteItemParam orderParam = productionOrderRouteItemParamService.getById(productRouteItemParamDto.getId());
+                            if (orderParam != null) {
+                                paramEntity.setParamName(orderParam.getParamName());
+                                paramEntity.setParamType(orderParam.getParamType());
+                                paramEntity.setParamFormat(orderParam.getParamFormat());
+                                paramEntity.setValueMode(orderParam.getValueMode());
+                                paramEntity.setUnit(orderParam.getUnit());
+                            }
+                        }
+                        productionProductRouteItemParamService.save(paramEntity);
+                    }
                 }
             }
 
@@ -481,13 +494,14 @@
         dto.setMaterialCode(productMaterialSkuDto.getMaterialCode());
         dto.setModel(productMaterialSkuDto.getModel());
 
-        //  鏌ヨ鎬荤殑浜у嚭鏁伴噺(杩欓噷鎶婃姇鍏ヨ〃寮勬垚浜嗕骇鍑烘�昏〃)
+        //  鏌ヨ鎬荤殑鎶曞叆鏁伴噺
         ProductionProductInput input = productionProductInputService.getOne(
                 new LambdaQueryWrapper<ProductionProductInput>()
                         .eq(ProductionProductInput::getProductMainId, productMainId)
+                        .isNull(ProductionProductInput::getRouteItemId)
                         .last("LIMIT 1"));
         if (input != null) {
-            dto.setProductId(input.getProductModelId());
+            dto.setProductId(input.getProductId());
             dto.setQuantity(input.getQuantity());
         }
 
@@ -497,6 +511,7 @@
                         .eq(ProductionProductOutput::getProductMainId, productMainId)
                         .last("LIMIT 1"));
         if (output != null) {
+            dto.setQuantity(output.getTotalQuantity());
             dto.setQualifiedQuantity(output.getQuantity());
             dto.setUnqualifiedQuantity(output.getScrapQty());
         }
@@ -520,21 +535,44 @@
                 List<ProductionProductRouteItemParam> paramList = productionProductRouteItemParamService.list(
                         new LambdaQueryWrapper<ProductionProductRouteItemParam>()
                                 .eq(ProductionProductRouteItemParam::getProductionProductRouteItemId, routeItem.getId()));
+
+                List<ProductionProductRouteItemParamDto> paramDtoList = new ArrayList<>();
                 if (paramList != null && !paramList.isEmpty()) {
-                    List<ProductionProductRouteItemParamDto> paramDtoList = paramList.stream().map(param -> {
+                    paramDtoList.addAll(paramList.stream().map(param -> {
                         ProductionProductRouteItemParamDto paramDto = new ProductionProductRouteItemParamDto();
                         BeanUtils.copyProperties(param, paramDto);
-                        if (paramDto.getProductId() != null) {
-                            ProductMaterialSkuDto materialSkuDto = productMaterialService.selectProductByModelId(paramDto.getProductId());
-                            productMaterialService.selectProductByModelId(paramDto.getProductId());
+                        return paramDto;
+                    }).collect(Collectors.toList()));
+                }
+
+                //  鏌ヨ宸ュ簭鎶曞叆鐗╂枡
+                List<ProductionProductInput> routeItemInputList = productionProductInputService.list(
+                        new LambdaQueryWrapper<ProductionProductInput>()
+                                .eq(ProductionProductInput::getProductMainId, productMainId)
+                                .eq(ProductionProductInput::getRouteItemId, routeItem.getId()));
+                if (routeItemInputList != null && !routeItemInputList.isEmpty()) {
+                    paramDtoList.addAll(routeItemInputList.stream().map(inputItem -> {
+                        ProductionProductRouteItemParamDto paramDto = new ProductionProductRouteItemParamDto();
+                        paramDto.setProductId(inputItem.getProductId());
+                        paramDto.setBomId(inputItem.getBomId());
+                        paramDto.setQuantity(inputItem.getQuantity());
+                        paramDto.setProductValue(inputItem.getQuantity());
+                        paramDto.setUnit(inputItem.getUnit());
+
+                        ProductMaterialSkuDto materialSkuDto = productMaterialService.selectProductByModelId(inputItem.getProductId());
+                        if (materialSkuDto != null) {
                             paramDto.setParamName(materialSkuDto.getProductName());
+                            paramDto.setProductName(materialSkuDto.getProductName());
                             paramDto.setModel(materialSkuDto.getModel());
                             paramDto.setMaterialCode(materialSkuDto.getMaterialCode());
-                            String strength = productBomService.strengthById(paramDto.getBomId());
-                            paramDto.setStrength(strength);
                         }
+                        String strength = productBomService.strengthById(inputItem.getBomId());
+                        paramDto.setStrength(strength);
                         return paramDto;
-                    }).collect(Collectors.toList());
+                    }).collect(Collectors.toList()));
+                }
+
+                if (!paramDtoList.isEmpty()) {
                     routeItemDto.setProductionProductRouteItemParamDtoList(paramDtoList);
                 }
 
@@ -627,10 +665,11 @@
         //  鏇存柊鎶曞叆琛�
         ProductionProductInput input = productionProductInputService.getOne(new LambdaQueryWrapper<ProductionProductInput>()
                 .eq(ProductionProductInput::getProductMainId, productMainId)
+                .isNull(ProductionProductInput::getRouteItemId)
                 .last("LIMIT 1"));
         if (input != null) {
-            input.setProductModelId(dto.getProductId());
-            input.setQuantity(dto.getQuantity());
+            input.setProductId(dto.getProductId());
+            input.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
             productionProductInputService.updateById(input);
         }
 
@@ -639,6 +678,7 @@
             oldOutput.setProductModelId(dto.getProductId());
             oldOutput.setQuantity(dto.getQualifiedQuantity());
             oldOutput.setScrapQty(dto.getUnqualifiedQuantity());
+            oldOutput.setTotalQuantity(dto.getQuantity());
             productionProductOutputService.updateById(oldOutput);
         }
 
@@ -660,27 +700,48 @@
 
             final Long routeItemId = routeItemEntity.getId();
 
-            //  澶勭悊宸ュ簭鍙傛暟: 鍏堝垹闄よ宸ュ簭涓嬫墍鏈夋棫鍙傛暟锛屽啀閲嶆柊鎻掑叆浼犲叆鐨勫弬鏁�
+            //  澶勭悊宸ュ簭鍙傛暟鍙婃姇鍏�: 鍏堝垹闄よ宸ュ簭涓嬫墍鏈夋棫鍙傛暟鍜屾棫鎶曞叆锛屽啀閲嶆柊鎻掑叆浼犲叆鐨勬暟鎹�
             productionProductRouteItemParamService.remove(new LambdaQueryWrapper<ProductionProductRouteItemParam>()
                     .eq(ProductionProductRouteItemParam::getProductionProductRouteItemId, routeItemId));
+            productionProductInputService.remove(new LambdaQueryWrapper<ProductionProductInput>()
+                    .eq(ProductionProductInput::getProductMainId, productMainId)
+                    .eq(ProductionProductInput::getRouteItemId, routeItemId));
 
             List<ProductionProductRouteItemParamDto> paramDtoList = routeItemDto.getProductionProductRouteItemParamDtoList();
             if (paramDtoList != null && !paramDtoList.isEmpty()) {
                 for (ProductionProductRouteItemParamDto paramDto : paramDtoList) {
-                    ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
-                    BeanUtils.copyProperties(paramDto, paramEntity, "id");
-                    paramEntity.setProductionProductRouteItemId(routeItemId);
-                    if (paramEntity.getProductId() == null && paramDto.getId() != null) {
-                        ProductionOrderRouteItemParam orderParam = productionOrderRouteItemParamService.getById(paramDto.getId());
-                        if (orderParam != null) {
-                            paramEntity.setOrderItemParamId(orderParam.getId());
-                            paramEntity.setParamName(orderParam.getParamName());
-                            paramEntity.setParamType(orderParam.getParamType());
-                            paramEntity.setParamFormat(orderParam.getParamFormat());
-                            paramEntity.setValueMode(orderParam.getValueMode());
+                    if (paramDto.getProductId() != null) {
+                        // 鎶曞叆鐗╂枡
+                        ProductionProductInput inputEntity = new ProductionProductInput();
+                        inputEntity.setProductMainId(productMainId);
+                        inputEntity.setRouteItemId(routeItemId);
+                        inputEntity.setProductId(paramDto.getProductId());
+                        inputEntity.setBomId(paramDto.getBomId());
+                        BigDecimal qty = paramDto.getQuantity();
+                        if (qty == null) {
+                            qty = paramDto.getProductValue();
                         }
+                        inputEntity.setQuantity(qty != null ? qty : BigDecimal.ZERO);
+                        inputEntity.setUnit(paramDto.getUnit());
+                        productionProductInputService.save(inputEntity);
+                    } else {
+                        // 鏅�氬弬鏁�
+                        ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
+                        BeanUtils.copyProperties(paramDto, paramEntity, "id");
+                        paramEntity.setProductionProductRouteItemId(routeItemId);
+                        if (paramDto.getId() != null) {
+                            ProductionOrderRouteItemParam orderParam = productionOrderRouteItemParamService.getById(paramDto.getId());
+                            if (orderParam != null) {
+                                paramEntity.setOrderItemParamId(orderParam.getId());
+                                paramEntity.setParamName(orderParam.getParamName());
+                                paramEntity.setParamType(orderParam.getParamType());
+                                paramEntity.setParamFormat(orderParam.getParamFormat());
+                                paramEntity.setValueMode(orderParam.getValueMode());
+                                paramEntity.setUnit(orderParam.getUnit());
+                            }
+                        }
+                        productionProductRouteItemParamService.save(paramEntity);
                     }
-                    productionProductRouteItemParamService.save(paramEntity);
                 }
             }
 

--
Gitblit v1.9.3