diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/WmsPdaApiController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/WmsPdaApiController.java
index 92230a4f..b06e3de7 100644
--- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/WmsPdaApiController.java
+++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/WmsPdaApiController.java
@@ -33,6 +33,7 @@ public class WmsPdaApiController extends BaseController {
private final IWmsMoveOrderService wmsMoveOrderService;
private final IWmsAllocateOrderDetailService wmsAllocateOrderDetailService;
private final IWmsAllocateTaskService wmsAllocateTaskService;
+ private final IWmsInstockRecordService wmsInstockRecordService;
/**
* 原材料退库-现场扫描
@@ -543,4 +544,30 @@ public class WmsPdaApiController extends BaseController {
return R.ok();
}
+ /**
+ * PDA 入库提交(带质检判断)
+ *
+ * 业务流程:
+ * 1. 查询入库打印记录
+ * 2. 判断是否需要质检(是否有物料 inspectionRequest = "0")
+ * 3. 如果全部是免检物料,直接调用 completeQualityCheck() 完成入库
+ * 4. 如果有必检物料,调用 QMS 创建质检任务,更新打印记录状态为"质检中"
+ *
+ * @param instockCode 入库单号
+ * @return 处理结果
+ */
+ @PostMapping("/instock/submit")
+ public R instockSubmit(String instockCode) {
+ if (instockCode == null || instockCode.trim().isEmpty()) {
+ return R.fail("入库单号不能为空");
+ }
+
+ try {
+ Boolean result = wmsInstockRecordService.submitInstockWithQualityCheck(instockCode);
+ return result ? R.ok("入库提交成功") : R.fail("入库提交失败");
+ } catch (Exception e) {
+ return R.fail("入库提交异常: " + e.getMessage());
+ }
+ }
+
}
diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInspectionInitiationServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInspectionInitiationServiceImpl.java
index 0cb951e6..7e673096 100644
--- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInspectionInitiationServiceImpl.java
+++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInspectionInitiationServiceImpl.java
@@ -12,6 +12,7 @@ import org.dromara.wms.service.IWmsInspectionInitiationService;
import org.dromara.wms.service.IWmsInstockPrintService;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -184,7 +185,11 @@ public class WmsInspectionInitiationServiceImpl implements IWmsInspectionInitiat
request.setInstockCode(print.getInstockCode()); // 入库单号
request.setMaterialCode(print.getMaterialCode()); // 物料编码
request.setMaterialName(print.getMaterialName()); // 物料名称
- request.setInspectionQty(print.getApportionQty()); // 质检数量(分包数量)
+ // 质检数量:使用每包数量 materialQty
+ Long materialQty = print.getMaterialQty();
+ log.info("构建质检请求,批次: {}, 前端传入 materialQty: {}", print.getBatchCode(), materialQty);
+ request.setInspectionQty(materialQty != null
+ ? new BigDecimal(materialQty) : BigDecimal.ONE);
request.setBatchCode(print.getBatchCode()); // 批次号
// 检验类型:优先使用前端传入的参数,默认为"4"(原材料检)
//首检=0, 专检=1, 自检=2, 互检=3, 原材料检=4, 抽检=5, 成品检=6, 入库检=7,出库检=8
diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java
index 2b07d470..6abef963 100644
--- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java
+++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java
@@ -4,12 +4,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.qms.api.RemoteQmsInspectionService;
+import org.dromara.qms.api.dto.WmsInspectionTaskRequest;
import org.dromara.wms.domain.BaseMaterialCategory;
import org.dromara.wms.domain.SysUser;
import org.dromara.wms.domain.WmsInstockOrder;
@@ -45,6 +50,7 @@ import java.util.Map;
* @author Yinq
* @date 2025-01-07
*/
+@Slf4j
@RequiredArgsConstructor
@Service
public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService {
@@ -59,6 +65,13 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService {
private final IWmsPurchaseOrderService purchaseOrderService;
private final IWmsPurchaseOrderDetailService purchaseOrderDetailService;
+ /**
+ * QMS 质检服务(Dubbo 引用)
+ * 用于为 WMS 入库单创建质检任务
+ */
+ @DubboReference(timeout = 300000)
+ private final RemoteQmsInspectionService remoteQmsInspectionService;
+
/**
* 查询入库记录
@@ -367,4 +380,79 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService {
}
}
+ /**
+ * PDA 入库提交(带质检判断)
+ *
+ * 业务流程:
+ * 1. 查询入库打印记录
+ * 2. 判断是否需要质检(是否有物料 inspectionRequest = "0")
+ * 3. 如果全部是免检物料,直接调用 completeQualityCheck() 完成入库
+ * 4. 如果有必检物料,调用 QMS 创建质检任务,更新打印记录状态为"质检中"
+ *
+ * @param instockCode 入库单号
+ * @return 是否处理成功
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean submitInstockWithQualityCheck(String instockCode) {
+ log.info("PDA入库提交开始,入库单号: {}", instockCode);
+
+ // 1. 查询入库打印记录
+ WmsInstockPrintBo printBo = new WmsInstockPrintBo();
+ printBo.setInstockCode(instockCode);
+ List prints = instockPrintService.queryList(printBo);
+
+ if (prints.isEmpty()) {
+ throw new ServiceException("入库打印记录不存在: " + instockCode);
+ }
+
+ // 2. 判断是否需要质检
+ boolean needInspection = prints.stream()
+ .anyMatch(print -> "0".equals(print.getInspectionRequest()));
+
+ if (!needInspection) {
+ // 免检物料 - 直接入库
+ log.info("入库单 {} 全部为免检物料,直接入库", instockCode);
+ return completeQualityCheck(instockCode);
+ }
+
+ // 3. 必检物料 - 调用 QMS 创建质检任务
+ log.info("入库单 {} 包含必检物料,开始创建质检任务", instockCode);
+
+ for (WmsInstockPrintVo print : prints) {
+ // 只处理必检物料
+ if ("0".equals(print.getInspectionRequest())) {
+ try {
+ // 构建 QMS 请求参数
+ WmsInspectionTaskRequest request = new WmsInspectionTaskRequest();
+ request.setInstockCode(instockCode);
+ request.setMaterialCode(print.getMaterialCode());
+ request.setMaterialName(print.getMaterialName());
+ request.setInspectionQty(print.getApportionQty());
+ request.setBatchCode(print.getBatchCode());
+ request.setInspectionType("7"); // 入库检
+
+ // 调用 QMS 创建质检任务(租户ID和用户ID由 Dubbo 调用链自动传递)
+ String inspectionNo = remoteQmsInspectionService.createInspectionTaskForWMS(request);
+
+ log.info("质检任务创建成功,质检单号: {}, 物料编码: {}", inspectionNo, print.getMaterialCode());
+
+ // 更新打印记录状态:质检中
+ WmsInstockPrintBo updatePrintBo = new WmsInstockPrintBo();
+ updatePrintBo.setInstockPrintId(print.getInstockPrintId());
+ updatePrintBo.setInspectionType("1"); // 质检状态:1=质检中
+ updatePrintBo.setInboundStatus("2"); // 入库状态:2=入库中
+ instockPrintService.updateByBo(updatePrintBo);
+
+ } catch (Exception e) {
+ log.error("为物料 {} 创建质检任务失败: {}", print.getMaterialCode(), e.getMessage(), e);
+ throw new ServiceException("为物料 " + print.getMaterialCode() + " 创建质检任务失败: " + e.getMessage());
+ }
+ }
+ }
+
+ log.info("入库单 {} 质检任务创建完成,等待质检结果", instockCode);
+ return true;
+ }
+
}