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