From 29c0f2e4bb55bf486b7a5cf95e2ad4b215d4d281 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 30 三月 2026 17:14:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  154 +++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 123 insertions(+), 31 deletions(-)

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 8138ec2..578ea2d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,8 +1,10 @@
 package com.ruoyi.production.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,12 +14,12 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.production.dto.DrawMaterialDto;
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -30,7 +32,6 @@
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -39,6 +40,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -138,25 +140,70 @@
         productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
         productionProductMain.setStatus(0);
+        productionProductMain.setDeviceId(dto.getDeviceId());
         productionProductMainMapper.insert(productionProductMain);
-        /*鏂板鎶ュ伐鎶曞叆琛�*/
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-        if (productStructureDtos.size() == 0) {
-            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
-            ProductStructureDto productStructureDto = new ProductStructureDto();
-            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
-            productStructureDto.setUnitQuantity(BigDecimal.ONE);
-            productStructureDtos.add(productStructureDto);
-        }
-        for (ProductStructureDto productStructureDto : productStructureDtos) {
+        /* 鏂板鎶ュ伐鎶曞叆琛� */
+        List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList();
+        if (!CollectionUtils.isEmpty(drawMaterialList)) {
+            // 1. 鎵归噺鏌ヨ鏁版嵁
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+            if (productWorkOrder == null) {
+                throw new RuntimeException("宸ュ崟涓嶅瓨鍦�");
+            }
 
-            ProductionProductInput productionProductInput = new ProductionProductInput();
-            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
-            productionProductInput.setProductMainId(productionProductMain.getId());
-            productionProductInputMapper.insert(productionProductInput);
-            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            if (productOrder == null) {
+                throw new RuntimeException("浜у搧璁㈠崟涓嶅瓨鍦�");
+            }
 
+            // 2. 瑙f瀽骞舵瀯寤虹墿鏂橫ap
+            List<DrawMaterialDto> existingMaterialList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+            if (CollectionUtils.isEmpty(existingMaterialList)) {
+                throw new RuntimeException("鍙鐢ㄧ墿鏂欏垪琛ㄤ负绌�");
+            }
+
+            Map<Long, DrawMaterialDto> materialMap = existingMaterialList.stream()
+                    .collect(Collectors.toMap(DrawMaterialDto::getProductModelId,
+                            Function.identity()));
+
+            // 澶勭悊鎶ュ伐鐗╂枡
+            List<ProductionProductInput> inputList = new ArrayList<>();
+
+            for (DrawMaterialDto drawMaterial : drawMaterialList) {
+                Long modelId = drawMaterial.getProductModelId();
+                BigDecimal reportQty = drawMaterial.getReportQty();
+
+                DrawMaterialDto material = materialMap.get(modelId);
+                if (material == null) {
+                    throw new RuntimeException("鐗╂枡涓嶅瓨鍦�: " + modelId);
+                }
+
+                // 楠岃瘉搴撳瓨
+                BigDecimal availableQty = material.getRequisitionQty().subtract(reportQty);
+                if (availableQty.compareTo(BigDecimal.valueOf(0)) < 0) {
+                    throw new RuntimeException(String.format("鐗╂枡%s搴撳瓨涓嶈冻锛屽彲鐢�:%s锛岄渶棰�:%s",
+                            modelId, availableQty, reportQty));
+                }
+
+                // 鏇存柊鍙鐢�
+                material.setRequisitionQty(availableQty);
+
+                // 鏋勫缓鎶曞叆璁板綍
+                ProductionProductInput input = new ProductionProductInput();
+                input.setProductModelId(modelId);
+                input.setQuantity(reportQty);
+                input.setProductMainId(productionProductMain.getId());
+                input.setRemark(drawMaterial.getRemark());
+                inputList.add(input);
+            }
+
+            if (!inputList.isEmpty()) {
+                for (ProductionProductInput productionProductInput : inputList) {
+                    productionProductInputMapper.insert(productionProductInput);
+                }
+                productOrder.setDrawMaterials(JSON.toJSONString(existingMaterialList));
+                productOrderMapper.updateById(productOrder);
+            }
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -164,9 +211,10 @@
         productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
         productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
         productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
+        productionProductOutput.setOtherData(dto.getOtherData() != null ? dto.getOtherData() : "");
         productionProductOutputMapper.insert(productionProductOutput);
-        //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
-        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+        //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺
+        BigDecimal productQty = productionProductOutput.getQuantity();
         //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
         if (productQty.compareTo(BigDecimal.ZERO) > 0) {
             /*鏂板璐ㄦ*/
@@ -180,18 +228,27 @@
                     inspectType = 2;
                     process = null;
                 }
+                ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+                ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+                if (productOrder == null) {
+                    throw new RuntimeException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+                }
+
+
                 Product product = productMapper.selectById(productModel.getProductId());
                 QualityInspect qualityInspect = new QualityInspect();
                 qualityInspect.setProductId(product.getId());
                 qualityInspect.setProductName(product.getProductName());
                 qualityInspect.setModel(productModel.getModel());
                 qualityInspect.setUnit(productModel.getUnit());
-                qualityInspect.setQuantity(productQty);
+                qualityInspect.setQuantity(productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()));
                 qualityInspect.setProcess(process);
                 qualityInspect.setInspectState(0);
                 qualityInspect.setInspectType(inspectType);
                 qualityInspect.setProductMainId(productionProductMain.getId());
                 qualityInspect.setProductModelId(productModel.getId());
+                qualityInspect.setBatchNo(productOrder.getBatchNo());
+                qualityInspect.setManufacturingTeam(productOrder.getManufacturingTeam());
                 qualityInspectMapper.insert(qualityInspect);
                 List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
                 if (qualityTestStandard.size() > 0) {
@@ -207,9 +264,9 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -220,6 +277,7 @@
             if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
                 productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
             }
+            productWorkOrder.setTotalInvestment(dto.getTotalInvestment());
             productWorkOrderMapper.updateById(productWorkOrder);
             //鐢熶骇璁㈠崟
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
@@ -234,13 +292,17 @@
                 }
             }
             productOrderMapper.updateById(productOrder);
-            /*娣诲姞鐢熶骇鏍哥畻*/
+            /*娣诲姞鐢熶骇鏍哥畻        鍖哄垎宸ュ簭鏄浠惰繕鏄鏃�*/
+            BigDecimal workHours = (productProcess.getType() == 1)
+                    ? productProcess.getSalaryQuota().multiply(productQty)
+                    : productProcess.getSalaryQuota();
+
             SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
                     .productMainId(productionProductMain.getId())
                     .schedulingUserId(user.getUserId())
                     .schedulingUserName(user.getNickName())
                     .finishedNum(productQty)
-                    .workHours(productProcess.getSalaryQuota())
+                    .workHours(workHours)
                     .process(productProcess.getName())
                     .schedulingDate(LocalDate.now())
                     .tenantId(dto.getTenantId())
@@ -260,10 +322,12 @@
     public Boolean removeProductMain(Long id) {
         //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
-        List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
-                .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
-        if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
-            throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+        if (qualityInspects.size() > 0) {
+            List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
+                    .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
+                throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+            }
         }
         ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id);
         //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
@@ -315,9 +379,37 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
-                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+            stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
 
+        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
+        List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+
+        // 鎵归噺鏌ヨ骞舵瀯寤篗ap
+        Map<Long, BigDecimal> usedQuantityMap = productionProductInputMapper.selectList(
+                        new LambdaQueryWrapper<ProductionProductInput>()
+                                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())
+                                .in(ProductionProductInput::getProductModelId,
+                                        materialDtoList.stream()
+                                                .map(DrawMaterialDto::getProductModelId)
+                                                .collect(Collectors.toList()))
+                ).stream()
+                .collect(Collectors.groupingBy(
+                        ProductionProductInput::getProductModelId,
+                        Collectors.reducing(BigDecimal.ZERO, ProductionProductInput::getQuantity, BigDecimal::add)
+                ));
+
+        // 鏇存柊鎵�鏈夌墿鏂�
+        materialDtoList.forEach(dto -> {
+            BigDecimal usedQty = usedQuantityMap.getOrDefault(dto.getProductModelId(), BigDecimal.ZERO);
+            dto.setRequisitionQty(dto.getRequisitionQty().add(usedQty));
+        });
+
+        // 鏇存柊璁㈠崟
+        productOrder.setDrawMaterials(JSON.toJSONString(materialDtoList));
+        productOrderMapper.updateById(productOrder);
+
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));

--
Gitblit v1.9.3