自动化立体仓库 - WMS系统
chen.lin
2026-02-14 371462edc6b3ee1de97c235d4a019b544badda0d
src/main/java/com/zy/asrs/task/AgvScheduler.java
@@ -27,6 +27,7 @@
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;
@@ -90,7 +91,7 @@
     * 每次只处理一个任务,避免高并发执行
     * 使用AtomicBoolean确保单线程执行循环
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    @Scheduled(cron = "0/15 * * * * ? ")
    private void allocateSite() {
        if (!schedulerProperties.isEnabled()) {
            log.debug("定时任务allocateSite:调度器未启用,跳过执行");
@@ -276,7 +277,7 @@
        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;
        }
@@ -538,12 +539,33 @@
                    );
                }
                // 如果通过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;
                        }
                    }
                }
@@ -607,13 +629,11 @@
                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);
                    }
                }
@@ -638,12 +658,12 @@
    }
    /**
     * 查询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();
@@ -656,7 +676,7 @@
                    agvTask.setErrorMemo2(errorMsg);
                    agvTask.setErrorTime2(new Date());
                    taskService.updateById(agvTask);
                    return null;
                    return false;
                }
            }
@@ -687,7 +707,7 @@
                agvTask.setErrorMemo2(errorMsg);
                agvTask.setErrorTime2(new Date());
                taskService.updateById(agvTask);
                return null;
                return false;
            }
            // 解析响应
@@ -697,7 +717,7 @@
                agvTask.setErrorMemo2(errorMsg);
                agvTask.setErrorTime2(new Date());
                taskService.updateById(agvTask);
                return null;
                return false;
            }
            try {
@@ -712,7 +732,7 @@
                    agvTask.setErrorMemo2(errorMsg);
                    agvTask.setErrorTime2(new Date());
                    taskService.updateById(agvTask);
                    return null;
                    return false;
                }
                // 获取订单信息
@@ -721,14 +741,17 @@
                    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);
@@ -736,7 +759,7 @@
                    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);
@@ -744,7 +767,7 @@
                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());
@@ -752,7 +775,7 @@
            agvTask.setErrorMemo2(errorMsg);
            agvTask.setErrorTime2(new Date());
            taskService.updateById(agvTask);
            return null;
            return false;
        }
    }