fix(order): 修复生产订单状态检查和无码收货功能

- 添加订单状态为1时返回空列表的逻辑
- 移除对订单项数量小于等于0的过滤条件
- 修改无码收货接口参数结构,从列表改为单个对象
- 简化无码收货流程中的订单验证和票据创建逻辑
- 优化循环结构,移除重复的订单查询操作
- 统一物料号匹配和二维码存在性检查的处理方式
This commit is contained in:
曹鹏飞 2026-06-04 10:34:12 +08:00
parent e3b7642c6b
commit 23f0dd176b
2 changed files with 82 additions and 90 deletions

View File

@ -431,11 +431,13 @@ public class InProduceOrderController extends BaseController {
.eq(StrUtil.isNotBlank(no), WmsInProduceOrder::getNo, no) .eq(StrUtil.isNotBlank(no), WmsInProduceOrder::getNo, no)
.one(); .one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
if (order.getState()==1){
return ApiResult.success(Collections.emptyList());
}
List<WmsInProduceOrderItem> items = produceOrderItemService.lambdaQuery() List<WmsInProduceOrderItem> items = produceOrderItemService.lambdaQuery()
.eq(WmsInProduceOrderItem::getOrderId, order.getId()) .eq(WmsInProduceOrderItem::getOrderId, order.getId())
.list(); .list();
items.removeIf(item -> item.getNum().compareTo(BigDecimal.ZERO) <= 0 items.removeIf(item -> noScanningBaseControllerService.existsQrCode(item.getMaterialNo()));
|| noScanningBaseControllerService.existsQrCode(item.getMaterialNo()));
return ApiResult.success( return ApiResult.success(
items.stream() items.stream()
.map(item -> new NoScanItemVO() .map(item -> new NoScanItemVO()

View File

@ -433,108 +433,98 @@ public class InProduceOrderSurplusController extends BaseController {
/** /**
* 无码收货和入库 * 无码收货和入库
* @param requests 请求参数 * @param request 请求参数
*/ */
@Transactional @Transactional
@PostMapping("receiveNoScanning") @PostMapping("receiveNoScanning")
public ApiResult<Void> receiveNoScanning(@Valid @RequestBody @NotEmpty List<NoScanningRequest> requests) { public ApiResult<Void> receiveNoScanning(@Valid @RequestBody NoScanningRequest request) {
List<InventoryInDTO> inventories = new ArrayList<>(); List<InventoryInDTO> inventories = new ArrayList<>();
Map<String, ZWM3A22Input1QO> input1Map = new LinkedHashMap<>(); Map<String, ZWM3A22Input1QO> input1Map = new LinkedHashMap<>();
Map<String, ZWM3A22Input2QO> input2Map = new LinkedHashMap<>(); Map<String, ZWM3A22Input2QO> input2Map = new LinkedHashMap<>();
Set<Long> orderIds = new HashSet<>();
Set<String> warehouseNos = new HashSet<>(); Set<String> warehouseNos = new HashSet<>();
WmsInProduceOrderSurplusTicket ticket = null;
List<WmsInProduceOrderSurplusItem> orderItemsToUpdate = new ArrayList<>(); List<WmsInProduceOrderSurplusItem> orderItemsToUpdate = new ArrayList<>();
List<WmsInProduceOrderSurplusTicketItem> ticketItems = new ArrayList<>(); List<WmsInProduceOrderSurplusTicketItem> ticketItems = new ArrayList<>();
WmsInProduceOrderSurplus order = null;
for (NoScanningRequest request : requests) { WmsInProduceOrderSurplus order = inProduceOrderSurplusService.lambdaQuery()
order = inProduceOrderSurplusService.lambdaQuery() .eq(Objects.nonNull(request.getId()), WmsInProduceOrderSurplus::getId, request.getId())
.eq(Objects.nonNull(request.getId()), WmsInProduceOrderSurplus::getId, request.getId()) .eq(StrUtil.isNotBlank(request.getNo()), WmsInProduceOrderSurplus::getNo, request.getNo())
.eq(StrUtil.isNotBlank(request.getNo()), WmsInProduceOrderSurplus::getNo, request.getNo()) .one();
.one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); List<WmsInProduceOrderSurplusItem> orderItems = inProduceOrderSurplusItemService.lambdaQuery()
WmsInProduceOrderSurplus currentOrder = order; .eq(WmsInProduceOrderSurplusItem::getOrderId, order.getId())
List<WmsInProduceOrderSurplusItem> orderItems = inProduceOrderSurplusItemService.lambdaQuery() .list();
.eq(WmsInProduceOrderSurplusItem::getOrderId, currentOrder.getId()) VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItems)).throwMessage("订单项不存在");
.list(); Map<Long, WmsInProduceOrderSurplusItem> orderItemMap = orderItems.stream()
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItems)).throwMessage("订单项不存在"); .collect(Collectors.toMap(WmsInProduceOrderSurplusItem::getId, item -> item));
Map<Long, WmsInProduceOrderSurplusItem> orderItemMap = orderItems.stream() warehouseNos.addAll(request.getItems().stream().map(NoScanningItemRequest::getWarehouseNo).collect(Collectors.toSet()));
.collect(Collectors.toMap(WmsInProduceOrderSurplusItem::getId, item -> item)); VUtil.trueThrowBusinessError(warehouseNos.size() != 1).throwMessage("请一次只提交同一个库存地点的无码收货");
orderIds.add(currentOrder.getId()); WmsInProduceOrderSurplusTicket ticket = new WmsInProduceOrderSurplusTicket()
VUtil.trueThrowBusinessError(orderIds.size() != 1).throwMessage("请一次只提交同一个订单的无码收货"); .setId(IdUtil.getSnowflakeNextId())
warehouseNos.addAll(request.getItems().stream().map(NoScanningItemRequest::getWarehouseNo).collect(Collectors.toSet())); .setNo(serialNumberControllerService.generateSerialNumber(25))
VUtil.trueThrowBusinessError(warehouseNos.size() != 1).throwMessage("请一次只提交同一个库存地点的无码收货"); .setOrderId(order.getId())
if (ticket == null) { .setLgort(warehouseNos.iterator().next())
ticket = new WmsInProduceOrderSurplusTicket() .setType(1)
.setId(IdUtil.getSnowflakeNextId()) .setCreateBy(UserUtil.getUserName())
.setNo(serialNumberControllerService.generateSerialNumber(25)) .setCreateTime(LocalDateTime.now());
.setOrderId(currentOrder.getId())
.setLgort(warehouseNos.iterator().next())
.setType(1)
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
}
for (NoScanningItemRequest item : request.getItems()) { for (NoScanningItemRequest item : request.getItems()) {
WmsInProduceOrderSurplusItem orderItem = orderItemMap.get(item.getOrderItemId()); WmsInProduceOrderSurplusItem orderItem = orderItemMap.get(item.getOrderItemId());
VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("订单项不存在"); VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("订单项不存在");
VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMatnr())) VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMatnr()))
.throwMessage("订单项与物料不匹配:" + item.getMaterialNo()); .throwMessage("订单项与物料不匹配:" + item.getMaterialNo());
VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMatnr())) VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMatnr()))
.throwMessage("物料" + orderItem.getMatnr() + "已生成二维码,不允许无码收货"); .throwMessage("物料" + orderItem.getMatnr() + "已生成二维码,不允许无码收货");
BigDecimal totalNum = item.getDatas().stream() BigDecimal totalNum = item.getDatas().stream()
.peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0) .peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量必须大于0")) .throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量必须大于0"))
.map(NoScanningItemDataRequest::getNum) .map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getLeftNum()) > 0) VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getLeftNum()) > 0)
.throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量超出可入库数量"); .throwMessage("物料" + orderItem.getMatnr() + "的无码收货数量超出可入库数量");
orderItem.setLeftNum(orderItem.getLeftNum().subtract(totalNum)); orderItem.setLeftNum(orderItem.getLeftNum().subtract(totalNum));
orderItemsToUpdate.add(orderItem); orderItemsToUpdate.add(orderItem);
item.getDatas().forEach(data -> { item.getDatas().forEach(data -> {
inventories.add(new InventoryInDTO() inventories.add(new InventoryInDTO()
.setMaterialNo(orderItem.getMatnr()) .setMaterialNo(orderItem.getMatnr())
.setFactoryNo(currentOrder.getDwerk()) .setFactoryNo(order.getDwerk())
.setWarehouseNo(item.getWarehouseNo()) .setWarehouseNo(item.getWarehouseNo())
.setBatchNo(StrUtil.blankToDefault(data.getBatchNo(), "")) .setBatchNo(StrUtil.blankToDefault(data.getBatchNo(), ""))
.setSerialNo(StrUtil.blankToDefault(data.getSerialNo(), "")) .setSerialNo(StrUtil.blankToDefault(data.getSerialNo(), ""))
.setBinLocation(StrUtil.blankToDefault(data.getBinNo(), "")) .setBinLocation(StrUtil.blankToDefault(data.getBinNo(), ""))
.setNum(data.getNum()) .setNum(data.getNum())
); );
String input1Key = orderItem.getRspos() + "|" + orderItem.getMatnr() + "|" + StrUtil.blankToDefault(data.getBatchNo(), "") + "|" + item.getWarehouseNo(); String input1Key = orderItem.getRspos() + "|" + orderItem.getMatnr() + "|" + StrUtil.blankToDefault(data.getBatchNo(), "") + "|" + item.getWarehouseNo();
input1Map.merge(input1Key, new ZWM3A22Input1QO() input1Map.merge(input1Key, new ZWM3A22Input1QO()
.setRspos(orderItem.getRspos()) .setRspos(orderItem.getRspos())
.setMatnr(orderItem.getMatnr()) .setMatnr(orderItem.getMatnr())
.setMaktx(orderItem.getMaktx2()) .setMaktx(orderItem.getMaktx2())
.setWerks(currentOrder.getDwerk()) .setWerks(order.getDwerk())
.setLgort(item.getWarehouseNo()) .setLgort(item.getWarehouseNo())
.setMenge(data.getNum()) .setMenge(data.getNum())
.setMenge_t(BigDecimal.ZERO) .setMenge_t(BigDecimal.ZERO)
.setMeins(orderItem.getMeins()) .setMeins(orderItem.getMeins())
.setCharg(StrUtil.blankToDefault(data.getBatchNo(), "")), (e, i) -> { .setCharg(StrUtil.blankToDefault(data.getBatchNo(), "")), (e, i) -> {
e.setMenge(e.getMenge().add(i.getMenge())); e.setMenge(e.getMenge().add(i.getMenge()));
return e; 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() if (StrUtil.isNotBlank(data.getSerialNo())) {
.setId(IdUtil.getSnowflakeNextId()) String input2Key = orderItem.getRspos() + "|" + data.getSerialNo();
.setTicketId(ticket.getId()) input2Map.putIfAbsent(input2Key, new ZWM3A22Input2QO()
.setOrderItemId(orderItem.getId()) .setRspos(orderItem.getRspos())
.setLgpbe(StrUtil.join(",", item.getDatas().stream() .setSernr(data.getSerialNo()));
.map(NoScanningItemDataRequest::getBinNo) }
.filter(StrUtil::isNotBlank) });
.toList())) ticketItems.add(new WmsInProduceOrderSurplusTicketItem()
.setNum(totalNum)); .setId(IdUtil.getSnowflakeNextId())
} .setTicketId(ticket.getId())
.setOrderItemId(orderItem.getId())
.setLgpbe(StrUtil.join(",", item.getDatas().stream()
.map(NoScanningItemDataRequest::getBinNo)
.filter(StrUtil::isNotBlank)
.toList()))
.setNum(totalNum));
} }
inventoryService.in(mergeInventories(inventories)); inventoryService.in(mergeInventories(inventories));