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/dto/ProductionProductRouteItemParamDto.java        |   13 +
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java           |   84 ++++++++++--
 src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java                       |    4 
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                   |   29 +++
 src/main/resources/mapper/production/ProductionProductInputMapper.xml                 |   10 +
 src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java      |  151 +++++++++++++++------
 src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java                  |    7 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   10 
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java                   |    6 
 src/main/resources/mapper/production/ProductOrderMapper.xml                           |   16 +-
 doc/宁夏-中盛建材.sql                                                                       |   31 ++++
 src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java          |   19 --
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                  |    3 
 src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml        |    6 
 14 files changed, 277 insertions(+), 112 deletions(-)

diff --git "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql" "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
index f16e44e..7ea4756 100644
--- "a/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
+++ "b/doc/\345\256\201\345\244\217-\344\270\255\347\233\233\345\273\272\346\235\220.sql"
@@ -417,4 +417,33 @@
 DROP TABLE IF EXISTS product_structure_instance;
 
 ALTER TABLE `product-inventory-management-zsjc`.`production_product_route_item_param`
-    MODIFY COLUMN `order_item_param_id` bigint NULL DEFAULT NULL COMMENT '鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛↖D' AFTER `production_product_route_item_id`;
\ No newline at end of file
+    MODIFY COLUMN `order_item_param_id` bigint NULL DEFAULT NULL COMMENT '鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾垮伐搴�--鍙傛暟琛↖D' AFTER `production_product_route_item_id`;
+
+CREATE TABLE `production_product_input`
+(
+    `id`              bigint          NOT NULL AUTO_INCREMENT,
+    `product_main_id` bigint          NOT NULL COMMENT '鎶ュ伐鍗曚富琛↖D',
+    `route_item_id`   bigint      DEFAULT NULL COMMENT '鍏宠仈鍏蜂綋鐨勬姤宸ュ伐搴廔D (瀵瑰簲鍘熷弬鏁拌〃鐨勫叧鑱擨D)',
+    `product_id`      bigint          NOT NULL COMMENT '浜у搧/鐗╂枡ID',
+    `bom_id`          bigint      DEFAULT NULL COMMENT 'BOM ID',
+    `quantity`        decimal(30, 15) NOT NULL COMMENT '鎶曞叆鏁伴噺 (瀵瑰簲鍘焢roduct_value)',
+    `unit`            varchar(20) DEFAULT NULL COMMENT '鍗曚綅',
+    `create_user`     bigint      DEFAULT NULL COMMENT '褰曞叆浜�',
+    `create_time`     datetime    DEFAULT CURRENT_TIMESTAMP COMMENT '褰曞叆鏃堕棿',
+    `update_time`     datetime    DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    `tenant_id`       bigint          NOT NULL COMMENT '绉熸埛ID',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY `idx_main_id` (`product_main_id`),
+    KEY `idx_product_id` (`product_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci COMMENT ='鐢熶骇鎶ュ伐鐗╂枡鎶曞叆琛�';
+
+ALTER TABLE `production_product_route_item_param`
+    DROP COLUMN `product_id`,
+    DROP COLUMN `bom_id`,
+    DROP COLUMN `product_value`,
+    DROP COLUMN `dict_code`;
+
+ALTER TABLE `product-inventory-management-zsjc`.`production_product_output`
+    ADD COLUMN `total_quantity` decimal(20, 15) NULL COMMENT '鎬绘暟閲�' AFTER `scrap_qty`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
index accedd1..234bce7 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
@@ -4,6 +4,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
 
 /**
  * <br>
@@ -27,6 +28,18 @@
     @ApiModelProperty("鐗╂枡缂栫爜")
     private String materialCode;
 
+    @ApiModelProperty("浜у搧ID")
+    private Long productId;
+
+    @ApiModelProperty("BOM ID")
+    private Long bomId;
+
+    @ApiModelProperty("鎶曞叆鏁伴噺")
+    private BigDecimal quantity;
+
+    @ApiModelProperty("鐗╂枡鍊�")
+    private BigDecimal productValue;
+
     @ApiModelProperty("寮哄害")
     private String strength;
 
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
index 526b207..f04a034 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
@@ -57,10 +57,10 @@
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
     private LocalDateTime updateTime;
 
-    @ApiModelProperty("鍚堟牸鏁伴噺")
+    @ApiModelProperty("鍚堟牸鏁伴噺/浜у嚭鏂归噺")
     private BigDecimal qualifiedQuantity;
 
-    @ApiModelProperty("涓嶅悎鏍兼暟閲�")
+    @ApiModelProperty("涓嶅悎鏍兼暟閲�/涓嶅悎鏍兼柟閲�")
     private BigDecimal unqualifiedQuantity;
 
     @ApiModelProperty("浜у嚭鏁伴噺")
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index 82bece9..4d88679 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -14,20 +14,37 @@
     @TableId(type = IdType.AUTO)
     private Long id;
 
-    @ApiModelProperty(value = "鎶ュ伐id")
+    @ApiModelProperty(value = "鎶ュ伐鍗曚富琛↖D")
     private Long productMainId;
 
-    @ApiModelProperty(value = "浜у搧id")
-    private Long productModelId;
+    @ApiModelProperty(value = "鍏宠仈鍏蜂綋鐨勬姤宸ュ伐搴廔D")
+    private Long routeItemId;
 
-    @ApiModelProperty(value = "鏁伴噺")
+    @ApiModelProperty(value = "浜у搧/鐗╂枡ID")
+    @TableField("product_id")
+    private Long productId;
+
+    @ApiModelProperty(value = "BOM ID")
+    private Long bomId;
+
+    @ApiModelProperty(value = "鎶曞叆鏁伴噺")
     private BigDecimal quantity;
 
-    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "褰曞叆浜�")
+    private Long createUser;
+
+    @ApiModelProperty(value = "褰曞叆鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
 
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
index 17e7612..18fe2e0 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
@@ -20,7 +20,7 @@
     @ApiModelProperty(value = "浜у搧id")
     private Long productModelId;
 
-    @ApiModelProperty(value = "鍚堟牸鏁伴噺")
+    @ApiModelProperty(value = "鍚堟牸鏁伴噺/浜у嚭鏂归噺")
     private BigDecimal quantity;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
@@ -31,6 +31,9 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
-    @ApiModelProperty(value = "涓嶅悎鏍兼暟閲�")
+    @ApiModelProperty(value = "涓嶅悎鏍兼暟閲�/涓嶅悎鏍兼柟閲�")
     private BigDecimal scrapQty;
+
+    @ApiModelProperty(value = "鎬绘暟閲�")
+    private BigDecimal totalQuantity;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
index 2de5259..472e56c 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
@@ -64,15 +64,6 @@
     @ApiModelProperty(value = "鍙傛暟鍊�")
     private String paramValue;
 
-    @ApiModelProperty(value = "浜у搧ID")
-    private Long productId;
-
-    @ApiModelProperty(value = "浜у搧鎶曞叆鍊�")
-    private BigDecimal productValue;
-
-    @ApiModelProperty(value = "BOM ID")
-    private Long bomId;
-
     @ApiModelProperty(value = "鍗曚綅")
     private String unit;
 
@@ -82,25 +73,21 @@
     @ApiModelProperty(value = "鍙傛暟鎺掑簭")
     private Integer sourceSort;
 
-    @ApiModelProperty(value = "浜у搧绫诲瀷")
-    private Long dictCode;
-
     @ApiModelProperty(value = "涓婁紶鑰�")
     private Long createUser;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @TableField(fill = FieldFill.INSERT)
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "淇敼鑰�")
     private Long updateUser;
 
     @ApiModelProperty(value = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     @ApiModelProperty(value = "绉熸埛ID")
-    @TableField(fill = FieldFill.INSERT)
+    @TableField(value = "tenant_id", fill = FieldFill.INSERT)
     private Long tenantId;
-
 }
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 e8237a8..85db0c2 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -123,14 +123,16 @@
             productStructureDtos.add(productStructureDto);
         }
         for (ProductStructureDto productStructureDto : productStructureDtos) {
-
             ProductionProductInput productionProductInput = new ProductionProductInput();
-            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
+            productionProductInput.setProductId(productStructureDto.getProductModelId());
+            BigDecimal unitQty = productStructureDto.getUnitQuantity() != null ? productStructureDto.getUnitQuantity() : BigDecimal.ZERO;
+            BigDecimal mainQty = dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO;
+            productionProductInput.setQuantity(unitQty.multiply(mainQty));
+            productionProductInput.setUnit(productStructureDto.getUnit());
             productionProductInput.setProductMainId(productionProductMain.getId());
+            productionProductInput.setRouteItemId(productProcessRouteItem.getId());
             productionProductInputMapper.insert(productionProductInput);
             stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
-
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
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);
                 }
             }
 
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 8265b25..35d9cfb 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -3,9 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.production.dto.ProcessRouteItemParamDto;
-import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
-import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import com.ruoyi.production.dto.ProductionProductRouteItemParamDto;
 import com.ruoyi.quality.dto.FinishedPageDto;
 import com.ruoyi.quality.dto.FinishedRatioDto;
 import com.ruoyi.quality.dto.ProcessPageDto;
@@ -34,7 +32,7 @@
 
     IPage<ProcessPageDto> processPage(Page page, ProcessPageDto processPageDto);
 
-    List<ProductionProductRouteItemParam> processDetails(ProcessPageDto processPageDto);
+    List<ProductionProductRouteItemParamDto> processDetails(ProcessPageDto processPageDto);
 
     IPage<FinishedPageDto> finishedPage(Page page, FinishedPageDto finishedPageDto);
 
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index f58a625..0d68a23 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -9,17 +9,20 @@
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.dto.ProcessRouteItemParamDto;
+import com.ruoyi.production.dto.ProductMaterialSkuDto;
+import com.ruoyi.production.dto.ProductionProductRouteItemParamDto;
 import com.ruoyi.production.mapper.ProductOrderMapper;
 import com.ruoyi.production.mapper.ProductionProductRouteItemMapper;
 import com.ruoyi.production.mapper.ProductionProductRouteItemParamMapper;
-import com.ruoyi.production.pojo.ProductionOrderRouteItemParam;
+import com.ruoyi.production.pojo.ProductionProductInput;
 import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import com.ruoyi.production.service.ProductBomService;
+import com.ruoyi.production.service.ProductMaterialService;
+import com.ruoyi.production.service.ProductionProductInputService;
 import com.ruoyi.quality.dto.FinishedPageDto;
 import com.ruoyi.quality.dto.FinishedRatioDto;
 import com.ruoyi.quality.dto.ProcessPageDto;
@@ -42,6 +45,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -52,23 +56,29 @@
 public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService {
 
     private final StockUtils stockUtils;
-    private QualityInspectMapper qualityInspectMapper;
+    private final QualityInspectMapper qualityInspectMapper;
 
-    private IQualityInspectParamService qualityInspectParamService;
+    private final IQualityInspectParamService qualityInspectParamService;
 
-    private QualityTestStandardMapper qualityTestStandardMapper;
+    private final QualityTestStandardMapper qualityTestStandardMapper;
 
-    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
+    private final QualityUnqualifiedMapper qualityUnqualifiedMapper;
 
-    private SalesLedgerProductMapper salesLedgerProductMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
 
-    private ProcurementRecordService procurementRecordService;
+    private final ProcurementRecordService procurementRecordService;
 
-    private ProductionProductRouteItemMapper productionProductRouteItemMapper;
+    private final ProductionProductRouteItemMapper productionProductRouteItemMapper;
 
-    private ProductionProductRouteItemParamMapper productionProductRouteItemParamMapper;
+    private final ProductionProductRouteItemParamMapper productionProductRouteItemParamMapper;
 
-    private ProductOrderMapper productOrderMapper;
+    private final ProductOrderMapper productOrderMapper;
+
+    private final ProductionProductInputService productionProductInputService;
+
+    private final ProductMaterialService productMaterialService;
+
+    private final ProductBomService productBomService;
 
     @Override
     public int add(QualityInspectDto qualityInspectDto) {
@@ -177,8 +187,54 @@
     }
 
     @Override
-    public List<ProductionProductRouteItemParam> processDetails(ProcessPageDto processPageDto) {
-        return productionProductRouteItemParamMapper.processDetails(processPageDto.getProductionProductRouteItemId());
+    public List<ProductionProductRouteItemParamDto> processDetails(ProcessPageDto processPageDto) {
+        List<ProductionProductRouteItemParamDto> resultList = new ArrayList<>();
+
+        // 1. 鏌ヨ鏅�氬弬鏁�
+        List<ProductionProductRouteItemParam> paramList = productionProductRouteItemParamMapper.processDetails(processPageDto.getProductionProductRouteItemId());
+        if (paramList != null && !paramList.isEmpty()) {
+            resultList.addAll(paramList.stream().map(param -> {
+                ProductionProductRouteItemParamDto dto = new ProductionProductRouteItemParamDto();
+                BeanUtils.copyProperties(param, dto);
+                return dto;
+            }).collect(Collectors.toList()));
+        }
+
+        // 2. 鏌ヨ鐗╂枡鎶曞叆
+        // 娉ㄦ剰锛氭垚鍝佹鐨勬椂鍊欏彲鑳芥病鏈夊叿浣撳崟鏉℃姤宸ヨ褰旾D锛屾墍浠ユ垚鍝佹璇︽儏鍙兘闇�瑕佹寜璁㈠崟鏌ヨ锛�
+        // 浣嗚繖閲岀殑processDetails鏄�滆繃绋嬫璇︽儏鈥濓紝閫氬父鏈夊叿浣撴姤宸ヨ褰曘��
+        // 鏍规嵁鎶ュ伐璁板綍 ID 鏌ユ壘瀵瑰簲鐨� ProductMainId
+        Long routeItemId = processPageDto.getProductionProductRouteItemId();
+        if (routeItemId != null) {
+            List<ProductionProductInput> inputList = productionProductInputService.list(Wrappers.<ProductionProductInput>lambdaQuery()
+                    .eq(ProductionProductInput::getRouteItemId, routeItemId));
+
+            if (inputList != null && !inputList.isEmpty()) {
+                for (ProductionProductInput input : inputList) {
+                    ProductionProductRouteItemParamDto dto = new ProductionProductRouteItemParamDto();
+                    dto.setProductId(input.getProductId());
+                    dto.setBomId(input.getBomId());
+                    dto.setQuantity(input.getQuantity());
+                    dto.setProductValue(input.getQuantity());
+                    dto.setUnit(input.getUnit());
+
+                    // 濉厖鐗╂枡淇℃伅
+                    ProductMaterialSkuDto materialSkuDto = productMaterialService.selectProductByModelId(input.getProductId());
+                    if (materialSkuDto != null) {
+                        dto.setParamName(materialSkuDto.getProductName());
+                        dto.setProductName(materialSkuDto.getProductName());
+                        dto.setModel(materialSkuDto.getModel());
+                        dto.setMaterialCode(materialSkuDto.getMaterialCode());
+                    }
+                    String strength = productBomService.strengthById(input.getBomId());
+                    dto.setStrength(strength);
+
+                    resultList.add(dto);
+                }
+            }
+        }
+
+        return resultList;
     }
 
     @Override
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index b9193a0..5f8d566 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -210,25 +210,23 @@
                sku.material_code,
                pm.product_name,
                sku.model,
-               pprip.unit,
+               ppi.unit,
                pos.unit_quantity,
-               sum(pprip.product_value) actualInputQuantity,
+               sum(ppi.quantity) actualInputQuantity,
                sum(ppo.quantity+ppo.scrap_qty) actualOutputQuantity
-        from   production_product_route_item_param pprip
-        left join production_product_route_item ppri on ppri.id=pprip.production_product_route_item_id
-        left join production_product_main ppm on ppm.id=ppri.product_main_id
+        from   production_product_input ppi
+        left join production_product_main ppm on ppm.id=ppi.product_main_id
         left join production_product_output ppo on ppm.id=ppo.product_main_id
-        left join product_material_sku sku ON pprip.product_id = sku.id
+        left join product_material_sku sku ON ppi.product_id = sku.id
         left join product_material pm ON sku.product_id = pm.id
-        left join production_order_structure pos ON pos.product_model_id = pprip.product_id
+        left join production_order_structure pos ON pos.product_model_id = ppi.product_id
         where ppm.product_order_id = #{productOrderId}
         and pos.order_id = #{productOrderId}
-        and pprip.order_item_param_id is null
         group by sku.material_code,
                  pm.product_name,
                  sku.model,
                  pos.unit_quantity,
-                 pprip.unit)A
+                 ppi.unit)A
         
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductInputMapper.xml b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
index 65e2b96..1d21cea 100644
--- a/src/main/resources/mapper/production/ProductionProductInputMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -5,11 +5,17 @@
     <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductionProductInput">
         <id property="id" column="id"/>
         <result property="productMainId" column="product_main_id"/>
-        <result property="productModelId" column="product_model_id"/>
+        <result property="routeItemId" column="route_item_id"/>
+        <result property="productId" column="product_id"/>
+        <result property="bomId" column="bom_id"/>
         <result property="quantity" column="quantity"/>
-        <result property="tenantId" column="tenant_id"/>
+        <result property="unit" column="unit"/>
+        <result property="createUser" column="create_user"/>
         <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
+
     <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto">
         select ppi.*,
         pm.model as model,
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 22d46a8..798c2b9 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -23,13 +23,12 @@
         pms.material_code as materialCode,
         pm.product_name as productName,
         pms.model as productModelName,
-        IFNULL(ppi.quantity, 0) as totalQuantity,
+        IFNULL(ppo.total_quantity, 0) as totalQuantity,
         IFNULL(ppo.scrap_qty, 0) as scrapQty,
         IFNULL(ppo.quantity, 0) as quantity
         from
         production_product_main ppm
         left join production_product_output ppo on ppo.product_main_id = ppm.id
-        left join production_product_input ppi on ppi.product_main_id = ppm.id
         left join product_order po on po.id = ppm.product_order_id
         left join product_order_plan pop on po.id = pop.product_order_id
         left join production_plan pp on pop.production_plan_id = pp.id
diff --git a/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
index 45e1d13..adfc0d6 100644
--- a/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
@@ -14,13 +14,9 @@
         <result column="min_value" property="minValue"/>
         <result column="max_value" property="maxValue"/>
         <result column="param_value" property="paramValue"/>
-        <result column="product_id" property="productId"/>
-        <result column="bom_id" property="bomId"/>
-        <result column="product_value" property="productValue"/>
         <result column="unit" property="unit"/>
         <result column="is_required" property="isRequired"/>
         <result column="source_sort" property="sourceSort"/>
-        <result column="dict_code" property="dictCode"/>
         <result column="create_user" property="createUser"/>
         <result column="create_time" property="createTime"/>
         <result column="update_user" property="updateUser"/>
@@ -31,7 +27,7 @@
         select pprip.*
         from production_product_route_item_param pprip
         where pprip.production_product_route_item_id = #{productionProductRouteItemId}
-        and pprip.order_item_param_id is not null
+          and pprip.order_item_param_id is not null
     </select>
 
 </mapper>

--
Gitblit v1.9.3