From 371462edc6b3ee1de97c235d4a019b544badda0d Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期六, 14 二月 2026 22:09:37 +0800
Subject: [PATCH] AGV工作档界面和逻辑调整

---
 src/main/java/com/zy/asrs/task/AgvScheduler.java |  257 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 247 insertions(+), 10 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..15ba6c8 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,15 @@
 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.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -83,7 +91,7 @@
      * 姣忔鍙鐞嗕竴涓换鍔★紝閬垮厤楂樺苟鍙戞墽琛�
      * 浣跨敤AtomicBoolean纭繚鍗曠嚎绋嬫墽琛屽惊鐜�
      */
-    @Scheduled(cron = "0/5 * * * * ? ")
+    @Scheduled(cron = "0/15 * * * * ? ")
     private void allocateSite() {
         if (!schedulerProperties.isEnabled()) {
             log.debug("瀹氭椂浠诲姟allocateSite锛氳皟搴﹀櫒鏈惎鐢紝璺宠繃鎵ц");
@@ -144,6 +152,7 @@
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     log.warn("瀹氭椂浠诲姟allocateSite锛氬欢杩熻涓柇", e);
+                    isAllocateSite.set(false);
                     break; // 濡傛灉琚腑鏂紝閫�鍑哄惊鐜�
                 }
             }
@@ -202,7 +211,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 +226,7 @@
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     log.warn("鍛煎彨AGV瀹氭椂浠诲姟锛氬欢杩熻涓柇", e);
+                    isAllocateSite.set(false);
                     break; // 濡傛灉琚腑鏂紝閫�鍑哄惊鐜�
                 }
             }
@@ -268,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;
         }
@@ -325,14 +334,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());
                         }
@@ -528,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); // 鍙栫涓�涓�
+                    // 鏋勫缓鏌ヨ鏉′欢锛氭潯鐮佸尮閰嶏紝涓斿巻鍙叉。鍒涘缓鏃堕棿鍦ˋGV璁㈠崟鍒涘缓鏃堕棿涔嬪悗锛屼笖涓嶈秴杩嘇GV鍒涘缓鏃堕棿涔嬪悗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);
+                    // 杩囨护锛氬彧淇濈暀宸ヤ綔鍙峰尮閰嶇殑鍘嗗彶妗o紝閬垮厤閲嶅鏉$爜瀵艰嚧璇垽
+                    for (WrkMastLog log : logList) {
+                        if (agvTask.getWrkNo() != null && log.getWrkNo() != null && 
+                                log.getWrkNo().equals(agvTask.getWrkNo())) {
+                            wrkMastLog = log;
+                            break;
+                        }
                     }
                 }
 
@@ -577,6 +609,34 @@
                                 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) {
+                    // queryAgvOrderStatus鍐呴儴宸茬粡璋冪敤processAgvOrderStatus杩涜褰掔被澶勭悊
+                    // 杩斿洖true琛ㄧず搴旇瀹岀粨璁㈠崟锛屾坊鍔犲埌瀹屾垚鍒楄〃
+                    boolean shouldComplete = queryAgvOrderStatus(agvTask, displayTaskId);
+                    if (shouldComplete) {
+                        completedTasks.add(agvTask);
+                    }
+                }
+
             }
 
             // 绔嬪嵆灏嗗畬鎴愮殑AGV浠诲姟杞Щ鍒板巻鍙茶〃锛屼笉淇濈暀鍦═ask琛ㄤ腑
@@ -597,5 +657,182 @@
         }
     }
 
+    /**
+     * 鏌ヨAGV璁㈠崟鐘舵�佸苟褰掔被澶勭悊
+     * @param agvTask AGV浠诲姟
+     * @param displayTaskId 鏄剧ず鐨勪换鍔D
+     * @return true琛ㄧず搴旇瀹岀粨璁㈠崟锛宖alse琛ㄧず涓嶅簲璇ュ畬缁擄紙璺宠繃锛夛紝濡傛灉鏌ヨ澶辫触杩斿洖false
+     */
+    private boolean queryAgvOrderStatus(Task agvTask, String displayTaskId) {
+        try {
+            // 鏋勫缓璁㈠崟ID锛屼紭鍏堜娇鐢╝gvWrkNo锛屽鏋滀负绌哄垯浣跨敤T+wrkNo锛堝悜鍚庡吋瀹癸級
+            String orderId = agvTask.getAgvWrkNo();
+            if (orderId == null || orderId.isEmpty()) {
+                if (agvTask.getWrkNo() != null) {
+                    orderId = "T" + agvTask.getWrkNo();
+                } else {
+                    String errorMsg = String.format("鏌ヨAGV璁㈠崟鐘舵�佸け璐ワ細浠诲姟ID锛�%s锛宎gvWrkNo鍜寃rkNo閮戒负绌�", displayTaskId);
+                    log.warn("鏌ヨAGV璁㈠崟鐘舵�佸け璐� - 浠诲姟ID锛歿}锛寋}", displayTaskId, errorMsg);
+                    agvTask.setErrorMemo2(errorMsg);
+                    agvTask.setErrorTime2(new Date());
+                    taskService.updateById(agvTask);
+                    return false;
+                }
+            }
+
+            // 鏋勫缓璇锋眰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 false;
+            }
+
+            // 瑙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 false;
+            }
+
+            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 false;
+                }
+
+                // 鑾峰彇璁㈠崟淇℃伅
+                JSONObject entityValue = responseJson.getJSONObject("entityValue");
+                if (entityValue != null) {
+                    String status = entityValue.getString("status");
+                    if (status != null) {
+                        log.info("鏌ヨAGV璁㈠崟鐘舵�佹垚鍔� - 浠诲姟ID锛歿}锛岃鍗旾D锛歿}锛岀姸鎬侊細{}", displayTaskId, orderId, status);
+                        // 鏌ヨ鍚庝娇鐢╬rocessAgvOrderStatus鏂规硶褰掔被
+                        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锛歿}锛岃鍗旾D锛歿}锛寋}", displayTaskId, orderId, errorMsg);
+                        agvTask.setErrorMemo2(errorMsg);
+                        agvTask.setErrorTime2(new Date());
+                        taskService.updateById(agvTask);
+                        return false;
+                    }
+                } 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 false;
+                }
+            } 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 false;
+            }
+        } 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 false;
+        }
+    }
+
+    /**
+     * 澶勭悊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