| | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | |
| | | * 每次只处理一个任务,避免高并发执行 |
| | | * 使用AtomicBoolean确保单线程执行循环 |
| | | */ |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | @Scheduled(cron = "0/15 * * * * ? ") |
| | | private void allocateSite() { |
| | | if (!schedulerProperties.isEnabled()) { |
| | | log.debug("定时任务allocateSite:调度器未启用,跳过执行"); |
| | |
| | | if (!schedulerProperties.isEnabled()) { |
| | | return; |
| | | } |
| | | List<Task> taskList = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 9).eq("is_deleted", 0)); |
| | | List<Task> taskList = taskService.selectList(new EntityWrapper<Task>().in("wrk_sts", 9L,10L).eq("is_deleted", 0)); |
| | | if (taskList.isEmpty()) { |
| | | return; |
| | | } |
| | |
| | | ); |
| | | } |
| | | // 如果通过wrk_no没找到,且有条码,则通过条码查询 |
| | | // 注意:通过条码查询时,需要验证工作档是否真的已完成(通过wrk_no匹配),避免重复条码导致误判 |
| | | if (wrkMastLog == null && !Cools.isEmpty(agvTask.getBarcode())) { |
| | | List<WrkMastLog> logList = wrkMastLogService.selectList( |
| | | new EntityWrapper<WrkMastLog>().eq("barcode", agvTask.getBarcode()) |
| | | ); |
| | | if (!logList.isEmpty()) { |
| | | wrkMastLog = logList.get(0); // 取第一个 |
| | | // 构建查询条件:条码匹配,且历史档创建时间在AGV订单创建时间之后,且不超过AGV创建时间之后6小时 |
| | | Wrapper<WrkMastLog> logWrapper = new EntityWrapper<WrkMastLog>() |
| | | |
| | | .eq("barcode", agvTask.getBarcode()); |
| | | // 如果AGV订单有创建时间,添加时间过滤条件 |
| | | if (agvTask.getAppeTime() != null) { |
| | | // 计算AGV创建时间之后6小时的时间 |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.setTime(agvTask.getAppeTime()); |
| | | calendar.add(Calendar.HOUR_OF_DAY, 6); // 加6小时 |
| | | Date endTime = calendar.getTime(); |
| | | // 查询条件:历史档创建时间 >= AGV订单创建时间 且 <= AGV创建时间之后6小时 |
| | | logWrapper = logWrapper.ge("appe_time", agvTask.getAppeTime()) |
| | | .le("appe_time", endTime) |
| | | .eq("barcode", agvTask.getBarcode()) |
| | | ; |
| | | } |
| | | List<WrkMastLog> logList = wrkMastLogService.selectList(logWrapper); |
| | | // 过滤:只保留工作号匹配的历史档,避免重复条码导致误判 |
| | | for (WrkMastLog log : logList) { |
| | | if (agvTask.getWrkNo() != null && log.getWrkNo() != null && |
| | | log.getWrkNo().equals(agvTask.getWrkNo())) { |
| | | wrkMastLog = log; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | String displayTaskId = (agvTask.getWrkNo() != null) ? String.valueOf(agvTask.getWrkNo()) : String.valueOf(agvTask.getId()); |
| | | // 如果订单创建超过五分钟,查询AGV订单状态 |
| | | if (shouldCheckAgvStatus) { |
| | | String agvOrderStatus = queryAgvOrderStatus(agvTask, displayTaskId); |
| | | if (agvOrderStatus != null) { |
| | | // 根据订单状态处理 |
| | | boolean shouldComplete = processAgvOrderStatus(agvTask, agvOrderStatus, displayTaskId, now); |
| | | if (shouldComplete) { |
| | | completedTasks.add(agvTask); |
| | | } |
| | | // queryAgvOrderStatus内部已经调用processAgvOrderStatus进行归类处理 |
| | | // 返回true表示应该完结订单,添加到完成列表 |
| | | boolean shouldComplete = queryAgvOrderStatus(agvTask, displayTaskId); |
| | | if (shouldComplete) { |
| | | completedTasks.add(agvTask); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 查询AGV订单状态 |
| | | * 查询AGV订单状态并归类处理 |
| | | * @param agvTask AGV任务 |
| | | * @param displayTaskId 显示的任务ID |
| | | * @return 订单状态(Building/Created/Assigned/Failed/Done/Cancelled),如果查询失败返回null |
| | | * @return true表示应该完结订单,false表示不应该完结(跳过),如果查询失败返回false |
| | | */ |
| | | private String queryAgvOrderStatus(Task agvTask, String displayTaskId) { |
| | | private boolean queryAgvOrderStatus(Task agvTask, String displayTaskId) { |
| | | try { |
| | | // 构建订单ID,优先使用agvWrkNo,如果为空则使用T+wrkNo(向后兼容) |
| | | String orderId = agvTask.getAgvWrkNo(); |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | } |
| | | |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | |
| | | // 解析响应 |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | |
| | | try { |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | |
| | | // 获取订单信息 |
| | |
| | | String status = entityValue.getString("status"); |
| | | if (status != null) { |
| | | log.info("查询AGV订单状态成功 - 任务ID:{},订单ID:{},状态:{}", displayTaskId, orderId, status); |
| | | return status; |
| | | // 查询后使用processAgvOrderStatus方法归类 |
| | | Date now = new Date(); |
| | | boolean shouldComplete = processAgvOrderStatus(agvTask, status, displayTaskId, now); |
| | | return shouldComplete; |
| | | } else { |
| | | String errorMsg = String.format("查询AGV订单状态响应中缺少status字段,请求:%s,响应:%s", requestBody, response); |
| | | log.warn("查询AGV订单状态失败 - 任务ID:{},订单ID:{},{}", displayTaskId, orderId, errorMsg); |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | } else { |
| | | String errorMsg = String.format("查询AGV订单状态响应中缺少entityValue字段,请求:%s,响应:%s", requestBody, response); |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | } catch (com.alibaba.fastjson.JSONException e) { |
| | | String errorMsg = String.format("解析AGV订单状态响应JSON失败:%s,请求:%s,响应:%s", e.getMessage(), requestBody, response); |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | } catch (Exception e) { |
| | | String errorMsg = String.format("查询AGV订单状态异常:%s", e.getMessage()); |
| | |
| | | agvTask.setErrorMemo2(errorMsg); |
| | | agvTask.setErrorTime2(new Date()); |
| | | taskService.updateById(agvTask); |
| | | return null; |
| | | return false; |
| | | } |
| | | } |
| | | |