From 3e6cd2231fc99a855129d1a293b8d65adf1683b5 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@gmail.com>
Date: 星期三, 04 二月 2026 10:55:11 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java |  119 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 88 insertions(+), 31 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
index 34b83ff..2e52cda 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
@@ -3,12 +3,13 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.utils.Base62;
 import com.zy.acs.common.utils.RedisSupport;
-import com.zy.acs.common.utils.Utils;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.R;
 import com.zy.acs.framework.common.SnowflakeIdWorker;
 import com.zy.acs.manager.common.annotation.OperationLog;
+import com.zy.acs.manager.common.config.UplinkProperties;
 import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
 import com.zy.acs.manager.common.exception.BusinessException;
 import com.zy.acs.manager.core.service.*;
@@ -18,6 +19,7 @@
 import com.zy.acs.manager.manager.enums.*;
 import com.zy.acs.manager.manager.service.*;
 import com.zy.acs.manager.system.controller.BaseController;
+import com.zy.acs.manager.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -64,7 +66,7 @@
     @Autowired
     private StaService staService;
     @Autowired
-    private TrafficService trafficService;
+    private UplinkProperties uplinkProperties;
     @Autowired
     private ThreadPoolRegulator threadPoolRegulator;
     @Autowired
@@ -75,6 +77,10 @@
     private PatrolService patrolService;
     @Autowired
     private StaReserveService staReserveService;
+    @Autowired
+    private AgvAreaDispatcher agvAreaDispatcher;
+    @Autowired
+    private ConfigService configService;
 
     @PreAuthorize("hasAuthority('manager:agv:update')")
     @OperationLog("Locate All Agv")
@@ -138,6 +144,7 @@
             return R.error();
         }
 
+        Boolean maintainLocSts = configService.getVal("maintainLocSts", Boolean.class);
         Date now = new Date();
         Agv agv = agvService.selectByUuid(param.getAgvNo());
         AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
@@ -162,16 +169,17 @@
         Task task = new Task();
         task.setAgvId(agv.getId());
         task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
-        List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
-        task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+//        List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
+//        task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+        task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
 
         task.setTaskType(param.getTaskMode().val());
         task.setTaskSts(TaskStsType.WAITING.val());
-
+        task.setUplinkSts(uplinkProperties.getEnabled() ? TaskUplinkStateType.PENDING.toString() : TaskUplinkStateType.SKIPPED.toString());
         task.setPriority(999);
         task.setIoTime(now);
         task.setStartTime(now);
-        task.setMemo("HANDLE");
+        task.setMemo("AUTO");
         if (!taskService.save(task)) {
             throw new BusinessException(task.getSeqNum() + "浠诲姟淇濆瓨澶辫触");
         }
@@ -192,6 +200,9 @@
                 }
                 if (null == endCode) {
                     return R.error();
+                }
+                if (!agvAreaDispatcher.match(agv.getId(), endCode.getId())) {
+                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + endCode.getData());
                 }
                 if (!taskService.removeById(task.getId())) {
                     throw new BusinessException("failed to remove task");
@@ -222,13 +233,19 @@
                 if (null == oriLoc) {
                     return R.error();
                 }
-                if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
-                    throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 涓嶆槸鍦ㄥ簱鐘舵��");
+                if (!agvAreaDispatcher.match(agv.getId(), oriLoc.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + oriLoc.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈捐捣濮嬪簱浣嶃��" + oriLoc.getLocNo() + "銆�");
                 }
-                oriLoc.setLocSts(LocStsType.PAKOUT.val());
-                oriLoc.setUpdateTime(now);
-                if (!locService.updateById(oriLoc)) {
-                    throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                if (maintainLocSts) {
+                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
+                        throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 涓嶆槸鍦ㄥ簱鐘舵��");
+                    }
+                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
+                    oriLoc.setUpdateTime(now);
+                    if (!locService.updateById(oriLoc)) {
+                        throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                    }
                 }
 
                 // destLoc
@@ -241,13 +258,19 @@
                 if (null == destLoc) {
                     return R.error();
                 }
-                if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
-                    throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 涓嶆槸绌洪棽鐘舵��");
+                if (!agvAreaDispatcher.match(agv.getId(), destLoc.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + destLoc.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈剧洰鏍囧簱浣嶃��" + destLoc.getLocNo() + "銆�");
                 }
-                destLoc.setLocSts(LocStsType.PAKIN.val());
-                destLoc.setUpdateTime(now);
-                if (!locService.updateById(destLoc)) {
-                    throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                if (maintainLocSts) {
+                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
+                        throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 涓嶆槸绌洪棽鐘舵��");
+                    }
+                    destLoc.setLocSts(LocStsType.PAKIN.val());
+                    destLoc.setUpdateTime(now);
+                    if (!locService.updateById(destLoc)) {
+                        throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                    }
                 }
 
                 // task
@@ -267,13 +290,19 @@
                 if (null == oriLoc) {
                     return R.error();
                 }
-                if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
-                    throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 涓嶆槸鍦ㄥ簱鐘舵��");
+                if (!agvAreaDispatcher.match(agv.getId(), oriLoc.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + oriLoc.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈捐捣濮嬪簱浣嶃��" + oriLoc.getLocNo() + "銆�");
                 }
-                oriLoc.setLocSts(LocStsType.PAKOUT.val());
-                oriLoc.setUpdateTime(now);
-                if (!locService.updateById(oriLoc)) {
-                    throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                if (maintainLocSts) {
+                    if (!oriLoc.getLocSts().equals(LocStsType.STOCK.val())) {
+                        throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 涓嶆槸鍦ㄥ簱鐘舵��");
+                    }
+                    oriLoc.setLocSts(LocStsType.PAKOUT.val());
+                    oriLoc.setUpdateTime(now);
+                    if (!locService.updateById(oriLoc)) {
+                        throw new BusinessException("oriLoc锛�" + oriLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                    }
                 }
 
                 // destSta
@@ -286,15 +315,20 @@
                 if (null == destSta) {
                     return R.error();
                 }
+                if (!agvAreaDispatcher.match(agv.getId(), destSta.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + destSta.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈剧洰鏍囩珯鐐广��" + destSta.getStaNo() + "銆�");
+                }
                 if (null == staReserveService.reserveStaIn(destSta, task, 1)) {
                     throw new BusinessException("destSta锛�" + destSta.getStaNo() + " 棰勭害澶辫触");
                 }
-
                 // task
                 task.setOriLoc(oriLoc.getId());
                 task.setOriCode(oriLoc.getCode());
                 task.setDestSta(destSta.getId());
                 task.setDestCode(destSta.getCode());
+
+                staReserveService.allocateCallBack(task, agv.getId());
                 break;
             case STA_TO_LOC:
                 // oriSta
@@ -306,6 +340,10 @@
                 }
                 if (null == oriSta) {
                     return R.error();
+                }
+                if (!agvAreaDispatcher.match(agv.getId(), oriSta.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + oriSta.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈捐捣濮嬬珯鐐广��" + oriSta.getStaNo() + "銆�");
                 }
                 if (null == staReserveService.reserveStaOut(oriSta, task, 1)) {
                     throw new BusinessException("oriSta锛�" + oriSta.getStaNo() + " 棰勭害澶辫触");
@@ -321,13 +359,19 @@
                 if (null == destLoc) {
                     return R.error();
                 }
-                if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
-                    throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 涓嶆槸绌洪棽鐘舵��");
+                if (!agvAreaDispatcher.match(agv.getId(), destLoc.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + destLoc.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈剧洰鏍囧簱浣嶃��" + destLoc.getLocNo() + "銆�");
                 }
-                destLoc.setLocSts(LocStsType.PAKIN.val());
-                destLoc.setUpdateTime(now);
-                if (!locService.updateById(destLoc)) {
-                    throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                if (maintainLocSts) {
+                    if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
+                        throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 涓嶆槸绌洪棽鐘舵��");
+                    }
+                    destLoc.setLocSts(LocStsType.PAKIN.val());
+                    destLoc.setUpdateTime(now);
+                    if (!locService.updateById(destLoc)) {
+                        throw new BusinessException("destLoc锛�" + destLoc.getLocNo() + " 淇敼搴撲綅鐘舵�佸け璐�");
+                    }
                 }
 
                 // task
@@ -335,6 +379,8 @@
                 task.setOriCode(oriSta.getCode());
                 task.setDestLoc(destLoc.getId());
                 task.setDestCode(destLoc.getCode());
+
+                staReserveService.allocateCallBack(task, agv.getId());
                 break;
             case STA_TO_STA:
                 // oriSta
@@ -347,9 +393,14 @@
                 if (null == oriSta) {
                     return R.error();
                 }
+                if (!agvAreaDispatcher.match(agv.getId(), oriSta.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + oriSta.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈捐捣濮嬬珯鐐广��" + oriSta.getStaNo() + "銆�");
+                }
                 if (null == staReserveService.reserveStaOut(oriSta, task, 1)) {
                     throw new BusinessException("oriSta锛�" + oriSta.getStaNo() + " 棰勭害澶辫触");
                 }
+
 
                 // destSta
                 if (!Cools.isEmpty(param.getEndStaNo())) {
@@ -361,6 +412,10 @@
                 if (null == destSta) {
                     return R.error();
                 }
+                if (!agvAreaDispatcher.match(agv.getId(), destSta.getCode())) {
+//                    throw new BusinessException("AGV " + agv.getUuid() + " failed to reach target code " + destSta.getCode$());
+                    throw new BusinessException("AGV銆�" + agv.getUuid() + "銆戞棤娉曞埌杈剧洰鏍囩珯鐐广��" + destSta.getStaNo() + "銆�");
+                }
                 if (null == staReserveService.reserveStaIn(destSta, task, 1)) {
                     throw new BusinessException("destSta锛�" + destSta.getStaNo() + " 棰勭害澶辫触");
                 }
@@ -370,6 +425,8 @@
                 task.setOriCode(oriSta.getCode());
                 task.setDestSta(destSta.getId());
                 task.setDestCode(destSta.getCode());
+
+                staReserveService.allocateCallBack(task, agv.getId());
                 break;
             default:
                 break;

--
Gitblit v1.9.1