From 48eefc082760c3f859656e5375f5a71b04f38054 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期三, 13 十一月 2024 08:11:57 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/constants.js                                                      |    1 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java         |   37 +++---------
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java      |    5 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java            |    6 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java |    7 +
 zy-acs-flow/src/map/tool.js                                                           |    5 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java           |    6 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java   |    5 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java |   72 ++++++++++++++++++++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java       |    6 +
 zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java                |   13 ++++
 11 files changed, 124 insertions(+), 39 deletions(-)

diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java
index cc9733e..230ea3f 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java
@@ -15,6 +15,19 @@
     IMU_ERROR(0xF1, "IMU寮傚父鐘舵��"),
     ERROR(0xFF, "鏁呴殰鐘舵��"),
     ;
+//    IDLE(0x00, "IDLE"),
+//    STRAIGHT(0x01, "鐩磋鐘舵��"),
+//    TURN(0x03, "TURN"),
+//    CHARGE(0x07, "CHARGE"),
+//    LOW_POWER(0x08, "浣庡姛鑰楃姸鎬�"),
+//    PAUSE(0x09, "瀹氭椂鏆傚仠鐘舵��"),
+//    ROTATE(0x0A, "鏃嬭浆鏍囧畾鐘舵��"),
+//    MOTION(0x0B, "鍙栨斁璐х姸鎬�"),
+//    TEMP(0x0C, "棰勭暀"),
+//    LOST(0xF0, "涓㈠け鍦板潃鐮佺姸鎬�"),
+//    IMU_ERROR(0xF1, "IMU寮傚父鐘舵��"),
+//    ERROR(0xFF, "鏁呴殰鐘舵��"),
+//    ;
 
     public Integer val;
 
diff --git a/zy-acs-flow/src/map/constants.js b/zy-acs-flow/src/map/constants.js
index 3f52d08..137f7aa 100644
--- a/zy-acs-flow/src/map/constants.js
+++ b/zy-acs-flow/src/map/constants.js
@@ -1,4 +1,5 @@
 
+export const ANIMATE_DURING_TIME = 1000;
 
 export const MAP_MODE = Object.freeze({
     OBSERVER_MODE: "1",
diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index ab5e99f..3afce6a 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -9,6 +9,7 @@
     DEVICE_SELECTED_EFFECT_COLOR,
     POINT_ROUTE_DIRECTION,
     DEVICE_SPRITE_TINT_DARK,
+    ANIMATE_DURING_TIME,
 } from './constants';
 import { getRouteList } from './http';
 import PointRoute from "./PointRoute";
@@ -564,7 +565,7 @@
     const endRotation = sprite.rotation + rotationDifference;
 
     new TWEEDLE.Tween(sprite)
-        .to({ rotation: endRotation }, 1000)
+        .to({ rotation: endRotation }, ANIMATE_DURING_TIME)
         .easing(TWEEDLE.Easing.Linear.None)
         .onUpdate(() => {
             // agv
@@ -721,7 +722,7 @@
         .to({
             x: codeSprite.position.x,
             y: codeSprite.position.y
-        }, 1000)
+        }, ANIMATE_DURING_TIME)
         .easing(TWEEDLE.Easing.Linear.None)
         .start();
 }
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 53bd72b..541a3ed 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
@@ -47,6 +47,8 @@
     @Autowired
     private MainService mainService;
     @Autowired
+    private MainLockWrapService mainLockWrapService;
+    @Autowired
     private SnowflakeIdWorker snowflakeIdWorker;
     @Autowired
     private CodeService codeService;
@@ -110,13 +112,13 @@
                 if (null == endCode) {
                     return R.error();
                 }
-                if (!mainService.buildMinorTask(agv, agvDetail, param.getTaskMode(), endCode.getData())) {
+                if (!mainLockWrapService.buildMinorTask(agv, agvDetail, param.getTaskMode(), endCode.getData())) {
                     return R.error();
                 }
                 break;
             case TO_CHARGE:
             case TO_STANDBY:
-                if (!mainService.buildMinorTask(agv, agvDetail, param.getTaskMode(), null)) {
+                if (!mainLockWrapService.buildMinorTask(agv, agvDetail, param.getTaskMode(), null)) {
                     return R.error();
                 }
                 break;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
index 1dfb30e..49aa6a6 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.acs.manager.core.domain.AgvTaskDto;
+import com.zy.acs.manager.core.service.MainLockWrapService;
 import com.zy.acs.manager.core.service.MainService;
 import com.zy.acs.manager.core.service.TrafficService;
 import com.zy.acs.manager.manager.entity.Bus;
@@ -44,6 +45,8 @@
     @Autowired
     private MainService mainService;
     @Autowired
+    private MainLockWrapService mainLockWrapService;
+    @Autowired
     private ActionService actionService;
     @Autowired
     private SegmentService segmentService;
@@ -81,7 +84,7 @@
         }
 
         for (AgvTaskDto dto : taskDtoList) {
-            mainService.buildMajorTask(dto.getAgvId(), dto.getTaskList());
+            mainLockWrapService.buildMajorTask(dto.getAgvId(), dto.getTaskList());
         }
         this.lock.unlock();
     }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index 26ddb08..277b7de 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -4,6 +4,7 @@
 import com.zy.acs.common.enums.AgvStatusType;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.DateUtils;
+import com.zy.acs.manager.core.service.MainLockWrapService;
 import com.zy.acs.manager.core.service.MainService;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
@@ -37,6 +38,8 @@
     private FuncStaService funcStaService;
     @Autowired
     private MainService mainService;
+    @Autowired
+    private MainLockWrapService mainLockWrapService;
     @Autowired
     private TaskService taskService;
     @Autowired
@@ -79,7 +82,7 @@
                     continue;
                 }
 
-                mainService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_CHARGE, null);
+                mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_CHARGE, null);
             }
         }
     }
@@ -142,7 +145,7 @@
                 }
 //            }
 
-            mainService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_STANDBY, null);
+            mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_STANDBY, null);
         }
     }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
new file mode 100644
index 0000000..cd8f4f6
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
@@ -0,0 +1,72 @@
+package com.zy.acs.manager.core.service;
+
+import com.zy.acs.framework.exception.CoolException;
+import com.zy.acs.manager.manager.entity.Agv;
+import com.zy.acs.manager.manager.entity.AgvDetail;
+import com.zy.acs.manager.manager.entity.Task;
+import com.zy.acs.manager.manager.enums.TaskTypeType;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by vincent on 11/12/2024
+ */
+@Slf4j
+@Service
+public class MainLockWrapService {
+
+    private static final int LOCK_TIMEOUT = 5;
+    private final ReentrantLock lock = new ReentrantLock(Boolean.TRUE);
+
+    @Autowired
+    private MainService mainService;
+
+    public void buildMajorTask(Long agvId, List<Task> taskList) {
+        boolean lockAcquired = false;
+        try {
+            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
+                throw new CoolException("failed to generate [major task] action, cause can not acquire lock ...");
+            }
+
+            mainService.buildMajorTask(agvId, taskList);
+        } catch (Exception e) {
+
+            log.error("MainLockWrapService.buildMajorTask[task]", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        } finally {
+            if (lockAcquired) {
+                this.lock.unlock();
+            }
+        }
+    }
+
+    public boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
+        boolean lockAcquired = false;
+        try {
+            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
+                throw new CoolException("failed to generate [minor task] actions, cause can not acquire lock ...");
+            }
+//            log.info("buildMinorTask AGV[{}] lock time: {}", agv.getUuid(), System.currentTimeMillis());
+
+            return mainService.buildMinorTask(agv, agvDetail, taskType, destination);
+        } catch (Exception e) {
+            log.error("MainLockWrapService.buildMinorTask[task]", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+
+            return false;
+        } finally {
+
+            if (lockAcquired) {
+                this.lock.unlock();
+            }
+//            log.info("buildMinorTask AGV[{}] unlock time: {}", agv.getUuid(), System.currentTimeMillis());
+        }
+    }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index 9544127..ca8080e 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -21,6 +21,7 @@
 import com.zy.acs.framework.common.SnowflakeIdWorker;
 import com.zy.acs.framework.exception.CoolException;
 import com.zy.acs.manager.common.domain.TaskDto;
+import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
 import com.zy.acs.manager.common.exception.BusinessException;
 import com.zy.acs.manager.common.utils.CommonUtil;
 import com.zy.acs.manager.core.domain.AgvBackpackDto;
@@ -35,11 +36,11 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
@@ -271,16 +272,12 @@
 
     /**
      * 瑙f瀽鍙栨斁璐ч泦鍚堜换鍔�,杩涜鏈�浼樼殑鎺掑垪缁勫悎椤哄簭 ( 杞﹁締姝ゆ椂鏄┖闂蹭笖闈欐鐨� )
+     * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
      */
-    @Transactional
-    public synchronized void buildMajorTask(Long agvId, List<Task> taskList) {
-        if (Cools.isEmpty(taskList)) { return; }
-        boolean lockAcquired = false;
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void buildMajorTask(Long agvId, List<Task> taskList) {
+        if (Cools.isEmpty(agvId, taskList)) { return; }
         try {
-            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
-                throw new CoolException("generate [task] action fail, cause can not acquire lock ...");
-            }
-
             // valid -----------------------------------------------
             Agv agv = agvService.getById(agvId);
             if (!agvService.judgeEnable(agv.getId(), true)) {
@@ -516,28 +513,19 @@
 
         } catch (Exception e) {
 
-            log.error("mainService.mergeMajorTask[task]", e);
+            log.error("mainService.buildMajorTask[task]", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        } finally {
-
-            if (lockAcquired) {
-                this.lock.unlock();
-            }
         }
     }
+
 
     /**
      * 鍏呯數 鍥炲緟鏈轰綅浠诲姟
      */
-    @Transactional
-    public synchronized boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
+    @Transactional(propagation = Propagation.REQUIRES_NEW) // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional
+    public boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
         if (Cools.isEmpty(agv, taskType)) { return false; }
-        boolean lockAcquired = false;
         try {
-            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
-                throw new CoolException("generate [task] action fail, cause can not acquire lock ...");
-            }
-
             if (null == agvDetail) {
                 agvDetail = agvDetailService.selectByAgvId(agv.getId());
             }
@@ -668,11 +656,6 @@
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
             return false;
-        } finally {
-
-            if (lockAcquired) {
-                this.lock.unlock();
-            }
         }
     }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
index 4a43739..f7fe7d8 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
@@ -47,8 +47,10 @@
     private AgvDetailService agvDetailService;
     @Autowired
     private TaskService taskService;
+//    @Autowired
+//    private MainService mainService;
     @Autowired
-    private MainService mainService;
+    private MainLockWrapService mainLockWrapService;
     @Autowired
     private CodeService codeService;
     @Autowired
@@ -77,7 +79,7 @@
         if (null == randomCode) {
             return;
         }
-        if (mainService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
+        if (mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
             log.info(agv.getUuid() + "寮�濮嬭蛋琛屾紨绀�...");
         }
     }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
index d9e99d5..a213cac 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -55,6 +55,8 @@
     @Autowired
     private MainService mainService;
     @Autowired
+    private MainLockWrapService mainLockWrapService;
+    @Autowired
     private MapService mapService;
     @Autowired
     private MapDataDispatcher mapDataDispatcher;
@@ -91,6 +93,7 @@
             if (!Cools.isEmpty(waitingSegList)) {
                 for (Segment waitingSeg : waitingSegList) {
                     if (!waitingSeg.getId().equals(segment.getId())) {
+                        log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid());
                         return;
                     }
                 }
@@ -441,7 +444,7 @@
 
         } else {
 
-            return mainService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData);
+            return mainLockWrapService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData);
         }
 
         return true;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
index 869cb02..6aaed9c 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
@@ -27,6 +27,8 @@
 @Slf4j
 public class AgvSimulatorTask implements Runnable {
 
+    public static final int ACTION_DURING_TIME = 1000;
+
     private final Agv agv;
     private final AgvDetailService agvDetailService;
     private final ActionService actionService;
@@ -114,7 +116,7 @@
         // 妯℃嫙鐢甸噺娑堣��
 //        agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 鏍规嵁璺濈娑堣�楃數閲�
 
-        Thread.sleep(1000);
+        Thread.sleep(ACTION_DURING_TIME);
 
         agvDetailService.updateById(agvDetail);
 
@@ -138,7 +140,7 @@
         // 妯℃嫙鐢甸噺娑堣��?
 //        agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 鏍规嵁瑙掑害娑堣�楃數閲�
 
-        Thread.sleep(1000);
+        Thread.sleep(ACTION_DURING_TIME);
         agvDetailService.updateById(agvDetail);
         action.setActionSts(ActionStsType.FINISH.val());
         actionService.updateById(action);

--
Gitblit v1.9.1