From f8dfc6add4658bec89ef48c2bc091cfdbd7f65c8 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期四, 19 三月 2026 16:35:28 +0800
Subject: [PATCH] feat(production): 实现生产报工审核功能

---
 src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java    |    2 
 src/main/java/com/ruoyi/production/service/ProductionProductMainService.java            |    7 +
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                      |   30 +++++
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java   |  174 +++++++++++++++++++++++-----
 src/main/java/com/ruoyi/common/enums/AuditEnum.java                                     |   25 ++++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                  |   17 --
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                    |    3 
 src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java      |   13 +
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java |   14 -
 src/main/java/com/ruoyi/RuoYiApplication.java                                           |    2 
 src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java                    |    4 
 src/main/java/com/ruoyi/production/vo/ProductAuditVo.java                               |   28 ++++
 12 files changed, 257 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/ruoyi/RuoYiApplication.java b/src/main/java/com/ruoyi/RuoYiApplication.java
index 97efe32..cc60723 100644
--- a/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -3,6 +3,7 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
@@ -12,6 +13,7 @@
  */
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @EnableScheduling
+@EnableAspectJAutoProxy(exposeProxy = true)
 public class RuoYiApplication
 {
     public static void main(String[] args)
diff --git a/src/main/java/com/ruoyi/common/enums/AuditEnum.java b/src/main/java/com/ruoyi/common/enums/AuditEnum.java
new file mode 100644
index 0000000..9ba5f36
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/AuditEnum.java
@@ -0,0 +1,25 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/19
+ * @email 3038525872@qq.com
+ */
+@Getter
+public enum AuditEnum implements BaseEnum<Integer> {
+
+    NO_AUDIT(0, "鏈鏍�"),
+    AUDIT_SUCCESS(1, "瀹℃牳閫氳繃"),
+    AUDIT_FAIL(2, "瀹℃牳澶辫触");
+
+
+    private final Integer code;
+    private final String value;
+
+    AuditEnum(Integer code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
index 2d5231d..7e16d45 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
@@ -19,6 +19,8 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
index e4a0813..39768b6 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -3,18 +3,16 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.production.dto.ProductProcessRouteItemDto;
 import com.ruoyi.production.dto.ProductionProductMainDto;
-import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto;
 import com.ruoyi.production.service.ProductionProductMainService;
+import com.ruoyi.production.vo.ProductAuditVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.Arrays;
+import javax.validation.Valid;
 import java.util.List;
 
 @RequestMapping("productionProductMain")
@@ -63,4 +61,11 @@
         ExcelUtil<ProductionProductMainDto> util = new ExcelUtil<ProductionProductMainDto>(ProductionProductMainDto.class);
         util.exportExcel(response, list, "鐢熶骇鎶ュ伐鏁版嵁");
     }
+
+
+    @PostMapping("/productAudit")
+    public R productAudit(@RequestBody @Valid ProductAuditVo vo) {
+        productionProductMainService.auditProductMain(vo);
+        return R.ok();
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index 9e5e121..c9cbaa1 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.enums.AuditEnum;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.production.pojo.ProductionProductMain;
 import io.swagger.annotations.ApiModelProperty;
@@ -61,5 +62,6 @@
     private BigDecimal workHours;
     private BigDecimal wages;
 
-
+    private Long auditUserId;
+    private String auditUserName;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 2064e04..d3164f1 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -51,4 +51,34 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty(value = "瀹℃牳鐘舵��")
+    @TableField(value = "audit_status")
+    private Integer auditStatus;
+
+    @ApiModelProperty(value = "瀹℃牳浜篿d")
+    @TableField(value = "audit_user_id")
+    private Long auditUserId;
+
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    @TableField(value = "audit_user_name")
+    private String auditUserName;
+
+    @ApiModelProperty(value = "琚鏍镐汉id")
+    @TableField(value = "sure_audit_user_id")
+    private Long sureAuditUserId;
+
+    @ApiModelProperty(value = "琚鏍镐汉")
+    @TableField(value = "sure_audit_user_name")
+    private String sureAuditUserName;
+
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿")
+    @TableField(value = "audit_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty(value = "瀹℃牳鎰忚")
+    @TableField(value = "audit_opinion")
+    private String auditOpinion;
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
index 72d868c..e09893d 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -5,7 +5,10 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.pojo.ProductionProductOutput;
+import com.ruoyi.production.vo.ProductAuditVo;
 
+import javax.validation.constraints.NotNull;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -14,7 +17,11 @@
 
     Boolean addProductMain(ProductionProductMainDto productionProductMainDto);
 
+    void auditProductMain(@NotNull ProductAuditVo productAuditVo);
+
     Boolean removeProductMain(Long id);
 
+    void nextAddProductMain(@NotNull ProductionProductOutput productionProductOutput);
+
     ArrayList<Long> listMain(List<Long> idList);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
index c5fbac0..19f5f61 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -18,6 +18,7 @@
 import lombok.AllArgsConstructor;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -36,17 +37,13 @@
 @AllArgsConstructor
 public class ProductProcessRouteItemServiceImpl extends ServiceImpl<ProductProcessRouteItemMapper, ProductProcessRouteItem> implements ProductProcessRouteItemService {
 
-
+    @Autowired
+    @Lazy
     private ProductionProductMainService productionProductMainService;
+
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
 
     private ProductionProductMainMapper productionProductMainMapper;
-
-    private ProductionProductInputMapper productionProductInputMapper;
-
-    private ProductionProductOutputMapper productionProductOutputMapper;
-
-    private QualityInspectMapper qualityInspectMapper;
 
     private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
 
@@ -54,9 +51,6 @@
 
     private ProductOrderMapper productOrderMapper;
 
-    private ProductProcessRouteMapper productProcessRouteMapper;
-
-    private SalesLedgerProductMapper salesLedgerProductMapper;
 
 
     @Override
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 fa34114..36a02b7 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -11,10 +13,12 @@
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.enums.AuditEnum;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -22,16 +26,21 @@
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductionProductMainService;
+import com.ruoyi.production.vo.ProductAuditVo;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
 import com.ruoyi.quality.service.IQualityInspectService;
 import lombok.AllArgsConstructor;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -39,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Service
@@ -91,6 +101,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean addProductMain(ProductionProductMainDto dto) {
         SysUser user = userMapper.selectUserById(dto.getUserId());
         ProductionProductMain productionProductMain = new ProductionProductMain();
@@ -137,11 +148,13 @@
         productionProductMain.setUserName(dto.getUserName());
         productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
+        productionProductMain.setAuditUserId(dto.getAuditUserId());
+        productionProductMain.setAuditUserName(dto.getAuditUserName());
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
         /*鏂板鎶ュ伐鎶曞叆琛�*/
         List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-        if (productStructureDtos.size() == 0) {
+        if (productStructureDtos.isEmpty()) {
             //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
             ProductStructureDto productStructureDto = new ProductStructureDto();
             productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
@@ -169,6 +182,130 @@
         BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
         //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
         if (productQty.compareTo(BigDecimal.ZERO) > 0) {
+            List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+            /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+            productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
+            if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
+                productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+            }
+            if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
+                productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+            }
+            productWorkOrderMapper.updateById(productWorkOrder);
+            //鐢熶骇璁㈠崟
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            if (ObjectUtils.isNull(productOrder.getStartTime())) {
+                productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
+            }
+            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
+                productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
+                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
+                    productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+                }
+            }
+            productOrderMapper.updateById(productOrder);
+        }
+        //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
+        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
+            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
+                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+            }
+        }
+        //nextAddProductMain(productionProductOutput) // 鐢变簬闇�瑕佸鏍革紝鎵�浠ラ渶瑕佹媶灏佷笅鏉�
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void auditProductMain(ProductAuditVo productAuditVo) {
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productAuditVo.getId());
+
+        // 褰撳墠瀹℃壒浜� 瑕佷笌褰撳墠鐧诲綍浜轰负鍚屼竴浜�
+        Assert.isTrue(SecurityUtils.getUserId().equals(productionProductMain.getAuditUserId()), "褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰撳墠瀹℃壒浜�");
+
+
+        // 鐘舵�佸繀椤讳负寰呭鏍哥姸鎬�
+        if (!Objects.equals(productionProductMain.getAuditStatus(), AuditEnum.NO_AUDIT.getCode())) {
+            throw new ServiceException("褰撳墠鐘舵�佸凡瀹℃牳,涓嶈兘閲嶅瀹℃牳");
+        }
+
+        LambdaQueryWrapper<ProductionProductOutput> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProductionProductOutput::getProductMainId, productionProductMain.getId());
+        queryWrapper.last("limit 1");
+        ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectOne(queryWrapper);
+        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+
+
+        switch (productAuditVo.getAuditStatus()) {
+            case NO_AUDIT:
+                throw new ServiceException("淇敼瀹℃牳鐘舵�佸け璐ワ紝涓嶈兘涓烘湭瀹℃牳鐘舵��");
+            case AUDIT_SUCCESS:
+
+                Assert.isTrue(productionProductOutput != null, "娌℃湁鎵惧埌瀵瑰簲鐨勬姤宸ヤ骇鍑鸿褰�");
+                ((ProductionProductMainService) AopContext.currentProxy()).nextAddProductMain(productionProductOutput);
+                break;
+            case AUDIT_FAIL:
+                // 鍑忓皯 鏇存柊宸ュ崟鍜岀敓浜ц鍗�
+                ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+                ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
+                productWorkOrder.setCompleteQuantity(
+                        productWorkOrder.getCompleteQuantity()
+                                .subtract(productionProductOutput.getQuantity())
+                                .max(BigDecimal.ZERO)
+                );
+                List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+
+
+                if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                    //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗� 闇�瑕佹墸闄�
+                    productOrder.setCompleteQuantity(
+                            productOrder.getCompleteQuantity()
+                                    .subtract(productionProductOutput.getQuantity())
+                                    .max(BigDecimal.ZERO)
+                    );
+                    if (productOrder.getCompleteQuantity().compareTo(productionProductOutput.getQuantity()) > 0) {
+                        productOrder.setEndTime(null);
+                    }
+                    productOrderMapper.updateById(productOrder);
+                }
+
+                if (productWorkOrder.getCompleteQuantity().compareTo(productionProductOutput.getQuantity()) > 0) {
+                    productWorkOrder.setActualEndTime(null);
+                }
+
+                productWorkOrderMapper.updateById(productWorkOrder);
+
+                break;
+        }
+
+        // 淇敼鐘舵��
+        ProductionProductMain updateDate = new ProductionProductMain();
+        updateDate.setId(productionProductMain.getId());
+        updateDate.setAuditStatus(productAuditVo.getAuditStatus().getCode());
+        updateDate.setSureAuditUserId(SecurityUtils.getUserId());
+        updateDate.setSureAuditUserName(SecurityUtils.getUsername());
+        updateDate.setAuditTime(LocalDateTime.now());
+        updateDate.setAuditOpinion(productAuditVo.getAuditOpinion());
+        productionProductMainMapper.updateById(updateDate);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void nextAddProductMain(@NotNull ProductionProductOutput productionProductOutput){
+        //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductOutput.getProductMainId());
+        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
+        //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
+        ProductModel productModel = productModelMapper.selectById(productProcessRouteItem.getProductModelId());
+        SysUser user = userMapper.selectUserById(SecurityUtils.getUserId());
+
+        //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
+        if (productQty.compareTo(BigDecimal.ZERO) > 0) {
             /*鏂板璐ㄦ*/
             List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
             if (productProcessRouteItem.getIsQuality()) {
@@ -194,7 +331,7 @@
                 qualityInspect.setProductModelId(productModel.getId());
                 qualityInspectMapper.insert(qualityInspect);
                 List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
-                if (qualityTestStandard.size() > 0) {
+                if (!qualityTestStandard.isEmpty()) {
                     qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
                     qualityInspectMapper.updateById(qualityInspect);
                     qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
@@ -211,29 +348,7 @@
                 //鐩存帴鍏ュ簱
                 stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
-            /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
-            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
-            productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
-            if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
-                productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
-            }
-            if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
-                productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
-            }
-            productWorkOrderMapper.updateById(productWorkOrder);
-            //鐢熶骇璁㈠崟
-            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
-            if (ObjectUtils.isNull(productOrder.getStartTime())) {
-                productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
-            }
-            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
-                //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
-                productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
-                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
-                    productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
-                }
-            }
-            productOrderMapper.updateById(productOrder);
+
             /*娣诲姞鐢熶骇鏍哥畻        鍖哄垎宸ュ簭鏄浠惰繕鏄鏃�*/
             BigDecimal workHours = (productProcess.getType() == 1)
                     ? productProcess.getSalaryQuota().multiply(productQty)
@@ -247,17 +362,10 @@
                     .workHours(workHours)
                     .process(productProcess.getName())
                     .schedulingDate(LocalDate.now())
-                    .tenantId(dto.getTenantId())
+                    .tenantId(productionProductOutput.getTenantId())
                     .build();
             salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
         }
-        //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
-        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
-            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
-                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
-            }
-        }
-        return true;
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/production/vo/ProductAuditVo.java b/src/main/java/com/ruoyi/production/vo/ProductAuditVo.java
new file mode 100644
index 0000000..27ae500
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/vo/ProductAuditVo.java
@@ -0,0 +1,28 @@
+package com.ruoyi.production.vo;
+
+import com.ruoyi.common.enums.AuditEnum;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/19
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductAuditVo implements Serializable {
+    @NotNull(message = "id涓嶈兘涓虹┖")
+    private Long id;
+
+    @NotNull(message = "瀹℃牳鐘舵�佷笉鑳戒负绌�")
+    private AuditEnum auditStatus;
+
+    // 瀹℃牳鎰忚
+    private String auditOpinion;
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 0e9f52f..2326c13 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -52,6 +52,7 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
@@ -107,21 +108,8 @@
     private final CommonFileServiceImpl commonFileService;
     private final ShippingInfoMapper shippingInfoMapper;
     private final InvoiceLedgerMapper invoiceLedgerMapper;
-    private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
-    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
-    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
     private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
     private final InvoiceRegistrationMapper invoiceRegistrationMapper;
-    private final ProductOrderMapper productOrderMapper;
-    private final ProcessRouteMapper processRouteMapper;
-    private final ProductProcessRouteMapper productProcessRouteMapper;
-    private final ProcessRouteItemMapper processRouteItemMapper;
-    private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
-    private final ProductWorkOrderMapper productWorkOrderMapper;
-    private final ProductionProductMainMapper productionProductMainMapper;
-    private final ProductionProductOutputMapper productionProductOutputMapper;
-    private final ProductionProductInputMapper productionProductInputMapper;
-    private final QualityInspectMapper qualityInspectMapper;
     private final RedisTemplate<String, String> redisTemplate;
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -135,8 +123,9 @@
     @Autowired
     private ProductStructureMapper productStructureMapper;
     @Autowired
+    @Lazy
     private ProductionProductMainService productionProductMainService;
-    ;
+
     @Autowired
     private SysUserMapper sysUserMapper;
 
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index a122e90..5b3f845 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -48,6 +48,9 @@
             <if test="c.status != null and c.status != ''">
                 and ppm.status = #{c.status}
             </if>
+            <if test="c.auditStatus != null">
+                and ppm.audit_status = #{c.auditStatus.code}
+            </if>
         </where>
         order by ppm.id
 

--
Gitblit v1.9.3