Browse Source

预约任务优化

master
常熟吴彦祖 2 months ago
parent
commit
3f1ef12af7
  1. 123
      src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AutoTaskServiceImpl.java

123
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为nullto_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");

Loading…
Cancel
Save