| | |
| | | import cn.iocoder.yudao.module.mes.enums.MesProScanEventStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.framework.qrcode.MesTraceCodeUtils; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesProScanEventDO createInbound(MesProScanEventCreateReqVO req) { |
| | | // 追溯二维码内容是「追溯网址?code=码值」,扫码枪也可能直传整段网址,先统一提取码值 |
| | | String scanCode = MesTraceCodeUtils.extractCode(req.getBagCode()); |
| | | String scanType = (req.getScanType() == null || req.getScanType().isBlank()) ? SCAN_TYPE_BAG : req.getScanType(); |
| | | if (!List.of(SCAN_TYPE_BAG, SCAN_TYPE_PALLET, SCAN_TYPE_BATCH).contains(scanType)) { |
| | | throw new ServiceException(400, "不支持的扫码类型"); |
| | | } |
| | | MesProScanEventDO existing = eventMapper.selectByEventIdForUpdate(req.getEventId()); |
| | | if (existing != null) { |
| | | boolean contentMatch = req.getBagCode().equals(existing.getBagCode()) |
| | | boolean contentMatch = scanCode.equals(existing.getBagCode()) |
| | | && Objects.equals(req.getDeviceCode(), existing.getDeviceCode()) |
| | | && Objects.equals(req.getLineCode(), existing.getLineCode()) |
| | | && Objects.equals(scanType, existing.getScanType()) |
| | |
| | | return existing; |
| | | } |
| | | MesProScanEventDO event = new MesProScanEventDO(); |
| | | event.setEventId(req.getEventId()).setBagCode(req.getBagCode()).setScanType(scanType) |
| | | event.setEventId(req.getEventId()).setBagCode(scanCode).setScanType(scanType) |
| | | .setQuantity(req.getQuantity()).setDeviceCode(req.getDeviceCode()).setLineCode(req.getLineCode()) |
| | | .setRemark(req.getRemark()).setLocationId(req.getLocationId()).setAreaId(req.getAreaId()) |
| | | .setStatus(MesProScanEventStatusEnum.FAILED).setReceivedTime(LocalDateTime.now()); |
| | |
| | | Long bagCodeId = null; |
| | | String bagCode = null; |
| | | if (SCAN_TYPE_PALLET.equals(scanType)) { |
| | | MesProPalletDO pallet = palletMapper.selectByScanCodeForUpdate(req.getBagCode()); |
| | | MesProPalletDO pallet = palletMapper.selectByScanCodeForUpdate(scanCode); |
| | | if (pallet == null) return failed(event, "MES_SCAN_PALLET_NOT_EXISTS", "托盘码不存在"); |
| | | if (MesProPalletStatusEnum.CANCELED.getStatus().equals(pallet.getStatus())) |
| | | return failed(event, "MES_SCAN_PALLET_CANCELED", "托盘已作废,不可入库"); |
| | |
| | | targetId = pallet.getId(); |
| | | quantity = BigDecimal.valueOf(bagCodeMapper.selectPendingInboundCountByPalletId(pallet.getId())); |
| | | } else if (SCAN_TYPE_BATCH.equals(scanType)) { |
| | | batch = batchMapper.selectByScanCodeForUpdate(req.getBagCode()); |
| | | batch = batchMapper.selectByScanCodeForUpdate(scanCode); |
| | | if (batch == null) return failed(event, "MES_SCAN_BATCH_NOT_EXISTS", "生产批次不存在"); |
| | | batchId = batch.getId(); |
| | | targetId = batch.getId(); |
| | | quantity = BigDecimal.valueOf(bagCodeMapper.selectPendingInboundCountByBatchId(batch.getId())); |
| | | } else { |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByScanCodeForUpdate(req.getBagCode()); |
| | | MesProBagCodeDO bag = bagCodeMapper.selectByScanCodeForUpdate(scanCode); |
| | | if (bag == null) return failed(event, "MES_SCAN_BAG_NOT_EXISTS", "袋码不存在"); |
| | | if (MesProBagCodeStatusEnum.CANCELED.getStatus().equals(bag.getStatus())) |
| | | return failed(event, "MES_SCAN_BAG_CANCELED", "袋码已作废,不可入库"); |
| | |
| | | return event; |
| | | } catch (Exception ex) { |
| | | log.error("[createInbound] 库存事务处理失败,eventId={}, bagCode={}, batchId={}, itemId={}", |
| | | req.getEventId(), req.getBagCode(), batchId, batch.getItemId(), ex); |
| | | req.getEventId(), scanCode, batchId, batch.getItemId(), ex); |
| | | throw ex; |
| | | } |
| | | } |