| | |
| | | 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; |
| | |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private MesProFeedbackMapper feedbackMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | 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; |
| | | } |
| | | |
| | | // ========== 私有方法 ========== |
| | | |
| | | /** |