From 6675214383570a99d287bbe97b06fe542a33df2d Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期四, 15 一月 2026 13:18:50 +0800
Subject: [PATCH] #

---
 version/db/new.sql                                                            |   25 ----
 zy-acs-flow/src/i18n/en.js                                                    |    8 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java      |    6 +
 zy-acs-flow/src/page/code/CodeEdit.jsx                                        |  164 ++++++++++++++++++++++++++++++++
 zy-acs-flow/src/i18n/zh.js                                                    |    8 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/DirectionDto.java |   25 -----
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java  |   10 +
 7 files changed, 192 insertions(+), 54 deletions(-)

diff --git a/version/db/new.sql b/version/db/new.sql
index 603a794..d7a24af 100644
--- a/version/db/new.sql
+++ b/version/db/new.sql
@@ -1,23 +1,2 @@
--- auto-generated definition
-create table man_lane
-(
-    id          bigint unsigned auto_increment comment 'ID'
-        primary key,
-    uuid        varchar(255)                        null comment '缂栧彿(*)',
-    zone_id     bigint                              null comment '搴撳尯[man_zone]',
-    name        varchar(255)                        null comment '鍚嶇О',
-    hash_code   varchar(255)                        not null comment '鍝堝笇鍊�',
-    codes       text                                not null comment '鏉$爜闆�',
-    entry_angle int       default -1                null comment '鍏ュ彛瑙掑害',
-    maximum     int       default -1                null comment '鎵胯浇閲�',
-    status      int(1)    default 1                 not null comment '鐘舵�亄1:姝e父,0:鍐荤粨}',
-    deleted     int(1)    default 0                 not null comment '鏄惁鍒犻櫎{1:鏄�,0:鍚',
-    tenant_id   int                                 null comment '绉熸埛[sys_tenant]',
-    create_by   bigint                              null comment '娣诲姞浜哄憳[sys_user]',
-    create_time timestamp default CURRENT_TIMESTAMP not null comment '娣诲姞鏃堕棿',
-    update_by   bigint                              null comment '淇敼浜哄憳[sys_user]',
-    update_time timestamp default CURRENT_TIMESTAMP null comment '淇敼鏃堕棿',
-    memo        varchar(255)                        null comment '澶囨敞'
-)
-    charset = utf8;
-
+alter table man_code
+    add dir_rule varchar(255) null comment '鏂瑰悜瑙勫垯' after corner;
diff --git a/zy-acs-flow/src/i18n/en.js b/zy-acs-flow/src/i18n/en.js
index d19f9b7..3589f6a 100644
--- a/zy-acs-flow/src/i18n/en.js
+++ b/zy-acs-flow/src/i18n/en.js
@@ -275,6 +275,7 @@
                 x: "x",
                 y: "y",
                 corner: "corner",
+                dirRule: "direction rule",
                 scale: "scale",
                 spin: "spin",
             },
@@ -599,6 +600,13 @@
     },
     page: {
         code: {
+            dirRule: {
+                helper: 'Select one direction to disable; other directions remain available.',
+                status: {
+                    enabled: 'Enabled',
+                    disabled: 'Disabled',
+                },
+            },
             enums: {
                 spin: {
                     na: 'N/A',
diff --git a/zy-acs-flow/src/i18n/zh.js b/zy-acs-flow/src/i18n/zh.js
index dd26f06..ffe3417 100644
--- a/zy-acs-flow/src/i18n/zh.js
+++ b/zy-acs-flow/src/i18n/zh.js
@@ -275,6 +275,7 @@
                 x: "x",
                 y: "y",
                 corner: "鎷愯",
+                dirRule: "鏂瑰悜瑙勫垯",
                 scale: "姣斾緥",
                 spin: "鏃嬭浆",
             },
@@ -599,6 +600,13 @@
     },
     page: {
         code: {
+            dirRule: {
+                helper: '閫夋嫨涓�涓柟鍚戠鐢紝鍏朵綑鏂瑰悜淇濇寔鍙敤',
+                status: {
+                    enabled: '鍙敤',
+                    disabled: '绂佺敤',
+                },
+            },
             enums: {
                 spin: {
                     na: '鍏ㄥ悜',
diff --git a/zy-acs-flow/src/page/code/CodeEdit.jsx b/zy-acs-flow/src/page/code/CodeEdit.jsx
index 1a715df..c7a7d56 100644
--- a/zy-acs-flow/src/page/code/CodeEdit.jsx
+++ b/zy-acs-flow/src/page/code/CodeEdit.jsx
@@ -1,4 +1,4 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
+import React, { useEffect, useMemo } from "react";
 import {
     Edit,
     SimpleForm,
@@ -21,7 +21,8 @@
     DeleteButton,
 } from 'react-admin';
 import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
+import { Stack, Grid, Box, Typography, ToggleButton, ToggleButtonGroup } from '@mui/material';
+import { alpha } from '@mui/material/styles';
 import * as Common from '@/utils/common';
 import { EDIT_MODE } from '@/config/setting';
 import EditBaseAside from "../components/EditBaseAside";
@@ -39,6 +40,161 @@
         </Toolbar>
     )
 }
+
+const DIR_RULE_ANGLES = [0, 90, 180, 270];
+
+const normalizeDirRuleValue = (value) => {
+    let parsed = [];
+
+    if (Array.isArray(value)) {
+        parsed = value;
+    } else if (typeof value === 'string' && value.trim()) {
+        try {
+            parsed = JSON.parse(value);
+        } catch (error) {
+            parsed = [];
+        }
+    } else if (value && typeof value === 'object') {
+        parsed = [value];
+    }
+
+    const angleMap = new Map();
+
+    parsed.forEach(item => {
+        const angle = typeof item?.angle === 'number' ? item.angle : Number(item?.angle);
+        if (!Number.isFinite(angle)) {
+            return;
+        }
+        const enabled = !(
+            item?.enabled === false ||
+            item?.enabled === 'false' ||
+            item?.enabled === 0 ||
+            item?.enabled === '0'
+        );
+        angleMap.set(angle, { angle, enabled });
+    });
+
+    let disabledCaptured = false;
+
+    return DIR_RULE_ANGLES.map(angle => {
+        const matched = angleMap.get(angle);
+        if (matched && matched.enabled === false) {
+            if (disabledCaptured) {
+                return { angle, enabled: true };
+            }
+            disabledCaptured = true;
+            return { angle, enabled: false };
+        }
+
+        return { angle, enabled: true };
+    });
+};
+
+const DirectionRuleInput = () => {
+    const translate = useTranslate();
+    const { register, setValue } = useFormContext();
+    const dirRuleValue = useWatch({ name: 'dirRule' });
+
+    useEffect(() => {
+        register('dirRule');
+    }, [register]);
+
+    const rules = useMemo(() => normalizeDirRuleValue(dirRuleValue), [dirRuleValue]);
+    const normalizedRulesString = useMemo(() => JSON.stringify(rules), [rules]);
+
+    useEffect(() => {
+        if (dirRuleValue !== normalizedRulesString) {
+            setValue('dirRule', normalizedRulesString, { shouldDirty: false, shouldTouch: false });
+        }
+    }, [dirRuleValue, normalizedRulesString, setValue]);
+
+    const disabledAngle = useMemo(() => {
+        const disabled = rules.find(rule => !rule.enabled);
+        return typeof disabled?.angle === 'number' ? disabled.angle : null;
+    }, [rules]);
+
+    const handleToggle = (_, newDisabledAngle) => {
+        if (newDisabledAngle === null) {
+            const resetRules = rules.map(rule => ({ ...rule, enabled: true }));
+            setValue('dirRule', JSON.stringify(resetRules), { shouldDirty: true, shouldTouch: true });
+            return;
+        }
+
+        const parsedAngle = typeof newDisabledAngle === 'number' ? newDisabledAngle : Number(newDisabledAngle);
+        if (Number.isNaN(parsedAngle)) {
+            return;
+        }
+
+        const nextRules = rules.map(rule =>
+            rule.angle === parsedAngle ? { ...rule, enabled: false } : { ...rule, enabled: true }
+        );
+
+        setValue('dirRule', JSON.stringify(nextRules), { shouldDirty: true, shouldTouch: true });
+    };
+
+    return (
+        <Box>
+            <Typography variant="subtitle2" sx={{ fontWeight: 500, mb: 1 }}>
+                {translate('table.field.code.dirRule')}
+            </Typography>
+            <Typography variant="caption" color="text.secondary" sx={{ display: 'block', mb: 1 }}>
+                {translate('page.code.dirRule.helper')}
+            </Typography>
+            <ToggleButtonGroup
+                fullWidth
+                exclusive
+                value={disabledAngle}
+                onChange={handleToggle}
+                color="primary"
+            >
+                {rules.map(rule => {
+                    const isDisabled = !rule.enabled;
+                    return (
+                        <ToggleButton
+                            key={rule.angle}
+                            value={rule.angle}
+                            sx={{
+                                textTransform: 'none',
+                                flex: 1,
+                                flexDirection: 'column',
+                                gap: 0.5,
+                                py: 1.5,
+                                '&.Mui-selected': {
+                                    color: (theme) => theme.palette.error.main,
+                                    borderColor: (theme) => theme.palette.error.main,
+                                    bgcolor: (theme) => alpha(theme.palette.error.main, 0.08),
+                                    '&:hover': {
+                                        bgcolor: (theme) => alpha(theme.palette.error.main, 0.16),
+                                    },
+                                },
+                                '& .dirRuleStatus': {
+                                    color: isDisabled ? 'error.main' : 'text.secondary',
+                                },
+                                '& .dirRuleAngle': {
+                                    fontWeight: 600,
+                                },
+                                '&.Mui-selected .dirRuleStatus': {
+                                    color: (theme) => theme.palette.error.main,
+                                },
+                            }}
+                        >
+                            <Typography className="dirRuleAngle" variant="body2">
+                                {rule.angle}掳
+                            </Typography>
+                            <Typography
+                                variant="caption"
+                                className="dirRuleStatus"
+                                sx={{ fontWeight: 600, letterSpacing: 0.2, textTransform: 'uppercase' }}
+                            >
+                                {translate(isDisabled ? 'page.code.dirRule.status.disabled' : 'page.code.dirRule.status.enabled')}
+                            </Typography>
+                        </ToggleButton>
+                    );
+                })}
+            </ToggleButtonGroup>
+        </Box>
+    );
+};
 
 const CodeEdit = () => {
     const translate = useTranslate();
@@ -116,6 +272,10 @@
                             />
                         </Stack> */}
 
+                        <Box mt={2}>
+                            <DirectionRuleInput />
+                        </Box>
+
                     </Grid>
                     <Grid item xs={12} md={4}>
                         <Typography variant="h6" gutterBottom>
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/DirectionDto.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/DirectionDto.java
index 232bc84..89bc227 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/DirectionDto.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/DirectionDto.java
@@ -42,29 +42,4 @@
         return list;
     }
 
-    public static List<DirectionDto> initCodeDirections0() {
-        List<DirectionDto> list = new ArrayList<>();
-        DirectionDto northDto = new DirectionDto();
-        northDto.setAngle(CodeDirectionType.NORTH.angle);
-        northDto.setEnabled(true);
-        list.add(northDto);
-
-        DirectionDto eastDto = new DirectionDto();
-        eastDto.setAngle(CodeDirectionType.EAST.angle);
-        eastDto.setEnabled(false);
-        list.add(eastDto);
-
-        DirectionDto southDto = new DirectionDto();
-        southDto.setAngle(CodeDirectionType.SOUTH.angle);
-        southDto.setEnabled(true);
-        list.add(southDto);
-
-        DirectionDto westDto = new DirectionDto();
-        westDto.setAngle(CodeDirectionType.WEST.angle);
-        westDto.setEnabled(true);
-        list.add(westDto);
-
-        return list;
-    }
-
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
index d792dd8..15614f4 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
@@ -7,7 +7,6 @@
 import com.zy.acs.manager.core.domain.DirectionDto;
 import com.zy.acs.manager.core.domain.SortCodeDto;
 import com.zy.acs.manager.core.domain.UnlockPathTask;
-import com.zy.acs.manager.core.domain.type.CodeDirectionType;
 import com.zy.acs.manager.core.service.astart.*;
 import com.zy.acs.manager.core.service.astart.domain.AStarNavigateNode;
 import com.zy.acs.manager.core.service.astart.domain.DynamicNode;
@@ -429,6 +428,7 @@
     public static void main(String[] args) {
         CodeSpinType codeSpinType = calcSpinDirection(null, 260.0, 10.0);
         List<DirectionDto> directionDtoList = DirectionDto.initCodeDirections();
+        System.out.println(JSON.toJSONString(directionDtoList));
         System.out.println(codeSpinType.toString());
     }
 
@@ -437,9 +437,11 @@
             return CodeSpinType.NA;
         }
         List<Double> disableAngleList = new ArrayList<>();
-        List<DirectionDto> directionDtoList = DirectionDto.initCodeDirections();
-        if (code.getData().contains("57")) {
-            directionDtoList = DirectionDto.initCodeDirections0();
+        List<DirectionDto> directionDtoList;
+        if (!Cools.isEmpty(code.getDirRule())) {
+            directionDtoList = JSON.parseArray(code.getDirRule(), DirectionDto.class);
+        } else {
+            directionDtoList = DirectionDto.initCodeDirections();
         }
         for (DirectionDto dto : directionDtoList) {
             if (null != dto.getEnabled() && !dto.getEnabled()) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
index 4f78fd2..5e98cf5 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java
@@ -59,6 +59,12 @@
     private String scale;
 
     /**
+     * 鏂瑰悜瑙勫垯
+     */
+    @ApiModelProperty(value= "鏂瑰悜瑙勫垯")
+    private String dirRule;
+
+    /**
      * 鏃嬭浆鏂瑰悜 0: N/A 1: 椤烘椂閽�  2: 閫嗘椂閽�
      */
     @ApiModelProperty(value= "鏃嬭浆鏂瑰悜 0: N/A 1: 椤烘椂閽�  2: 閫嗘椂閽�  ")

--
Gitblit v1.9.1