diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index 70b2ac3e..38d5db85 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -6,9 +6,11 @@ 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.NoScanningRequest; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BinService; +import com.nflg.wms.admin.service.NoScanningBaseControllerService; import com.nflg.wms.admin.service.SapService; import com.nflg.wms.admin.util.*; import com.nflg.wms.common.constant.BarCodeProcessStage; @@ -120,6 +122,9 @@ public class InProduceOrderController extends BaseController { @Resource private IOptRecordService optRecordService; + @Resource + private NoScanningBaseControllerService noScanningBaseControllerService; + /** * 从SAP查询生产订单信息 * @param no 生产订单号 @@ -222,6 +227,67 @@ public class InProduceOrderController extends BaseController { return ApiResult.success(order.getId()); } + /** + * 无码保存 + * @param request 请求参数 + */ + @Transactional + @PostMapping("saveNoScanning") + public ApiResult saveNoScanning(@Valid @RequestBody InProduceOrderGenerateMaterialsQO request) { + return ApiResult.success(saveNoScanningOrder(request)); + } + + private Long saveNoScanningOrder(InProduceOrderGenerateMaterialsQO request) { + WmsInProduceOrder order = new WmsInProduceOrder() + .setId(IdUtil.getSnowflakeNextId()) + .setDataType(request.getDataType()) + .setNo(serialNumberControllerService.generateSerialNumber(8)) + .setOrderNo(request.getAufnr()) + .setList(request.getList()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + produceOrderService.save(order); + String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd"); + stringRedisTemplate.opsForValue().setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS); + String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0"); + WmsInProduceOrderItem parent = new WmsInProduceOrderItem() + .setId(IdUtil.getSnowflakeNextId()) + .setOrderId(order.getId()) + .setParentId(0L) + .setNum(request.getNum()) + .setMaterialNo(request.getMatnr()) + .setMaterialDesc(request.getMaktx()) + .setUnit(request.getMeins()) + .setFactoryNo(request.getPwerk()) + .setWarehouseNo(request.getLgort()) + .setOrderNum(request.getPsmng()) + .setBatchNo(date + index) + .setSernr(request.getSernr()); + produceOrderItemService.save(parent); + if (request.getList()) { + List children = bomService.getChildren(request.getMatnr()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套物料"); + List items = children.stream() + .map(it -> new WmsInProduceOrderItem() + .setId(IdUtil.getSnowflakeNextId()) + .setOrderId(order.getId()) + .setParentId(parent.getId()) + .setNum(it.getNum()) + .setMaterialNo(it.getNo()) + .setMaterialDesc(it.getDescribe()) + .setUnit(request.getMeins()) + .setFactoryNo(request.getPwerk()) + .setWarehouseNo(request.getLgort()) + .setOrderNum(request.getPsmng()) + .setBatchNo(parent.getBatchNo()) + .setSernr(request.getSernr()) + ) + .toList(); + produceOrderItemService.saveBatch(items); + } + return order.getId(); + } + /** * 搜索 * @param request 搜索参数 @@ -625,6 +691,127 @@ public class InProduceOrderController extends BaseController { return ApiResult.success(); } + /** + * 无码收货和入库(PDA使用) + * @param requests 请求参数 + */ + @Transactional + @PostMapping("receiveNoScanning") + public ApiResult receiveNoScanning(@Valid @RequestBody @NotEmpty List requests) { + List orderItems = produceOrderItemService.lambdaQuery() + .in(WmsInProduceOrderItem::getId, requests.stream().map(NoScanningRequest::getOrderItemId).distinct().toList()) + .list(); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItems)).throwMessage("订单项不存在"); + VUtil.trueThrowBusinessError(orderItems.size() != requests.stream().map(NoScanningRequest::getOrderItemId).distinct().count()) + .throwMessage("存在无效的订单项"); + + Set orderIds = orderItems.stream().map(WmsInProduceOrderItem::getOrderId).collect(Collectors.toSet()); + VUtil.trueThrowBusinessError(orderIds.size() != 1).throwMessage("请一次只提交同一个订单的无码收货"); + WmsInProduceOrder order = produceOrderService.getById(orderIds.iterator().next()); + VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); + VUtil.trueThrowBusinessError(!Objects.equals(order.getState(), (short) 0)) + .throwMessage("该订单非待收货状态"); + + Map orderItemMap = orderItems.stream() + .collect(Collectors.toMap(WmsInProduceOrderItem::getId, item -> item)); + List records = new ArrayList<>(); + List inventories = new ArrayList<>(); + requests.forEach(request -> { + WmsInProduceOrderItem orderItem = orderItemMap.get(request.getOrderItemId()); + VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("订单项不存在"); + VUtil.trueThrowBusinessError(!StrUtil.equals(request.getMaterialNo(), orderItem.getMaterialNo())) + .throwMessage("订单项与物料不匹配:" + request.getMaterialNo()); + VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMaterialNo())) + .throwMessage("物料" + orderItem.getMaterialNo() + "已生成二维码,不允许无码收货"); + + BigDecimal totalNum = request.getItems().stream() + .peek(item -> VUtil.trueThrowBusinessError(Objects.isNull(item.getNum()) || item.getNum().compareTo(BigDecimal.ZERO) <= 0) + .throwMessage("物料" + orderItem.getMaterialNo() + "的无码收货数量必须大于0")) + .map(item -> item.getNum()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getNum()) != 0) + .throwMessage("物料" + orderItem.getMaterialNo() + "的无码收货数量与订单数量不一致"); + + request.getItems().forEach(item -> { + records.add(new InMaterialScanRecord() + .setSource(4) + .setSourceId(order.getId()) + .setSourceItemId(orderItem.getId()) + .setTicketItemId(orderItem.getId()) + .setMaterialNo(orderItem.getMaterialNo()) + .setMaterialDesc(orderItem.getMaterialDesc()) + .setFactoryNo(orderItem.getFactoryNo()) + .setWarehouseNo(orderItem.getWarehouseNo()) + .setBinNo(StrUtil.blankToDefault(item.getBinNo(), "")) + .setContent("") + .setBatchNo(StrUtil.blankToDefault(item.getBatchNo(), "")) + .setSerialNo(StrUtil.blankToDefault(item.getSerialNo(), "")) + .setNum(item.getNum()) + .setUnit(orderItem.getUnit()) + .setUniqNo("NO_SCAN_" + IdUtil.getSnowflakeNextId()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(Instant.now()) + ); + inventories.add(new InventoryInDTO() + .setMaterialNo(orderItem.getMaterialNo()) + .setFactoryNo(orderItem.getFactoryNo()) + .setWarehouseNo(orderItem.getWarehouseNo()) + .setBatchNo(StrUtil.blankToDefault(item.getBatchNo(), "")) + .setSerialNo(StrUtil.blankToDefault(item.getSerialNo(), "")) + .setBinLocation("") + .setNum(item.getNum()) + ); + }); + }); + + inventoryService.in(mergeInventories(inventories)); + OptRecordDTO optRecordDTO = new OptRecordDTO(); + optRecordDTO.setOperationType((short) 1) + .setOrderId(order.getNo()); + optRecordService.add(optRecordDTO); + + Zwm00Mb107DTO dto = sapService.zwm00_mb107( + order.getOrderNo(), + UserUtil.getUserName(), + records.stream().collect(Collectors.groupingBy(InMaterialScanRecord::getKey8)) + .values() + .stream() + .map(items -> new Zwm00Mb107QO() + .setPWERK(items.get(0).getFactoryNo()) + .setPSMNG(items.stream().map(InMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) + .setAMEIN(items.get(0).getUnit()) + .setLGORT(items.get(0).getWarehouseNo()) + .setCHARG(items.get(0).getBatchNo())) + .toList(), + records.stream().map(InMaterialScanRecord::getSerialNo).toList() + ); + order.setMblnr(dto.getE_MBLNR()); + order.setMjahr(dto.getE_MJAHR()); + order.setState((short) 1); + order.setUpdateBy(UserUtil.getUserName()); + order.setUpdateTime(LocalDateTime.now()); + produceOrderService.updateById(order); + inMaterialScanRecordRespository.saveAll(records); + return ApiResult.success(); + } + + private List mergeInventories(List inventories) { + return inventories.stream() + .collect(Collectors.groupingBy(InventoryInDTO::getKey)) + .values() + .stream() + .map(items -> new InventoryInDTO() + .setMaterialNo(items.get(0).getMaterialNo()) + .setFactoryNo(items.get(0).getFactoryNo()) + .setWarehouseNo(items.get(0).getWarehouseNo()) + .setBatchNo(items.get(0).getBatchNo()) + .setSerialNo(items.get(0).getSerialNo()) + .setBinLocation(items.get(0).getBinLocation()) + .setNum(items.stream().map(InventoryInDTO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) + ) + .toList(); + } + // private void syncStorage(InProduceOrderItemVO it, Collection binNos) { // if (CollectionUtil.isEmpty(binNos)) // return;