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