2 天以前 3be684af887afe4c0e45f281cc53adfef6f12b78
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -12,7 +12,10 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsMergeItemDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMergeItemMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
import cn.iocoder.yudao.module.mes.enums.pro.MesProMpsStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderSourceTypeEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
@@ -61,6 +64,8 @@
    private MesMdAutoCodeRecordService autoCodeRecordService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private MesProFeedbackMapper feedbackMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -331,6 +336,57 @@
        mpsMapper.updateProducedQuantity(id, incrQuantity);
    }
    @Override
    public Boolean checkSaleOrderProductionFinished(Long saleOrderId) {
        if (saleOrderId == null) {
            return false;
        }
        // 1. 查询该销售订单所有 MPS(通过 saleOrderId 关联)
        List<MesProMpsDO> mpsList = mpsMapper.selectList(
                MesProMpsDO::getSaleOrderId, saleOrderId);
        if (CollUtil.isEmpty(mpsList)) {
            // 无 MPS 关联,视为完成
            return true;
        }
        // 2. 检查每个 MPS 是否完成
        for (MesProMpsDO mps : mpsList) {
            if (!isMpsFinished(mps)) {
                return false;
            }
        }
        return true;
    }
    @Override
    public MesProMpsDO getMpsByWorkOrderId(Long workOrderId) {
        if (workOrderId == null) {
            return null;
        }
        return mpsMapper.selectOne(MesProMpsDO::getWorkOrderId, workOrderId);
    }
    /**
     * 判断单个 MPS 是否完成
     */
    private boolean isMpsFinished(MesProMpsDO mps) {
        // 1. 已生产数量 >= 计划数量
        BigDecimal quantityProduced = ObjUtil.defaultIfNull(mps.getQuantityProduced(), BigDecimal.ZERO);
        if (quantityProduced.compareTo(mps.getQuantity()) < 0) {
            return false;
        }
        // 2. 检查工单下所有报工是否完成(确保质检完成)
        if (mps.getWorkOrderId() != null) {
            Long unfinishedCount = feedbackMapper.selectCount(
                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProFeedbackDO>()
                            .eq(MesProFeedbackDO::getWorkOrderId, mps.getWorkOrderId())
                            .ne(MesProFeedbackDO::getStatus, MesProFeedbackStatusEnum.FINISHED.getStatus()));
            if (unfinishedCount > 0) {
                return false;
            }
        }
        return true;
    }
    // ========== 私有方法 ==========
    /**