| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessOutputDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | |
| | | import java.util.Set; |
| | | import java.util.Comparator; |
| | | import java.util.Arrays; |
| | | import java.util.Objects; |
| | | import java.util.stream.Collectors; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | |
| | |
| | | throw exception(PRO_ROUTE_MIDDLE_OUTPUT_INVALID, process.getProcessId()); |
| | | } |
| | | } |
| | | // 4. 末道工序成品产出必须按产品归属,避免“通用”产出串到其它产品的工单 |
| | | List<MesProRouteProcessOutputDO> lastOutputs = routeProcessService |
| | | .getRouteProcessOutputListByRouteProcessIds(Collections.singletonList(lastProcess.getId())); |
| | | if (CollUtil.isNotEmpty(lastOutputs)) { |
| | | boolean attributionInvalid = lastOutputs.stream().anyMatch(output -> |
| | | output.getProductId() == null || !output.getProductId().equals(output.getItemId())); |
| | | Set<Long> attributedProducts = lastOutputs.stream() |
| | | .map(MesProRouteProcessOutputDO::getProductId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | if (attributionInvalid || !attributedProducts.containsAll(finishedItemIds)) { |
| | | throw exception(PRO_ROUTE_LAST_OUTPUT_ATTRIBUTION_REQUIRED, lastProcess.getProcessId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private Set<Long> parseOutputItemIds(String value) { |