From f43a65438cbfb5c11675bea8b643de8e0770f52b Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期二, 13 一月 2026 13:50:45 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/constants.js                                                      |   23 ++++++++++++++++++-----
 zy-acs-flow/src/map/http.js                                                           |   20 ++++++++++++++++++++
 zy-acs-flow/src/map/tool.js                                                           |    3 +--
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java |   11 +++++++++++
 zy-acs-flow/src/map/MapPage.jsx                                                       |    3 ++-
 5 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/zy-acs-flow/src/map/MapPage.jsx b/zy-acs-flow/src/map/MapPage.jsx
index 4981505..de4e424 100644
--- a/zy-acs-flow/src/map/MapPage.jsx
+++ b/zy-acs-flow/src/map/MapPage.jsx
@@ -8,7 +8,7 @@
     useTheme,
     Fab,
 } from '@mui/material';
-import { MAP_MODE, MAP_DEFAULT_ROTATION } from "./constants";
+import { MAP_MODE, MAP_DEFAULT_ROTATION, setMapPreferences } from "./constants";
 import Player from './player';
 import * as Tool from './tool';
 import { NotificationProvider, useNotification } from './Notification';
@@ -85,6 +85,7 @@
             Tool.setThemeMode(themeMode);
             Http.setNotify(notify);
             Http.setMapContainer(player.mapContainer);
+            await Http.fetchMapPreferences(curZone, setMapPreferences);
             websocket = new WebSocketClient('/ws/map/websocket');
 
             await Http.fetchMapData(curZone, setRcsStatus, setCurSprite);
diff --git a/zy-acs-flow/src/map/constants.js b/zy-acs-flow/src/map/constants.js
index 6875e15..0af14fe 100644
--- a/zy-acs-flow/src/map/constants.js
+++ b/zy-acs-flow/src/map/constants.js
@@ -1,12 +1,25 @@
 
-export const MAP_DEFAULT_ROTATION = 180;
-
-export const AGV_ANGLE_OFFSET_VAL = 90;
-
-export const MAP_MIRROR = true;
+export const MAP_DEFAULT_ROTATION = 0;
 
 export const ANIMATE_DURING_TIME = 300;
 
+export let AGV_ANGLE_OFFSET_VAL = 0;
+
+export let MAP_MIRROR = false;;
+
+export const setMapPreferences = (preferences = {}) => {
+    if (preferences == null || typeof preferences !== 'object') {
+        return;
+    }
+    const { agvAngleOffsetVal, mapMirror } = preferences;
+    if (typeof agvAngleOffsetVal === 'number' && !isNaN(agvAngleOffsetVal)) {
+        AGV_ANGLE_OFFSET_VAL = agvAngleOffsetVal;
+    }
+    if (typeof mapMirror === 'boolean') {
+        MAP_MIRROR = mapMirror;
+    }
+};
+
 export const MAP_MODE = Object.freeze({
     OBSERVER_MODE: "1",
     MOVABLE_MODE: "2",
diff --git a/zy-acs-flow/src/map/http.js b/zy-acs-flow/src/map/http.js
index 4754b48..f1be56e 100644
--- a/zy-acs-flow/src/map/http.js
+++ b/zy-acs-flow/src/map/http.js
@@ -14,6 +14,26 @@
     mapContainer = param;
 }
 
+export const fetchMapPreferences = async (zoneId, setMapPreferences) => {
+    try {
+        const res = await request.post('/map/config/preferences', {
+            zoneId: zoneId
+        }, {
+            headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+        });
+        const { code, msg, data } = res.data;
+        if (code === 200) {
+            setMapPreferences(data);
+            return data || {};
+        }
+        notify?.error(msg);
+    } catch (error) {
+        notify?.error(error.message);
+        console.error(error.message);
+    }
+    return {};
+}
+
 export const fetchMapData = (zoneId, setRcsStatus, setCurSprite) => {
     Tool.clearMapData();
     return request.post('/map/data/fetch', {
diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index abc1b4f..c348d14 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -801,8 +801,6 @@
     }
 }
 
-const agvRotationOffset = rotationParseNum(AGV_ANGLE_OFFSET_VAL);
-
 const showAgvSprite = (curZone, agvVo, setCurSprite) => {
     const { agvNo, agvModel, code, direction, battery, jobType, backpack: backpackCount, slots, error } = agvVo;
     if (!code) { return; }
@@ -810,6 +808,7 @@
     if (!codeSprite) { return; }
 
     const targetRotation = rotationParseNum(direction);
+    const agvRotationOffset = rotationParseNum(AGV_ANGLE_OFFSET_VAL);
     // const backpackCount = backpack?.filter(item => item.loaded === true).length || 0;
 
     let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo);
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 babdeee..bb31f02 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
@@ -87,6 +87,17 @@
     }
 
     @PreAuthorize("hasAuthority('manager:loc:list')")
+    @PostMapping("/config/preferences")
+    public R configPreferences(@RequestParam(required = false) Long zoneId, @RequestParam(required = false) Integer floor) {
+        Integer dashboardAgvAngleOffsetVal = configService.getVal("dashboardAgvAngleOffsetVal", Integer.class);
+        Boolean dashMapMirror = configService.getVal("dashMapMirror", Boolean.class);
+        return R.ok().add(Cools
+                .add("agvAngleOffsetVal", Optional.ofNullable(dashboardAgvAngleOffsetVal).orElse(0))
+                .add("mapMirror", Optional.ofNullable(dashMapMirror).orElse(Boolean.FALSE))
+        );
+    }
+
+    @PreAuthorize("hasAuthority('manager:loc:list')")
     @PostMapping("/data/fetch")
     public R fetch(@RequestParam(required = false) Long zoneId, @RequestParam(required = false) Integer floor) {
         // code

--
Gitblit v1.9.1