From 3f1ef12af7537930c3621e3fa26f8cade3c888e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Mon, 17 Nov 2025 15:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E7=BA=A6=E4=BB=BB=E5=8A=A1=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AutoTaskServiceImpl.java | 123 ++++++++++++------ 1 file changed, 80 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AutoTaskServiceImpl.java b/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AutoTaskServiceImpl.java index d518f35..30a96b6 100644 --- a/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AutoTaskServiceImpl.java +++ b/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AutoTaskServiceImpl.java @@ -445,30 +445,37 @@ public class AutoTaskServiceImpl implements AutoTaskService { else { System.out.println("指定区域放货 - rqrq,toArea=" + inData.getToArea()); - // 查询该区域下的空闲点位 - rqrq - String idleLocation = wcsIntegrationMapper.findFirstFreeStationByAreaId(inData.getToArea()); - - if(StringUtils.hasText(idleLocation)){ - System.out.println("找到空闲站点,尝试使用乐观锁预占 - rqrq:" + idleLocation); - // 使用乐观锁尝试预占站点(从空闲0改为待放货2)- rqrq - int lockResult = wcsIntegrationMapper.updateAgvStationStatusWithLock( - idleLocation, - 0, // expectedStatusDb - 期望当前是空闲 - 2, // newStatusDb - 更新为待放货 - "待放货" - ); + // 最多重试3次,防止所有空闲站点都被其他线程占用 - rqrq + int maxRetries = 3; + for(int i = 0; i < maxRetries; i++){ + // 查询该区域下的空闲点位 - rqrq + String idleLocation = wcsIntegrationMapper.findFirstFreeStationByAreaId(inData.getToArea()); - if(lockResult == 1){ - System.out.println("乐观锁预占站点成功 - rqrq"); - return idleLocation; + if(StringUtils.hasText(idleLocation)){ + System.out.println("找到空闲站点(第" + (i+1) + "次尝试),尝试使用乐观锁预占 - rqrq:" + idleLocation); + // 使用乐观锁尝试预占站点(从空闲0改为待放货2)- rqrq + int lockResult = wcsIntegrationMapper.updateAgvStationStatusWithLock( + idleLocation, + 0, // expectedStatusDb - 期望当前是空闲 + 2, // newStatusDb - 更新为待放货 + "待放货" + ); + + if(lockResult == 1){ + System.out.println("乐观锁预占站点成功 - rqrq"); + return idleLocation; + } else { + System.out.println("乐观锁预占站点失败,站点已被占用,尝试查找其他站点 - rqrq"); + // 继续下一次循环,查找其他空闲站点 - rqrq + } } else { - System.out.println("乐观锁预占站点失败,站点已被占用,尝试查找其他站点 - rqrq"); - return null; // 站点已被其他线程占用,创建预约任务 - rqrq + System.out.println("区域内无空闲站点(第" + (i+1) + "次尝试)- rqrq"); + break; // 没有空闲站点,跳出循环 - rqrq } - } else { - System.out.println("区域内无空闲站点,需要创建预约任务 - rqrq"); - return null; } + + System.out.println("经过" + maxRetries + "次重试,区域内仍无可用站点,需要创建预约任务 - rqrq"); + return null; } } @@ -867,39 +874,69 @@ public class AutoTaskServiceImpl implements AutoTaskService { System.out.println("目标站点状态为待放货,可以使用(预留给此任务)- rqrq"); return wmsTransportTask.getToLocation(); } else { - System.out.println("目标站点状态异常 - rqrq,期望状态=2(待放货),实际状态=" + stationStatus); - return null; + // 站点状态异常(被其他任务占用或已释放),自动改为区域预约 - rqrq + System.out.println("目标站点状态异常,自动改为区域预约 - rqrq,期望状态=2(待放货),实际状态=" + stationStatus); + + // 查询目标站点的区域信息 - rqrq + AgvStation targetStation = wcsIntegrationMapper.getAgvStation(wmsTransportTask.getToLocation()); + if(targetStation != null && StringUtils.hasText(targetStation.getAreaType())){ + String areaType = targetStation.getAreaType(); + System.out.println("查询到目标站点所属区域 - rqrq,areaType=" + areaType); + + // 更新任务记录的to_location为null,to_area为区域代码 - rqrq + wcsIntegrationMapper.updateWTTToLocationForId(wmsTransportTask.getSite(), wmsTransportTask.getTaskNo(), null); + wcsIntegrationMapper.updateTransportTaskToArea(wmsTransportTask.getSite(), wmsTransportTask.getTaskNo(), areaType); + + // 更新内存中的任务对象 - rqrq + wmsTransportTask.setToLocation(null); + wmsTransportTask.setToArea(areaType); + + System.out.println("已自动改为区域预约 - rqrq,toArea=" + areaType); + + return null; + } else { + // 查询不到区域信息,返回null等待下次处理 - rqrq + System.out.println("错误:无法获取目标站点的区域信息 - rqrq"); + return null; + } } } // 如果toLocation为空,说明是指定区域预约,需要查找空闲站点并锁定 - rqrq else if(StringUtils.hasText(wmsTransportTask.getToArea())){ System.out.println("处理指定区域预约任务 - rqrq,toArea=" + wmsTransportTask.getToArea()); - // 查询该区域下的空闲站点(status_db=0)- rqrq - String idleStation = wcsIntegrationMapper.findFirstFreeStationByAreaId(wmsTransportTask.getToArea()); - - if(StringUtils.hasText(idleStation)){ - System.out.println("找到空闲站点,尝试使用乐观锁占用 - rqrq:" + idleStation); + // 最多重试3次,防止死循环 - rqrq + int maxRetries = 3; + for(int i = 0; i < maxRetries; i++){ + // 查询该区域下的空闲站点(status_db=0)- rqrq + String idleStation = wcsIntegrationMapper.findFirstFreeStationByAreaId(wmsTransportTask.getToArea()); - // 使用乐观锁尝试占用站点(从空闲0改为待放货2)- rqrq - int lockResult = wcsIntegrationMapper.updateAgvStationStatusWithLock( - idleStation, - 0, // expectedStatusDb - 期望当前是空闲 - 2, // newStatusDb - 更新为待放货 - "待放货" - ); - - if(lockResult == 1){ - System.out.println("乐观锁占用站点成功 - rqrq"); - return idleStation; + if(StringUtils.hasText(idleStation)){ + System.out.println("找到空闲站点(第" + (i+1) + "次尝试),尝试使用乐观锁占用 - rqrq:" + idleStation); + + // 使用乐观锁尝试占用站点(从空闲0改为待放货2)- rqrq + int lockResult = wcsIntegrationMapper.updateAgvStationStatusWithLock( + idleStation, + 0, // expectedStatusDb - 期望当前是空闲 + 2, // newStatusDb - 更新为待放货 + "待放货" + ); + + if(lockResult == 1){ + System.out.println("乐观锁占用站点成功 - rqrq"); + return idleStation; + } else { + System.out.println("乐观锁占用站点失败,站点已被占用,尝试查找其他站点 - rqrq"); + // 继续下一次循环,查找其他空闲站点 - rqrq + } } else { - System.out.println("乐观锁占用站点失败,站点已被占用,继续等待 - rqrq"); - return null; + System.out.println("区域内无空闲站点(第" + (i+1) + "次尝试)- rqrq"); + break; // 没有空闲站点,跳出循环 - rqrq } - } else { - System.out.println("区域内无空闲站点 - rqrq"); - return null; } + + System.out.println("经过" + maxRetries + "次重试,仍未找到可用站点 - rqrq"); + return null; } else { System.out.println("toLocation和toArea都为空,无法确定目标站点 - rqrq");