gaoluyang
5 天以前 6fa82a1ad7c3ae061ef499f0d0806a16846e122b
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcNcrPurchaseSourceValidator.java
@@ -43,7 +43,7 @@
                .eq(MesWmArrivalNoticeLineDO::getId, iqc.getSourceLineId()).last("FOR UPDATE"));
        if (notice == null || line == null || !Objects.equals(line.getNoticeId(), notice.getId())
                || !Objects.equals(line.getIqcId(), iqc.getId())
                || !Objects.equals(notice.getStatus(), MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus())
                || !isDispositionAllowedNoticeStatus(notice.getStatus())
                || !Objects.equals(line.getItemId(), iqc.getItemId())
                || !Objects.equals(ncr.getItemId(), iqc.getItemId())
                || !samePositive(ncr.getUnqualifiedQuantity(), iqc.getUnqualifiedQuantity())
@@ -52,6 +52,19 @@
        return new Source(iqc, notice, line);
    }
    /**
     * 不合格处置允许的到货通知状态。
     *
     * 来料检验完成时,到货通知会在同一事务里从「待质检」推进到「待入库」并自动生成采购入库单
     * (只取合格数量),随后确认入库后变为「已完成」。不合格部分的退货/让步由不合格单单独处置,
     * 不再受通知状态限制,否则单行通知(或最后一行检验完成时)的不合格单将永远无法处置。
     */
    private boolean isDispositionAllowedNoticeStatus(Integer status) {
        return Objects.equals(status, MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus())
                || Objects.equals(status, MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus())
                || Objects.equals(status, MesWmArrivalNoticeStatusEnum.FINISHED.getStatus());
    }
    private boolean samePositive(BigDecimal a, BigDecimal b) {
        return a != null && b != null && a.signum() > 0 && a.compareTo(b) == 0;
    }