From 3a2d21f3fbaee7ea223827b50ac82c3f8db9314f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Tue, 9 Jun 2026 09:51:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(qms):=20=E6=9B=B4=E6=96=B0=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E5=9B=9E=E8=B0=83=E5=8A=9F=E8=83=BD=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=95=B0=E9=87=8F=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 ExternalIncomingInspectionApplyQO 中的 qrCodes 类型为 Collection - 新增 MaterialQrCodeDTO 数据传输对象用于二维码质检信息 - 在 NormalPGIController 中优化二维码获取逻辑并使用 Set 集合避免重复 - 为 QmsController 的 iqcIncoming 方法添加事务注解确保数据一致性 - 重构质检回调逻辑,移除异常捕获包装并优化代码结构 - 更新 WmsIncomingInspectionTaskCallbackQO 使用 MaterialQrCodeDTO 替代字符串列表 - 在质检不合格时更新二维码数量信息并处理父级二维码关联关系 - 完善质检结果处理流程,包括合格与不合格情况的数据更新逻辑 --- ...IncomingInspectionTaskCallbackService.java | 24 ++- .../admin/controller/NormalPGIController.java | 34 +++- .../common/pojo/dto/MaterialQrCodeDTO.java | 31 +++ .../qo/ExternalIncomingInspectionApplyQO.java | 3 +- .../WmsIncomingInspectionTaskCallbackQO.java | 10 +- .../srm/receive/controller/QmsController.java | 178 ++++++++++-------- 6 files changed, 175 insertions(+), 105 deletions(-) create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialQrCodeDTO.java diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java index e5b97868..ef978a29 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java @@ -2,6 +2,7 @@ package com.nflg.qms.admin.service; import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.NflgException; +import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.qo.WmsInventoryInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO; @@ -76,19 +77,26 @@ public class WmsIncomingInspectionTaskCallbackService { .select(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo, QmsIncomingInspectionTaskRecord::getQualified) .eq(QmsIncomingInspectionTaskRecord::getTaskId, taskVO.getId()) .list(); - qo.setQualifiedMaterialUniqueNo(records.stream() - .filter(QmsIncomingInspectionTaskRecord::getQualified) - .map(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo) - .toList() - ); if (processingResult == 4) { //维修 qo.setUnqualifiedQty(0); + qo.setQrCodes(records.stream() + .filter(QmsIncomingInspectionTaskRecord::getQualified) + .map(r-> new MaterialQrCodeDTO() + .setQrCode(r.getMaterialUniqueNo()) + .setInspectionQty(r.getInspectionQty()) + .setUnqualifiedQty(r.getUnqualifiedQty()) + .setQualifiedQty(r.getQualifiedQty())) + .toList() + ); } else { qo.setUnqualifiedQty(taskVO.getUnqualifiedQty()); - qo.setUnqualifiedMaterialUniqueNo(records.stream() - .filter(record -> !record.getQualified()) - .map(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo) + qo.setQrCodes(records.stream() + .map(r-> new MaterialQrCodeDTO() + .setQrCode(r.getMaterialUniqueNo()) + .setInspectionQty(r.getInspectionQty()) + .setUnqualifiedQty(r.getUnqualifiedQty()) + .setQualifiedQty(r.getQualifiedQty())) .toList() ); } 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 f82b65a0..b21a3b68 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 @@ -1176,6 +1176,32 @@ public class NormalPGIController extends BaseController { // srmItem.setInspectionFlag("Y"); // pushDto.getContent().getLineVOList().add(srmItem); // } + Set qrCodes = new HashSet<>(); + if (CollectionUtil.isNotEmpty(codes)) { + List qrCodeMasters = qrCodeMasterService.lambdaQuery() + .in(WmsQrCodeMaster::getMaterialCode, codes.stream() + .map(SrmMaterialReceiptScanCodes::getCodeId) + .toList() + ).list(); + qrCodes.addAll( + qrCodeMasters.stream() + .filter(q -> q.getPackagingType() == 0) + .map(WmsQrCodeMaster::getMaterialCode) + .toList() + ); + qrCodes.addAll( + qrCodeMasterService.lambdaQuery() + .in(WmsQrCodeMaster::getParentBarcodeId, qrCodeMasters.stream() + .filter(q -> q.getPackagingType() == 1) + .map(WmsQrCodeMaster::getId) + .toList() + ) + .list() + .stream() + .map(WmsQrCodeMaster::getMaterialCode) + .toList() + ); + } incomingInspectionApplyQOS.add( new ExternalIncomingInspectionApplyQO() .setRequestNo(String.valueOf(receiveItemId)) @@ -1190,13 +1216,7 @@ public class NormalPGIController extends BaseController { .setFactory(order.getIuCode()) .setInspectionQty(item.getReceiptNum() != null ? item.getReceiptNum().intValue() : 0) .setPurchaseGroup(order.getPurchaseGroup()) - .setQrCodes( - CollectionUtil.isNotEmpty(codes) - ? codes.stream() - .map(SrmMaterialReceiptScanCodes::getCodeId) - .collect(Collectors.toList()) - : Collections.emptyList() - ) + .setQrCodes(qrCodes) ); } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialQrCodeDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialQrCodeDTO.java new file mode 100644 index 00000000..26defc81 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialQrCodeDTO.java @@ -0,0 +1,31 @@ +package com.nflg.wms.common.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +public class MaterialQrCodeDTO { + + /** + * 二维码唯一编号 + */ + private String qrCode; + + /** + * 检测数量 + */ + private Integer inspectionQty; + + /** + * 不合格数量 + */ + private Integer unqualifiedQty; + + /** + * 合格数量 + */ + private Integer qualifiedQty; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ExternalIncomingInspectionApplyQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ExternalIncomingInspectionApplyQO.java index 4638fec9..c172656e 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ExternalIncomingInspectionApplyQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ExternalIncomingInspectionApplyQO.java @@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; +import java.util.Collection; import java.util.List; /** @@ -91,5 +92,5 @@ public class ExternalIncomingInspectionApplyQO { /** * 二维码列表 */ - private List qrCodes; + private Collection qrCodes; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java index e4add069..a9e2db63 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java @@ -1,5 +1,6 @@ package com.nflg.wms.common.pojo.qo; +import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; import lombok.Data; import lombok.experimental.Accessors; @@ -90,12 +91,7 @@ public class WmsIncomingInspectionTaskCallbackQO { private Short processingResult = 0; /** - * 合格物料唯一编号列表 + * 质检结果二维码信息 */ - private List qualifiedMaterialUniqueNo; - - /** - * 不合格物料唯一编号列表 - */ - private List unqualifiedMaterialUniqueNo; + private List qrCodes; } diff --git a/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java index 06df073f..7a64d8d9 100644 --- a/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java +++ b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.dto.InventoryInDTO; +import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; import com.nflg.wms.common.pojo.dto.SRMQualityInspectionResultDTO; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.util.VUtil; @@ -24,6 +25,7 @@ import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -64,6 +66,7 @@ public class QmsController extends BaseController { /** * IQC来料检测回调 */ + @Transactional @PostMapping("/iqc/incoming") public ApiResult iqcIncoming(@RequestBody @NotNull WmsIncomingInspectionTaskCallbackQO qo) { log.info("质检单解析完成, 单号: {}, 物料: {}, 结果: {}", qo.getDeliveryOrderNo(), qo.getMaterialNo(), qo.getInspectionResult()); @@ -75,7 +78,6 @@ public class QmsController extends BaseController { VUtil.trueThrowBusinessError(true).throwMessage("质检单已存在"); } - Integer result = 1; // 找到入库的明细 WmsQcReceiveItem receiveItem = qcReceiveItemService.lambdaQuery() .eq(WmsQcReceiveItem::getItemCode, qo.getMaterialNo()) @@ -119,44 +121,44 @@ public class QmsController extends BaseController { .setReceiveId(receiveItem.getId()) .setIsIn(false) .setAcceptTime(LocalDateTime.now()); - try { - short isCheck = 2; - if (qo.getInspectionResult()) { - isCheck = 1; - inspect.setReceiveQty(inspect.getQualifiedQty()); - log.info("质检合格, 质检单号: {}, 合格数量: {}", qo.getTaskNo(), qo.getQualifiedQty()); - // 如果物料没有生成过二维码,则直接入库(参考NormalPGIController.takeDeliveryConfirm方法) - if (!hasQrCode) { - inspect.setIsIn(true); - inspect.setInTime(LocalDateTime.now()); - log.info("物料没有生成过二维码, 执行直接入库, 质检单号: {}", qo.getTaskNo()); + short isCheck = 2; + if (qo.getInspectionResult()) { + isCheck = 1; + inspect.setReceiveQty(inspect.getQualifiedQty()); + log.info("质检合格, 质检单号: {}, 合格数量: {}", qo.getTaskNo(), qo.getQualifiedQty()); - // 构建库存入库数据 - InventoryInDTO inventoryDTO = new InventoryInDTO() - .setMaterialNo(qo.getMaterialNo()) - .setFactoryNo(qo.getFactory()) - .setWarehouseNo(receiveItem.getReceivedWarehouse()) - .setBatchNo(NoUtil.getBatchNo(qo.getSupplierCode())) - .setSerialNo("") - .setBinLocation("") - .setNum(BigDecimal.valueOf(qo.getQualifiedQty())); - List inventories = new ArrayList<>(); - inventories.add(inventoryDTO); + // 如果物料没有生成过二维码,则直接入库(参考NormalPGIController.takeDeliveryConfirm方法) + if (!hasQrCode) { + inspect.setIsIn(true); + inspect.setInTime(LocalDateTime.now()); + log.info("物料没有生成过二维码, 执行直接入库, 质检单号: {}", qo.getTaskNo()); - // 构建SAP入库数据 - ZWM3A17DTO zwm3A17DTO = new ZWM3A17DTO() - .setEbeln(qo.getPurchaseOrderNo()) - .setUsnam("SRM"); - zwm3A17DTO.getItem1().add(new ZWM3A17Item1DTO() - .setEBELP(receiveItem.getPoLineNumber()) - .setMATNR(receiveItem.getItemCode()) - .setERFMG(BigDecimal.valueOf(qo.getQualifiedQty())) - .setMEINS(receiveItem.getUomCode()) - .setCHARG(inventoryDTO.getBatchNo()) - .setWERKS(qo.getFactory()) - .setLGORT(receiveItem.getReceivedWarehouse()) - .setKZKRI("")); + // 构建库存入库数据 + InventoryInDTO inventoryDTO = new InventoryInDTO() + .setMaterialNo(qo.getMaterialNo()) + .setFactoryNo(qo.getFactory()) + .setWarehouseNo(receiveItem.getReceivedWarehouse()) + .setBatchNo(NoUtil.getBatchNo(qo.getSupplierCode())) + .setSerialNo("") + .setBinLocation("") + .setNum(BigDecimal.valueOf(qo.getQualifiedQty())); + List inventories = new ArrayList<>(); + inventories.add(inventoryDTO); + + // 构建SAP入库数据 + ZWM3A17DTO zwm3A17DTO = new ZWM3A17DTO() + .setEbeln(qo.getPurchaseOrderNo()) + .setUsnam("SRM"); + zwm3A17DTO.getItem1().add(new ZWM3A17Item1DTO() + .setEBELP(receiveItem.getPoLineNumber()) + .setMATNR(receiveItem.getItemCode()) + .setERFMG(BigDecimal.valueOf(qo.getQualifiedQty())) + .setMEINS(receiveItem.getUomCode()) + .setCHARG(inventoryDTO.getBatchNo()) + .setWERKS(qo.getFactory()) + .setLGORT(receiveItem.getReceivedWarehouse()) + .setKZKRI("")); // if (StrUtil.isNotBlank(data.getSerialNum())) { // zwm3A17DTO.getItem2().add(new ZWM3A17Item2DTO() // .setEBELP(data.getPoLineNumber()) @@ -164,57 +166,69 @@ public class QmsController extends BaseController { // .setSERNR(data.getSerialNum())); // } - // 执行库存入库 - log.info("开始本地库存入库, 数量: {}", qo.getQualifiedQty()); - inventoryService.in(inventories); + // 执行库存入库 + log.info("开始本地库存入库, 数量: {}", qo.getQualifiedQty()); + inventoryService.in(inventories); - // 推送到SAP - log.info("开始推送SAP入库, PO: {}, 物料: {}", qo.getPurchaseOrderNo(), qo.getMaterialNo()); - Pair, Pair> returnDto = sapService.zwm3a17(zwm3A17DTO); - log.info("SAP入库返回, 物料凭证: {}, 年份: {}", returnDto.getKey().getKey(), returnDto.getValue().getValue()); - // 更新收货明细的物料凭证和入库数量 - qcReceiveItemService.lambdaUpdate() - .eq(WmsQcReceiveItem::getId, receiveItem.getId()) - .set(WmsQcReceiveItem::getInQty, qo.getQualifiedQty()) - .set(WmsQcReceiveItem::getMaterialDoc, returnDto.getKey().getKey()) - .set(WmsQcReceiveItem::getMaterialDocYear, returnDto.getValue().getValue()) + // 推送到SAP + log.info("开始推送SAP入库, PO: {}, 物料: {}", qo.getPurchaseOrderNo(), qo.getMaterialNo()); + Pair, Pair> returnDto = sapService.zwm3a17(zwm3A17DTO); + log.info("SAP入库返回, 物料凭证: {}, 年份: {}", returnDto.getKey().getKey(), returnDto.getValue().getValue()); + // 更新收货明细的物料凭证和入库数量 + qcReceiveItemService.lambdaUpdate() + .eq(WmsQcReceiveItem::getId, receiveItem.getId()) + .set(WmsQcReceiveItem::getInQty, qo.getQualifiedQty()) + .set(WmsQcReceiveItem::getMaterialDoc, returnDto.getKey().getKey()) + .set(WmsQcReceiveItem::getMaterialDocYear, returnDto.getValue().getValue()) + .update(); + + // 检查并更新收货单完成状态 + List allItems = qcReceiveItemService.lambdaQuery() + .eq(WmsQcReceiveItem::getReceiveId, receiveItem.getReceiveId()) + .list(); + boolean allCompleted = allItems.stream() + .allMatch(item -> item.getInQty() != null && item.getInQty().compareTo(item.getReceiptNum()) >= 0); + if (allCompleted) { + qcReceiveService.lambdaUpdate() + .eq(WmsQcReceive::getId, receiveItem.getReceiveId()) + .set(WmsQcReceive::getIsCompleted, (short) 2) .update(); - - // 检查并更新收货单完成状态 - List allItems = qcReceiveItemService.lambdaQuery() - .eq(WmsQcReceiveItem::getReceiveId, receiveItem.getReceiveId()) - .list(); - boolean allCompleted = allItems.stream() - .allMatch(item -> item.getInQty() != null && item.getInQty().compareTo(item.getReceiptNum()) >= 0); - if (allCompleted) { - qcReceiveService.lambdaUpdate() - .eq(WmsQcReceive::getId, receiveItem.getReceiveId()) - .set(WmsQcReceive::getIsCompleted, (short) 2) - .update(); - log.info("收货单全部完成, receiveId: {}", receiveItem.getReceiveId()); - } else { - qcReceiveService.lambdaUpdate() - .eq(WmsQcReceive::getId, receiveItem.getReceiveId()) - .set(WmsQcReceive::getIsCompleted, (short) 1) - .update(); - log.info("收货单部分完成, receiveId: {}", receiveItem.getReceiveId()); - } + log.info("收货单全部完成, receiveId: {}", receiveItem.getReceiveId()); + } else { + qcReceiveService.lambdaUpdate() + .eq(WmsQcReceive::getId, receiveItem.getReceiveId()) + .set(WmsQcReceive::getIsCompleted, (short) 1) + .update(); + log.info("收货单部分完成, receiveId: {}", receiveItem.getReceiveId()); } - } else { - log.warn("质检不合格, 质检单号: {}, 不合格数量: {}", - qo.getTaskNo(), qo.getUnqualifiedQty()); } - srmQualityInspectionService.save(inspect); - qcReceiveService.lambdaUpdate() - .eq(WmsQcReceive::getOrderNo, inspect.getNoteNum()) - .set(WmsQcReceive::getIsCheck, isCheck) - .update(); - qcReceiveItemService.updateCheckNum(inspect.getInspectionQty(), inspect.getNoteNum(), inspect.getLineNumber(), inspect.getItemCode(), inspect.getReceiveNum()); - log.info("质检单处理完成: {}, 结果: {}", qo.getTaskNo(), inspect.getInspectionResult()); - } catch (Exception ex) { - log.error("SRM送货单保存失败", ex); - VUtil.trueThrowBusinessError(true).throwMessage(ex.getMessage()); + } else { + log.warn("质检不合格, 质检单号: {}, 不合格数量: {}", + qo.getTaskNo(), qo.getUnqualifiedQty()); } + srmQualityInspectionService.save(inspect); + qcReceiveService.lambdaUpdate() + .eq(WmsQcReceive::getOrderNo, inspect.getNoteNum()) + .set(WmsQcReceive::getIsCheck, isCheck) + .update(); + qcReceiveItemService.updateCheckNum(inspect.getInspectionQty(), inspect.getNoteNum(), inspect.getLineNumber(), inspect.getItemCode(), inspect.getReceiveNum()); + //更新二维码数量 + if (CollectionUtil.isNotEmpty(qo.getQrCodes())) { + List qrCodeMasters = qrCodeMasterService.getByCodes(qo.getQrCodes().stream().map(MaterialQrCodeDTO::getQrCode).toList()); + qrCodeMasters.forEach(qrCodeMaster -> { + MaterialQrCodeDTO dto = qo.getQrCodes().stream() + .filter(qrCodeDTO -> StrUtil.equals(qrCodeDTO.getQrCode(), qrCodeMaster.getMaterialCode())) + .findFirst() + .get(); + qrCodeMaster.setQuantity(qrCodeMaster.getQuantity().subtract(BigDecimal.valueOf(dto.getUnqualifiedQty()))); + VUtil.trueThrowBusinessError(qrCodeMaster.getQuantity().compareTo(BigDecimal.ZERO) < 0) + .throwMessage(dto.getQrCode() + "数据异常"); + if (qrCodeMaster.getQuantity().compareTo(BigDecimal.ZERO) == 0 || qrCodeMaster.getParentBarcodeId() > 0) { + qrCodeMaster.setParentBarcodeId(0L); + } + }); + } + log.info("质检单处理完成: {}, 结果: {}", qo.getTaskNo(), inspect.getInspectionResult()); return ApiResult.success(); } }