From cea1758e1f540e3f5f807951f128b7385b32afe6 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期六, 24 一月 2026 17:03:04 +0800
Subject: [PATCH] agv增加主动查询状态

---
 src/main/java/com/zy/asrs/task/AgvScheduler.java |  218 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 215 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/asrs/task/AgvScheduler.java b/src/main/java/com/zy/asrs/task/AgvScheduler.java
index aab2508..727dd07 100644
--- a/src/main/java/com/zy/asrs/task/AgvScheduler.java
+++ b/src/main/java/com/zy/asrs/task/AgvScheduler.java
@@ -1,5 +1,7 @@
 package com.zy.asrs.task;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.core.common.Cools;
@@ -11,7 +13,9 @@
 import com.zy.asrs.service.WrkMastLogService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.task.handler.AgvHandler;
+import com.zy.common.constant.ApiInterfaceConstant;
 import com.zy.common.properties.SchedulerProperties;
+import com.zy.common.utils.HttpHandler;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
@@ -19,11 +23,14 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -144,6 +151,7 @@
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     log.warn("瀹氭椂浠诲姟allocateSite锛氬欢杩熻涓柇", e);
+                    isAllocateSite.set(false);
                     break; // 濡傛灉琚腑鏂紝閫�鍑哄惊鐜�
                 }
             }
@@ -202,7 +210,6 @@
                         displayTaskId, task.getWrkNo(), task.getIoType(), task.getStaNo());
                 boolean processed = agvHandler.callAgv(Collections.singletonList(task));
 
-                // 鍙湁褰撲换鍔℃垚鍔熷鐞嗭紙鎴愬姛鍛煎彨AGV锛岀姸鎬佷粠7鍙樹负8锛夋椂锛屾墠鏇存柊lastProcessedTaskId
                 // 濡傛灉浠诲姟琚烦杩囷紙绔欑偣琚崰鐢ㄧ瓑锛夛紝涓嶆洿鏂發astProcessedTaskId锛屼笅娆′細閲嶆柊灏濊瘯
                 if (processed) {
                     lastProcessedTaskId = task.getId();
@@ -218,6 +225,7 @@
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     log.warn("鍛煎彨AGV瀹氭椂浠诲姟锛氬欢杩熻涓柇", e);
+                    isAllocateSite.set(false);
                     break; // 濡傛灉琚腑鏂紝閫�鍑哄惊鐜�
                 }
             }
@@ -325,14 +333,16 @@
                     if (agvTask.getIoType() != null &&
                             (agvTask.getIoType() == 1 || agvTask.getIoType() == 10 ||
                                     agvTask.getIoType() == 53 || agvTask.getIoType() == 57)) {
+                        
+                        // taskId浣跨敤宸ヤ綔鍙凤紙wrk_no锛夛紝濡傛灉宸ヤ綔鍙蜂负绌哄垯浣跨敤浠诲姟ID
+                        String displayTaskId = (agvTask.getWrkNo() != null) ? String.valueOf(agvTask.getWrkNo()) : String.valueOf(agvTask.getId());
+
                         // 鏇存柊AGV浠诲姟鐘舵�佷负瀹屾垚
                         agvTask.setWrkSts(9L);
                         agvTask.setModiTime(now);
                         if (taskService.updateById(agvTask)) {
                             completedTasks.add(agvTask);
                             completedCount++;
-                            // taskId浣跨敤宸ヤ綔鍙凤紙wrk_no锛夛紝濡傛灉宸ヤ綔鍙蜂负绌哄垯浣跨敤浠诲姟ID
-                            String displayTaskId = (agvTask.getWrkNo() != null) ? String.valueOf(agvTask.getWrkNo()) : String.valueOf(agvTask.getId());
                             log.info("鍏ュ簱浠诲姟宸ヤ綔妗e凡鍏ュ簱鎴愬姛锛屽畬缁揂GV鍛煎彨鍗曪紝taskId锛歿}锛寃rkNo锛歿}锛宐arcode锛歿}",
                                     displayTaskId, wrkMast.getWrkNo(), wrkMast.getBarcode());
                         }
@@ -577,6 +587,36 @@
                                 reason, displayTaskId, agvTask.getWrkNo(), agvTask.getBarcode(), agvTask.getStaNo());
                     }
                 }
+
+
+
+                // 妫�鏌ヨ鍗曞垱寤烘椂闂达紝瓒呰繃浜斿垎閽熷悗鎵嶆煡璇GV璁㈠崟鐘舵��
+                Date appeTime = agvTask.getAppeTime();
+                boolean shouldCheckAgvStatus = false;
+                if (appeTime != null) {
+                    long timeDiff = now.getTime() - appeTime.getTime();
+                    long fiveMinutesInMillis = 5 * 60 * 1000; // 5鍒嗛挓
+                    if (timeDiff >= fiveMinutesInMillis) {
+                        shouldCheckAgvStatus = true;
+                    }
+                } else {
+                    // 濡傛灉娌℃湁鍒涘缓鏃堕棿锛岄粯璁ゆ鏌�
+                    shouldCheckAgvStatus = true;
+                }
+                // taskId浣跨敤宸ヤ綔鍙凤紙wrk_no锛夛紝濡傛灉宸ヤ綔鍙蜂负绌哄垯浣跨敤浠诲姟ID
+                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);
+                        }
+                    }
+                }
+
             }
 
             // 绔嬪嵆灏嗗畬鎴愮殑AGV浠诲姟杞Щ鍒板巻鍙茶〃锛屼笉淇濈暀鍦═ask琛ㄤ腑
@@ -597,5 +637,177 @@
         }
     }
 
+    /**
+     * 鏌ヨAGV璁㈠崟鐘舵��
+     * @param agvTask AGV浠诲姟
+     * @param displayTaskId 鏄剧ず鐨勪换鍔D
+     * @return 璁㈠崟鐘舵�侊紙Building/Created/Assigned/Failed/Done/Cancelled锛夛紝濡傛灉鏌ヨ澶辫触杩斿洖null
+     */
+    private String queryAgvOrderStatus(Task agvTask, String displayTaskId) {
+        try {
+            // 鏋勫缓璁㈠崟ID锛屾牸寮忎负 "T" + wrkNo
+            String orderId = null;
+            if (agvTask.getWrkNo() != null) {
+                orderId = "T" + agvTask.getWrkNo();
+            } else {
+                String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�佸け璐ワ細浠诲姟ID锛�%s锛寃rkNo涓虹┖", displayTaskId);
+                log.warn("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛寋}", displayTaskId, errorMsg);
+                agvTask.setErrorMemo(errorMsg);
+                agvTask.setErrorTime(new Date());
+                taskService.updateById(agvTask);
+                return null;
+            }
+
+            // 鏋勫缓璇锋眰JSON
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("entityName", "ContainerTransportOrder");
+            requestJson.put("id", orderId);
+            String requestBody = requestJson.toJSONString();
+
+            // 鏋勫缓璇锋眰澶�
+            Map<String, Object> headers = new HashMap<>();
+            headers.put("xyy-app-id", "seer");
+            headers.put("xyy-app-key", "123456");
+
+            // 鍙戦�佽姹�
+            String response = null;
+            try {
+                response = new HttpHandler.Builder()
+                        .setUri(ApiInterfaceConstant.AGV_IP)
+                        .setPath(ApiInterfaceConstant.AGV_FIND_ONE_PATH)
+                        .setJson(requestBody)
+                        .setHeaders(headers)
+                        .build()
+                        .doPost();
+            } catch (IOException e) {
+                String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�丄PI璋冪敤澶辫触锛�%s锛岃姹傦細%s", e.getMessage(), requestBody);
+                log.error("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg, e);
+                agvTask.setErrorMemo2(errorMsg);
+                agvTask.setErrorTime2(new Date());
+                taskService.updateById(agvTask);
+                return null;
+            }
+
+            // 瑙f瀽鍝嶅簲
+            if (response == null || response.trim().isEmpty()) {
+                String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�丄PI杩斿洖涓虹┖锛岃姹傦細%s", requestBody);
+                log.warn("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg);
+                agvTask.setErrorMemo2(errorMsg);
+                agvTask.setErrorTime2(new Date());
+                taskService.updateById(agvTask);
+                return null;
+            }
+
+            try {
+                JSONObject responseJson = JSON.parseObject(response);
+                
+                // 妫�鏌ユ槸鍚︽湁閿欒鐮�
+                String code = responseJson.getString("code");
+                if (code != null && "errNoSuchEntity".equals(code)) {
+                    // 鎵句笉鍒颁笟鍔″璞★紝璁板綍鍒癳rrorMemo浣嗗拷鐣ワ紙涓嶉樆姝㈠悗缁鐞嗭級
+                    String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�侊細鎵句笉鍒拌鍗曪紙errNoSuchEntity锛夛紝璇锋眰锛�%s锛屽搷搴旓細%s", requestBody, response);
+                    log.debug("鏌ヨAGV璁㈠崟鐘舵�侊細鎵句笉鍒拌鍗� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}", displayTaskId, orderId);
+                    agvTask.setErrorMemo2(errorMsg);
+                    agvTask.setErrorTime2(new Date());
+                    taskService.updateById(agvTask);
+                    return null;
+                }
+
+                // 鑾峰彇璁㈠崟淇℃伅
+                JSONObject entityValue = responseJson.getJSONObject("entityValue");
+                if (entityValue != null) {
+                    String status = entityValue.getString("status");
+                    if (status != null) {
+                        log.info("鏌ヨAGV璁㈠崟鐘舵�佹垚鍔� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛岀姸鎬侊細{}", displayTaskId, orderId, status);
+                        return status;
+                    } else {
+                        String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�佸搷搴斾腑缂哄皯status瀛楁锛岃姹傦細%s锛屽搷搴旓細%s", requestBody, response);
+                        log.warn("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg);
+                        agvTask.setErrorMemo2(errorMsg);
+                        agvTask.setErrorTime2(new Date());
+                        taskService.updateById(agvTask);
+                        return null;
+                    }
+                } else {
+                    String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�佸搷搴斾腑缂哄皯entityValue瀛楁锛岃姹傦細%s锛屽搷搴旓細%s", requestBody, response);
+                    log.warn("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg);
+                    agvTask.setErrorMemo2(errorMsg);
+                    agvTask.setErrorTime2(new Date());
+                    taskService.updateById(agvTask);
+                    return null;
+                }
+            } catch (com.alibaba.fastjson.JSONException e) {
+                String errorMsg = String.format("瑙f瀽AGV璁㈠崟鐘舵�佸搷搴擩SON澶辫触锛�%s锛岃姹傦細%s锛屽搷搴旓細%s", e.getMessage(), requestBody, response);
+                log.error("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg, e);
+                agvTask.setErrorMemo2(errorMsg);
+                agvTask.setErrorTime2(new Date());
+                taskService.updateById(agvTask);
+                return null;
+            }
+        } catch (Exception e) {
+            String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�佸紓甯革細%s", e.getMessage());
+            log.error("鏌ヨAGV璁㈠崟鐘舵�佸紓甯� - 浠诲姟ID锛歿}锛寋}", displayTaskId, errorMsg, e);
+            agvTask.setErrorMemo2(errorMsg);
+            agvTask.setErrorTime2(new Date());
+            taskService.updateById(agvTask);
+            return null;
+        }
+    }
+
+    /**
+     * 澶勭悊AGV璁㈠崟鐘舵��
+     * @param agvTask AGV浠诲姟
+     * @param status 璁㈠崟鐘舵��
+     * @param displayTaskId 鏄剧ず鐨勪换鍔D
+     * @param now 褰撳墠鏃堕棿
+     * @return true琛ㄧず搴旇瀹岀粨璁㈠崟锛宖alse琛ㄧず涓嶅簲璇ュ畬缁擄紙璺宠繃锛�
+     */
+    private boolean processAgvOrderStatus(Task agvTask, String status, String displayTaskId, Date now) {
+        if (status == null) {
+            return false; // 鐘舵�佷负绌猴紝璺宠繃
+        }
+
+        switch (status) {
+            case "Building":
+                // Building=鏈彁浜わ紝姝e父娌℃湁姝ょ姸鎬侊紝蹇界暐
+                log.debug("AGV璁㈠崟鐘舵�佷负Building锛堟湭鎻愪氦锛夛紝蹇界暐 - 浠诲姟ID锛歿}", displayTaskId);
+                return true; // 缁х画澶勭悊
+            case "Created":
+                // Created=宸叉彁浜わ紝绛夊緟鏈熼棿锛屼笉澶勭悊
+                log.debug("AGV璁㈠崟鐘舵�佷负Created锛堝凡鎻愪氦锛夛紝绛夊緟鏈熼棿锛屼笉澶勭悊 - 浠诲姟ID锛歿}", displayTaskId);
+                return false; // 涓嶅鐞嗭紝璺宠繃
+            case "Assigned":
+            case "Assined":
+                // Assigned=宸叉淳杞︼紝姝e父鐘舵�侊紝涓嶅鐞�
+                log.debug("AGV璁㈠崟鐘舵�佷负{}锛堝凡娲捐溅锛夛紝姝e父鐘舵�侊紝涓嶅鐞� - 浠诲姟ID锛歿}", status, displayTaskId);
+                return false; // 涓嶅鐞嗭紝璺宠繃
+            case "Failed":
+            case "Failde":
+                // Failed=澶辫触锛屾爣璁颁负澶辫触璁㈠崟
+                log.warn("AGV璁㈠崟鐘舵�佷负{}锛堝け璐ワ級锛屾爣璁颁负澶辫触璁㈠崟 - 浠诲姟ID锛歿}", status, displayTaskId);
+                agvTask.setWrkSts(10L);
+                agvTask.setErrorTime(now);
+                agvTask.setErrorMemo(String.format("AGV璁㈠崟鐘舵�佷负%s锛堝け璐ワ級", status));
+                taskService.updateById(agvTask);
+                return false; // 涓嶅鐞嗭紝璺宠繃
+            case "Done":
+                // Done=宸插畬鎴愶紝瀹岀粨璁㈠崟
+                log.info("AGV璁㈠崟鐘舵�佷负Done锛堝凡瀹屾垚锛夛紝瀹岀粨璁㈠崟 - 浠诲姟ID锛歿}", displayTaskId);
+                return true; // 缁х画澶勭悊锛屽畬缁撹鍗�
+            case "Cancelled":
+                // Cancelled=鍙栨秷锛屽彇娑堣鍗�
+                log.warn("AGV璁㈠崟鐘舵�佷负Cancelled锛堝彇娑堬級锛屽彇娑堣鍗� - 浠诲姟ID锛歿}", displayTaskId);
+                agvTask.setWrkSts(10L);
+                agvTask.setErrorTime(now);
+                agvTask.setErrorMemo("AGV璁㈠崟鐘舵�佷负Cancelled锛堝彇娑堬級");
+                taskService.updateById(agvTask);
+                return false; // 涓嶅鐞嗭紝璺宠繃
+            default:
+                // 鏈煡鐘舵�侊紝璁板綍鏃ュ織浣嗙户缁鐞�
+                log.warn("AGV璁㈠崟鐘舵�佹湭鐭ワ細{}锛岀户缁鐞� - 浠诲姟ID锛歿}", status, displayTaskId);
+                return true; // 缁х画澶勭悊
+        }
+    }
+
 }
 

--
Gitblit v1.9.1