Browse Source

AGV回调优化

master
常熟吴彦祖 3 weeks ago
parent
commit
de0a56f295
  1. 50
      src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnAgvTaskServiceImpl.java

50
src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnAgvTaskServiceImpl.java

@ -121,7 +121,7 @@ public class HaiAnAgvTaskServiceImpl implements HaiAnAgvTaskService {
/**
* @author rqrq
* @Description 处理单条AGV回调明细:先锁定明细;下达和放货动作须将暂存的WCS区域原码解析成业务area_id后才更新托盘和移库,映射缺失保留明细重试 - rqrq
* @Description 处理单条AGV回调明细:先锁定明细;海安没有该托盘时把明细改已取消并结束,避免定时任务反复报错;下达和放货再解析区域后落托盘/移库 - rqrq
*/
@Override
@Transactional(rollbackFor = Exception.class)
@ -146,9 +146,22 @@ public class HaiAnAgvTaskServiceImpl implements HaiAnAgvTaskService {
throw new RuntimeException("AGV回调明细缺少site/taskNo/actionType");
}
// 调用运输主任务查询:入参site+taskNo,给明细托盘号兜底;查询失败由本事务回滚,避免误取消。- rqrq
HaiAnWmsTransportTask existedTask = haiAnAgvTaskMapper.getTransportTaskByTaskNo(site, taskNo);
String palletId = resolvePalletId(existedTask, taskDetail);
if (StringUtils.hasText(palletId)) {
// 调用托盘主数据查询:入参site+palletId且排除已删除;WCS回了海安没有的托盘(如SYS_空托)时不能再改calling_flag或移库。- rqrq
HaiAnPalletInfoResult palletInfo = haiAnPdaAutoWarehouseMapper.getPalletInfo(site, palletId);
if (palletInfo == null) {
// 未查到则把本条明细改已取消并写原因;不抛错,提交后定时任务不再捞这条。- rqrq
cancelAgvDetailForMissingPallet(taskDetail.getId(), palletId, now);
return;
}
}
if (HaiAnAgvCallbackTypeStaticData.DISPATCH.equals(callbackType)
|| HaiAnAgvCallbackTypeStaticData.PUT_DONE.equals(callbackType)) {
// 下达和放货会写主任务区域、托盘位置或移库;先按site重新解析回调区域,未配置时阻断消费但保留已接收明细。- rqrq
// 下达和放货会写主任务区域、托盘位置或移库;先按site重解析,能映射用area_id,不能映射就用回调原码继续消费。- rqrq
String detailArea = normalizeText(taskDetail.getToArea());
if (StringUtils.hasText(detailArea)) {
taskDetail.setToArea(resolveAgvCallbackBusinessArea(site, detailArea, taskDetail.getToLocation()));
@ -197,6 +210,22 @@ public class HaiAnAgvTaskServiceImpl implements HaiAnAgvTaskService {
}
}
/**
* 海安托盘主数据不存在时,把已抢占的AGV回调明细改成已取消并记下托盘号。
* 定时捞单只认已录入/处理失败/回调处理失败,改成已取消后不再运算;本方法不抛异常,保证事务提交。- rqrq
* @param detailId 已锁定的回调明细主键 - rqrq
* @param palletId 回调或主任务上的托盘号,写入错误信息供页面排查 - rqrq
* @param now 取消完成时间,写入complete_time表示本条已收口 - rqrq
*/
private void cancelAgvDetailForMissingPallet(Long detailId, String palletId, Date now) {
// 调用明细状态更新:入参id+已取消+完成时间;失败则本条仍停在处理中,下轮锁单会跳过,需人工处理。- rqrq
haiAnAgvTaskMapper.updateTransportTaskDetailStatusForId(detailId, HaiAnStatusStaticData.TASK_CANCELLED, now);
// 调用错误回写:保留托盘不存在原因,页面可看取消依据;失败不影响已取消状态提交。- rqrq
haiAnAgvTaskMapper.updateTransportTaskDetailWithError(
detailId, "PALLET_NOT_FOUND", truncateError("托盘不存在,回调明细已取消:" + palletId));
log.warn("海安AGV回调托盘不存在,明细改为已取消 - rqrq,id={},palletId={}", detailId, palletId);
}
/**
* @author rqrq
* @Description 处理“下达任务”:先更新calling_flag=Y,再创建/更新haian_wms_transport_task主记录(含from_area) - rqrq
@ -584,16 +613,18 @@ public class HaiAnAgvTaskServiceImpl implements HaiAnAgvTaskService {
}
/**
* AGV回调明细可能暂存WCS原码;消费写业务表前按site和目标点位重查配置,未映射则抛错保留明细待重试。- rqrq
* AGV回调明细可能暂存WCS原码;消费写业务表前按site和目标点位重查配置。
* 能映射则用业务area_id;haian_area没有对应记录时把回调原码当area继续下达/放货/落位,不再抛错卡定时消费。
* 立库端口仍优先A01;A01也缺失时回退回调原码。移库对未配置区域会跳过入队,不会因此生成脏IFS。- rqrq
* @param site 海安大工厂,限定区域配置范围 - rqrq
* @param areaCode 明细to_area,可能是业务area_id或WCS区域原码 - rqrq
* @param targetPoint 本次目标点位,三个立库端口固定归属A01 - rqrq
* @return 当前有效的业务area_id,供主任务、移库和托盘落位消费 - rqrq
* @return 映射后的业务area_id,或未配置时的回调原码,供主任务、移库和托盘落位消费 - rqrq
*/
private String resolveAgvCallbackBusinessArea(String site, String areaCode, String targetPoint) {
HaiAnAreaOption areaOption;
if (HaiAnStationStaticData.isWarehousePortStation(targetPoint)) {
// 立库端口按真实站点归属A01;配置缺失时不能用回调原码改写托盘区域。- rqrq
// 立库端口按真实站点归属A01;A01缺失时不能中断已到站回调,后面回退原码。- rqrq
areaOption = haiAnPdaAutoWarehouseMapper.getHaianArea(site, HaiAnAreaStaticData.STOCK_AREA);
} else {
// 已映射的历史明细优先按业务area_id识别,暂存WCS原码时再反查;两次查询都限定site。- rqrq
@ -602,10 +633,13 @@ public class HaiAnAgvTaskServiceImpl implements HaiAnAgvTaskService {
areaOption = haiAnPdaAutoWarehouseMapper.getHaianAreaByWcsAreaCode(site, areaCode);
}
}
if (areaOption == null || !StringUtils.hasText(areaOption.getAreaId())) {
throw new RuntimeException("AGV回调目标区域尚未配置,已保留回调明细待重试:" + areaCode);
if (areaOption != null && StringUtils.hasText(areaOption.getAreaId())) {
return areaOption.getAreaId().trim();
}
return areaOption.getAreaId().trim();
// 区域表没有对应记录时,把AREA_OUT_RFID_STAGE这类WCS原码直接当area继续执行,避免明细反复待重试。- rqrq
log.warn("海安AGV回调目标区域未配置,按原码继续消费 - rqrq,site={},areaCode={},targetPoint={}",
site, areaCode, targetPoint);
return areaCode;
}
/**

Loading…
Cancel
Save