3 天以前 111270df037596a04df97f787ca8b9199dd99866
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -365,6 +365,40 @@
        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 是否完成
     */
@@ -372,6 +406,8 @@
        // 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. 检查工单下所有报工是否完成(确保质检完成)
@@ -380,6 +416,7 @@
                    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;
            }