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)
.one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
if (order.getState()==1){
return ApiResult.success(Collections.emptyList());
}
List<WmsInProduceOrderItem> items = produceOrderItemService.lambdaQuery()
.eq(WmsInProduceOrderItem::getOrderId, order.getId())
.list();
items.removeIf(item -> item.getNum().compareTo(BigDecimal.ZERO) <= 0
|| noScanningBaseControllerService.existsQrCode(item.getMaterialNo()));
items.removeIf(item -> noScanningBaseControllerService.existsQrCode(item.getMaterialNo()));
return ApiResult.success(
items.stream()
.map(item -> new NoScanItemVO()

View File

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