| | |
| | | // 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; |
| | |
| | | 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())); |
| | | } |