refactor(qrcode): 优化条码处理逻辑并完善收货确认流程

- 修改getByCodes方法参数类型为Collection,增强接口灵活性
- 移除无用存储位数据集合,简化代码结构
- 实现条码状态校验,防止异常状态条码入库
- 增加对子码和父码的同步处理,保证条码信息完整性
- 优化批量更新条码状态及位置信息,统一设置扫码信息
- 删除冗余扫码条码处理代码,使用统一条码批量处理逻辑
- 添加验证注解,强化PoReceiveTaskConfirmQO及其子项的有效性校验
- 调整收货确认服务方法参数,去除废弃参数
- 精简import语句,优化代码整洁度
This commit is contained in:
曹鹏飞 2026-05-08 16:58:36 +08:00
parent 9ec0603c06
commit df569fa6cc
6 changed files with 100 additions and 126 deletions

View File

@ -49,10 +49,7 @@ import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -128,7 +125,6 @@ public class NormalPGIController extends BaseController {
/**
* 送货单列表
*
* @param request
* @return
*/
@ -140,7 +136,6 @@ public class NormalPGIController extends BaseController {
/**
* 送货单详情
*
* @param orderId 订单ID
* @return
*/
@ -157,7 +152,6 @@ public class NormalPGIController extends BaseController {
/**
* 获取扫码的详情信息
*
* @param orderItemId 订单项ID
* @return
*/
@ -172,7 +166,6 @@ public class NormalPGIController extends BaseController {
/**
* 扫描送货单号获取送货单详情PDA
*
* @param orderNo 送货单号
* @return
*/
@ -186,7 +179,6 @@ public class NormalPGIController extends BaseController {
/**
* 收货确认(PDA使用)
*
* @param request
* @return
*/
@ -323,7 +315,6 @@ public class NormalPGIController extends BaseController {
/**
* 普通物料的上架任务PDA
*
* @param orederNo 送货单号或是任务单号
* @return
*/
@ -351,7 +342,6 @@ public class NormalPGIController extends BaseController {
/**
* 采购物料入库确认PDA
*
* @param request
* @return
*/
@ -373,11 +363,8 @@ public class NormalPGIController extends BaseController {
.list();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(wmsPoReceiptItems)).throwMessage("获取入库详情失败");
List<WmsPoReceiptItem> receiptItems = new ArrayList<>();
List<StorageLocationDTO> storageLocationDTOS = new ArrayList<>();
List<InventoryInDTO> inventories = new ArrayList<>();
List<ZWM3A17DTO> zwm3A17DTOS = new ArrayList<>();
List<SrmMaterialReceiptScanCodes> scanCodes = new ArrayList<>();
List<WmsQrCodeMaster> qrCodeMasters = new ArrayList<>();
for (WmsPoReceiptItem item : wmsPoReceiptItems) {
PoReceiveTaskItemConfirmQO qo = request.getItems().stream()
.filter(q -> q.getId().equals(item.getId()))
@ -385,23 +372,12 @@ public class NormalPGIController extends BaseController {
.orElse(null);
if (Objects.isNull(qo))
continue;
// item.setCrossQty(qo.getCrossQty());
item.setReceivedWarehouse(qo.getReceivedWarehouse());
item.setInQty(item.getReceiptNum());
item.setUpdateTime(LocalDateTime.now());
item.setUpdateUserId(UserUtil.getUserId());
item.setUpdateUserName(UserUtil.getUserName());
receiptItems.add(item);
//储位处理
// if (StrUtil.isNotBlank(qo.getStorageLocationNew()) && qo.getStorageLocation().equals(qo.getStorageLocationNew())) {
// List<String> bins = Arrays.asList(item.getStorageLocation().split("/"));
// storageLocationDTOS.add(new StorageLocationDTO()
// .setBinNos(bins)
// .setMaterialNo(item.getItemCode())
// .setWarehouseNo(item.getReceivedWarehouse())
// .setFactory(wmsPoReceipt.getFactoryCode())
// );
// }
// SAP 和条码处理
//传入SAP的信息
@ -418,35 +394,84 @@ public class NormalPGIController extends BaseController {
zwm3A17DTOS.add(zwm3A17DTO);
}
Map<String, String> codeBinNoMap = request.getItems().stream()
.map(PoReceiveTaskItemConfirmQO::getItems)
.flatMap(List::stream)
.collect(Collectors.toMap(InCostCenterBackSubmitItemQRQO::getQrCode, InCostCenterBackSubmitItemQRQO::getBinNo));
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.getByCodes(codeBinNoMap.keySet());
List<String> tmpQrCodes = qrCodeMasters.stream()
.filter(qrCodeMaster -> !Objects.equals(qrCodeMaster.getProcessStage(), BarCodeProcessStage.Received.getState()))
.map(WmsQrCodeMaster::getBarcodeCode)
.toList();
VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(tmpQrCodes))
.throwMessage("条码状态异常:" + String.join(",", tmpQrCodes));
List<Long> tmpQrCodes1 = qrCodeMasters.stream()
.filter(qrCodeMaster -> qrCodeMaster.getPackagingType() == 1)
.map(WmsQrCodeMaster::getId)
.toList();
if (CollectionUtil.isNotEmpty(tmpQrCodes1)) {
//查询子码
qrCodeMasters.addAll(qrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.Received.getState())
.in(WmsQrCodeMaster::getParentBarcodeId, tmpQrCodes1)
.notIn(WmsQrCodeMaster::getBarcodeCode, codeBinNoMap.keySet())
.list()
);
}
Set<Long> tmpQrCodes2 = qrCodeMasters.stream()
.map(WmsQrCodeMaster::getParentBarcodeId)
.filter(parentBarcodeId -> parentBarcodeId > 0)
.collect(Collectors.toSet());
tmpQrCodes1.forEach(tmpQrCodes2::remove);
if (CollectionUtil.isNotEmpty(tmpQrCodes2)) {
//处理子码的父码
List<WmsQrCodeMaster> parentQrCodeMasters = qrCodeMasterService.listByIds(tmpQrCodes2);
List<WmsQrCodeMaster> childQrCodeMasters = qrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.Received.getState())
.in(WmsQrCodeMaster::getParentBarcodeId, tmpQrCodes2)
.list();
parentQrCodeMasters.removeIf(p ->
!childQrCodeMasters.stream()
.filter(c -> Objects.equals(c.getParentBarcodeId(), p.getId()))
.map(WmsQrCodeMaster::getId)
.collect(Collectors.toSet())
.equals(
qrCodeMasters.stream()
.filter(qrCodeMaster -> Objects.equals(qrCodeMaster.getParentBarcodeId(), p.getId()))
.map(WmsQrCodeMaster::getId)
.collect(Collectors.toSet())
)
);
//如果父码的子码都已扫码
if (CollectionUtil.isNotEmpty(parentQrCodeMasters)) {
qrCodeMasters.addAll(parentQrCodeMasters);
}
}
qrCodeMasters.sort(Comparator.comparing(WmsQrCodeMaster::getPackagingType).reversed());
qrCodeMasters.forEach(qrCodeMaster -> {
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState());
qrCodeMaster.setStorageLocation(qo.getReceivedWarehouse());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setLastScanTime(LocalDateTime.now());
String binNo = codeBinNoMap.get(qrCodeMaster.getBarcodeCode());
if (StrUtil.isNotBlank(binNo)) {
qrCodeMaster.setBinLocation(binNo);
if (qrCodeMaster.getPackagingType() == 1) {
qrCodeMasters.stream()
.filter(qr -> Objects.equals(qr.getParentBarcodeId(), qrCodeMaster.getId()))
.forEach(qr -> qr.setBinLocation(binNo));
}
}
});
qrCodeMasterService.updateBarCode(qrCodeMasters);
List<ZWM3A17Item1DTO> item1 = zwm3A17DTO.getItem1();
List<ZWM3A17Item2DTO> item2 = zwm3A17DTO.getItem2();
List<SrmMaterialReceiptScanCodes> scanCode = srmMaterialReceiptScanCodesRepository.findByReceiveItemId(item.getId());
if (CollectionUtil.isNotEmpty(scanCode)) {
scanCode = scanCode.stream().filter(code -> code.getIsIntoStorage() == false)
.toList();
}
if (CollectionUtil.isNotEmpty(scanCode)) {
scanCode.forEach(code -> {
WmsQrCodeMaster qrCodeMaster = qrCodeMasterService.getByCode(code.getCodeId());
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("条码不存在");
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState())
.setLastScanBy(UserUtil.getUserId())
.setLastScanByname(UserUtil.getUserName())
.setLastScanTime(LocalDateTime.now());
if (CollectionUtil.isNotEmpty(qo.getItems())) {
InCostCenterBackSubmitItemQRQO qrqo = qo.getItems()
.stream()
.filter(iit -> iit.getQrCode().contains(code.getCodeId()))
.findFirst()
.orElse(null);
if (Objects.nonNull(qrqo)) {
qrCodeMaster.setBinLocation(qrqo.getBinNo());
}
}
qrCodeMasters.add(qrCodeMaster);
if (qrCodeMaster.getPackagingType() == 0) {
qrCodeMasters.stream()
.filter(qrCodeMaster -> qrCodeMaster.getPackagingType() == 0)
.forEach(qrCodeMaster -> {
// 库存
InventoryInDTO inventoryDTO = inventories.stream()
.filter(inventoriesDTO -> inventoriesDTO.getMaterialNo().equals(item.getItemCode())
@ -474,7 +499,7 @@ public class NormalPGIController extends BaseController {
dto1.getEBELP().equals(item.getPoLineNumber())
&& dto1.getMATNR().equals(item.getItemCode())
&& dto1.getMeins().equals(item.getUomCode())
&& dto1.getCHARG().equals(code.getBatchNumber())
&& dto1.getCHARG().equals(qrCodeMaster.getBatchNo())
&& dto1.getWERKS().equals(wmsPoReceipt.getFactoryCode())
&& dto1.getLGORT().equals(item.getReceivedWarehouse())
).findFirst().orElse(null);
@ -482,76 +507,24 @@ public class NormalPGIController extends BaseController {
item1.add(new ZWM3A17Item1DTO()
.setEBELP(item.getPoLineNumber())
.setMATNR(item.getItemCode())
.setERFMG(code.getCodeNum())
.setERFMG(qrCodeMaster.getQuantity())
.setMEINS(item.getUomCode())
.setCHARG(code.getBatchNumber())
.setCHARG(qrCodeMaster.getBatchNo())
.setWERKS(wmsPoReceipt.getFactoryCode())
.setLGORT(item.getReceivedWarehouse())
.setKZKRI("")
);
} else {
ietm1Dto.setERFMG(ietm1Dto.getERFMG().add(code.getCodeNum()));
ietm1Dto.setERFMG(ietm1Dto.getERFMG().add(qrCodeMaster.getQuantity()));
}
item2.add(new ZWM3A17Item2DTO()
.setEBELP(item.getPoLineNumber())
.setFLAG("")
.setSERNR(code.getSerialNumbers()));
scanCodes.add(code);
// WmsQrCodeMaster wmsQrCodeMaster = new WmsQrCodeMaster()
// .setBarcodeCode(code.getCodeId())
// .setBarcodeType((short) 1)
// .setProcessStage(BarCodeProcessStage.InBound.getState())
// .setLastScanBy(UserUtil.getUserId())
// .setLastScanByname(UserUtil.getUserName())
// .setLastScanTime(LocalDateTime.now());
}
});
} else {
// 库存
InventoryInDTO inventoryDTO = new InventoryInDTO()
.setMaterialNo(item.getItemCode())
.setFactoryNo(wmsPoReceipt.getFactoryCode())
.setWarehouseNo(item.getReceivedWarehouse())
.setBatchNo("")
.setSerialNo("")
.setNum(item.getInQty());
inventories.add(inventoryDTO);
item1.add(new ZWM3A17Item1DTO()
.setEBELP(item.getPoLineNumber())
.setMATNR(item.getItemCode())
.setERFMG(item.getInQty())
.setMEINS(item.getUomCode())
.setCHARG("")
.setWERKS(wmsPoReceipt.getFactoryCode())
.setLGORT(item.getReceivedWarehouse())
.setKZKRI("")
);
}
}
if (CollectionUtil.isNotEmpty(qrCodeMasters)) {
//同步箱码信息到物料码中
qrCodeMasters.stream()
.filter(qr -> qr.getPackagingType() == 1)
.forEach(p -> {
qrCodeMasters.stream()
.filter(qr -> Objects.equals(qr.getParentBarcodeId(), p.getId()))
.forEach(c -> {
c.setProcessStage(p.getProcessStage());
c.setLastScanBy(UserUtil.getUserId());
c.setLastScanByname(UserUtil.getUserName());
c.setLastScanTime(LocalDateTime.now());
c.setFactoryCode(p.getFactoryCode());
c.setStorageLocation(p.getStorageLocation());
c.setBinLocation(p.getBinLocation());
c.setReceiptItemId(p.getReceiptItemId());
});
.setSERNR(qrCodeMaster.getSerialNo()));
});
qrCodeMasterService.updateBarCode(qrCodeMasters);
}
normalPGIControllerService.takeDeliveryConfirm(receiptItems, storageLocationDTOS, inventories, zwm3A17DTOS, request.getTaskId(), scanCodes);
normalPGIControllerService.takeDeliveryConfirm(receiptItems, inventories, zwm3A17DTOS, request.getTaskId());
return ApiResult.success();
}
@ -574,7 +547,6 @@ public class NormalPGIController extends BaseController {
/**
* 收货直接入库的未启用储位管理
*
* @return
*/
private void setPoReceiveByIn(SrmMaterialReceiptQO item,
@ -824,7 +796,6 @@ public class NormalPGIController extends BaseController {
/**
* 一键收货查询
*
* @param request
* @return
*/
@ -1001,7 +972,6 @@ public class NormalPGIController extends BaseController {
/**
* 一键收货无码
*
* @param request
* @return
*/
@ -1113,7 +1083,6 @@ public class NormalPGIController extends BaseController {
/**
* 采购物料上架确认无码
*
* @param request
* @return
*/
@ -1419,7 +1388,6 @@ public class NormalPGIController extends BaseController {
/**
* 通过打包码获取到打包码的信息
*
* @param request
* @return
*/
@ -1438,7 +1406,6 @@ public class NormalPGIController extends BaseController {
/**
* 获取打包码对应的送货单信息
*
* @param request
* @return
*/
@ -1451,7 +1418,6 @@ public class NormalPGIController extends BaseController {
/**
* 根据送货单单号和大码的ID获取到具体的物料信息
*
* @param request
* @return
*/
@ -1464,7 +1430,6 @@ public class NormalPGIController extends BaseController {
/**
* 根据送货单单号和大码的ID获取到具体的物料信息
*
* @param request id= 大码的ID
* @return
*/
@ -1486,7 +1451,6 @@ public class NormalPGIController extends BaseController {
/**
* 通过打包码获取到物料信息
*
* @param request
* @return
*/
@ -1505,7 +1469,6 @@ public class NormalPGIController extends BaseController {
/**
* 确认收货(无需扫码)
*
* @param request
* @return
*/
@ -1580,7 +1543,7 @@ public class NormalPGIController extends BaseController {
List<PDAScanCodeQO> scanCodes = new ArrayList<>();
List<WmsPackageItemDetailDTO> dtos1 = dtos.stream()
.filter(dto -> dto.getSrmOrderItemId().equals(item.getId())
&&dto.getPackagingType()==0
&& dto.getPackagingType() == 0
).collect(Collectors.toList());
for (WmsPackageItemDetailDTO dto : dtos1) {
PDAScanCodeQO scanCode = new PDAScanCodeQO();
@ -1710,7 +1673,6 @@ public class NormalPGIController extends BaseController {
/**
* 确认收货(需扫码)
*
* @param request
* @return
*/

View File

@ -294,11 +294,11 @@ public class NormalPGIControllerService {
@Transactional
public void takeDeliveryConfirm(
List<WmsPoReceiptItem> wmsPoReceiptItems,
List<StorageLocationDTO> storageLocationDTOS,
// List<StorageLocationDTO> storageLocationDTOS,
List<InventoryInDTO> inventories,
List<ZWM3A17DTO> zwm3A17DTOS,
Long taskId,
List<SrmMaterialReceiptScanCodes> scanCodes
Long taskId
// List<SrmMaterialReceiptScanCodes> scanCodes
) {
if (CollectionUtil.isNotEmpty(wmsPoReceiptItems)) {
wmsPoReceiptItemService.updateBatchById(wmsPoReceiptItems);

View File

@ -1,5 +1,8 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;
@ -13,6 +16,7 @@ public class PoReceiveTaskConfirmQO {
/**
* 任务ID
*/
@NotNull
private Long taskId;
// /**
@ -23,5 +27,7 @@ public class PoReceiveTaskConfirmQO {
/**
* 入库详情
*/
@Valid
@NotEmpty
private List<PoReceiveTaskItemConfirmQO> items;
}

View File

@ -1,6 +1,8 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;
@ -12,6 +14,7 @@ public class PoReceiveTaskItemConfirmQO {
/**
* 收货单详情ID
*/
@NotNull
private Long id;
// /**
@ -37,5 +40,6 @@ public class PoReceiveTaskItemConfirmQO {
* 二维码列表
*/
@Valid
@NotEmpty
private List<InCostCenterBackSubmitItemQRQO> items;
}

View File

@ -12,6 +12,7 @@ import com.nflg.wms.repository.entity.WmsTransferOrders;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import java.util.Collection;
import java.util.List;
/**
@ -43,7 +44,7 @@ public interface IWmsQrCodeMasterService extends IService<WmsQrCodeMaster> {
// void updateBatchByCode(List<WmsQrCodeMaster> qrCodeMasters);
List<WmsQrCodeMaster> getByCodes(List<String> qrCodes);
List<WmsQrCodeMaster> getByCodes(Collection<String> qrCodes);
WmsQrCodeMaster getByCode(String qrCode);

View File

@ -22,6 +22,7 @@ import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
/**
@ -167,7 +168,7 @@ public class WmsQrCodeMasterServiceImpl extends ServiceImpl<WmsQrCodeMasterMappe
// }
@Override
public List<WmsQrCodeMaster> getByCodes(List<String> qrCodes) {
public List<WmsQrCodeMaster> getByCodes(Collection<String> qrCodes) {
return lambdaQuery()
.in(WmsQrCodeMaster::getBarcodeCode, qrCodes)
.list();