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