- * 出库完成仍然复用当前出库作业完成过程,统一完成库存扣减、作业归档和出库单完成联动。
+ * WCS 确认托盘已离开库位并到达出库口后,立即释放原货位为空货位;
+ * PDA 扫码确认只负责后续库存扣减、作业归档、出库单完成和回流入库联动。
*/
@ApiLog(interfaceName = "WCS-完成出库作业", sysCode = "WCS", direction = "OUTBOUND")
@PostMapping("/wcs/outbound/complete")
@@ -212,9 +239,6 @@ public class ExternalApiController extends BaseController {
MydoJob job = null;
if (request != null && request.getJobId() != null && !request.getJobId().trim().isEmpty()) {
job = mydoJobService.selectMydoJobByJobId(request.getJobId().trim());
- if (job != null && (job.getInOrOut() == null || job.getInOrOut() < 20)) {
- job = null;
- }
}
if (job == null && request != null && request.getTaskNo() != null && !request.getTaskNo().trim().isEmpty()) {
job = mydoJobService.selectOutMydoJobByTaskNo(request.getTaskNo().trim());
@@ -225,8 +249,112 @@ public class ExternalApiController extends BaseController {
job = mydoJobService.selectLatestOutMydoJobByTrayCodeAndWarehouseId(request.getTrayCode().trim(), request.getWarehouseId().trim());
}
if (job == null) {
- return error("未找到对应出库作业");
+ return wcsError("未找到对应出库作业");
}
- return mydoJobService.completeOutJobFromWcs(job.getJobId());
+ if (!isExpectedJobType(job, false)) {
+ return wcsError("非法出库作业");
+ }
+ return wcsResult(mydoJobService.completeOutJobFromWcs(job.getJobId()));
+ }
+
+ private
+ * 标记作业已到达出库口并释放原货位;不执行出库完成存储过程,
+ * 库存扣减和作业归档仍由 PDA 扫码确认触发。
*
* @param jobId 作业ID
* @return 处理结果
*/
AjaxResult completeOutJobFromWcs(String jobId);
+ /**
+ * WCS 回调取货无货异常。
+ *
+ * @param jobId 出库作业ID
+ * @return 处理结果
+ */
+ AjaxResult handleWcsPickEmptyException(String jobId);
+
+ /**
+ * WCS 回调放货有货异常。
+ *
+ * @param jobId 入库作业ID
+ * @return 处理结果,data 为重新分配货位后的作业对象
+ */
+ AjaxResult handleWcsPutOccupiedException(String jobId);
+
/**
* 将未下发的出库作业推送到 WCS。
*
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java
index 0dbe680..6c7cb77 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java
@@ -5,6 +5,10 @@ import java.util.List;
import com.ruoyi.api.client.WcsClient;
import com.ruoyi.api.domain.ApiResponse;
+import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
+import com.ruoyi.bas.cargospace.mapper.BasCargoSpaceMapper;
+import com.ruoyi.bas.stock.mapper.BasStockDetailMapper;
+import com.ruoyi.bas.stock.mapper.BasStockMapper;
import com.ruoyi.bas.stationpoint.service.IBasStationPointService;
import com.ruoyi.common.annotation.WarehouseScope;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -12,12 +16,17 @@ import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.in.jobdetail.mapper.MydoJobDetailMapper;
import com.ruoyi.in.stockin.mapper.InStockinMapper;
+import com.ruoyi.out.stockout.mapper.OutStockoutMapper;
+import com.ruoyi.out.stockoutdetail.mapper.OutStockoutDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.in.job.mapper.MydoJobMapper;
import com.ruoyi.in.job.domain.MydoJob;
import com.ruoyi.in.job.service.IMydoJobService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
/**
* 作业信息Service业务层处理
@@ -37,6 +46,24 @@ public class MydoJobServiceImpl implements IMydoJobService
@Autowired
private IBasStationPointService basStationPointService;
+ @Autowired
+ private BasCargoSpaceMapper basCargoSpaceMapper;
+
+ @Autowired
+ private BasStockMapper basStockMapper;
+
+ @Autowired
+ private BasStockDetailMapper basStockDetailMapper;
+
+ @Autowired
+ private OutStockoutDetailMapper outStockoutDetailMapper;
+
+ @Autowired
+ private OutStockoutMapper outStockoutMapper;
+
+ @Autowired
+ private MydoJobDetailMapper mydoJobDetailMapper;
+
@Autowired
private WcsClient wcsClient;
@@ -146,7 +173,8 @@ public class MydoJobServiceImpl implements IMydoJobService
MydoJob updateJob = new MydoJob();
updateJob.setJobId(job.getJobId());
- updateJob.setStatus("2");
+ updateJob.setStatus("3");
+ updateJob.setExecutionPhase("1");
updateJob.setStartTime(DateUtils.getTime());
if (mydoJobMapper.updateMydoJob(updateJob) <= 0) {
return AjaxResult.error("出库作业状态更新失败");
@@ -227,6 +255,10 @@ public class MydoJobServiceImpl implements IMydoJobService
public AjaxResult cancelJob(String jobId,String type)
{
MydoJob job = mydoJobMapper.selectMydoJobByJobId(jobId);
+ AjaxResult wcsCancelResult = requestWcsCancelBeforeManualCancel(job);
+ if (wcsCancelResult.isError()) {
+ return wcsCancelResult;
+ }
if ("1".equals(type)){
HashMap
+ * 此时托盘已离开库位,货位状态在 WCS 完成回调中释放;PDA 确认不再负责释放货位。
*/
@Override
public AjaxResult completeOutJobFromWcs(String jobId)
{
MydoJob job = mydoJobMapper.selectMydoJobByJobId(jobId);
- HashMap