gongchunyi
2026-06-29 743b74dfa59b05cb4bafe8678d8a6223a283ad03
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -32,6 +32,10 @@
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.framework.security.LoginUser;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
@@ -69,6 +73,9 @@
    private ProcurementRecordService procurementRecordService;
    private IApproveProcessService approveProcessService;
    private StockInventoryService stockInventoryService;
    private SalesLedgerMapper salesLedgerMapper;
    @Override
    public int add(QualityInspectDto qualityInspectDto) {
@@ -132,22 +139,28 @@
        if (qualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
            if (Objects.equals(qualityInspect.getInspectType(), 0)) {
                Long ledgerId = qualityInspect.getPurchaseLedgerId();
                PurchaseLedger purchaseLedger = ledgerId == null ? null : purchaseLedgerMapper.selectById(ledgerId);
                if (purchaseLedger != null) {
                    submitQualifiedInboundApprove(qualityInspect);
                } else {
                    // 手动新增的原材料检验:无采购台账,不走采购入库审批,直接入合格库存(与过程/出厂检验一致)
                    stockUtils.addStock(
                            null,
                            null,
                            qualityInspect.getProductModelId(),
                            qualifiedQty,
                            StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(),
                            qualityInspect.getId()
                    );
                    syncQualifiedInboundToPurchaseProducts(qualityInspect, qualifiedQty);
                }
                stockUtils.addStock(
                        qualityInspect.getPurchaseLedgerId(),
                        null,
                        qualityInspect.getProductModelId(),
                        qualifiedQty,
                        StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(),
                        qualityInspect.getId()
                );
                syncQualifiedInboundToPurchaseProducts(qualityInspect, qualifiedQty);
                qualityInspect.setApprovalStatus(3);
            } else if (Objects.equals(qualityInspect.getInspectType(), 2) && qualityInspect.getSalesLedgerId() != null) {
                // 销售订单的成品出厂检验,提交后直接入库
                StockInventoryDto stockInventoryDto = new StockInventoryDto();
                stockInventoryDto.setRecordId(qualityInspect.getSalesLedgerProductId());
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode());
                stockInventoryDto.setQualitity(qualifiedQty);
                stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
                stockInventoryDto.setSalesLedgerId(qualityInspect.getSalesLedgerId());
                stockInventoryDto.setSalesLedgerProductId(qualityInspect.getSalesLedgerProductId());
                stockInventoryService.addstockInventory(stockInventoryDto);
                syncQualifiedInboundToSalesProducts(qualityInspect, qualifiedQty);
            } else {
                stockUtils.addStock(
                        qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId(),
@@ -165,6 +178,9 @@
        qualityInspect.setInspectState(1);
        int updated = qualityInspectMapper.updateById(qualityInspect);
        refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId());
        if (qualityInspect.getSalesLedgerId() != null) {
            refreshSalesLedgerStockStatusByInspect(qualityInspect.getSalesLedgerId());
        }
        return updated;
    }
@@ -397,6 +413,7 @@
            qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId()));
            for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
                qualityInspectParam.setInspectId(qualityInspectDto.getId());
                qualityInspectParam.setId(null);
            }
            qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
        }
@@ -554,5 +571,78 @@
        }
    }
    private void syncQualifiedInboundToSalesProducts(QualityInspect qualityInspect, BigDecimal inboundQty) {
        if (qualityInspect == null || qualityInspect.getSalesLedgerProductId() == null || inboundQty == null) {
            return;
        }
        if (inboundQty.compareTo(BigDecimal.ZERO) <= 0) {
            return;
        }
        SalesLedgerProduct line = salesLedgerProductMapper.selectById(qualityInspect.getSalesLedgerProductId());
        if (line == null) {
            return;
        }
        BigDecimal orderQty = line.getQuantity() == null ? BigDecimal.ZERO : line.getQuantity();
        BigDecimal stocked = line.getStockedQuantity() == null ? BigDecimal.ZERO : line.getStockedQuantity();
        BigDecimal newStocked = stocked.add(inboundQty);
        int status;
        if (newStocked.compareTo(BigDecimal.ZERO) <= 0) {
            status = 0;
        } else if (orderQty.compareTo(BigDecimal.ZERO) > 0 && newStocked.compareTo(orderQty) < 0) {
            status = 1;
        } else {
            status = 2;
        }
        line.setStockedQuantity(newStocked);
        line.setProductStockStatus(status);
        line.fillRemainingQuantity();
        salesLedgerProductMapper.updateById(line);
    }
    private void refreshSalesLedgerStockStatusByInspect(Long salesLedgerId) {
        if (salesLedgerId == null) {
            return;
        }
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                .eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId));
        if (products == null || products.isEmpty()) {
            return;
        }
        boolean hasStocked = false;
        boolean allStocked = true;
        for (SalesLedgerProduct product : products) {
            BigDecimal orderQty = product.getQuantity() == null ? BigDecimal.ZERO : product.getQuantity();
            BigDecimal sq = product.getStockedQuantity() == null ? BigDecimal.ZERO : product.getStockedQuantity();
            if (sq.compareTo(BigDecimal.ZERO) > 0) {
                hasStocked = true;
            }
            if (orderQty.compareTo(BigDecimal.ZERO) <= 0 || sq.compareTo(orderQty) < 0) {
                allStocked = false;
            }
        }
        long pendingInspectCount = qualityInspectMapper.selectCount(Wrappers.<QualityInspect>lambdaQuery()
                .eq(QualityInspect::getSalesLedgerId, salesLedgerId)
                .eq(QualityInspect::getInspectState, 0));
        boolean allInspectFinished = pendingInspectCount == 0;
        SalesLedger ledger = salesLedgerMapper.selectById(salesLedgerId);
        if (ledger != null) {
            int newStatus = ledger.getStockStatus() != null ? ledger.getStockStatus() : 0;
            if (allInspectFinished) {
                newStatus = allStocked ? 2 : 5; // 2: 已入库(质检完成), 5: 部分质检完成
            } else {
                newStatus = 4; // 4: 质检中
            }
            ledger.setStockStatus(newStatus);
            salesLedgerMapper.updateById(ledger);
        }
    }
}