| | |
| | | return mpsMapper.selectOne(MesProMpsDO::getWorkOrderId, workOrderId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean checkAndFinishMps(Long mpsId) { |
| | | if (mpsId == null) { |
| | | log.warn("[checkAndFinishMps] mpsId is null"); |
| | | return false; |
| | | } |
| | | MesProMpsDO mps = mpsMapper.selectById(mpsId); |
| | | if (mps == null) { |
| | | log.warn("[checkAndFinishMps] MPS not found, mpsId={}", mpsId); |
| | | return false; |
| | | } |
| | | // 已完成或已取消,直接返回 true |
| | | if (MesProMpsStatusEnum.FINISHED.getStatus().equals(mps.getStatus()) |
| | | || MesProMpsStatusEnum.CANCELED.getStatus().equals(mps.getStatus())) { |
| | | log.info("[checkAndFinishMps] MPS {} already finished or canceled, status={}", mpsId, mps.getStatus()); |
| | | return true; |
| | | } |
| | | // 检查是否满足完成条件 |
| | | boolean finished = isMpsFinished(mps); |
| | | log.info("[checkAndFinishMps] MPS {} check result: {}, quantity={}, produced={}, workOrderId={}", |
| | | mpsId, finished, mps.getQuantity(), mps.getQuantityProduced(), mps.getWorkOrderId()); |
| | | if (finished) { |
| | | // 自动完成 MPS |
| | | mpsMapper.updateById(new MesProMpsDO() |
| | | .setId(mpsId) |
| | | .setStatus(MesProMpsStatusEnum.FINISHED.getStatus()) |
| | | .setFinishDate(LocalDateTime.now())); |
| | | log.info("[checkAndFinishMps] MPS {} auto finished", mpsId); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 判断单个 MPS 是否完成 |
| | | */ |
| | |
| | | // 1. 已生产数量 >= 计划数量 |
| | | BigDecimal quantityProduced = ObjUtil.defaultIfNull(mps.getQuantityProduced(), BigDecimal.ZERO); |
| | | if (quantityProduced.compareTo(mps.getQuantity()) < 0) { |
| | | log.debug("[isMpsFinished] MPS {} quantity not enough: produced={}, required={}", |
| | | mps.getId(), quantityProduced, mps.getQuantity()); |
| | | return false; |
| | | } |
| | | // 2. 检查工单下所有报工是否完成(确保质检完成) |
| | |
| | | new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProFeedbackDO>() |
| | | .eq(MesProFeedbackDO::getWorkOrderId, mps.getWorkOrderId()) |
| | | .ne(MesProFeedbackDO::getStatus, MesProFeedbackStatusEnum.FINISHED.getStatus())); |
| | | log.debug("[isMpsFinished] MPS {} unfinished feedback count: {}", mps.getId(), unfinishedCount); |
| | | if (unfinishedCount > 0) { |
| | | return false; |
| | | } |