diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentOutboundController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentOutboundController.java index 5fd33589..f5d83d01 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentOutboundController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentOutboundController.java @@ -7,9 +7,13 @@ import cn.hutool.core.lang.Pair; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; +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.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.service.ComponentOutboundControllerService; +import com.nflg.wms.admin.service.NoScanningBaseControllerService; import com.nflg.wms.admin.service.SapService; import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.pojo.ApiResult; @@ -37,6 +41,7 @@ import java.time.Instant; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -85,6 +90,9 @@ public class ComponentOutboundController extends BaseController { @Resource private IOptRecordService optRecordService; + @Resource + private NoScanningBaseControllerService noScanningBaseControllerService; + /** * 零部件的出库单列表 * @param request 零部件出库单搜索条件参数对象,包含分页信息和搜索条件 @@ -394,6 +402,103 @@ public class ComponentOutboundController extends BaseController { return ApiResult.success(); } + /** + * 无码确认出库单 + * @param request 无码确认出库参数 + */ + @Transactional + @PostMapping("pda/confirmNoScanning") + public ApiResult confirmPdaNoScanning(@Valid @RequestBody NoScanningRequest request) { + WmsComponentPacking packing = wmscomponentPackingService.getById(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(packing)).throwMessage("此装箱单不存在"); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getItems())).throwMessage("无发货详情信息"); + + List packingItems = wmsComponentPackingItemService.lambdaQuery() + .eq(WmsComponentPackingItem::getPackingId, packing.getId()) + .list(); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(packingItems)).throwMessage("无法找到有效的装箱单详情"); + Map packingItemMap = packingItems.stream() + .collect(Collectors.toMap(WmsComponentPackingItem::getId, item -> item)); + + WmsComponentOutbound outbound = setWmsComponentOutbound(packing).setFinish(true); + List outboundItems = new ArrayList<>(); + List inventories = new ArrayList<>(); + List records = new ArrayList<>(); + ZWM3A20DTO zwm3a20DTO = new ZWM3A20DTO() + .setItSernrPatch(new ArrayList<>()) + .setItem(new ArrayList<>()) + .setItSernr(new ArrayList<>()) + .setItLipsItem(new ArrayList<>()) + .setIType("A") + .setIvDelivery(packing.getVbelv()); + + for (NoScanningItemRequest item : request.getItems()) { + WmsComponentPackingItem packingItem = packingItemMap.get(item.getOrderItemId()); + VUtil.trueThrowBusinessError(Objects.isNull(packingItem)).throwMessage("无效的装箱单明细"); + VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), packingItem.getIdnrk())) + .throwMessage("装箱单明细与物料不匹配:" + item.getMaterialNo()); + VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(packingItem.getIdnrk())) + .throwMessage("物料" + packingItem.getIdnrk() + "已生成二维码,不允许无码出库"); + + WmsComponentOutboundItem outboundItem = setWmsComponentOutboundItem(packing, packingItem, outbound, request.getWarehouseNo()); + outboundItems.add(outboundItem); + + BigDecimal totalNum = item.getDatas().stream() + .peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0) + .throwMessage("物料" + packingItem.getIdnrk() + "的无码出库数量必须大于0")) + .map(NoScanningItemDataRequest::getNum) + .reduce(BigDecimal.ZERO, BigDecimal::add); + VUtil.trueThrowBusinessError(outboundItem.getOutQty().compareTo(totalNum) != 0) + .throwMessage("物料[" + outboundItem.getIdnrk() + "]的出库数量[" + totalNum + "]不等于装箱数量[" + outboundItem.getOutQty() + "]"); + + List scanCodesGroup = new ArrayList<>(); + for (NoScanningItemDataRequest data : item.getDatas()) { + String batchNo = StrUtil.blankToDefault(data.getBatchNo(), ""); + String serialNo = StrUtil.blankToDefault(data.getSerialNo(), ""); + String binNo = StrUtil.blankToDefault(data.getBinNo(), ""); + records.add(new OutMaterialScanRecord() + .setSource(7) + .setSourceId(packing.getId()) + .setSourceItemId(outboundItem.getPackingItemId()) + .setTicketId(outbound.getId()) + .setTicketItemId(outboundItem.getId()) + .setMaterialNo(outboundItem.getIdnrk()) + .setContent("") + .setBatchNo(batchNo) + .setSerialNo(serialNo) + .setUniqNo("") + .setQiTao(true) + .setFactoryNo(packing.getFactoryNo()) + .setWarehouseNo(outboundItem.getLgort()) + .setBinNo(binNo) + .setNum(data.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(Instant.now()) + ); + setInventoryOutDTO(inventories, outboundItem.getIdnrk(), packing.getFactoryNo(), + outboundItem.getLgort(), binNo, batchNo, serialNo, data.getNum()); + + ScanCodeQO codeItem = scanCodesGroup.stream() + .filter(code -> StrUtil.equals(code.getBatchNumber(), batchNo) + && StrUtil.equals(code.getSerialNumbers(), serialNo)) + .findFirst() + .orElse(null); + if (Objects.isNull(codeItem)) { + scanCodesGroup.add(new ScanCodeQO() + .setBatchNumber(batchNo) + .setSerialNumbers(serialNo) + .setCodeNum(data.getNum())); + } else { + codeItem.setCodeNum(codeItem.getCodeNum().add(data.getNum())); + } + } + buildZwm3a20DTO(zwm3a20DTO, scanCodesGroup, outboundItem); + } + + componentOutboundControllerService.confirmPda(outbound, outboundItems, records, zwm3a20DTO, inventories); + return ApiResult.success(); + } + /** * 审核出库单 */ @@ -642,6 +747,34 @@ public class ComponentOutboundController extends BaseController { return outboundItem; } + private WmsComponentOutboundItem setWmsComponentOutboundItem(WmsComponentPacking packing, + WmsComponentPackingItem packingItem, + WmsComponentOutbound outbound, + String warehouseNo + ) { + return new WmsComponentOutboundItem() + .setId(IdUtil.getSnowflakeNextId()) + .setPackingItemId(packingItem.getId()) + .setItemIndex(packingItem.getItemIndex()) + .setVbeln(packing.getVbeln()) + .setPosnr(packingItem.getPosnr()) + .setIdnrk(packingItem.getIdnrk()) + .setOjtxb(packingItem.getOjtxb()) + .setMeins(packingItem.getMeins()) + .setMenge(packingItem.getMenge()) + .setAtwrt(packingItem.getAtwrt()) + .setZatwrt(packingItem.getZatwrt()) + .setZxiah(packingItem.getZxiah()) + .setZtext(packingItem.getZtext()) + .setPotx2(packingItem.getPotx2()) + .setPmenge(packingItem.getPmenge()) + .setLgpbe(packingItem.getLgpbe()) + .setLgort(StrUtil.blankToDefault(warehouseNo, packingItem.getLgort())) + .setLgobe(packingItem.getLgobe()) + .setOutQty(packingItem.getMenge()) + .setOutboundId(outbound.getId()); + } + /* 组装库存信息 */