diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java index 55afef09..72a9bb6d 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java @@ -10,10 +10,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; -import com.nflg.wms.admin.pojo.dto.QCMaterialSyncDTO; -import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO; -import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO; -import com.nflg.wms.admin.pojo.dto.ZWM3A17Item2DTO; +import com.nflg.wms.admin.pojo.dto.*; import com.nflg.wms.admin.repository.SrmMaterialReceiptNoScanCodesRepository; import com.nflg.wms.admin.repository.SrmMaterialReceiptScanCodesRepository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; @@ -118,6 +115,8 @@ public class NormalPGIController extends BaseController { @Resource private IWmsOutProduceTicketItemService outProduceTicketItemService; + @Resource + private IWmsWarehouseService wmsWarehouseService; //收货单分页 /** @@ -287,7 +286,7 @@ public class NormalPGIController extends BaseController { */ @GetMapping("PDA/task") @ApiMark(moduleName = "送货单管理", apiName = "普通物料上架任务") - public ApiResult> takeDelivery(@RequestParam(required = false) String orederNo) { + public ApiResult> getTakeDelivery(@RequestParam(required = false) String orederNo) { List wmsPoReceipts = wmsPoReceiptItemService.getTask(orederNo); return ApiResult.success(wmsPoReceipts .stream() @@ -501,6 +500,41 @@ public class NormalPGIController extends BaseController { return sapSyncParamsDTOS; } + /** + * 收货直接入库的(未启用储位管理) + * + * @return + */ + private void setPoReceiveByIn(SrmMaterialReceiptQO item, + List wmsPoReceiptItems, + Long receiveId, + SAPSyncParamsDTO materialInfoInOrder, + Long receiveItemId + ) { + + WmsPoReceiptItem receiptItem = new WmsPoReceiptItem() + .setId(receiveItemId) + .setLineNumber(item.getLineNumber()) + .setItemCode(item.getItemCode()) + .setUomCode(materialInfoInOrder.getMeins()) + .setCreateUserId(UserUtil.getUserId()) + .setCreateUserName(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + .setReceiptNum(item.getReceiptNum()) + .setReceivedWarehouse(materialInfoInOrder.getWarehouseNo()) + .setStorageLocation("") + .setInQty(item.getReceiptNum()) + .setNoteNum(item.getNoteNum()) + .setItemName(materialInfoInOrder.getMaktx()) + .setCrossQty(new BigDecimal(0)) + .setPoLineNumber(item.getPoLineNumber()) + .setPoNum(item.getPoNum()) + .setReceiveId(receiveId) + .setOrderItemId(item.getId()) + .setMaterialDoc("") + .setMaterialDocYear(""); + wmsPoReceiptItems.add(receiptItem); + } private void setPoReceive(SrmMaterialReceiptQO item, List wmsPoReceiptItems, @@ -1341,7 +1375,8 @@ public class NormalPGIController extends BaseController { @ApiMark(moduleName = "打包扫码", apiName = "通过打包码获取到打包码的信息") public ApiResult> getPackageContents(@Valid @RequestBody PackingPDASearchQO request) { // 首先判断当前包是否已经收货了 - PacageScanVO pacageScanVO = wmsPackageService.getPackageInfo(request.getPackageCode()); + WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode()) + .one(); VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在"); VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包"); VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货"); @@ -1358,58 +1393,280 @@ public class NormalPGIController extends BaseController { @PostMapping("takeDeliveryConfirmUnScan") @ApiMark(moduleName = "无需扫码收货", apiName = "无需扫码收货") public ApiResult takeDeliveryConfirmUnScan(@Valid @RequestBody PendingUnScanningQO request) { -// VUtil.trueThrowBusinessError(request.getBarcodeIds().stream().distinct().count() != request.getBarcodeIds().size()).throwMessage("存在重复的码"); -// // 重新验证所有码的合法性 1、是否是已打包未收货的状态;2、是否全部是已启用储位管理的状态 -// List pacageScanVO = wmsPackageService.getPackageInfos(request.getBarcodeIds()); -// VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(pacageScanVO)).throwMessage("打包码不存在"); -// -// long count = pacageScanVO.stream() -// .filter(pkg -> Objects.equals(pkg.getPackageStatus(), (short) 0)) -// .count(); -// VUtil.trueThrowBusinessError(count >= 0).throwMessage("存在尚未打包的码"); -// long count1 = pacageScanVO.stream() -// .filter(pkg -> Objects.equals(pkg.getPackageStatus(), (short) 2)) -// .count(); -// VUtil.trueThrowBusinessError(count1 >= 0).throwMessage("存在已经收货的码"); -// -// long count2 = pacageScanVO.stream() -// .filter(pkg -> Objects.equals(pkg.getIsCounting(), 1)) -// .count(); -// VUtil.trueThrowBusinessError(count2 >= 0).throwMessage("存在必须扫码的包装"); -// List items = wmsPackageService.getScanningItems(request.getBarcodeIds()); -// //对箱码要做出来,将箱码换成对应的物料码 -// List materialCodes = items.stream().filter(item -> Objects.equals(item.getPackagingType(), 1)) -// .map(item -> item.getBarcodeId()) -// .distinct() -// .collect(Collectors.toList()); -//// List qrCodeMasters = wmsQrCodeMasterService.getByMaterialCodes(materialCodes); -//// if(CollectionUtil.isEmpty(materialCodes)) -//// { -//// //计算箱内物料的数量,并判断是否是打包状态 -//// -//// -//// -//// } -// -// -// //根据包装信息获取对应的物料收货信息 -// List receiptQOS = new ArrayList<>(); -// //首先要对上面的信息 按照 srmId进行分组,汇总quantity -// -// for (PendingScanningItemDTO item : items) { -// SrmMaterialReceiptQO qo = new SrmMaterialReceiptQO() -// .setNoteNum(item.getDeliveryNo()) -// .setLineNumber(item.getDeliveryLineNo()) -// .setPoNum(item.getPoNumber()) -// .setPoLineNumber(item.getPoLineNumber()) -// .setItemCode(item.getMaterialCode()) -// .setId(item.getSrmId()) -// .setReceiptNum(item.getQuantity()); -// -// // .setScanCodes(item.getScanCodes()); -// } + // 首先判断当前包是否已经收货了 + WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode()) + .one(); + VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在"); + VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包"); + VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货"); + List pdaOrderVO = normalPGIControllerService.getPackageContents(request.getPackageCode()); + // 无码的时候要判断仓库,只有所有仓库都是支持大码一键收货的情况 + List warehouseCodes = pdaOrderVO.stream().map(PDAOrderItemVO::getReceivedWarehouse).distinct().collect(Collectors.toList()); + List warehouseList = wmsWarehouseService.lambdaQuery() + .in(WmsWarehouse::getNo, warehouseCodes) + .eq(WmsWarehouse::getBigBoxFastReceipt, false) + .list(); + if (CollectionUtil.isNotEmpty(warehouseList)) { + List warehouseNoList = warehouseList.stream().map(WmsWarehouse::getName).collect(Collectors.toList()); + VUtil.trueThrowBusinessError(true).throwMessage("仓库[" + warehouseNoList.stream().collect(Collectors.joining(";")) + "]"); + } -return ApiResult.success(); + + List dtos = wmsPackageService.getPackageItemDetails(request.getPackageCode()); + //对中码进行一个操作 + List parentIds = dtos.stream().filter(dto -> dto.getPackagingType() == 0) + .map(WmsPackageItemDetailDTO::getBarcodeId).collect(Collectors.toList()); + + if (CollectionUtil.isNotEmpty(parentIds)) { + List childMasters = wmsQrCodeMasterService.lambdaQuery() + .in(WmsQrCodeMaster::getParentBarcodeId, parentIds).list(); + childMasters.forEach(child -> { + WmsPackageItemDetailDTO dto = new WmsPackageItemDetailDTO(); + dto.setBarcodeId(child.getId()); + dto.setMaterialCode(child.getMaterialCode()); + dto.setPackagingType(child.getPackagingType()); + dto.setBatchNo(child.getBatchNo()); + dto.setSerialNo(child.getSerialNo()); + dto.setQuantity(child.getQuantity()); + dto.setPackagingType(child.getPackagingType()); + WmsPackageItemDetailDTO parentDto = dtos.stream() + .filter(dto1 -> dto1.getBarcodeId().equals(child.getParentBarcodeId())).findFirst().get(); + dto.setSrmOrderItemId(parentDto.getSrmOrderItemId()); + dto.setPackageItemId(parentDto.getPackageItemId()); + dtos.add(dto); + }); + } + + List receipts = new ArrayList<>(); +//根据送货单号进行排序 + List orderNos = pdaOrderVO.stream().map(PDAOrderItemVO::getDeliveryNo).distinct().collect(Collectors.toList()); + for (String orderNo : orderNos) { + SrmReceiptQO qo = new SrmReceiptQO(); + qo.setDeliveryNo(orderNo); + //根据送货单号,查找送货单的送货详情 + List items = pdaOrderVO.stream().filter(item -> item.getDeliveryNo().equals(orderNo)).collect(Collectors.toList()); + List receiptQOS = new ArrayList<>(); + for (PDAOrderItemVO item : items) { + SrmMaterialReceiptQO qoItem = new SrmMaterialReceiptQO() + .setId(item.getId()) + .setNoteNum(item.getDeliveryNo()) + .setLineNumber(item.getLineNumber()) + .setPoNum(item.getPoNum()) + .setPoLineNumber(item.getPoLineNumber()) + .setItemCode(item.getItemCode()) + .setReceivedWarehouse(item.getReceivedWarehouse()) + .setUomCode(item.getUomCode()) + .setReceiptNum(item.getDeliveryQty()); + List scanCodes = new ArrayList<>(); + List dtos1 = dtos.stream() + .filter(dto -> dto.getSrmOrderItemId().equals(item.getId())).collect(Collectors.toList()); + for (WmsPackageItemDetailDTO dto : dtos1) { + PDAScanCodeQO scanCode = new PDAScanCodeQO(); + scanCode.setCodeContent(dto.getBarcodeId().toString() + dto.getPackagingType().toString()); + scanCode.setCodeNum(dto.getQuantity()); + scanCode.setBatchNumber(dto.getBatchNo()); + scanCode.setSerialNumbers(dto.getSerialNo()); + scanCode.setCodeId(dto.getBarcodeCode()); + scanCodes.add(scanCode); + } + qoItem.setScanCodes(scanCodes); + receiptQOS.add(qoItem); + } + qo.setReceiptQOS(receiptQOS); + } + //开始收货 + GoodReceipt(receipts, pacageScanVO.getId()); + return ApiResult.success(); + } + + + private void GoodReceipt(List receipts, Long packageId) { + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(receipts)).throwMessage("收货参数为空"); + List dtos = new ArrayList<>(); + for (SrmReceiptQO request : receipts) { + List wmsPoReceiptItems = new ArrayList<>(); + List wmsQcReceiveItems = new ArrayList<>(); + List srmMaterialReceiptScanCodes = new ArrayList<>(); + List qcMaterialSyncDTOS = new ArrayList<>(); + List inventories = new ArrayList<>(); + List zwm3A17DTOS = new ArrayList<>(); + List qrCodes = new ArrayList<>(); + WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, request.getDeliveryNo()).one(); + VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("收货单不存在"); + List sapSyncParamsDTOS = getSapSyncParamsDTOS(request.getReceiptQOS(), order); + WmsPoReceipt wmsPoReceipt = new WmsPoReceipt() + .setCreateTime(LocalDateTime.now()) + .setId(IdUtil.getSnowflakeNextId()) + .setOrderNo(order.getNoteNum()) + .setCreateUserName(UserUtil.getUserName()) + .setCreateUserId(UserUtil.getUserId()) + .setFactoryCode(order.getIuCode()) + .setSourceType(0) + .setIsCompleted(false); + WmsQcReceive wmsQcReceive = new WmsQcReceive() + .setCreateTime(LocalDateTime.now()) + .setId(IdUtil.getSnowflakeNextId()) + .setIsCompleted((short) 0) + .setOrderNo(order.getNoteNum()) + .setCreateUserName(UserUtil.getUserName()) + .setFactoryCode(order.getIuCode()) + .setIsCheck(false) + .setSourceType(0) + .setCreateUserId(UserUtil.getUserId()); + for (SrmMaterialReceiptQO item : request.getReceiptQOS()) { + if (item.getReceiptNum().equals(BigDecimal.ZERO)) { + continue; + } + SAPSyncParamsDTO materialInfoInOrder = sapSyncParamsDTOS.stream() + .filter(sapSyncParamsDTO -> + sapSyncParamsDTO.getEbeln().equals(item.getPoNum()) + && sapSyncParamsDTO.getEbelp().equals(item.getPoLineNumber())) + .findFirst() + .orElse(null); + //数量验证(判断收货数量是否大于了未收数量) + VUtil.trueThrowBusinessError(item.getReceiptNum().compareTo(materialInfoInOrder.getTransportNum()) > 0).throwMessage("物料收货数量[" + item.getReceiptNum() + "]大于了未收数量[" + materialInfoInOrder.getTransportNum() + "],订单号:" + item.getPoNum()); + Long orderItemId = IdUtil.getSnowflakeNextId(); + //序列号和批次号验证 + List codes = normalPGIControllerService.validateScanCodes(item, materialInfoInOrder, orderItemId); + if (CollectionUtil.isNotEmpty(codes)) { + srmMaterialReceiptScanCodes.addAll(codes); + } + boolean isQuality = materialInfoInOrder.getKzkri().equals("X"); + if (isQuality) { + setQcMaterialSyncDto(qcMaterialSyncDTOS, item, order, codes, materialInfoInOrder, wmsQcReceiveItems, wmsQcReceive.getId(), orderItemId); + for (PDAScanCodeQO code : item.getScanCodes()) { + // 处理条码 + WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery() + .eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId()) + .one(); + VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "】"); + qrCodeMaster.setLastScanTime(LocalDateTime.now()); + qrCodeMaster.setLastScanBy(UserUtil.getUserId()); + qrCodeMaster.setLastScanByname(UserUtil.getUserName()); + qrCodeMaster.setProcessStage(BarCodeProcessStage.Checking.getState()); + qrCodeMaster.setReceiptItemId(orderItemId); + qrCodes.add(qrCodeMaster); + } + } else { + WmsWarehouse warehouse = wmsWarehouseService.lambdaQuery().eq(WmsWarehouse::getNo, item.getReceivedWarehouse()).one(); + if (!warehouse.getIsDisableLocation()) { + //设置收货明细项 + setPoReceiveByIn(item, wmsPoReceiptItems, wmsPoReceipt.getId(), materialInfoInOrder, orderItemId); + //设置SAP过账接口 + ZWM3A17DTO zwm3A17DTO = zwm3A17DTOS.stream() + .filter(zwm3A17DTO1 -> zwm3A17DTO1.getEbeln().equals(item.getPoNum())) + .findFirst() + .orElse(null); + if (Objects.isNull(zwm3A17DTO)) { + zwm3A17DTO = new ZWM3A17DTO() + .setEbeln(item.getPoNum()) + .setUsnam(UserUtil.getUserName()) + .setReceiveId(orderItemId) + .setItem1(new ArrayList<>()) + .setItem2(new ArrayList<>()); + zwm3A17DTOS.add(zwm3A17DTO); + } + List item1 = zwm3A17DTO.getItem1(); + List item2 = zwm3A17DTO.getItem2(); + for (PDAScanCodeQO code : item.getScanCodes()) { + // 处理条码 + WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery() + .eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId()) + .one(); + VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "】"); + qrCodeMaster.setLastScanTime(LocalDateTime.now()); + qrCodeMaster.setLastScanBy(UserUtil.getUserId()); + qrCodeMaster.setLastScanByname(UserUtil.getUserName()); + qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState()); + qrCodeMaster.setReceiptItemId(orderItemId); + qrCodes.add(qrCodeMaster); + if (qrCodeMaster.getPackagingType().equals(1)) { + continue; + } + // 库存 + InventoryDTO inventoryDTO = inventories.stream() + .filter(inventoriesDTO -> inventoriesDTO.getMaterialNo().equals(item.getItemCode()) + && inventoriesDTO.getBatchNo().equals(code.getBatchNumber()) + && inventoriesDTO.getSerialNo().equals(code.getSerialNumbers()) + && inventoriesDTO.getFactoryNo().equals(wmsPoReceipt.getFactoryCode()) + && inventoriesDTO.getWarehouseNo().equals(item.getReceivedWarehouse()) + ).findFirst().orElse(null); + if (Objects.isNull(inventoryDTO)) { + inventoryDTO = new InventoryDTO() + .setMaterialNo(item.getItemCode()) + .setFactoryNo(wmsPoReceipt.getFactoryCode()) + .setWarehouseNo(item.getReceivedWarehouse()) + .setBatchNo(code.getBatchNumber()) + .setSerialNo(code.getSerialNumbers()) + .setNum(code.getCodeNum()); + inventories.add(inventoryDTO); + } else { + inventoryDTO.setNum(inventoryDTO.getNum().add(code.getCodeNum())); + } + ZWM3A17Item1DTO ietm1Dto = item1.stream() + .filter(dto1 -> + dto1.getEBELP().equals(item.getPoLineNumber()) + && dto1.getMATNR().equals(item.getItemCode()) + && dto1.getMeins().equals(item.getUomCode()) + && dto1.getCHARG().equals(code.getBatchNumber()) + && dto1.getWERKS().equals(wmsPoReceipt.getFactoryCode()) + && dto1.getLGORT().equals(item.getReceivedWarehouse()) + ).findFirst().orElse(null); + if (Objects.isNull(ietm1Dto)) { + item1.add(new ZWM3A17Item1DTO() + .setEBELP(item.getPoLineNumber()) + .setMATNR(item.getItemCode()) + .setERFMG(code.getCodeNum()) + .setMEINS(item.getUomCode()) + .setCHARG(code.getBatchNumber()) + .setWERKS(wmsPoReceipt.getFactoryCode()) + .setLGORT(item.getReceivedWarehouse()) + .setKZKRI("") + ); + } else { + ietm1Dto.setERFMG(ietm1Dto.getERFMG().add(code.getCodeNum())); + } + + item2.add(new ZWM3A17Item2DTO() + .setEBELP(item.getPoLineNumber()) + .setFLAG("") + .setSERNR(code.getSerialNumbers())); + } + //................... + } else { + setPoReceive(item, wmsPoReceiptItems, wmsPoReceipt.getId(), materialInfoInOrder, orderItemId); + for (PDAScanCodeQO code : item.getScanCodes()) { + // 处理条码 + WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery() + .eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId()) + .one(); + VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "】"); + qrCodeMaster.setLastScanTime(LocalDateTime.now()); + qrCodeMaster.setLastScanBy(UserUtil.getUserId()); + qrCodeMaster.setLastScanByname(UserUtil.getUserName()); + qrCodeMaster.setStorageLocation(materialInfoInOrder.getWarehouseNo()); + qrCodeMaster.setProcessStage(BarCodeProcessStage.Received.getState()); + qrCodeMaster.setReceiptItemId(orderItemId); + qrCodes.add(qrCodeMaster); + } + } + } + //========= + } + GoodReceiptDTO dto = new GoodReceiptDTO() + .setWmsPoReceipt(wmsPoReceipt) + .setWmsQcReceive(wmsQcReceive) + .setWmsPoReceiptItems(wmsPoReceiptItems) + .setWmsQcReceiveItems(wmsQcReceiveItems) + .setSrmMaterialReceiptScanCodes(srmMaterialReceiptScanCodes) + .setOrderId(order.getId()) + .setInventories(inventories) + .setZwm3A17DTOS(zwm3A17DTOS) + .setQrCodes(qrCodes) + .setQcMaterialSyncDTOS(qcMaterialSyncDTOS); + dtos.add(dto); + } + normalPGIControllerService.takeDeliveryByPackage(dtos, packageId); } /** @@ -1419,7 +1676,29 @@ return ApiResult.success(); */ @PostMapping("takeDeliveryConfirmByScan") @ApiMark(moduleName = "需扫码收货", apiName = "需扫码收货") - public ApiResult takeDeliveryConfirmByScan(@Valid @RequestBody List request) { + public ApiResult takeDeliveryConfirmByScan(@Valid @RequestBody GoodReceiptQO request) { + // 首先判断当前包是否已经收货了 + WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode()) + .one(); + VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在"); + VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包"); + VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货"); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getItems())).throwMessage("没有收货的物料信息"); + List receipts = new ArrayList<>(); + List orderNos = request.getItems().stream().map(it -> it.getNoteNum()).distinct().toList(); + for (String orderNo : orderNos) { + SrmReceiptQO receipt = new SrmReceiptQO(); + receipt.setDeliveryNo(orderNo); + List items = request.getItems().stream().filter(it -> it.getNoteNum().equals(orderNo)).toList(); + for (SrmMaterialReceiptQO item : items) { + // 盘点是否有条码 + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(item.getScanCodes())).throwMessage("[" + item.getItemCode() + "]没有码信息"); + } + receipt.setReceiptQOS(items); + receipts.add(receipt); + } + GoodReceipt(receipts, pacageScanVO.getId()); return ApiResult.success(); } } + diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/QrCodeMasterController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/QrCodeMasterController.java index f3c20b00..281e3d12 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/QrCodeMasterController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/QrCodeMasterController.java @@ -310,7 +310,7 @@ public class QrCodeMasterController extends BaseController { // 查询子条形码并累加其数量 List qrCodeMasters = qrCodeMasterService.lambdaQuery() .eq(WmsQrCodeMaster::getParentBarcodeId, qrCodeMaster.getId()) - .eq(WmsQrCodeMaster::getProcessStage, request.getProcessStage()) + .in(WmsQrCodeMaster::getProcessStage, request.getProcessStage()) .list(); VUtil.trueThrowBusinessError(ObjectUtil.isNull(qrCodeMasters)) .throwMessage("此箱[" + request.getPackageCode() + "]为空箱"); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/GoodReceiptDTO.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/GoodReceiptDTO.java new file mode 100644 index 00000000..eabc4274 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/GoodReceiptDTO.java @@ -0,0 +1,63 @@ +package com.nflg.wms.admin.pojo.dto; + +import com.nflg.wms.common.pojo.document.SrmMaterialReceiptScanCodes; +import com.nflg.wms.common.pojo.dto.InventoryDTO; +import com.nflg.wms.repository.entity.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class GoodReceiptDTO { + /** + * 采购收货单 单头 + */ + private WmsPoReceipt wmsPoReceipt; + + /** + * 质检收货单 单头 + */ + private WmsQcReceive wmsQcReceive; + + /** + * 采购收货单 单行 + */ + private List wmsPoReceiptItems; + + /** + * 质检收货单 单行 + */ + private List wmsQcReceiveItems; + + /** + * 扫描码 + */ + private List srmMaterialReceiptScanCodes; + + /** + * 质检同步数据到SAP + */ + private List qcMaterialSyncDTOS; + + /** + * 采购单ID + */ + private Long orderId; + + /** + * 库存数据 + */ + private List inventories; + + /** + *同步库存到SAP的数据 + */ + private List zwm3A17DTOS; + + /** + * 条码数据 + */ + private List qrCodes; +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/ZWM3A17DTO.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/ZWM3A17DTO.java index 0dca2e13..4419faaf 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/ZWM3A17DTO.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/ZWM3A17DTO.java @@ -20,6 +20,11 @@ public class ZWM3A17DTO { */ private String usnam; + /** + * 收货单ID + */ + private Long receiveId; + private List item1 = new ArrayList<>(); private List item2 = new ArrayList<>(); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/NormalPGIControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/NormalPGIControllerService.java index e2d0b3da..e82d5467 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/NormalPGIControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/NormalPGIControllerService.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.nflg.wms.admin.pojo.dto.GoodReceiptDTO; import com.nflg.wms.admin.pojo.dto.QCMaterialSyncDTO; import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO; import com.nflg.wms.admin.repository.SrmMaterialReceiptNoScanCodesRepository; @@ -104,6 +105,12 @@ public class NormalPGIControllerService { @Resource private IWmsPackageService wmsPackageService; + @Resource + private IWmsQrCodeMasterService qrCodeMasterService; + + @Resource + private IWmsPackageItemService wmsPackageItemService; + /** * 根据订单编号获取订单详情信息,包括订单头信息和订单行项目信息。 *

@@ -544,61 +551,78 @@ public class NormalPGIControllerService { } public List getPackageContents(@NotNull @NotBlank String packageCode) { -// List packagePOItems = wmsPackageService.getPackagePOItems(packageCode); -// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(packagePOItems)).throwMessage("获取打包物料信息异常"); -// -// -// // 根据订单编号查询订单主表信息 -// WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, orderNo) -// .eq(WmsSrmOrder::getIsCompleted, false).one(); -// VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("此收货单[" + orderNo + "] 单号无效"); -// -// PDAOrderVO pdaOrderVO = new PDAOrderVO(); -// // 设置订单头基本信息 -// pdaOrderVO.setNoteNum(order.getNoteNum()); -// pdaOrderVO.setSupplierNum(order.getSupplierNum()); -// pdaOrderVO.setSupplierName(order.getSupplierName()); -// -// // 查询订单行项目列表 -// List orderItemList = wmsSrmOrderItemService.lambdaQuery() -// .eq(WmsSrmOrderItem::getOrderId, order.getId()) -// .list(); -// VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItemList)).throwMessage("此收货单[" + orderNo + "] 已完成收货,无需再次操作"); -// -// List orderItemVOList = new ArrayList<>(); -// // 遍历订单行项目,填充详细信息并从 SAP 获取补充数据 -// for (WmsSrmOrderItem item : orderItemList) { -// PDAOrderItemVO itemVO = new PDAOrderItemVO(); -// itemVO.setId(item.getId()); -// itemVO.setPoLineNumber(item.getPoLineNumber()); -// itemVO.setPoNum(item.getPoNum()); -// itemVO.setItemCode(item.getItemCode()); -// itemVO.setItemName(item.getItemName()); -// itemVO.setIsQuality(item.getIsQuality()); -// itemVO.setOrderQty(item.getOrderQty()); -// itemVO.setUomCode(item.getUomCode()); -// itemVO.setLineNumber(item.getLineNumber()); -// itemVO.setDeliveryQty(item.getDeliveryQty().subtract(item.getReceiptQty())); -// // 从 SAP 系统获取物料相关信息 -// SAPSyncParamsDTO syncParamsDTO = sapCommonService.getMaterialInfoInOrder(item.getPoNum(), -// order.getSupplierNum(), item.getItemCode(), item.getPoLineNumber()); -// if (Objects.nonNull(syncParamsDTO)) { -// itemVO.setItemName(syncParamsDTO.getMaktx()); -// itemVO.setUomCode(syncParamsDTO.getMeins()); -// itemVO.setOrderQty(syncParamsDTO.getMenge()); -// itemVO.setReceivedWarehouse(syncParamsDTO.getWarehouseNo()); -// itemVO.setBinNos(syncParamsDTO.getBinNos()); -// itemVO.setLbprt(syncParamsDTO.getLbprt()); -// itemVO.setTransportNum(syncParamsDTO.getTransportNum()); -// // 判断是否质检 -// boolean isQuality = "X".equals(syncParamsDTO.getKzkri()); -// itemVO.setIsQuality(isQuality); -// orderItemVOList.add(itemVO); -// } -// } -// // 设置订单行项目列表到返回对象中 -// pdaOrderVO.setOrderItemVOList(orderItemVOList); - // return pdaOrderVO; - return null; + List packagePOItems = wmsPackageService.getPackagePOItems(packageCode); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(packagePOItems)).throwMessage("此大包中的物料已完成收货"); + + List orderItemVOList = new ArrayList<>(); + // 遍历订单行项目,填充详细信息并从 SAP 获取补充数据 + for (PackagePOItemDTO item : packagePOItems) { + PDAOrderItemVO itemVO = new PDAOrderItemVO(); + itemVO.setId(item.getSrmOrderId()); + itemVO.setPoLineNumber(item.getPoLineNumber()); + itemVO.setPoNum(item.getPoNumber()); + itemVO.setItemCode(item.getMaterialCode()); + itemVO.setItemName(item.getMaterialDescription()); + itemVO.setOrderQty(item.getOrderQty()); + // itemVO.setUomCode(item.getUomCode()); + itemVO.setLineNumber(item.getDeliveryLineNo()); + itemVO.setDeliveryQty(item.getPackingQuantity()); + itemVO.setDeliveryNo(item.getDeliveryNo()); + // 从 SAP 系统获取物料相关信息 + SAPSyncParamsDTO syncParamsDTO = sapCommonService.getMaterialInfoInOrder(item.getPoNumber(), + item.getSupplierCode(), item.getMaterialCode(), item.getPoLineNumber()); + if (Objects.nonNull(syncParamsDTO)) { + itemVO.setItemName(syncParamsDTO.getMaktx()); + itemVO.setUomCode(syncParamsDTO.getMeins()); + itemVO.setOrderQty(syncParamsDTO.getMenge()); + itemVO.setReceivedWarehouse(syncParamsDTO.getWarehouseNo()); + itemVO.setBinNos(syncParamsDTO.getBinNos()); + itemVO.setLbprt(syncParamsDTO.getLbprt()); + itemVO.setTransportNum(syncParamsDTO.getTransportNum()); + // 判断是否质检 + boolean isQuality = "X".equals(syncParamsDTO.getKzkri()); + itemVO.setIsQuality(isQuality); + orderItemVOList.add(itemVO); + } + } + return orderItemVOList; + } + + @Transactional + public void takeDeliveryByPackage(List dtos, Long packageId) { + for (GoodReceiptDTO dto : dtos) { + //收货 + takeDelivery(dto.getWmsPoReceipt(), dto.getWmsQcReceive(), dto.getWmsPoReceiptItems(), dto.getWmsQcReceiveItems() + , dto.getSrmMaterialReceiptScanCodes(), dto.getQcMaterialSyncDTOS(), dto.getOrderId() + ); + //入库 + if (CollectionUtil.isNotEmpty(dto.getInventories())) { + inventoryService.in(dto.getInventories()); + } + //过账SAP + if (CollectionUtil.isNotEmpty(dto.getZwm3A17DTOS())) { + for (ZWM3A17DTO zwm3A17DTO : dto.getZwm3A17DTOS()) { + Pair, Pair> returnDto = sapService.zwm3a17(zwm3A17DTO); + wmsPoReceiptItemService.lambdaUpdate() + .eq(WmsPoReceiptItem::getPoNum, zwm3A17DTO.getEbeln()) + .eq(WmsPoReceiptItem::getReceiveId, zwm3A17DTO.getReceiveId()) + .set(WmsPoReceiptItem::getMaterialDoc, returnDto.getKey().getKey()) + .set(WmsPoReceiptItem::getMaterialDocYear, returnDto.getValue().getValue()) + .update(); + } + } + //编码管理 + if (CollectionUtil.isNotEmpty(dto.getQrCodes())) { + qrCodeMasterService.updateBarCode(dto.getQrCodes()); + // 修改包装项的收货状态 + if (Objects.nonNull(packageId) && packageId > 0) { + List codeIds = dto.getQrCodes().stream().map(WmsQrCodeMaster::getBarcodeCode).toList(); + wmsPackageItemService.lambdaUpdate() + .eq(WmsPackageItem::getPackageId, packageId) + .in(WmsPackageItem::getBarcodeCode, codeIds) + .set(WmsPackageItem::getPackageStatus, (short) 2); + } + } + } } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/BarCodeProcessStage.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/BarCodeProcessStage.java index c45ff417..5b0b9bb0 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/BarCodeProcessStage.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/constant/BarCodeProcessStage.java @@ -12,11 +12,12 @@ public enum BarCodeProcessStage { Packaged((short) 1, "已装箱"), UnLoaded((short) 2, "未打包"), Loaded((short) 3, "已打包"), - Received ((short) 4, "已收货"), + Received((short) 4, "已收货"), Checking((short) 5, "质检中"), InBound((short) 6, "已入库"), OutBound((short) 7, "已出库"), //已被使用,只有退库的时候才会被重新激活 - Hold((short) 8, "已挂起");// 用于仓库转储,出库之后此二维码还需要继续使用,用一个特殊的状态标记 + Hold((short) 8, "已挂起"), + Checked((short) 9, "质检已完成"); // 用于仓库转储,出库之后此二维码还需要继续使用,用一个特殊的状态标记 private final short state; private final String description; diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackagePOItemDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackagePOItemDTO.java index 3ef94188..c32980c5 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackagePOItemDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackagePOItemDTO.java @@ -10,6 +10,22 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) public class PackagePOItemDTO { + + /** + * 包码 + */ + private String packageCode; + + /** + * 送货单项ID + */ + private Long srmOrderId; + + /** + * 供应商编号 + */ + private String supplierCode; + /** * 物料编号 */ @@ -37,13 +53,19 @@ public class PackagePOItemDTO { private String poNumber; /** - * 仓库 + * 采购单行号 */ - private String storageLocation; + private String poLineNumber; + /** * 送货单单号 */ private String deliveryNo; + /** + * 送货单行号 + */ + private String deliveryLineNo; + } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/WmsPackageItemDetailDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/WmsPackageItemDetailDTO.java new file mode 100644 index 00000000..a0d423e3 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/WmsPackageItemDetailDTO.java @@ -0,0 +1,56 @@ +package com.nflg.wms.common.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +public class WmsPackageItemDetailDTO { + + /* * + * 条码ID + */ + private Long barcodeId; + + /** + * 包装项ID + */ + + private Long packageItemId; + + /** + * 条码编号 + */ + private String barcodeCode; + + /** + * 订单项ID + */ + private Long srmOrderItemId; + /** + * 条码编号 + */ + + /** + * 物料编号 + */ + private String materialCode; + /** + * 包装类型 0 为箱子;1 为物料码 + */ + private Short packagingType; + /** + * 批次编号 + */ + private String batchNo; + /** + * 序列编号 + */ + private String serialNo; + /** + * 数量 + */ + private BigDecimal quantity; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/GoodReceiptQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/GoodReceiptQO.java new file mode 100644 index 00000000..400722b1 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/GoodReceiptQO.java @@ -0,0 +1,21 @@ +package com.nflg.wms.common.pojo.qo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class GoodReceiptQO { + /** + * 打包码编号 + */ + private String packageCode; + + /** + * 扫码记录 + */ + private List items; + +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PendingScanningQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PendingScanningQO.java index b163cff7..d522f540 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PendingScanningQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PendingScanningQO.java @@ -28,4 +28,8 @@ public class PendingScanningQO { */ private BigDecimal pendingScanQuantity; + /** + * 仓库编号 + */ + private String warehouseCode; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmMaterialReceiptQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmMaterialReceiptQO.java index 5ec69950..55863e11 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmMaterialReceiptQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmMaterialReceiptQO.java @@ -18,7 +18,7 @@ public class SrmMaterialReceiptQO { /** * 送货单行ID */ - private Long id; + private Long id; /** * 订单编号 @@ -52,11 +52,19 @@ public class SrmMaterialReceiptQO { @NotNull private BigDecimal receiptNum; + /** + * 收货仓库 + */ + private String receivedWarehouse; + /** * 扫码记录 */ private List scanCodes; - + /** + * 物料单位 + */ + private String uomCode; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmReceiptQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmReceiptQO.java new file mode 100644 index 00000000..2f2df941 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/SrmReceiptQO.java @@ -0,0 +1,22 @@ +package com.nflg.wms.common.pojo.qo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Accessors(chain = true) +public class SrmReceiptQO { + + /** + * 送货单号 + */ + private String deliveryNo; + + /** + * 收货明细 + */ + private List receiptQOS; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PDAOrderItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PDAOrderItemVO.java index eb45b518..de22b70e 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PDAOrderItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PDAOrderItemVO.java @@ -1,8 +1,11 @@ package com.nflg.wms.common.pojo.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.nflg.wms.common.pojo.qo.PDAScanCodeQO; import lombok.Data; import java.math.BigDecimal; +import java.util.List; @Data public class PDAOrderItemVO { @@ -78,4 +81,9 @@ public class PDAOrderItemVO { */ private BigDecimal transportNum; + /** + * 送货单单号 + */ + private String deliveryNo; + } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsPackageMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsPackageMapper.java index 5e37170e..f60ec6e1 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsPackageMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsPackageMapper.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.dto.PackagePOItemDTO; import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO; +import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO; import com.nflg.wms.common.pojo.qo.PackingQO; import com.nflg.wms.common.pojo.qo.PackingSearchQO; import com.nflg.wms.common.pojo.vo.*; @@ -42,4 +43,6 @@ public interface WmsPackageMapper extends BaseMapper { List getScanningItems(List barcodeIds); List getPackagePOItems(String packageCode); + + List getPackageItemDetails(String packageCode); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsPackageService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsPackageService.java index 9f0ab0ff..d9104bd9 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsPackageService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsPackageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.dto.PackagePOItemDTO; import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO; +import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO; import com.nflg.wms.common.pojo.qo.PackingQO; import com.nflg.wms.common.pojo.qo.PackingSearchQO; import com.nflg.wms.common.pojo.vo.*; @@ -51,4 +52,6 @@ public interface IWmsPackageService extends IService { List getScanningItems(List barcodeIds); List getPackagePOItems(@NotNull @NotBlank String packageCode); + + List getPackageItemDetails(String packageCode); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsPackageServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsPackageServiceImpl.java index be7bfa6e..284d46ed 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsPackageServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsPackageServiceImpl.java @@ -8,6 +8,7 @@ import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.dto.PackagePOItemDTO; import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO; +import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO; import com.nflg.wms.common.pojo.qo.PackingQO; import com.nflg.wms.common.pojo.qo.PackingSearchQO; import com.nflg.wms.common.pojo.vo.*; @@ -143,5 +144,10 @@ public class WmsPackageServiceImpl extends ServiceImpl getPackageItemDetails(String packageCode) { + return baseMapper.getPackageItemDetails(packageCode); + } + } diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsPackageMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsPackageMapper.xml index 6d43e126..4e677ac3 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsPackageMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsPackageMapper.xml @@ -178,20 +178,67 @@ + +