|
|
|
@ -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"); |
|
|
|
|