2026-06-01 284034e851859cf2e0008ef3c353666bc12943a1
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -200,33 +200,11 @@
        if (!validResults.contains(request.getCheckResult())) {
            return R.fail("检测结果必须为:合格、不合格、部分合格");
        }
        if (request.getQuantity() == null || request.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
            return R.fail("总数量必须大于0");
        }
        if (request.getTestStandardId() == null) {
            return R.fail("指标标准ID不能为空");
        }
        // quantity = qualifiedQuantity + unqualifiedQuantity
        BigDecimal qty = request.getQuantity();
        BigDecimal qualified = request.getQualifiedQuantity() != null ? request.getQualifiedQuantity() : BigDecimal.ZERO;
        BigDecimal unqualified = request.getUnqualifiedQuantity() != null ? request.getUnqualifiedQuantity() : BigDecimal.ZERO;
        if (qty.compareTo(qualified.add(unqualified)) != 0) {
            return R.fail("总数量必须等于合格数量加不合格数量");
        }
        String checkResult = request.getCheckResult();
        if ("合格".equals(checkResult)) {
            if (qualified.compareTo(qty) != 0 || unqualified.compareTo(BigDecimal.ZERO) != 0) {
                return R.fail("检验结果为合格时,合格数量应等于总数量,不合格数量应为0");
            }
        } else if ("不合格".equals(checkResult)) {
            if (qualified.compareTo(BigDecimal.ZERO) != 0 || unqualified.compareTo(qty) != 0) {
                return R.fail("检验结果为不合格时,合格数量应为0,不合格数量应等于总数量");
            }
        } else {
            if (qualified.compareTo(BigDecimal.ZERO) <= 0 || unqualified.compareTo(BigDecimal.ZERO) <= 0) {
                return R.fail("检验结果为部分合格时,合格数量和不合格数量都必须大于0");
            }
        }
        // 解析检测日期
        Date checkTimeDate = null;
@@ -239,8 +217,7 @@
        for (Long id : request.getIds()) {
            try {
                // 使用独立事务处理每个检验单,避免单个失败影响整体事务
                processSingleInspect(id, request, checkResult, qty, qualified, unqualified, checkTimeDate);
                processSingleInspect(id, request, checkResult, checkTimeDate);
                success++;
            } catch (Exception e) {
                errors.add("检验单 " + id + " 处理失败:" + e.getMessage());
@@ -256,12 +233,11 @@
    /**
     * 在独立事务中处理单个检验单
     * 数量、合格数量默认使用检验单自身的数量,不合格数量为0
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void processSingleInspect(Long id, BatchQuickInspectRequest request,
                                     String checkResult, BigDecimal qty,
                                     BigDecimal qualified, BigDecimal unqualified,
                                     Date checkTimeDate) {
                                     String checkResult, Date checkTimeDate) {
        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
        if (qualityInspect == null) {
            throw new RuntimeException("检验单不存在");
@@ -270,6 +246,11 @@
            throw new RuntimeException("检验单已提交");
        }
        // 数量默认取检验单自身的数量,不合格数量为0
        BigDecimal qty = qualityInspect.getQuantity() != null ? qualityInspect.getQuantity() : BigDecimal.ZERO;
        BigDecimal qualified = qty;
        BigDecimal unqualified = BigDecimal.ZERO;
        // 2. 更新检验单字段
        qualityInspect.setCheckResult(checkResult);
        qualityInspect.setTestStandardId(request.getTestStandardId());