From 03ac57d63d2f196ce92ace269b5681aca1c0467a Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期三, 27 五月 2026 09:27:36 +0800
Subject: [PATCH] feat(production):报工实际添加order完成数量调整

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  118 +++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 75 insertions(+), 43 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 4487851..f5679d3 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -31,6 +31,7 @@
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
 import com.ruoyi.quality.service.IQualityInspectService;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.aop.framework.AopContext;
 import org.springframework.stereotype.Service;
@@ -41,17 +42,18 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
+
+import static cn.hutool.core.date.LocalDateTimeUtil.between;
 
 @Service
 @AllArgsConstructor
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final ProductionMachineRecordMapper productionMachineRecordMapper;
     private IQualityInspectService qualityInspectService;
     private ProductionProductMainMapper productionProductMainMapper;
 
@@ -102,7 +104,6 @@
         LocalDateTime now = LocalDateTime.now();
         ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
 
-        SysUser user = userMapper.selectUserById(dto.getUserId());
         ProductionProductMain productionProductMain = new ProductionProductMain();
         //褰撳墠宸ヨ壓璺嚎瀵瑰簲鐨勫伐搴忚鎯�
         ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
@@ -145,25 +146,35 @@
         productionProductMain.setProductNo(productNo);
 
         // 淇敼鐝粍淇℃伅 浠ョ涓�浜轰綔涓哄師鍏坰etUserId setUserName
-        Assert.isTrue(CollUtil.isNotEmpty(dto.getTeamList()),"鐝粍淇℃伅涓嶈兘涓虹┖");
+        Assert.isTrue(CollUtil.isNotEmpty(dto.getTeamList()), "鐝粍淇℃伅涓嶈兘涓虹┖");
 
         productionProductMain.setTeamIds(dto.getTeamList().stream().map(ProductionProductMainDto.Team::getUserId).map(String::valueOf).collect(Collectors.joining(",")));
         productionProductMain.setTeamNames(dto.getTeamList().stream().map(ProductionProductMainDto.Team::getUserName).collect(Collectors.joining(",")));
 
-        productionProductMain.setUserId(dto.getTeamList().get(0).getUserId());
-        productionProductMain.setUserName(dto.getTeamList().get(0).getUserName());
-
+        //鎶ュ伐浜� 鏄� 璋佹姤宸ュ氨鏄槸璋�
+        productionProductMain.setUserId(SecurityUtils.getUserId());
+        productionProductMain.setUserName(SecurityUtils.getLoginUser().getNickName());
 
 
         productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
-        productionProductMain.setAuditUserId(dto.getAuditUserId());
-        productionProductMain.setAuditUserName(dto.getAuditUserName());
+//        productionProductMain.setAuditUserId(dto.getAuditUserId());
+//        productionProductMain.setAuditUserName(dto.getAuditUserName());
         productionProductMain.setStatus(0);
-        productionProductMain.setStartTime(productWorkOrder.getStartProductTime());
-        productionProductMain.setEndTime(now);
-        productionProductMain.setDeviceId(productProcess.getDeviceId());
-        productionProductMain.setDeviceName(productProcess.getDeviceName());
+        if (ObjectUtils.isNotEmpty(dto.getStartTime()) && ObjectUtils.isNotEmpty(dto.getEndTime())) {
+            productionProductMain.setStartTime(dto.getStartTime());
+            productionProductMain.setEndTime(dto.getEndTime());
+        } else {
+            productionProductMain.setStartTime(productWorkOrder.getStartProductTime());
+            productionProductMain.setEndTime(now);
+        }
+        productionProductMain.setDeviceId(dto.getDeviceId());
+        productionProductMain.setDeviceName(dto.getDeviceName());
+
+        // 瀹℃壒浜轰负鑷繁 鐩存帴閫氳繃瀹℃壒
+        productionProductMain.setAuditUserName(SecurityUtils.getUsername());
+        productionProductMain.setAuditUserId(SecurityUtils.getUserId());
+
         productionProductMainMapper.insert(productionProductMain);
         /*鏂板鎶ュ伐鎶曞叆琛�*/
         List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
@@ -175,14 +186,12 @@
             productStructureDtos.add(productStructureDto);
         }
         for (ProductStructureDto productStructureDto : productStructureDtos) {
-
             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());
-
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -191,6 +200,7 @@
         productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
         productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
         productionProductOutput.setReplenishQty(dto.getReplenishQty());
+        productionProductOutput.setAddQty(dto.getAddQty() != null ? dto.getAddQty() : BigDecimal.ZERO);
         productionProductOutputMapper.insert(productionProductOutput);
         //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
         BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
@@ -202,7 +212,7 @@
             if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
                 productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
             }
-            if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
+            if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0) {
                 productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
             }
             productWorkOrder.setEndProductTime(now);
@@ -212,17 +222,21 @@
             if (ObjectUtils.isNull(productOrder.getStartTime())) {
                 productOrder.setStartTime(now);//寮�濮嬫椂闂�
             }
-            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+            if (productProcessRouteItem.getDragSort() >= productProcessRouteItems.size() -1 ) {
                 //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
                 productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
-                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
+                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) >= 0) {
                     productOrder.setEndTime(now);//缁撴潫鏃堕棿
                 }
             }
             productOrderMapper.updateById(productOrder);
         }
-
-        //nextAddProductMain(productionProductOutput) // 鐢变簬闇�瑕佸鏍革紝鎵�浠ラ渶瑕佹媶灏佷笅鏉�
+        ProductAuditVo productAuditVo = new ProductAuditVo();
+        productAuditVo.setId(productionProductMain.getId());
+        productAuditVo.setAuditStatus(AuditEnum.AUDIT_SUCCESS);
+        productAuditVo.setAuditOpinion("");
+        ((ProductionProductMainService) AopContext.currentProxy()).auditProductMain(productAuditVo);
+//        nextAddProductMain(productionProductOutput) // 鐢变簬闇�瑕佸鏍革紝鎵�浠ラ渶瑕佹媶灏佷笅鏉�
         return true;
     }
 
@@ -232,7 +246,7 @@
         ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productAuditVo.getId());
 
         // 褰撳墠瀹℃壒浜� 瑕佷笌褰撳墠鐧诲綍浜轰负鍚屼竴浜�
-        if(productionProductMain.getAuditUserId() != -1){
+        if (productionProductMain.getAuditUserId() != -1) {
             Assert.isTrue(SecurityUtils.getUserId().equals(productionProductMain.getAuditUserId()), "褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰撳墠瀹℃壒浜�");
         }
 
@@ -305,7 +319,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void nextAddProductMain(@NotNull ProductionProductOutput productionProductOutput){
+    public void nextAddProductMain(@NotNull ProductionProductOutput productionProductOutput) {
         //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
         ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductOutput.getProductMainId());
         BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
@@ -355,31 +369,49 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId(),"-","-","-");
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId(), "-", "-", "-");
             }
 
             /*娣诲姞鐢熶骇鏍哥畻        鍖哄垎宸ュ簭鏄浠惰繕鏄鏃�*/
             BigDecimal workHours = productProcess.getSalaryQuota();
-
-            SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
-                    .productMainId(productionProductMain.getId())
-                    .schedulingUserId(productionProductMain.getUserId())
-                    .schedulingUserName(userMapper.selectUserById(productionProductMain.getUserId()).getNickName())
-                    .finishedNum(productQty)
-                    .workHours(workHours)
-                    .process(productProcess.getName())
-                    .schedulingDate(LocalDate.now())
-                    .tenantId(productionProductOutput.getTenantId())
-                    .build();
-            salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
+            List<ProductionMachineRecord> productionMachineRecords = productionMachineRecordMapper.selectList(Wrappers.<ProductionMachineRecord>lambdaQuery().eq(ProductionMachineRecord::getWorkOrderId, productionProductMain.getWorkOrderId()));
+            if (ObjectUtils.isNotEmpty(productionMachineRecords)) {
+                for (ProductionMachineRecord productionMachineRecord : productionMachineRecords) {
+                    //璇存槑宸茬粡娣诲姞杩囦簡锛屼笉娣诲姞浜�
+                    if (productionMachineRecord.getReportStatus()) {
+                        continue;
+                    }
+                    for (String s : productionMachineRecord.getOperatorId().split(",")) {
+                        Long minutes = 0L;
+                        if (productionMachineRecord.getMachineStartTime() != null) {
+                            minutes = between(productionMachineRecord.getMachineStartTime(), LocalDateTime.now()).toMinutes();
+                        }
+                        SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
+                                .productMainId(productionProductMain.getId())
+                                .schedulingUserId(Long.parseLong(s))
+                                .schedulingUserName(Optional.of(userMapper.selectUserById(Long.parseLong(s))).orElse(new SysUser()).getNickName())
+                                .finishedNum(productQty)
+                                .workHours(workHours)
+                                .process(productProcess.getName())
+                                .schedulingDate(LocalDate.now())
+                                .tenantId(productionProductOutput.getTenantId())
+                                .deviceId(productionMachineRecord.getMachineId())
+                                .workHour(minutes)
+                                .build();
+                        salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
+                    }
+                    productionMachineRecord.setReportStatus(true);
+                    productionMachineRecordMapper.updateById(productionMachineRecord);
+                }
+            }
         }
 
         //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
         if (ObjectUtils.isNotEmpty(productionProductOutput.getScrapQty())) {
             if (productionProductOutput.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
-                stockUtils.addUnStock(productModel.getId(), productionProductOutput.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId(),"-","-","-");
+                stockUtils.addUnStock(productModel.getId(), productionProductOutput.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId(), "-", "-", "-");
             }
         }
     }
@@ -388,10 +420,10 @@
     public Boolean removeProductMain(Long id) {
         //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
-        if (qualityInspects.size() > 0){
+        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) {
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
                 throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
             }
         }
@@ -415,7 +447,7 @@
 
 
             BigDecimal validQuantity = outputQty.subtract(scrapQty);
-            if(productionProductMain.getAuditStatus() != 2){
+            if (productionProductMain.getAuditStatus() != 2) {
                 productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity).max(BigDecimal.ZERO));
             }
             productWorkOrder.setActualEndTime(null);
@@ -449,7 +481,7 @@
                     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());
         });
 
         // 鍒犻櫎浜у嚭璁板綍

--
Gitblit v1.9.3