From dcbab3b27d9eec9e684bb782cbd47d3eb7db4471 Mon Sep 17 00:00:00 2001 From: yf001217 <834502597@qq.com> Date: Mon, 1 Jun 2026 14:06:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=A0=E7=A0=81=E6=94=B6?= =?UTF-8?q?=E8=B4=A7-=E9=97=B4=E5=86=85=E8=B0=83=E6=8B=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TransferFactoryController.java | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java index e087237f..1d0da57f 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java @@ -6,11 +6,15 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.nflg.wms.admin.pojo.dto.PdfPageDTO; +import com.nflg.wms.admin.pojo.request.NoScanningItemDataRequest; +import com.nflg.wms.admin.pojo.request.NoScanningItemRequest; +import com.nflg.wms.admin.pojo.request.NoScanningRequest; import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; +import com.nflg.wms.admin.service.NoScanningBaseControllerService; import com.nflg.wms.admin.service.SapService; import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.QRCodeUtil; @@ -107,6 +111,9 @@ public class TransferFactoryController extends BaseController { @Resource private IOptRecordService optRecordService; + @Resource + private NoScanningBaseControllerService noScanningBaseControllerService; + /** * 查询SAP领料订单数据 */ @@ -508,6 +515,110 @@ public class TransferFactoryController extends BaseController { return ApiResult.success(); } + /** + * 无码出库(PDA使用) + */ + @Transactional + @PostMapping("pda/submitForOutNoScanning") + public ApiResult submitForOutNoScanning(@Valid @RequestBody NoScanningRequest request) { + WmsTransferFactory order = transferFactoryService.getById(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("调拨单不存在"); + List datas = transferFactoryItemService.getList(order.getId()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("调拨单明细不存在"); + Map itemMap = datas.stream() + .collect(Collectors.toMap(WmsTransferFactoryItem::getId, item -> item)); + + List records = new ArrayList<>(); + List ticketItems = new ArrayList<>(); + WmsTransferFactoryTicket ticket = new WmsTransferFactoryTicket() + .setId(IdUtil.getSnowflakeNextId()) + .setNo(serialNumberControllerService.generateSerialNumber(19)) + .setLgort(request.getWarehouseNo()) + .setOrderId(order.getId()) + .setFinish(true) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + + for (NoScanningItemRequest item : request.getItems()) { + WmsTransferFactoryItem orderItem = itemMap.get(item.getOrderItemId()); + VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("物料" + item.getMaterialNo() + "不需要出库"); + VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMatnr())) + .throwMessage("调拨单明细与物料不匹配:" + item.getMaterialNo()); + VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMatnr())) + .throwMessage("物料" + orderItem.getMatnr() + "已生成二维码,不允许无码出库"); + + BigDecimal totalNum = item.getDatas().stream() + .peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0) + .throwMessage("物料" + orderItem.getMatnr() + "的无码出库数量必须大于0")) + .map(NoScanningItemDataRequest::getNum) + .reduce(BigDecimal.ZERO, BigDecimal::add); + VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getLeft()) > 0) + .throwMessage("物料" + orderItem.getMatnr() + "的出库数量超出申请限制"); + + WmsTransferFactoryTicketItem ticketItem = new WmsTransferFactoryTicketItem() + .setId(IdUtil.getSnowflakeNextId()) + .setTicketId(ticket.getId()) + .setOrderItemId(orderItem.getId()) + .setNum(totalNum); + ticketItems.add(ticketItem); + + item.getDatas().forEach(data -> { + String batchNo = StrUtil.blankToDefault(data.getBatchNo(), ""); + String serialNo = StrUtil.blankToDefault(data.getSerialNo(), ""); + String binNo = StrUtil.blankToDefault(data.getBinNo(), ""); + records.add(new OutMaterialScanRecord() + .setSource(4) + .setSourceId(order.getId()) + .setSourceItemId(orderItem.getId()) + .setTicketId(ticket.getId()) + .setTicketItemId(ticketItem.getId()) + .setMaterialNo(orderItem.getMatnr()) + .setUnit(orderItem.getMeins()) + .setRspos(orderItem.getRspos()) + .setContent("") + .setBatchNo(batchNo) + .setSerialNo(serialNo) + .setUniqNo("NO_SCAN_" + IdUtil.getSnowflakeNextId()) + .setQiTao(false) + .setFactoryNo(order.getWerks()) + .setWarehouseNo(request.getWarehouseNo()) + .setBinNo(binNo) + .setNum(data.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(Instant.now()) + ); + orderItem.setLeft(orderItem.getLeft().subtract(data.getNum())); + VUtil.trueThrowBusinessError(orderItem.getLeft().compareTo(BigDecimal.ZERO) < 0) + .throwMessage("物料" + orderItem.getMatnr() + "的出库数量超出申请限制"); + }); + } + + transferFactoryTicketItemService.saveBatch(ticketItems); + transferFactoryItemService.updateBatchById(datas); + transferFactoryService.lambdaUpdate() + .set(WmsTransferFactory::getUpdateBy, UserUtil.getUserName()) + .set(WmsTransferFactory::getUpdateTime, LocalDateTime.now()) + .eq(WmsTransferFactory::getId, order.getId()) + .update(); + transferFactoryTicketService.save(ticket); + inventoryService.out(records.stream() + .collect(Collectors.groupingBy(OutMaterialScanRecord::getKey)) + .values() + .stream() + .map(list -> new InventoryOutDTO() + .setMaterialNo(list.get(0).getMaterialNo()) + .setBatchNo(list.get(0).getBatchNo()) + .setSerialNo(list.get(0).getSerialNo()) + .setFactoryNo(list.get(0).getFactoryNo()) + .setWarehouseNo(list.get(0).getWarehouseNo()) + .setBinLocation(list.get(0).getBinNo()) + .setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) + ).toList() + ); + outMaterialScanRecordRespository.saveAll(records); + return ApiResult.success(); + } + /** * 审核出库单 */ @@ -781,6 +892,129 @@ public class TransferFactoryController extends BaseController { return ApiResult.success(); } + /** + * 无码入库(PDA使用) + */ + @Transactional + @PostMapping("pda/submitForInNoScanning") + public ApiResult submitForInNoScanning(@Valid @RequestBody @NotNull NoScanningRequest request) { + TransferFactoryTicketInfoVO ticket = transferFactoryTicketService.getInfo(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("出库单不存在"); + VUtil.trueThrowBusinessError(!Objects.equals(ticket.getState(), 0)).throwMessage("出库单无效"); + List records1 = outMaterialScanRecordRespository.findByTicketId(ticket.getId()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(records1)).throwMessage("未找到出库记录"); + List ticketItems = transferFactoryTicketItemService.getList(ticket.getId()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(ticketItems)).throwMessage("出库单明细不存在"); + + Set matchedIds = new HashSet<>(); + List records = new ArrayList<>(); + for (NoScanningItemRequest item : request.getItems()) { + TransferFactoryItemVO ticketItem = findTicketItem(ticketItems, item.getOrderItemId()); + VUtil.trueThrowBusinessError(Objects.isNull(ticketItem)).throwMessage("物料" + item.getMaterialNo() + "不需要入库"); + VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), ticketItem.getMatnr())) + .throwMessage("出库单明细与物料不匹配:" + item.getMaterialNo()); + VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(ticketItem.getMatnr())) + .throwMessage("物料" + ticketItem.getMatnr() + "已生成二维码,不允许无码入库"); + + BigDecimal totalNum = item.getDatas().stream() + .peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0) + .throwMessage("物料" + ticketItem.getMatnr() + "的无码入库数量必须大于0")) + .map(NoScanningItemDataRequest::getNum) + .reduce(BigDecimal.ZERO, BigDecimal::add); + VUtil.trueThrowBusinessError(totalNum.compareTo(ticketItem.getNum()) != 0) + .throwMessage("物料" + ticketItem.getMatnr() + "的无码入库数量与出库数量不一致"); + + OutMaterialScanRecord outRecord = findOutRecord(records1, ticketItem); + VUtil.trueThrowBusinessError(Objects.isNull(outRecord)).throwMessage("未找到物料" + ticketItem.getMatnr() + "的出库记录"); + matchedIds.add(item.getOrderItemId()); + + item.getDatas().forEach(data -> { + String batchNo = StrUtil.blankToDefault(data.getBatchNo(), ""); + String serialNo = StrUtil.blankToDefault(data.getSerialNo(), ""); + String binNo = StrUtil.blankToDefault(data.getBinNo(), ""); + records.add(new InMaterialScanRecord() + .setSource(5) + .setSourceId(outRecord.getSourceId()) + .setSourceItemId(outRecord.getSourceItemId()) + .setTicketItemId(outRecord.getTicketItemId()) + .setMaterialNo(outRecord.getMaterialNo()) + .setContent(outRecord.getContent()) + .setBatchNo(batchNo) + .setSerialNo(serialNo) + .setFactoryNo(ticket.getWerks()) + .setWarehouseNo(request.getWarehouseNo()) + .setBinNo(binNo) + .setUniqNo(outRecord.getUniqNo()) + .setRspos(outRecord.getRspos()) + .setNum(data.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(Instant.now()) + ); + }); + } + + List missedMaterials = ticketItems.stream() + .filter(item -> !matchedIds.contains(item.getId()) && !matchedIds.contains(item.getOrderItemId())) + .map(TransferFactoryItemVO::getMatnr) + .distinct() + .toList(); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(missedMaterials)) + .throwMessage("以下物料未提交无码入库信息:" + StrUtil.join(",", missedMaterials)); + + inventoryService.in(records.stream() + .collect(Collectors.groupingBy(InMaterialScanRecord::getKey9)) + .values() + .stream() + .map(list -> new InventoryInDTO() + .setMaterialNo(list.get(0).getMaterialNo()) + .setBatchNo(list.get(0).getBatchNo()) + .setSerialNo(list.get(0).getSerialNo()) + .setFactoryNo(list.get(0).getFactoryNo()) + .setWarehouseNo(list.get(0).getWarehouseNo()) + .setBinLocation(list.get(0).getBinNo()) + .setNum(list.stream().map(InMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) + ).toList() + ); + ZWM00MB113DTO vo = sapService.zwm00_mb113(new ZWM00MB113QO() + .setIRsnum(ticket.getRsnum()) + .setIUmlgo(ticket.getUmlgo()) + .setT_list1(ticketItems.stream().map(item -> new ZWM00MB113LIST1QO() + .setRspos(item.getRspos()) + .setMatnr(item.getMatnr()) + .setErfmg(item.getNum()) + .setMeins(item.getMeins()) + .setWerks(ticket.getWerks()) + .setLgort(request.getWarehouseNo())).toList() + ) + .setT_list2(records1.stream() + .collect(Collectors.groupingBy(OutMaterialScanRecord::getKey6)) + .values() + .stream() + .map(ls -> new ZWM00MB113LIST2QO() + .setRspos(ls.get(0).getRspos()) + .setSernr(ls.get(0).getSerialNo()) + .setFlag("X") + ) + .toList() + ) + ); + OptRecordDTO optRecordDTO = new OptRecordDTO(); + optRecordDTO.setOperationType((short)1) + .setOrderId(ticket.getNo()); + optRecordService.add(optRecordDTO); + transferFactoryTicketService.lambdaUpdate() + .set(WmsTransferFactoryTicket::getMatDoc, vo.getEMblnr()) + .set(WmsTransferFactoryTicket::getDocYear, vo.getEMjahr()) + .set(WmsTransferFactoryTicket::getUpdateBy, UserUtil.getUserName()) + .set(WmsTransferFactoryTicket::getUpdateTime, LocalDateTime.now()) + .set(WmsTransferFactoryTicket::getLgort1, request.getWarehouseNo()) + .set(WmsTransferFactoryTicket::getState, 1) + .eq(WmsTransferFactoryTicket::getId, ticket.getId()) + .update(); + inMaterialScanRecordRespository.saveAll(records); + return ApiResult.success(); + } + /** * 搜索调拨凭证 */ @@ -847,4 +1081,19 @@ public class TransferFactoryController extends BaseController { PdfGeneratorUtil.generatePdf("厂内调拨入库单" + order.getTicketNo(), html, response); } + private TransferFactoryItemVO findTicketItem(List ticketItems, Long itemId) { + return ticketItems.stream() + .filter(item -> Objects.equals(item.getId(), itemId) || Objects.equals(item.getOrderItemId(), itemId)) + .findFirst() + .orElse(null); + } + + private OutMaterialScanRecord findOutRecord(List records, TransferFactoryItemVO ticketItem) { + return records.stream() + .filter(record -> Objects.equals(record.getTicketItemId(), ticketItem.getId()) + || Objects.equals(record.getSourceItemId(), ticketItem.getOrderItemId())) + .findFirst() + .orElse(null); + } + }