diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnAgvTaskServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnAgvTaskServiceImpl.java index 5f5596ba..d4b518c5 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnAgvTaskServiceImpl.java +++ b/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; } /**