From 0499563371f905ac5c41628de40bdaae080d4101 Mon Sep 17 00:00:00 2001 From: yf001217 <834502597@qq.com> Date: Wed, 3 Jun 2026 14:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=E5=89=AF?= =?UTF-8?q?=E4=BA=A7=E5=93=81(=E6=8B=86=E8=A7=A3)=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=97=A0=E7=A0=81=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InProduceOrderSurplusController.java | 227 +++++++----------- 1 file changed, 92 insertions(+), 135 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java index bdb14140..46ee4c55 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java @@ -23,15 +23,12 @@ import com.nflg.wms.common.pojo.document.InMaterialScanRecord; import com.nflg.wms.common.pojo.dto.InventoryInDTO; import com.nflg.wms.common.pojo.dto.OptRecordDTO; import com.nflg.wms.common.pojo.dto.QrCodeMasterPrintDTO; -import com.nflg.wms.common.pojo.dto.Zwm00Mb107DTO; import com.nflg.wms.common.pojo.qo.*; -import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.service.*; -import com.nflg.wms.starter.annotation.ApiMark; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -39,7 +36,6 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -51,10 +47,8 @@ import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.net.URL; import java.time.Instant; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -73,15 +67,6 @@ public class InProduceOrderSurplusController extends BaseController { @Resource private BasdeSerialNumberControllerService serialNumberControllerService; - @Resource - private IWmsInProduceOrderService produceOrderService; - - @Resource - private IWmsInProduceOrderItemService produceOrderItemService; - - @Resource - private IWmsBomService bomService; - @Resource private IWmsInProduceOrderSurplusService inProduceOrderSurplusService; @@ -100,9 +85,6 @@ public class InProduceOrderSurplusController extends BaseController { @Resource private IWmsInventoryService inventoryService; - @Resource - private StringRedisTemplate stringRedisTemplate; - @Resource private IWmsQrCodeMasterService qrCodeMasterService; @@ -183,67 +165,6 @@ public class InProduceOrderSurplusController extends BaseController { return ApiResult.success(); } - /** - * 无码保存 - * @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(); - } - /** * 搜索订单 */ @@ -483,23 +404,23 @@ public class InProduceOrderSurplusController extends BaseController { */ @GetMapping("getListForNoScan") public ApiResult> getListForNoScan(@RequestParam Long orderId) { - WmsInProduceOrder order = produceOrderService.getById(orderId); + WmsInProduceOrderSurplus order = inProduceOrderSurplusService.getById(orderId); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - List items = produceOrderItemService.lambdaQuery() - .eq(WmsInProduceOrderItem::getOrderId, orderId) + List items = inProduceOrderSurplusItemService.lambdaQuery() + .eq(WmsInProduceOrderSurplusItem::getOrderId, orderId) .list(); - items.removeIf(item -> item.getNum().compareTo(BigDecimal.ZERO) <= 0 - || noScanningBaseControllerService.existsQrCode(item.getMaterialNo())); + items.removeIf(item -> item.getLeftNum().compareTo(BigDecimal.ZERO) <= 0 + || noScanningBaseControllerService.existsQrCode(item.getMatnr())); return ApiResult.success( items.stream() .map(item -> new NoScanItemVO() - .setRowNo("") + .setRowNo(item.getRspos()) .setOrderItemId(item.getId()) - .setMaterialNo(item.getMaterialNo()) - .setMaterialDesc(item.getMaterialDesc()) - .setFactoryNo(item.getFactoryNo()) - .setWarehouseNo(item.getWarehouseNo()) - .setNum(item.getNum()) + .setMaterialNo(item.getMatnr()) + .setMaterialDesc(item.getMaktx2()) + .setFactoryNo(order.getDwerk()) + .setWarehouseNo(order.getLgort2()) + .setNum(item.getLeftNum()) ) .toList() ); @@ -513,83 +434,119 @@ public class InProduceOrderSurplusController extends BaseController { @PostMapping("receiveNoScanning") public ApiResult receiveNoScanning(@Valid @RequestBody @NotEmpty List requests) { List inventories = new ArrayList<>(); - List input1 = new ArrayList<>(); - List sernrs = new ArrayList<>(); + Map input1Map = new LinkedHashMap<>(); + Map input2Map = new LinkedHashMap<>(); Set orderIds = new HashSet<>(); + Set warehouseNos = new HashSet<>(); + WmsInProduceOrderSurplusTicket ticket = null; + List orderItemsToUpdate = new ArrayList<>(); + List ticketItems = new ArrayList<>(); + WmsInProduceOrderSurplus order = null; for (NoScanningRequest request : requests) { - WmsInProduceOrder order = produceOrderService.getById(request.getId()); + order = inProduceOrderSurplusService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - VUtil.trueThrowBusinessError(!Objects.equals(order.getState(), (short) 0)) - .throwMessage("该订单非待收货状态"); - - List orderItems = produceOrderItemService.lambdaQuery() - .eq(WmsInProduceOrderItem::getOrderId, order.getId()) + WmsInProduceOrderSurplus currentOrder = order; + List orderItems = inProduceOrderSurplusItemService.lambdaQuery() + .eq(WmsInProduceOrderSurplusItem::getOrderId, currentOrder.getId()) .list(); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItems)).throwMessage("订单项不存在"); - Map orderItemMap = orderItems.stream() - .collect(Collectors.toMap(WmsInProduceOrderItem::getId, item -> item)); - orderIds.add(order.getId()); + Map orderItemMap = orderItems.stream() + .collect(Collectors.toMap(WmsInProduceOrderSurplusItem::getId, item -> item)); + orderIds.add(currentOrder.getId()); VUtil.trueThrowBusinessError(orderIds.size() != 1).throwMessage("请一次只提交同一个订单的无码收货"); + warehouseNos.addAll(request.getItems().stream().map(NoScanningItemRequest::getWarehouseNo).collect(Collectors.toSet())); + VUtil.trueThrowBusinessError(warehouseNos.size() != 1).throwMessage("请一次只提交同一个库存地点的无码收货"); + if (ticket == null) { + ticket = new WmsInProduceOrderSurplusTicket() + .setId(IdUtil.getSnowflakeNextId()) + .setNo(serialNumberControllerService.generateSerialNumber(25)) + .setOrderId(currentOrder.getId()) + .setLgort(warehouseNos.iterator().next()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + } for (NoScanningItemRequest item : request.getItems()) { - WmsInProduceOrderItem orderItem = orderItemMap.get(item.getOrderItemId()); + WmsInProduceOrderSurplusItem orderItem = orderItemMap.get(item.getOrderItemId()); VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("订单项不存在"); - VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMaterialNo())) + VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMatnr())) .throwMessage("订单项与物料不匹配:" + item.getMaterialNo()); - VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMaterialNo())) - .throwMessage("物料" + orderItem.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.getMaterialNo() + "的无码收货数量必须大于0")) + .throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量必须大于0")) .map(NoScanningItemDataRequest::getNum) .reduce(BigDecimal.ZERO, BigDecimal::add); - VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getNum()) != 0) - .throwMessage("物料" + orderItem.getMaterialNo() + "的无码收货数量与订单数量不一致"); + VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getLeftNum()) > 0) + .throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量超出可入库数量"); + orderItem.setLeftNum(orderItem.getLeftNum().subtract(totalNum)); + orderItemsToUpdate.add(orderItem); item.getDatas().forEach(data -> { inventories.add(new InventoryInDTO() - .setMaterialNo(orderItem.getMaterialNo()) - .setFactoryNo(orderItem.getFactoryNo()) - .setWarehouseNo(orderItem.getWarehouseNo()) + .setMaterialNo(orderItem.getMatnr()) + .setFactoryNo(currentOrder.getDwerk()) + .setWarehouseNo(item.getWarehouseNo()) .setBatchNo(StrUtil.blankToDefault(data.getBatchNo(), "")) .setSerialNo(StrUtil.blankToDefault(data.getSerialNo(), "")) .setBinLocation(StrUtil.blankToDefault(data.getBinNo(), "")) .setNum(data.getNum()) ); + String input1Key = orderItem.getRspos() + "|" + orderItem.getMatnr() + "|" + StrUtil.blankToDefault(data.getBatchNo(), "") + "|" + item.getWarehouseNo(); + input1Map.merge(input1Key, new ZWM3A22Input1QO() + .setRspos(orderItem.getRspos()) + .setMatnr(orderItem.getMatnr()) + .setMaktx(orderItem.getMaktx2()) + .setWerks(currentOrder.getDwerk()) + .setLgort(item.getWarehouseNo()) + .setMenge(data.getNum()) + .setMenge_t(BigDecimal.ZERO) + .setMeins(orderItem.getMeins()) + .setCharg(StrUtil.blankToDefault(data.getBatchNo(), "")), (e, i) -> { + e.setMenge(e.getMenge().add(i.getMenge())); + return e; + }); + if (StrUtil.isNotBlank(data.getSerialNo())) { + String input2Key = orderItem.getRspos() + "|" + data.getSerialNo(); + input2Map.putIfAbsent(input2Key, new ZWM3A22Input2QO() + .setRspos(orderItem.getRspos()) + .setSernr(data.getSerialNo())); + } }); + ticketItems.add(new WmsInProduceOrderSurplusTicketItem() + .setId(IdUtil.getSnowflakeNextId()) + .setTicketId(ticket.getId()) + .setOrderItemId(orderItem.getId()) + .setLgpbe(StrUtil.join(",", item.getDatas().stream() + .map(NoScanningItemDataRequest::getBinNo) + .filter(StrUtil::isNotBlank) + .toList())) + .setNum(totalNum)); } - - input1.addAll(orderItems.stream() - .filter(it -> Objects.equals(it.getParentId(), 0L)) - .map(it -> new Zwm00Mb107QO() - .setPWERK(it.getFactoryNo()) - .setPSMNG(it.getNum()) - .setAMEIN(it.getUnit()) - .setLGORT(it.getWarehouseNo()) - .setCHARG(it.getBatchNo())) - .toList()); - sernrs.addAll(orderItems.stream() - .filter(it -> Objects.equals(it.getParentId(), 0L)) - .map(WmsInProduceOrderItem::getSernr) - .toList()); } inventoryService.in(mergeInventories(inventories)); - WmsInProduceOrder order = produceOrderService.getById(requests.get(0).getId()); + inProduceOrderSurplusItemService.updateBatchById(orderItemsToUpdate); + inProduceOrderSurplusTicketItemService.saveBatch(ticketItems); + Pair result = sapService.zwm3a22(new ZWM3A22QO() + .setAufnr(order.getAufnr()) + .setInput1(new ArrayList<>(input1Map.values())) + .setInput2(new ArrayList<>(input2Map.values()))); + ticket.setMatDoc(result.getKey()); + ticket.setDocYear(result.getValue()); + inProduceOrderSurplusTicketService.save(ticket); + inProduceOrderSurplusService.lambdaUpdate() + .set(WmsInProduceOrderSurplus::getUpdateBy, UserUtil.getUserName()) + .set(WmsInProduceOrderSurplus::getUpdateTime, LocalDateTime.now()) + .eq(WmsInProduceOrderSurplus::getId, order.getId()) + .update(); OptRecordDTO optRecordDTO = new OptRecordDTO(); optRecordDTO.setOperationType((short) 1) - .setOrderId(order.getNo()); + .setOrderId(ticket.getNo()); optRecordService.add(optRecordDTO); - - Zwm00Mb107DTO dto = sapService.zwm00_mb107(order.getOrderNo(), UserUtil.getUserName(), input1, sernrs); - 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); return ApiResult.success(); }