From 73ec875e216f434d510a6b95c574fe80387b2bc2 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 08 一月 2026 18:27:52 +0800
Subject: [PATCH] #权限

---
 rsf-admin/src/page/system/role/RoleList.jsx |  167 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 129 insertions(+), 38 deletions(-)

diff --git a/rsf-admin/src/page/system/role/RoleList.jsx b/rsf-admin/src/page/system/role/RoleList.jsx
index 6ef91f5..0c5ea8f 100644
--- a/rsf-admin/src/page/system/role/RoleList.jsx
+++ b/rsf-admin/src/page/system/role/RoleList.jsx
@@ -30,7 +30,8 @@
     useNotify,
     Button,
 } from 'react-admin';
-import { Box, Card, Stack } from '@mui/material';
+import { Box, Card, Stack, Menu, MenuItem, ListItemIcon, ListItemText } from '@mui/material';
+import SecurityIcon from '@mui/icons-material/Security';
 import { styled } from '@mui/material/styles';
 import RoleCreate from "./RoleCreate";
 import RolePanel from "./RolePanel";
@@ -43,9 +44,12 @@
 import * as Common from '@/utils/common';
 import AssignPermissions from "./AssignPermissions";
 import AssignPermissionsPda from "./AssignPermissions_pda";
+import AssignPermissionsMatnr from "./AssignPermissions_matnr";
 import request from '@/utils/request';
 import AssignmentIndIcon from '@mui/icons-material/AssignmentInd';
 import AdUnitsIcon from '@mui/icons-material/AdUnits';
+import ArticleIcon from '@mui/icons-material/Article';
+import { margin } from "@mui/system";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -83,12 +87,14 @@
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
     const [drawerValPda, setDrawerValPda] = useState(false);
+    const [drawerValMatnr, setDrawerValMatnr] = useState(false);
 
     const [menuIds, setMenuIds] = useState([]);
 
     const [authType, setAuthType] = useState(0)
 
     const assign = (record) => {
+        setDrawerValPda(false);
         request('/role/scope/list', {
             method: 'GET',
             params: {
@@ -106,6 +112,7 @@
     }
 
     const assignPda = (record) => {
+        setDrawerVal(false);
         request('/rolePda/scope/list', {
             method: 'GET',
             params: {
@@ -122,6 +129,24 @@
         });
     }
 
+    const assignMatnr = (record) => {
+        setDrawerVal(false);
+        request('/roleMatnr/scope/list', {
+            method: 'GET',
+            params: {
+                roleId: record.id
+            }
+        }).then((res) => {
+            if (res?.data?.code === 200) {
+                const { data: menuIds } = res.data;
+                setMenuIds(menuIds || []);
+                setDrawerValMatnr(!!drawerValMatnr && drawerValMatnr === record ? null : record);
+            } else {
+                notify(res.data.msg, { type: 'error' });
+            }
+        });
+    }
+
     return (
         <Box display="flex">
             <List
@@ -131,7 +156,7 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: (!!drawerVal || !!drawerValPda) ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: (!!drawerVal || !!drawerValPda || !!drawerValMatnr) ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.role"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
@@ -167,9 +192,12 @@
                     <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
-                        <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} auType={0} setAuthType={setAuthType} label="缃戦〉鏉冮檺&nbsp;&nbsp;&nbsp;" />
-                        <PdaScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assignPda={assignPda} auType={1} setAuthType={setAuthType} label="PDA鏉冮檺&nbsp;&nbsp;&nbsp;" />
-                        <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} auType={2} setAuthType={setAuthType} label="浠撳簱鏉冮檺&nbsp;" />
+                        <PermissionMenuButton
+                            assign={assign}
+                            assignPda={assignPda}
+                            assignMatnr={assignMatnr}
+                            setAuthType={setAuthType}
+                        />
                         <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                         <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                     </WrapperField>
@@ -215,46 +243,109 @@
                     authType={authType}
                 />
             </PageDrawer>
+            <PageDrawer
+                drawerVal={drawerValMatnr}
+                setDrawerVal={setDrawerValMatnr}
+                title={!!drawerValMatnr ? `Scope by ${drawerValMatnr.code || drawerValMatnr.name}` : 'Role Detail'}
+                closeCallback={() => {
+                    setMenuIds([]);
+                }}
+            >
+                <AssignPermissionsMatnr
+                    role={drawerValMatnr}
+                    originMenuIds={menuIds}
+                    setDrawerVal={setDrawerValMatnr}
+                    closeCallback={() => {
+                        setMenuIds([]);
+                    }}
+                    authType={authType}
+                />
+            </PageDrawer>
         </Box>
     )
 }
 
-const ScopeButton = (props) => {
+const PermissionMenuButton = ({ assign, assignPda, assignMatnr, setAuthType }) => {
     const record = useRecordContext();
-    const { assign, auType, setAuthType, label, ...rest } = props;
-    return (
-        <Button
-            variant="text"
-            color="primary"
-            startIcon={<AssignmentIndIcon />}
-            label={label}
-            onClick={(event) => {
-                setAuthType(auType);
-                event.stopPropagation();
-                assign(record);
-            }}
-            {...rest}
-        />
-    )
-}
+    const [anchorEl, setAnchorEl] = useState(null);
+    const open = Boolean(anchorEl);
 
-const PdaScopeButton = (props) => {
-    const record = useRecordContext();
-    const { assignPda, auType, setAuthType, label, ...rest } = props;
+    const handleClick = (event) => {
+        event.stopPropagation();
+        setAnchorEl(event.currentTarget);
+    };
+
+    const handleClose = (event) => {
+        if (event) event.stopPropagation();
+        setAnchorEl(null);
+    };
+
+    const handleWebPermission = (event) => {
+        event.stopPropagation();
+        setAuthType(0);
+        assign(record);
+        handleClose();
+    };
+
+    const handlePdaPermission = (event) => {
+        event.stopPropagation();
+        setAuthType(1);
+        assignPda(record);
+        handleClose();
+    };
+
+    const handleMatnrPermission = (event) => {
+        event.stopPropagation();
+        setAuthType(2);
+        assignMatnr(record);
+        handleClose();
+    };
+
     return (
-        <Button
-            variant="text"
-            color="primary"
-            startIcon={<AdUnitsIcon />}
-            label={label}
-            onClick={(event) => {
-                setAuthType(auType);
-                event.stopPropagation();
-                assignPda(record);
-            }}
-            {...rest}
-        />
-    )
+        <>
+            <Button
+                variant="text"
+                color="primary"
+                startIcon={<SecurityIcon />}
+                label="鏉冮檺"
+                onClick={handleClick}
+                sx={{ marginLeft: '2px', padding: '1px', fontSize: '.75rem' }}
+            />
+            <Menu
+                anchorEl={anchorEl}
+                open={open}
+                onClose={handleClose}
+                onClick={(e) => e.stopPropagation()}
+                anchorOrigin={{
+                    vertical: 'bottom',
+                    horizontal: 'left',
+                }}
+                transformOrigin={{
+                    vertical: 'top',
+                    horizontal: 'left',
+                }}
+            >
+                <MenuItem onClick={handleWebPermission}>
+                    <ListItemIcon>
+                        <AssignmentIndIcon fontSize="small" />
+                    </ListItemIcon>
+                    <ListItemText>缃戦〉鏉冮檺</ListItemText>
+                </MenuItem>
+                <MenuItem onClick={handlePdaPermission}>
+                    <ListItemIcon>
+                        <AdUnitsIcon fontSize="small" />
+                    </ListItemIcon>
+                    <ListItemText>PDA鏉冮檺</ListItemText>
+                </MenuItem>
+                <MenuItem onClick={handleMatnrPermission}>
+                    <ListItemIcon>
+                        <ArticleIcon fontSize="small" />
+                    </ListItemIcon>
+                    <ListItemText>鐗╂枡鏉冮檺</ListItemText>
+                </MenuItem>
+            </Menu>
+        </>
+    );
 }
 
 export default RoleList;

--
Gitblit v1.9.1