From 1152f62dc99230c59b0eab1f1a32039ff25e53cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 26 Jun 2026 15:33:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(qms):=20=E6=B7=BB=E5=8A=A0=E9=80=80?= =?UTF-8?q?=E6=96=99=E5=85=A5=E5=BA=93=E6=A3=80=E9=AA=8C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ReturnInspectionCallbackQO 查询对象用于退料检验回调 - 在 QmsController 中添加 /backIn 接口处理退料入库检验回调 - 实现退料检验的数量验证和二维码处理逻辑 - 添加退料检验状态更新和不合格品处理机制 - 在 WmsIncomingInspectionTaskCallbackService 中添加退料入库回调方法 - 配置 wms.backIn.callback.url 回调地址配置项 - 优化 WmsInCostcenterBackItem 实体注释结构 --- ...IncomingInspectionTaskCallbackService.java | 27 ++++++++- .../pojo/qo/ReturnInspectionCallbackQO.java | 37 ++++++++++++ .../entity/WmsInCostcenterBackItem.java | 1 + .../srm/receive/controller/QmsController.java | 57 +++++++++++++++++++ 4 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ReturnInspectionCallbackQO.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 817f26d6..f5439aa9 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 @@ -4,6 +4,7 @@ import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; +import com.nflg.wms.common.pojo.qo.ReturnInspectionCallbackQO; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.qo.WmsInventoryInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO; @@ -36,6 +37,9 @@ public class WmsIncomingInspectionTaskCallbackService { @Value("${wms.iqc.inventory.callback.url}") private String inventoryUrl; + @Value("${wms.backIn.callback.url}") + private String backInUrl; + @Resource private IQmsIncomingInspectionTaskService incomingInspectionTaskService; @@ -48,9 +52,6 @@ public class WmsIncomingInspectionTaskCallbackService { @Resource private IQmsIssueTicketService issueTicketService; - @Resource - private IWmsInventoryService inventoryService; - @Resource private IDictionaryItemService dictionaryItemService; @@ -257,4 +258,24 @@ public class WmsIncomingInspectionTaskCallbackService { VUtil.trueThrowBusinessError(!Objects.equals(taskVO.getInspectionStatus(), (short) 2)).throwMessage("来料检验任务状态不允许回调"); process(taskVO, processingResult); } + + /** + * 向WMS系统发送退料入库检验任务回调 + */ + private void returnIn() { + try { + ReturnInspectionCallbackQO qo = new ReturnInspectionCallbackQO(); + //TODO 组装qo数据 + ApiResult result = wmsApiService.post(backInUrl, qo, "退料入库检验任务回调WMS"); + if (result.getCode() == 200) { + //TODO 操作成功 + + } else { + //TODO 操作失败 result.getMessage() + + } + } catch (Exception e) { + throw new NflgException(STATE.BusinessError, "调用WMS接口失败:" + e.getMessage()); + } + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ReturnInspectionCallbackQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ReturnInspectionCallbackQO.java new file mode 100644 index 00000000..d9260581 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ReturnInspectionCallbackQO.java @@ -0,0 +1,37 @@ +package com.nflg.wms.common.pojo.qo; + +import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class ReturnInspectionCallbackQO extends ExternalReturnInspectionApplyQO { + + /** + * 检测单号 + */ + @NotBlank(message = "检测单号不能为空") + private String taskNo; + + /** + * 合格数量 + */ + @NotNull(message = "合格数量不能为空") + private Integer qualifiedQty; + + /** + * 不合格数量 + */ + @NotNull(message = "不合格数量不能为空") + private Integer unqualifiedQty; + + /** + * 二维码列表 + */ + @Valid + private List qrCodes; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInCostcenterBackItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInCostcenterBackItem.java index 938c656c..35d97a54 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInCostcenterBackItem.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInCostcenterBackItem.java @@ -60,6 +60,7 @@ public class WmsInCostcenterBackItem implements Serializable { * 基本计量单位 */ private String meins; + // /** // * 库存地点 // */ 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 602caa9c..40b09f0b 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 @@ -11,6 +11,7 @@ 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.TransferOrderDTO; +import com.nflg.wms.common.pojo.qo.ReturnInspectionCallbackQO; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.qo.WmsInventoryInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.vo.InventoryLockVO; @@ -87,6 +88,9 @@ public class QmsController extends BaseController { @Resource private RedissonClient redissonClient; + @Resource + private IWmsInCostcenterBackItemService inCostcenterBackItemService; + /** * IQC来料检测回调 */ @@ -334,4 +338,57 @@ public class QmsController extends BaseController { produceOrderItemService.updateById(item); return ApiResult.success(); } + + /** + * 退料入库检测回调 + */ + @Transactional + @PostMapping("/backIn") + public ApiResult backIn(@RequestBody @NotNull ReturnInspectionCallbackQO qo) { + log.info("退料入库检测回调, 请求单号: {}, 物料: {}", qo.getRequestNo(), qo.getMaterialNo()); + VUtil.trueThrowBusinessError(qo.getInspectionQty() != qo.getQualifiedQty() + qo.getUnqualifiedQty()) + .throwMessage("数量不一致"); + if (CollectionUtil.isNotEmpty(qo.getQrCodes())) { + VUtil.trueThrowBusinessError(qo.getQualifiedQty() + qo.getUnqualifiedQty() + != qo.getQrCodes().stream().map(MaterialQrCodeDTO::getInspectionQty).reduce(0, Integer::sum)) + .throwMessage("数量不一致"); + List qrCodeMasters = qrCodeMasterService.getByCodes(qo.getQrCodes().stream().map(MaterialQrCodeDTO::getQrCode).toList()); + qo.getQrCodes().forEach(qit -> { + WmsQrCodeMaster qrCodeMaster = qrCodeMasters.stream() + .filter(qm -> qm.getBarcodeCode().equals(qit.getQrCode())) + .findFirst() + .orElse(null); + VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("二维码无效:" + qit.getQrCode()); + VUtil.trueThrowBusinessError(qit.getQualifiedQty() > qrCodeMaster.getQuantity().intValue()) + .throwMessage("二维码" + qit.getQrCode() + "的合格数量超出自身数量"); + qrCodeMaster.setQuantity(BigDecimal.valueOf(qit.getQualifiedQty())); + }); + qrCodeMasterService.updateBarCode(qrCodeMasters); + } + switch (qo.getReturnType()) { + case 1: + WmsInCostcenterBackItem item = inCostcenterBackItemService.getById(Long.valueOf(qo.getRequestNo())); + VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("数据无效"); + VUtil.trueThrowBusinessError(item.getNum().intValue() != qo.getInspectionQty()).throwMessage("检验数量与送检数量不一致"); + VUtil.trueThrowBusinessError(qo.getQualifiedQty() > item.getNum().intValue()).throwMessage("合格数量不能大于送检数量"); + if (item.getNum().intValue() != qo.getQualifiedQty()) { + item.setNum(BigDecimal.valueOf(qo.getQualifiedQty())); + item.setLeft(item.getNum()); + item.setInspectionStatus(1); + inCostcenterBackItemService.updateById(item); + } + if (qo.getUnqualifiedQty() > 0) { + item.setId(IdUtil.getSnowflakeNextId()); + item.setNum(BigDecimal.valueOf(qo.getUnqualifiedQty())); + item.setLeft(item.getNum()); + item.setInspectionStatus(2); + inCostcenterBackItemService.save(item); + } + break; + default: + VUtil.trueThrowBusinessError(true).throwMessage("不支持的退料来源"); + break; + } + return ApiResult.success(); + } }