From 2a5a58b16314fcd73c2c554707536c0b62189ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 1 Apr 2026 09:44:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E9=80=80?= =?UTF-8?q?=E8=B4=A7=E7=94=B3=E8=AF=B7=E5=92=8C=E7=94=9F=E4=BA=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=89=AF=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ApplyReturnRequestItemVO 和 ApplyReturnRequestVO 数据传输对象 - 添加 InProduceOrderSurplusController 实现生产订单副产品管理功能 - 添加 NormalPGIController 实现普通物料收货单管理功能 - 实现出库入库、扫码记录、订单详情等核心业务逻辑 - 集成 SAP 接口实现数据同步和处理 - 实现 PDF 导出和条码生成功能 --- .../InProduceOrderSurplusController.java | 4 +- .../admin/controller/NormalPGIController.java | 7 +- .../admin/controller/NormalQMController.java | 185 +++++++++--------- .../controller/OutPurchaseController.java | 2 +- .../controller/PurchaseReturnController.java | 5 +- .../pojo/vo/ApplyReturnRequestItemVO.java | 7 +- .../common/pojo/vo/ApplyReturnRequestVO.java | 5 + .../repository/entity/WmsQrCodeMaster.java | 23 ++- 8 files changed, 135 insertions(+), 103 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 843ac8e0..1a8aa048 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 @@ -487,7 +487,7 @@ public class InProduceOrderSurplusController extends BaseController { List list = inProduceOrderSurplusItemService.getList(id); list.forEach(it -> it.setNum(null)); Map base = new HashMap<>(); - base.put("title", "副产品退料单"); + base.put("title", "返修退料单"); base.put("date", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd")); base.put("qrcode", QRCodeUtil.generateQRCodeBase64(order.getNo(), 100, 100)); Map variables = new HashMap<>(); @@ -495,7 +495,7 @@ public class InProduceOrderSurplusController extends BaseController { variables.put("base", base); variables.put("pages", PdfPageDTO.create(list, 17, new WmsInProduceOrderSurplusItem())); String html = ThymeleafUtil.generator("/template/", "生产退料单", ".html", variables); - PdfGeneratorUtil.generatePdf("副产品退料单" + order.getNo(), html, response); + PdfGeneratorUtil.generatePdf("返修退料单" + order.getNo(), html, response); } /** diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java index 51ec9c2d..2ad7a41e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalPGIController.java @@ -1160,7 +1160,7 @@ public class NormalPGIController extends BaseController { VUtil.trueThrowBusinessError(!wmsPoReceipt.getSourceType().equals(1)).throwMessage("不属于无码收货的采购单"); //首先判断是否已经确认 - VUtil.trueThrowBusinessError(Objects.isNull(wmsPoReceipt)).throwMessage("收货单不存在"); +// VUtil.trueThrowBusinessError(Objects.isNull(wmsPoReceipt)).throwMessage("收货单不存在"); VUtil.trueThrowBusinessError(Objects.equals(wmsPoReceipt.getIsCompleted(), true)).throwMessage("此任务已入库"); @@ -1207,6 +1207,8 @@ public class NormalPGIController extends BaseController { if (CollectionUtil.isNotEmpty(scanCode)) { scanCode.forEach(code -> { + WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.getByCode(code.getCodeId()); + VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("条码不存在:" + code.getCodeId()); // 库存 InventoryInDTO inventoryDTO = inventories.stream() .filter(inventoriesDTO -> inventoriesDTO.getMaterialNo().equals(item.getItemCode()) @@ -1214,6 +1216,7 @@ public class NormalPGIController extends BaseController { && inventoriesDTO.getSerialNo().equals(Objects.isNull(code.getSerialNumbers()) ? "" : code.getSerialNumbers()) && inventoriesDTO.getFactoryNo().equals(wmsPoReceipt.getFactoryCode()) && inventoriesDTO.getWarehouseNo().equals(item.getReceivedWarehouse()) + && StrUtil.equals(inventoriesDTO.getBinLocation(), qrCodeMaster.getBinLocation()) ).findFirst().orElse(null); if (Objects.isNull(inventoryDTO)) { @@ -1221,6 +1224,7 @@ public class NormalPGIController extends BaseController { .setMaterialNo(item.getItemCode()) .setFactoryNo(wmsPoReceipt.getFactoryCode()) .setWarehouseNo(item.getReceivedWarehouse()) + .setBinLocation(qrCodeMaster.getBinLocation()) .setBatchNo(Objects.isNull(code.getBatchNumber()) ? "" : code.getBatchNumber()) .setSerialNo(Objects.isNull(code.getSerialNumbers()) ? "" : code.getSerialNumbers()) .setNum(code.getCodeNum()); @@ -1265,6 +1269,7 @@ public class NormalPGIController extends BaseController { .setMaterialNo(item.getItemCode()) .setFactoryNo(wmsPoReceipt.getFactoryCode()) .setWarehouseNo(item.getReceivedWarehouse()) + .setBinLocation("") .setBatchNo("") .setSerialNo("") .setNum(item.getInQty()); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalQMController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalQMController.java index 7d5a7a1b..0857b02e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalQMController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalQMController.java @@ -42,6 +42,7 @@ 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.stream.Collectors; @@ -75,6 +76,7 @@ public class NormalQMController extends BaseController { /** * 获取SRM推送过来的质检单信息 + * * @param request * @return */ @@ -86,6 +88,7 @@ public class NormalQMController extends BaseController { /** * 导出质检单 + * * @param request 查询条件 * @return */ @@ -99,6 +102,7 @@ public class NormalQMController extends BaseController { /** * 质检物料上架任务(PDA) + * * @param orderNo 送货单号或任务单号 * @return */ @@ -111,6 +115,7 @@ public class NormalQMController extends BaseController { /** * 质检物料上架物料详情 + * * @param taskId 任务ID **/ @GetMapping("PDA/task/item") @@ -122,6 +127,7 @@ public class NormalQMController extends BaseController { /** * 质检物料上架任务确认 + * * @param request **/ @Transactional @@ -144,6 +150,73 @@ public class NormalQMController extends BaseController { VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request)).throwMessage("不存在待入库的物料(或此物料已入库)"); + List qrCodes = CollectionUtil.unionAll( + request.stream() + .map(QCReceiveTaskConfirmQO::getReceiveItems) + .flatMap(List::stream) + .map(InCostCenterBackSubmitItemQRQO::getQrCode) + .toList() + , request.stream() + .map(QCReceiveTaskConfirmQO::getRejectItems) + .flatMap(List::stream) + .map(InCostCenterBackSubmitItemQRQO::getQrCode) + .toList() + ); + List qrCodeMasters = qrCodeMasterService.getChildrenWithParent(qrCodes); + request.forEach(rit -> { + if (CollectionUtil.isNotEmpty(rit.getReceiveItems())) { + rit.getReceiveItems().forEach(item -> { + WmsQrCodeMaster p = qrCodeMasters.stream() + .filter(q -> q.getBarcodeCode().equals(item.getQrCode())) + .findFirst() + .get(); + p.setProcessStage(BarCodeProcessStage.InBound.getState()); + p.setFactoryCode(rit.getFactoryCode()); + p.setStorageLocation(rit.getReceivedWarehouse()); + p.setBinLocation(item.getBinNo()); + p.setLastScanBy(UserUtil.getUserId()); + p.setLastScanByname(UserUtil.getUserName()); + p.setLastScanTime(LocalDateTime.now()); + qrCodeMasters.stream() + .filter(q -> q.getParentBarcodeId().equals(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()); + }); + }); + } + if (CollectionUtil.isNotEmpty(rit.getRejectItems())) { + rit.getRejectItems().forEach(item -> { + WmsQrCodeMaster p = qrCodeMasters.stream() + .filter(q -> q.getBarcodeCode().equals(item.getQrCode())) + .findFirst() + .get(); + p.setProcessStage(BarCodeProcessStage.Reject.getState()); + p.setBinLocation(item.getBinNo()); + p.setLastScanBy(UserUtil.getUserId()); + p.setLastScanByname(UserUtil.getUserName()); + p.setLastScanTime(LocalDateTime.now()); + qrCodeMasters.stream() + .filter(q -> q.getParentBarcodeId().equals(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()); + }); + }); + } + }); //首先根据采购单的编号进行分类 List poNums = request.stream() .map(QCReceiveTaskConfirmQO::getPoNum) // 提取每个对象的 ID @@ -258,105 +331,36 @@ public class NormalQMController extends BaseController { .setEbelp(Integer.valueOf(code.getPoLineNumber())) .setMenge(code.getRejectQty()) .setMatDoc(code.getReceiveNum()) - .setDocYear(DateTimeUtil.format(LocalDate.now(),"yyyy")) + .setDocYear(DateTimeUtil.format(LocalDate.now(), "yyyy")) ); } if (code.getReceiveQty().compareTo(BigDecimal.ZERO) > 0) { // 合格品数量大于0时的处理逻辑 - InventoryInDTO inventoryDTO = qcReceiveDTO.getQualifiednventories() - .stream() - .filter(inventoryDTO1 -> - inventoryDTO1.getMaterialNo().equals(code.getItemCode()) - && inventoryDTO1.getWarehouseNo().equals(item.getReceivedWarehouse()) - && inventoryDTO1.getBatchNo().equals(code.getMaterialBatch()) - && inventoryDTO1.getSerialNo().equals(code.getSerialNum()) - && inventoryDTO1.getFactoryNo().equals(code.getFactory())) - .findFirst() - .orElse(null); - - if (Objects.isNull(inventoryDTO)) { + List itemQrCodeMasters = qrCodeMasters.stream() + .filter(qr -> Objects.equals(qr.getProcessStage(), BarCodeProcessStage.InBound.getState()) + && qr.getMaterialCode().equals(code.getItemCode()) + ) + .toList(); + Map> qrCodeMastersMap = itemQrCodeMasters.stream() + .collect(Collectors.groupingBy(WmsQrCodeMaster::getKey1)); + qrCodeMastersMap.values().forEach(vqrs -> { + WmsQrCodeMaster qf = vqrs.get(0); qcReceiveDTO.getQualifiednventories().add(new InventoryInDTO() - .setMaterialNo(code.getItemCode()) - .setFactoryNo(code.getFactory()) - .setWarehouseNo(item.getReceivedWarehouse()) // 不合格仓固定 - .setNum(code.getReceiveQty()) - .setBatchNo(code.getMaterialBatch()) - .setSerialNo(code.getSerialNum()) + .setMaterialNo(qf.getMaterialCode()) + .setFactoryNo(qf.getFactoryCode()) + .setWarehouseNo(qf.getStorageLocation()) // 不合格仓固定 + .setBinLocation(qf.getBinLocation()) + .setBatchNo(qf.getBatchNo()) + .setSerialNo(qf.getSerialNo()) + .setNum(vqrs.stream().map(WmsQrCodeMaster::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add)) ); - } else { - inventoryDTO.setNum(inventoryDTO.getNum().add(code.getReceiveQty())); - } + }); } } } } qcReceiveDTOS.add(qcReceiveDTO); } - List qrCodes = CollectionUtil.unionAll( - request.stream() - .map(QCReceiveTaskConfirmQO::getReceiveItems) - .flatMap(List::stream) - .map(InCostCenterBackSubmitItemQRQO::getQrCode) - .toList() - , request.stream() - .map(QCReceiveTaskConfirmQO::getRejectItems) - .flatMap(List::stream) - .map(InCostCenterBackSubmitItemQRQO::getQrCode) - .toList() - ); - List qrCodeMasters = qrCodeMasterService.getChildrenWithParent(qrCodes); - request.forEach(rit -> { - if (CollectionUtil.isNotEmpty(rit.getReceiveItems())) { - rit.getReceiveItems().forEach(item -> { - WmsQrCodeMaster p = qrCodeMasters.stream() - .filter(q -> q.getBarcodeCode().equals(item.getQrCode())) - .findFirst() - .get(); - p.setProcessStage(BarCodeProcessStage.InBound.getState()); - p.setBinLocation(item.getBinNo()); - p.setLastScanBy(UserUtil.getUserId()); - p.setLastScanByname(UserUtil.getUserName()); - p.setLastScanTime(LocalDateTime.now()); - qrCodeMasters.stream() - .filter(q -> q.getParentBarcodeId().equals(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()); - }); - }); - } - if (CollectionUtil.isNotEmpty(rit.getRejectItems())) { - rit.getRejectItems().forEach(item -> { - WmsQrCodeMaster p = qrCodeMasters.stream() - .filter(q -> q.getBarcodeCode().equals(item.getQrCode())) - .findFirst() - .get(); - p.setProcessStage(BarCodeProcessStage.Reject.getState()); - p.setBinLocation(item.getBinNo()); - p.setLastScanBy(UserUtil.getUserId()); - p.setLastScanByname(UserUtil.getUserName()); - p.setLastScanTime(LocalDateTime.now()); - qrCodeMasters.stream() - .filter(q -> q.getParentBarcodeId().equals(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()); - }); - }); - } - }); qrCodeMasterService.updateBarCode(qrCodeMasters); normalQMControllerService.confirmReceive(qcReceiveDTOS); return ApiResult.success(); @@ -365,6 +369,7 @@ public class NormalQMController extends BaseController { /** * 无码质检任务上架确认 + * * @param request 任务ID * @return */ @@ -386,7 +391,7 @@ public class NormalQMController extends BaseController { //VUtil.trueThrowBusinessError(!qcReceive.getSourceType().equals(1)).throwMessage("不属于无码收货的采购单"); //根据ID获取到任务单 List taskConfirmQOS = new ArrayList<>(); - List qrCodes=new ArrayList<>(); + List qrCodes = new ArrayList<>(); for (WmsQcReceive qcReceive : qcReceives) { List tasks = normalQMControllerService.getTaskItem(qcReceive.getId()); if (CollectionUtil.isNotEmpty(tasks)) { @@ -394,7 +399,7 @@ public class NormalQMController extends BaseController { .anyMatch(task -> task.getUnqualifiedQty().compareTo(BigDecimal.ZERO) > 0) ).throwMessage("含有质检不合格物料,请扫码入库!"); qrCodeMasterService.getByExtendIds(tasks.stream().map(QCTaskItemVO::getId).toList()) - .forEach(code->{ + .forEach(code -> { qrCodes.add(new InCostCenterBackSubmitItemQRQO() .setBinNo("") .setQrCode(code.getBarcodeCode()) @@ -453,7 +458,7 @@ public class NormalQMController extends BaseController { zwm3A18DTO.getItem1().add(item1DTO); } else { item1DTO.setErfmg1(item1DTO.getErfmg1().add(code.getQualifiedQty())); - item1DTO.setErfmg2(BigDecimal.ZERO); + item1DTO.setErfmg2(BigDecimal.ZERO); } if (StrUtil.isNotBlank(code.getSerialNum())) { String flag = code.getInspectionResult().equals("合格") ? "X" : ""; diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutPurchaseController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutPurchaseController.java index 0702a76a..e87e1921 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutPurchaseController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutPurchaseController.java @@ -212,7 +212,7 @@ public class OutPurchaseController extends BaseController { items.add(item); input1.add(new ZWM3A06Input1DTO() .setEbelp(it.getEbelp()) - .setRetpo(it.getRetpo()) + .setRetpo("X") .setMatnr(it.getMatnr()) .setMaktx(it.getMaktx()) .setErfmg(item.getNum()) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/PurchaseReturnController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/PurchaseReturnController.java index 1dc65368..41363c55 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/PurchaseReturnController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/PurchaseReturnController.java @@ -201,8 +201,8 @@ public class PurchaseReturnController extends BaseController { User user = userService.getById(UserUtil.getUserId()); VUtil.trueThrowBusinessError(StrUtil.equals(user.getPurchasingGroup(), returnRequest.getPurchaseGroup())) .throwMessage("无权限审核此单"); - VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 1) - .throwMessage("此单已审核通过,不可以再此审核"); +// VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 1) +// .throwMessage("此单已审核通过,不可以再此审核"); if (request.getApprovalStatus().equals(2)) { VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 2) @@ -280,6 +280,7 @@ public class PurchaseReturnController extends BaseController { } //修改状态 returnRequestService.lambdaUpdate() + .set(WmsReturnRequest::getPoNumberNew, returnRequest.getPoNumberNew()) .set(WmsReturnRequest::getApprovalStatus, request.getApprovalStatus()) .set(WmsReturnRequest::getDocumentType, request.getDocumentType()) .set(WmsReturnRequest::getApproveTime, LocalDateTime.now()) diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestItemVO.java index ee026880..03d93443 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestItemVO.java @@ -111,12 +111,7 @@ public class ApplyReturnRequestItemVO { private String unit; /** - * sap过账的行号 + * 新采购单行号 */ private Integer poLineNumberNew; - - /** - * 新的采购单号 - */ - private String poNumberNew; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestVO.java index 255ce828..3de3ecce 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ApplyReturnRequestVO.java @@ -99,4 +99,9 @@ public class ApplyReturnRequestVO { * 0 PC端,1 PDA端 */ private Short dataSource; + + /** + * 新的采购单号 + */ + private String poNumberNew; } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsQrCodeMaster.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsQrCodeMaster.java index e0fe4d57..e594bd28 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsQrCodeMaster.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsQrCodeMaster.java @@ -1,5 +1,6 @@ package com.nflg.wms.repository.entity; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.*; import lombok.Getter; import lombok.Setter; @@ -14,6 +15,7 @@ import java.time.LocalDateTime; *

* *

+ * * @author 代码生成器生成 * @since 2026 */ @@ -74,11 +76,19 @@ public class WmsQrCodeMaster implements Serializable { */ private String batchNo; + public String getBatchNo() { + return StrUtil.isBlank(batchNo) ? "" : batchNo; + } + /** * 序列号 */ private String serialNo; + public String getSerialNo() { + return StrUtil.isBlank(serialNo) ? "" : serialNo; + } + /** * 供应商编号 */ @@ -109,6 +119,10 @@ public class WmsQrCodeMaster implements Serializable { */ private String binLocation; + public String getBinLocation() { + return StrUtil.isBlank(binLocation) ? "" : binLocation; + } + /** * 最后扫描时间 */ @@ -190,6 +204,13 @@ public class WmsQrCodeMaster implements Serializable { private String key; public String getKey() { - return factoryCode + "|" + storageLocation + "|"; + return factoryCode + "|" + storageLocation; + } + + @TableField(exist = false) + private String key1; + + public String getKey1() { + return factoryCode + "|" + storageLocation + "|" + getBinLocation() + "|" + getBatchNo() + "|" + getSerialNo(); } }