| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderProcessMapper; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; |
| | |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | |
| | | /** |
| | | * MES 生产工单工序 Service 实现类 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Service |
| | | @Validated |
| | |
| | | private MesProProcessService processService; |
| | | @Resource |
| | | private MesProRouteProcessService routeProcessService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProWorkOrderBomService workOrderBomService; |
| | | @Resource |
| | | private MesProWorkOrderBomMapper workOrderBomMapper; |
| | | |
| | | @Override |
| | | public Long createWorkOrderProcess(MesProWorkOrderProcessSaveReqVO createReqVO) { |
| | |
| | | |
| | | // 2. 插入数据 |
| | | MesProWorkOrderProcessDO workOrderProcess = BeanUtils.toBean(createReqVO, MesProWorkOrderProcessDO.class); |
| | | if (CollUtil.isNotEmpty(createReqVO.getOutputItemIds())) { |
| | | workOrderProcess.setOutputItemId( |
| | | createReqVO.getOutputItemIds().stream() |
| | | .map(String::valueOf) |
| | | .collect(Collectors.joining(","))); |
| | | } |
| | | workOrderProcessMapper.insert(workOrderProcess); |
| | | |
| | | // 3. 重建工序链 |
| | |
| | | |
| | | // 2. 更新数据 |
| | | MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProWorkOrderProcessDO.class); |
| | | if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) { |
| | | updateObj.setOutputItemId( |
| | | updateReqVO.getOutputItemIds().stream() |
| | | .map(String::valueOf) |
| | | .collect(Collectors.joining(","))); |
| | | } |
| | | workOrderProcessMapper.updateById(updateObj); |
| | | |
| | | // 3. 重建工序链 |
| | |
| | | @Override |
| | | public List<MesProWorkOrderProcessDO> getWorkOrderProcessListByWorkOrderId(Long workOrderId) { |
| | | return workOrderProcessMapper.selectListByWorkOrderId(workOrderId); |
| | | } |
| | | |
| | | @Override |
| | | public MesProWorkOrderProcessDO getLastWorkOrderProcessByWorkOrderId(Long workOrderId) { |
| | | return workOrderProcessMapper.selectLastByWorkOrderId(workOrderId); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesProWorkOrderProcessDO> getWorkOrderProcessListByWorkOrderIds(java.util.Collection<Long> workOrderIds) { |
| | | if (CollUtil.isEmpty(workOrderIds)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return workOrderProcessMapper.selectListByWorkOrderIds(workOrderIds); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (item.getId() == null) { |
| | | // 新增 |
| | | MesProWorkOrderProcessDO process = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class); |
| | | if (CollUtil.isNotEmpty(item.getOutputItemIds())) { |
| | | process.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(","))); |
| | | } |
| | | workOrderProcessMapper.insert(process); |
| | | } else { |
| | | // 更新 |
| | | MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class); |
| | | if (CollUtil.isNotEmpty(item.getOutputItemIds())) { |
| | | updateObj.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(","))); |
| | | } |
| | | workOrderProcessMapper.updateById(updateObj); |
| | | } |
| | | } |
| | | |
| | | // 4. 重建工序链 |
| | | // 4. 保存工单 BOM 投料(合并所有工序的 bomItems,按 itemId 去重) |
| | | saveWorkOrderBomFromProcesses(workOrderId, list); |
| | | |
| | | // 5. 重建工序链 |
| | | rebuildProcessChain(workOrderId); |
| | | } |
| | | |
| | | /** |
| | | * 从工序列表中提取 BOM 投料,按工序分别保存到工单 BOM 表 |
| | | */ |
| | | private void saveWorkOrderBomFromProcesses(Long workOrderId, List<MesProWorkOrderProcessSaveReqVO> list) { |
| | | workOrderBomService.deleteWorkOrderBomByWorkOrderId(workOrderId); |
| | | List<MesProWorkOrderBomDO> bomList = new ArrayList<>(); |
| | | for (MesProWorkOrderProcessSaveReqVO item : list) { |
| | | if (CollUtil.isNotEmpty(item.getBomItems())) { |
| | | for (MesProWorkOrderProcessSaveReqVO.BomItem bomItem : item.getBomItems()) { |
| | | if (bomItem.getItemId() != null) { |
| | | bomList.add(MesProWorkOrderBomDO.builder() |
| | | .workOrderId(workOrderId) |
| | | .processId(item.getProcessId()) |
| | | .itemId(bomItem.getItemId()) |
| | | .quantity(bomItem.getQuantity()) |
| | | .remark(bomItem.getRemark()) |
| | | .build()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (CollUtil.isNotEmpty(bomList)) { |
| | | workOrderBomMapper.insertBatch(bomList); |
| | | } |
| | | } |
| | | |
| | | // ==================== 私有方法 ==================== |
| | | |
| | | private MesProWorkOrderProcessDO validateWorkOrderProcessExists(Long id) { |