From 87fda255732e4709e923f5b4c1e6b401e20c6002 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期六, 09 十一月 2024 15:25:20 +0800
Subject: [PATCH] #
---
zy-acs-flow/src/map/http.js | 21 +++++
zy-acs-flow/src/i18n/en.js | 2
zy-acs-manager/src/main/java/com/zy/acs/manager/core/PatrolService.java | 103 +++++++++++++++++++++++++
zy-acs-flow/src/map/insight/agv/AgvMain.jsx | 40 +++++++++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java | 19 ++++
zy-acs-flow/src/i18n/zh.js | 2
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java | 4 +
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAgvVo.java | 2
8 files changed, 190 insertions(+), 3 deletions(-)
diff --git a/zy-acs-flow/src/i18n/en.js b/zy-acs-flow/src/i18n/en.js
index 933ea92..ff8e64d 100644
--- a/zy-acs-flow/src/i18n/en.js
+++ b/zy-acs-flow/src/i18n/en.js
@@ -647,6 +647,8 @@
enable: 'ENABLE',
reset: 'RESET',
restoreALl: 'Restore All',
+ startPatrol: 'START PATROL',
+ stopPatrol: 'STOP PATROL',
},
mode: {
observer: 'OBSERVER',
diff --git a/zy-acs-flow/src/i18n/zh.js b/zy-acs-flow/src/i18n/zh.js
index f54e55b..607b965 100644
--- a/zy-acs-flow/src/i18n/zh.js
+++ b/zy-acs-flow/src/i18n/zh.js
@@ -646,6 +646,8 @@
enable: '鍚敤',
reset: '閲嶇疆',
restoreALl: '鎭㈠鎵�鏈�',
+ startPatrol: '寮�鍚贰閫�',
+ stopPatrol: '鍋滄宸¢��',
},
mode: {
observer: '瑙傚療妯″紡',
diff --git a/zy-acs-flow/src/map/http.js b/zy-acs-flow/src/map/http.js
index 2fce322..b059e6c 100644
--- a/zy-acs-flow/src/map/http.js
+++ b/zy-acs-flow/src/map/http.js
@@ -283,3 +283,24 @@
console.error(error.message);
})
}
+
+export const handleAgvPatrol = async (param) => {
+ try {
+ const res = await request.post('/handler/agv/patrol', param, {
+ headers: {
+ 'appKey': HANDLE_APP_KEY
+ }
+ });
+ const { code, msg, data } = res.data;
+ if (code === 200) {
+ notify.success(msg);
+ return true;
+ } else {
+ notify.error(msg);
+ }
+ } catch (error) {
+ notify.error(error.message);
+ console.error(error.message);
+ }
+ return false;
+}
\ No newline at end of file
diff --git a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
index c5aaf5b..2c981e6 100644
--- a/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
+++ b/zy-acs-flow/src/map/insight/agv/AgvMain.jsx
@@ -14,7 +14,7 @@
} from '@mui/material';
import { useNotification } from '../../Notification';
import AgvThree from './AgvThree';
-import { handleRestoreAgvAll } from '../../http';
+import { handleRestoreAgvAll, handleAgvPatrol } from '../../http';
import BoolValueIcon from '../BoolValueIcon';
import ConfirmButton from '../../../page/components/ConfirmButton';
import { grey } from '@mui/material/colors';
@@ -122,6 +122,13 @@
});
}
+ const patrolControl = async () => {
+ const res = await handleAgvPatrol({ agvNo: info.agvNo })
+ if (res) {
+ fetchAgvInfo(curAgvNo);
+ }
+ }
+
return (
<Box display="flex" height="100%">
<Box
@@ -193,7 +200,8 @@
}}>
<Grid container spacing={2} style={{ marginTop: '0px' }}>
<Grid item xs={12}>
- <Stack spacing={2} mt={2}>
+ <Stack spacing={1} mt={2}>
+ {/* more */}
<Button
color="primary"
variant="contained"
@@ -203,8 +211,33 @@
>
{translate('page.map.settings.map.more.title')}
</Button>
+ {/* patrol */}
{info && (
- info.status === 1
+ info.patrol
+ ?
+ <Button variant="contained" color="error" fullWidth onClick={() => {
+ patrolControl();
+ }}>
+ {translate('page.map.action.stopPatrol')}
+ </Button>
+ :
+ // <Button variant="contained" fullWidth onClick={() => {
+ // patrolControl();
+ // }}>
+ // {translate('page.map.action.startPatrol')}
+ // </Button>
+ <ConfirmButton
+ label="page.map.action.startPatrol"
+ color="primary"
+ variant="contained"
+ onConfirm={() => {
+ patrolControl();
+ }}
+ />
+ )}
+ {/* status */}
+ {info && (
+ info.status === 0
? <Button variant="contained" color="error" fullWidth onClick={() => {
updateStatus();
}}>
@@ -216,6 +249,7 @@
{translate('page.map.action.enable')}
</Button>
)}
+ {/* restore all */}
<ConfirmButton
label="page.map.action.restoreALl"
color="inherit"
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 2573042..63d395e 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
@@ -65,6 +65,8 @@
private MapDataDispatcher mapDataDispatcher;
@Autowired
private AvoidWaveCalculator avoidWaveCalculator;
+ @Autowired
+ private PatrolService patrolService;
@RequestMapping(value = "/control/agv", method = {RequestMethod.GET, RequestMethod.POST})
@Transactional
@@ -277,4 +279,21 @@
return R.ok();
}
+ @RequestMapping(value = "/agv/patrol", method = {RequestMethod.GET, RequestMethod.POST})
+ public R agvPatrol(@RequestHeader String appKey,
+ @RequestBody HandlerPublishParam param) throws ExecutionException, InterruptedException {
+ if (Cools.isEmpty(param.getAgvNo(), appKey)) {
+ return R.error();
+ }
+ if (!APP_KEY.equals(appKey)) {
+ return R.error();
+ }
+ String agvNo = param.getAgvNo();
+ if (patrolService.isPatrolling(agvNo)) {
+ return patrolService.shutdownPatrol(agvNo);
+ } else {
+ return patrolService.startupPatrol(agvNo);
+ }
+ }
+
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/PatrolService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/PatrolService.java
new file mode 100644
index 0000000..a40d879
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/PatrolService.java
@@ -0,0 +1,103 @@
+package com.zy.acs.manager.core;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.framework.common.R;
+import com.zy.acs.manager.manager.entity.Agv;
+import com.zy.acs.manager.manager.enums.StatusType;
+import com.zy.acs.manager.manager.service.AgvService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.Map;
+import java.util.concurrent.*;
+
+/**
+ * Created by vincent on 11/9/2024
+ */
+@Slf4j
+@Service
+public class PatrolService {
+
+ private static final int SCHEDULE_TIME_INTERVAL = 1;
+ private static final Map<String, ScheduledFuture<?>> AGV_PATROL_MAP = new ConcurrentHashMap<>();
+
+ private ScheduledExecutorService scheduler = null;
+
+ @Autowired
+ private AgvService agvService;
+
+ public boolean isPatrolling(String agvNo) {
+ ScheduledFuture<?> scheduledFuture = AGV_PATROL_MAP.get(agvNo);
+ if (scheduledFuture == null) {
+ return false;
+ }
+ return !scheduledFuture.isCancelled() && !scheduledFuture.isDone();
+ }
+
+ public R startupPatrol(String agvNo) {
+ if (AGV_PATROL_MAP.containsKey(agvNo)) {
+ return R.error("AGV " + agvNo + " 鐨勮窇搴撲换鍔″凡缁忓湪杩愯涓��");
+ }
+
+ Runnable patrolTask = () -> {
+ try {
+ executePatrolLogic(agvNo);
+ } catch (Exception e) {
+ log.error("鎵цAGV " + agvNo + " 璺戝簱浠诲姟鏃跺彂鐢熷紓甯�: " + e.getMessage());
+ e.printStackTrace();
+ }
+ };
+
+ ScheduledFuture<?> scheduledFuture = scheduler.scheduleAtFixedRate(patrolTask, 0, SCHEDULE_TIME_INTERVAL, TimeUnit.SECONDS);
+
+ AGV_PATROL_MAP.put(agvNo, scheduledFuture);
+ log.info("宸插惎鍔ˋGV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ return R.ok();
+ }
+
+
+ public R shutdownPatrol(String agvNo) {
+ ScheduledFuture<?> scheduledFuture = AGV_PATROL_MAP.get(agvNo);
+ if (scheduledFuture == null) {
+ return R.error("AGV " + agvNo + " 娌℃湁姝e湪杩愯鐨勮窇搴撲换鍔°��");
+ }
+
+ boolean cancelled = scheduledFuture.cancel(true);
+ if (cancelled) {
+ AGV_PATROL_MAP.remove(agvNo);
+ log.info("宸插仠姝GV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ return R.ok("宸插仠姝GV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ } else {
+ log.error("鏈兘鎴愬姛鍋滄AGV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ return R.error("鏈兘鎴愬姛鍋滄AGV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ }
+ }
+
+ private void executePatrolLogic(String agvNo) {
+ // TODO: 鍦ㄨ繖閲屽疄鐜板叿浣撶殑璺戝簱涓氬姟閫昏緫
+ log.info("鎵цAGV " + agvNo + " 鐨勮窇搴撲换鍔°��");
+ }
+
+ @PostConstruct
+ public void init() {
+ int count = agvService.count(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
+ if (count > 0) {
+ this.scheduler = Executors.newScheduledThreadPool(count);
+ }
+ }
+
+ @PreDestroy
+ public void destroy() throws InterruptedException {
+ for (Map.Entry<String, ScheduledFuture<?>> entry : AGV_PATROL_MAP.entrySet()) {
+ entry.getValue().cancel(true);
+ }
+ scheduler.shutdown();
+ if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) {
+ scheduler.shutdownNow();
+ }
+ }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java
index 90921f4..1843570 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java
@@ -13,6 +13,7 @@
import com.zy.acs.manager.common.domain.MapDto;
import com.zy.acs.manager.common.domain.MapRouteDto;
import com.zy.acs.manager.common.exception.BusinessException;
+import com.zy.acs.manager.core.PatrolService;
import com.zy.acs.manager.core.domain.BackpackDto;
import com.zy.acs.manager.core.service.MapService;
import com.zy.acs.manager.core.service.floyd.FloydNavigateService;
@@ -68,6 +69,8 @@
private LocService locService;
@Autowired
private ConfigService configService;
+ @Autowired
+ private PatrolService patrolService;
@PreAuthorize("hasAuthority('manager:loc:update')")
@PostMapping("/startupOrShutdown")
@@ -160,6 +163,7 @@
vo.setCode(codeService.getById(agvDetail.getRecentCode()).getData());
vo.setDirection(agvDetail.getAgvAngle());
vo.setBackpack(GsonUtils.fromJsonToList(agvDetail.getBackpack(), BackpackDto.class));
+ vo.setPatrol(patrolService.isPatrolling(agvNo));
}
List<Task> tasks = taskService.selectInSts(agv.getId(), TaskStsType.WAITING, TaskStsType.ASSIGN, TaskStsType.PROGRESS);
if (!Cools.isEmpty(tasks)) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAgvVo.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAgvVo.java
index 3f1e798..b982081 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAgvVo.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAgvVo.java
@@ -36,4 +36,6 @@
private List<Long> taskIds = new ArrayList<>();
+ private Boolean patrol;
+
}
--
Gitblit v1.9.1