云
2 天以前 ac2e2b5af3726ee64dc37c3ebf26989a0346f22a
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -146,21 +146,14 @@
            // 2.1 需要检验,进入待质检
            arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
                    .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()));
            // 2.2 为需要质检的行自动创建 IQC 检验单
            // 2.2 检验单创建失败时回滚提交,避免单据停留在无法处理的待质检状态
            for (MesWmArrivalNoticeLineDO line : lines) {
                if (Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null) {
                    try {
                        Long iqcId = iqcService.createIqcFromArrivalNotice(
                                id, line, notice.getCode(), notice.getVendorId());
                        // 更新行上的 iqcId
                        arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
                        log.info("[submitArrivalNotice][到货通知单({}) 行({}) 自动创建 IQC 检验单({})]",
                                id, line.getId(), iqcId);
                    } catch (Exception e) {
                        log.warn("[submitArrivalNotice][到货通知单({}) 行({}) 创建 IQC 失败: {}]",
                                id, line.getId(), e.getMessage());
                        // 继续处理其他行,不中断流程
                    }
                    Long iqcId = iqcService.createIqcFromArrivalNotice(
                            id, line, notice.getCode(), notice.getVendorId());
                    arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
                    log.info("[submitArrivalNotice][到货通知单({}) 行({}) 自动创建 IQC 检验单({})]",
                            id, line.getId(), iqcId);
                }
            }
            return;
@@ -192,16 +185,19 @@
            return;
        }
        // 3.2 判断是否所有需检行都可以入库(合格或特采)
        boolean hasNonInbound = CollectionUtils.anyMatch(lines,
                line -> Boolean.TRUE.equals(line.getIqcCheckFlag())
                        && !MesQcCheckResultEnum.canInbound(line.getIqcCheckResult()));
        if (hasNonInbound) {
            log.info("[updateArrivalNoticeWhenIqcFinish][到货通知单({}) 存在不可入库的行(退货/报废),状态保持待质检]", id);
        // 3.2 判断是否还有可入库的行(未启用来料检验的行按到货数量入库;检验行须合格或特采)
        boolean hasInbound = CollectionUtils.anyMatch(lines,
                line -> !Boolean.TRUE.equals(line.getIqcCheckFlag())
                        || MesQcCheckResultEnum.canInbound(line.getIqcCheckResult()));
        if (!hasInbound) {
            // 所有检验行均为退货/报废,无可入库数量,直接结束到货通知单,避免停留在待质检
            log.info("[updateArrivalNoticeWhenIqcFinish][到货通知单({}) 全部检验行不可入库(退货/报废),直接完成]", id);
            arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
                    .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.FINISHED.getStatus()));
            return;
        }
        // 3.3 所有行检验完成且可入库,更新主表状态 PENDING_QC → PENDING_RECEIPT
        // 3.3 所有行检验完成,更新主表状态 PENDING_QC → PENDING_RECEIPT(不可入库的行在生成入库单时过滤)
        arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
                .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()));
    }