From a53438ba7e092ce279c8204329953c94179320a9 Mon Sep 17 00:00:00 2001
From: zgw <13623675548@163.com>
Date: Tue, 15 Sep 2026 11:23:09 +0800
Subject: [PATCH] fix: reject blocked outbound jobs at WCS intake
---
ruoyi-admin/pom.xml | 11 ++
.../api/service/impl/ApiServiceImpl.java | 28 +++++
.../mapper/BasCargoSpaceMapper.java | 5 +
.../mapper/bas/BasCargoSpaceMapper.xml | 20 ++++
.../api/service/impl/ApiServiceImplTest.java | 113 ++++++++++++++++++
5 files changed, 177 insertions(+)
create mode 100644 ruoyi-admin/src/test/java/com/ruoyi/api/service/impl/ApiServiceImplTest.java
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index ae294d5..3aad0ad 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -83,6 +83,12 @@
slf4j-api
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
org.apache.plc4x
@@ -106,6 +112,11 @@
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.2.5
+
org.springframework.boot
spring-boot-maven-plugin
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java
index 6e76e54..b824bfb 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java
@@ -18,6 +18,7 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.PositionCodeData;
import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService;
+import com.ruoyi.bas.cargospace.mapper.BasCargoSpaceMapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.job.domain.MydoJob;
@@ -54,6 +55,8 @@ public class ApiServiceImpl implements IApiService {
@Autowired
private IMydoJobService mydoJobService;
@Autowired
+ private BasCargoSpaceMapper basCargoSpaceMapper;
+ @Autowired
private IAgvContainerTaskService agvContainerTaskService;
@@ -359,6 +362,20 @@ public class ApiServiceImpl implements IApiService {
@Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
+ Integer jobType = parseOutboundJobType(receiveOutJob);
+ if (jobType == null || jobType < 20) {
+ String rawType = receiveOutJob == null ? null : receiveOutJob.getInOrOut();
+ return AjaxResult.error("WCS 无法识别作业类型 " + rawType + ",任务未接收");
+ }
+ if (jobType != 30) {
+ String cargoSpaceId = receiveOutJob.getCargoSpaceId();
+ if (basCargoSpaceMapper.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId) == null) {
+ return AjaxResult.error("WCS 未找到出库货位 " + cargoSpaceId + ",任务未接收");
+ }
+ if (basCargoSpaceMapper.countOutboundBlockingPositions(cargoSpaceId) > 0) {
+ return AjaxResult.error("同通道外侧货位尚未清空,等待前置移库完成");
+ }
+ }
MydoJob mydoJob = new MydoJob();
mydoJob.setJobId(receiveOutJob.getJobId());
mydoJob.setTaskNo(receiveOutJob.getTaskNo());
@@ -382,6 +399,17 @@ public class ApiServiceImpl implements IApiService {
}
+ private Integer parseOutboundJobType(ReceiveJob job) {
+ if (job == null || job.getInOrOut() == null) {
+ return null;
+ }
+ try {
+ return Integer.valueOf(job.getInOrOut());
+ } catch (NumberFormatException ignored) {
+ return null;
+ }
+ }
+
@Override
public AjaxResult receiveInMydoJob(ReceiveJob receiveInJob) {
MydoJob mydoJob = new MydoJob();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java
index 48faa42..0711635 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java
@@ -20,6 +20,11 @@ public interface BasCargoSpaceMapper
*/
public BasCargoSpace selectBasCargoSpaceByCargoSpaceId(String cargoSpaceId);
+ /**
+ * Count occupied positions or unfinished outbound jobs outside the requested position.
+ */
+ int countOutboundBlockingPositions(@Param("cargoSpaceId") String cargoSpaceId);
+
/**
* 查询库存信息列表
*
diff --git a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml
index 1cb55ca..4d848f4 100644
--- a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml
+++ b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml
@@ -60,6 +60,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where cargo_space_id = #{cargoSpaceId}
+
+