lbq
15 小时以前 56ca28233a84c5aa3ca93cae266b2d008ea348e1
Web页面优化
6个文件已添加
22个文件已修改
2461 ■■■■ 已修改文件
rsf-admin/src/i18n/en.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/layout/AppBar.jsx 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/layout/Logo.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/layout/MyMenu.jsx 166 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/layout/SubMenu.jsx 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/ResourceContent.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/companys/CompanysList.jsx 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/dashboard/NbCard.jsx 365 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/dashboard/NbList.jsx 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/dashboard/NbPie.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderList.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/preparation/MatPreparationItemList.jsx 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/preparation/MatPreparationList.jsx 422 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/preparation/MatPreparationPanel.jsx 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/preparation/MatPreparationPublic.jsx 483 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/preparation/index.jsx 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/menu/MenuList.jsx 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/role/AssignPermissions.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/role/RoleList.jsx 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/themes/ThemeSwapper.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -217,7 +217,7 @@
        locDeadReport: 'Locs Dead Report',
        stockStatistic: 'Stock Statistic',
        statisticCount: 'Statistic Count',
        preparation:"备料单",
    },
    table: {
        field: {
rsf-admin/src/i18n/zh.js
@@ -172,7 +172,7 @@
        companys: '往来企业',
        serialRuleItem: '编码规则子表',
        serialRule: '编码规则',
        asnOrder: '收货通知单',
        asnOrder: '入库通知单',
        asnOrderItem: '收货明细',
        asnOrderLog: '收货历史单',
        asnOrderItemLog: '收货历史明细',
@@ -228,6 +228,10 @@
        inStatisticItem: '日入库明细查询',
        outStatisticItem: '日出库明细查询',
        statisticCount: '日出入库汇总统计',
        preparation: '备料单',
        check: '盘点管理',
        abnormal: '异常管理',
        platform: '平台管理'
    },
    table: {
        field: {
@@ -394,7 +398,7 @@
                nromNum: "标包数量",
                unit: "单位",
                purUnit: "采购单位",
                stockUnit: "库存单位",
                stockUnit: "使用组织", //"库存单位",
                stockLevel: "ABC分类",
                isLabelMange: "标签管理",
                safeQty: "安全值",
@@ -406,14 +410,14 @@
                flagCheck: "免检",
            },
            matnrGroup: {
                name: "名称",
                code: "编码",
                name: "物料分组名称",
                code: "物料分组编码",
                parentId: "上级标识",
                parCode: "上级编码",
            },
            warehouse: {
                name: "仓库名称",
                code: "编码",
                code: "仓库编码",
                factory: "工厂",
                address: "地址",
                longitude: "经度",
@@ -460,7 +464,7 @@
            loc: {
                warehouseId: "所属仓库",
                areaId: "所属库区",
                code: "编码",
                code: "库位编码",
                type: "类型",
                name: "名称",
                flagLogic: "虚拟库位",
@@ -601,10 +605,10 @@
                color: "颜色",
            },
            companys: {
                code: "企业编码",
                code: "编码",
                name: "名称",
                nameEn: "英文别名",
                breifCode: "助记码",
                breifCode: "昵称",  //助记码
                type: "类型",
                contact: "联系人",
                tel: "联系电话",
@@ -647,8 +651,8 @@
                poId: "PO标识",
                type: "单据类型",
                wkType: "业务类型",
                anfme: "计划数量",
                qty: "完成数量",
                anfme: "应收数量",
                qty: "实收数量",
                logisNo: "物流单号",
                arrTime: "预计到达时间",
                rleStatus: "释放状态",
@@ -793,13 +797,13 @@
                spec: "规格",
                model: "型号",
                matnrCode: "物料编码",
                anfme: "计划数量",
                anfme: "应收数量",
                stockUnit: "单位",
                isptResult: "质检结果",
                purQty: "采购量",
                purUnit: "采购单位",
                unit: '单位',
                qty: "完成数",
                qty: "实收数量",
                safeQty: '合格数',
                disQty: '不合格数',
                splrBatch: "批次",
@@ -1055,6 +1059,23 @@
                stockLocs: "库存位置",
                stockQty: "库存数量",
            },
            preparation: {
                orderCode: "备料单号",
                orderStatus: "备料状态",
                orderTime: "时间",
                anfme: "备料数量",
            },
            preparationItem: {
                matnrId: "物料ID",
                matnrCode: "物料编码",
                maktx: "物料名称",
                unit: "单位",
                spec: "规格",
                model: "型号",
                anfme: "备料数量",
                workQty: "完成数量",
                status: "备料状态",
            },
            task: {
                taskCode: "任务号",
                taskStatus: "状态",
rsf-admin/src/layout/AppBar.jsx
@@ -1,8 +1,7 @@
import * as React from 'react';
import { AppBar, TitlePortal } from 'react-admin';
import { AppBar } from 'react-admin';
import { Box, useMediaQuery } from '@mui/material';
// https://www.base64-image.de/
import Logo from './Logo';
import { AppBarToolbar } from './AppBarToolbar';
@@ -10,16 +9,39 @@
    const isLargeEnough = useMediaQuery(theme =>
        theme.breakpoints.up('sm')
    );
    return (
        <AppBar
            color="secondary"
            toolbar={<AppBarToolbar />}
            sx={{
                // 隐藏最左侧的菜单按钮
                '& .RaAppBar-menuButton': {
                    display: 'none !important',
                },
                // 调整工具栏布局
                '& .RaAppBar-toolbar': {
                    paddingLeft: '4px !important', // 最小左边距
                    justifyContent: 'flex-start',
                    gap: 2, // 元素之间的间距
                }
            }}
        >
            <TitlePortal />
            {isLargeEnough && <Logo />}
            {isLargeEnough && <Box component="span" sx={{ flex: 1 }} />}
            {/* Logo 完全靠左 */}
            {isLargeEnough && (
                <Box sx={{
                    display: 'flex',
                    alignItems: 'center',
                    minWidth: 'auto', // 不限制宽度
                }}>
                    <Logo />
                </Box>
            )}
            {/* 弹性空间将工具栏按钮推到右侧 */}
            <Box component="span" sx={{ flex: 1 }} />
        </AppBar>
    );
};
export default CustomAppBar;
export default CustomAppBar;
rsf-admin/src/layout/Logo.jsx
@@ -12,12 +12,12 @@
            <svg
                xmlns="http://www.w3.org/2000/svg"
                xmlSpace="preserve"
                width={200}
                width={145}
                height={30}
                {...param}
            >
                <image
                    width={200}
                    width={145}
                    height={30}
                    href="data:image/png;base64,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"
                />
@@ -30,12 +30,12 @@
            <svg
                xmlns="http://www.w3.org/2000/svg"
                xmlSpace="preserve"
                width={200}
                width={145}
                height={30}
                {...param}
            >
                <image
                    width={200}
                    width={145}
                    height={30}
                    href="data:image/png;base64,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"
                />
rsf-admin/src/layout/MyMenu.jsx
@@ -59,45 +59,106 @@
    if (IconComponent) {
      return <IconComponent />;
    } else {
      return <KeyboardArrowDownIcon />
      return <KeyboardArrowDownIcon />;
    }
  };
  const generateMenu = (permissions) => {
    return permissions.map((node) => {
      if (node.children) {
        return (
          <SubMenu
            key={node.id}
            handleToggle={() => handleToggle(node.route)}
            isOpen={state[node.route]}
            name={node.name}
            dense={dense}
            icon={getIcon(node.icon)}
          >
            {generateMenu(node.children)}
          </SubMenu>
        );
      } else {
        if (node.component) {
          return (
            <MenuItemLink
              key={node.id}
              to={node.component} // correspond to Resource.name
              state={{ _scrollToTop: true }}
              // primaryText={translate(`resources.orders.name`, {
              //     smart_count: 2,
              // })}
              primaryText={node.name}
              leftIcon={getIcon(node.icon)}
              dense={dense}
              // sx={{ '& .RaMenuItemLink-icon': { visibility: 'hidden' } }}
            />
          );
        }
  // 检查菜单是否被选中
  const isSelected = (component) => {
    if (!component) return false;
    const currentPath = location.pathname.replace("/", "");
    return currentPath === component;
  };
  // 检查父级菜单是否有子菜单被选中
  const hasSelectedChild = (node) => {
    if (!node.children) return false;
    return node.children.some(child => {
      if (child.children) {
        return hasSelectedChild(child);
      }
      return isSelected(child.component);
    });
  };
  // 在 MyMenu 组件的 generateMenu 函数中,确保 MenuItemLink 也左对齐
  const generateMenu = (permissions) => {
    return permissions.map((node) => {
        if (node.children) {
            const selected = isSelected(node.component) || hasSelectedChild(node);
            return (
                <SubMenu
                    key={node.id}
                    handleToggle={() => handleToggle(node.route)}
                    isOpen={state[node.route]}
                    name={node.name}
                    dense={dense}
                    icon={getIcon(node.icon)}
                    isSelected={selected}
                >
                    {generateMenu(node.children)}
                </SubMenu>
            );
        } else {
            if (node.component) {
                const selected = isSelected(node.component);
                // 在 generateMenu 函数中的 MenuItemLink 部分
                return (
                    <MenuItemLink
                        key={node.id}
                        to={node.component}
                        state={{ _scrollToTop: true }}
                        primaryText={translate(node.name)}
                        leftIcon={getIcon(node.icon)}
                        dense={dense}
                        sx={{
                            backgroundColor: selected ? 'rgba(25, 118, 210, 0.08) !important' : 'transparent',
                            color: selected ? '#1976d2 !important' : 'text.secondary',
                            '&:hover': {
                                backgroundColor: selected ? 'rgba(25, 118, 210, 0.12) !important' : 'rgba(0, 0, 0, 0.04)',
                            },
                            borderLeft: 'none',
                            borderRadius: '4px',
                            margin: '2px 8px',
                            width: 'calc(100% - 16px)',
                            transition: 'all 0.2s ease-in-out',
                            // 缩小整体间距
                            padding: '6px 8px', // 减少内边距
                            minHeight: '36px', // 稍微减小高度
                            '& .RaMenuItemLink-icon': {
                                color: selected ? '#1976d2 !important' : 'text.secondary',
                                minWidth: '32px !important', // 缩小图标区域宽度
                                marginRight: '4px', // 缩小图标和文字间距
                                display: 'flex',
                                alignItems: 'center',
                                justifyContent: 'center', // 图标居中显示
                            },
                            fontWeight: selected ? 600 : 400,
                            // 确保文字内容左对齐
                            '& .MuiListItemText-root': {
                                margin: 0,
                                '& .MuiTypography-root': {
                                    textAlign: 'left',
                                    justifyContent: 'flex-start',
                                    fontSize: '0.875rem', // 稍微减小字体大小
                                    lineHeight: '1.3',
                                }
                            },
                        }}
                    />
                );
            }
        }
    });
  };
  // 检查固定菜单是否选中
  const isDashboardSelected = location.pathname === '/dashboard';
  const isSettingsSelected = location.pathname === '/settings';
  return isPending ? (
    <div>Waiting for permissions...</div>
@@ -112,19 +173,54 @@
            easing: theme.transitions.easing.sharp,
            duration: theme.transitions.duration.leavingScreen,
          }),
        // 菜单容器样式
        '& .MuiMenuItem-root': {
          boxSizing: 'border-box',
        }
      }}
    >
      <Menu.Item
        to="/dashboard"
        primaryText="menu.dashboard"
        leftIcon={<DashboardIcon />}
        sx={{
          backgroundColor: isDashboardSelected ? 'rgba(25, 118, 210, 0.08) !important' : 'transparent',
          color: isDashboardSelected ? '#1976d2 !important' : 'text.secondary',
          '&:hover': {
            backgroundColor: isDashboardSelected ? 'rgba(25, 118, 210, 0.12) !important' : 'rgba(0, 0, 0, 0.04)',
          },
          borderLeft: isDashboardSelected ? '3px solid #1976d2' : '3px solid transparent',
          borderRadius: '0 4px 4px 0',
          margin: '1px 0',
          width: '100%',
          transition: 'all 0.2s ease-in-out',
          '& .MuiListItemIcon-root': {
            color: isDashboardSelected ? '#1976d2 !important' : 'text.secondary',
            minWidth: 40,
          }
        }}
      />
      {permissions && generateMenu(permissions)}
      {/* <Menu.ResourceItems /> */}
      <Menu.Item
        to="/settings"
        primaryText="menu.settings"
        leftIcon={<PersonIcon />}
        sx={{
          backgroundColor: isSettingsSelected ? 'rgba(25, 118, 210, 0.08) !important' : 'transparent',
          color: isSettingsSelected ? '#1976d2 !important' : 'text.secondary',
          '&:hover': {
            backgroundColor: isSettingsSelected ? 'rgba(25, 118, 210, 0.12) !important' : 'rgba(0, 0, 0, 0.04)',
          },
          borderLeft: isSettingsSelected ? '3px solid #1976d2' : '3px solid transparent',
          borderRadius: '0 4px 4px 0',
          margin: '1px 0',
          width: '100%',
          transition: 'all 0.2s ease-in-out',
          '& .MuiListItemIcon-root': {
            color: isSettingsSelected ? '#1976d2 !important' : 'text.secondary',
            minWidth: 40,
          }
        }}
      />
    </Box>
  );
@@ -173,4 +269,4 @@
  }
  return [];
};
};
rsf-admin/src/layout/SubMenu.jsx
@@ -9,33 +9,104 @@
    Collapse,
    Tooltip,
} from '@mui/material';
import ExpandMore from '@mui/icons-material/ExpandMore';
import { useTranslate, useSidebarState } from 'react-admin';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
const SubMenu = (props) => {
    const { handleToggle, isOpen, name, icon, children, dense } = props;
    const { handleToggle, isOpen, name, icon, children, dense, isSelected = false } = props;
    const translate = useTranslate();
    const [sidebarIsOpen] = useSidebarState();
    const header = (
       <MenuItem dense={dense} onClick={handleToggle} sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
            <Box sx={{ display: 'flex', alignItems: 'center', flex: 1 }}>
                <ListItemIcon sx={{ minWidth: 40, color: 'text.secondary', display: 'flex', alignItems: 'center' }}>
        <MenuItem
            dense={dense}
            onClick={handleToggle}
            sx={{
                display: 'flex',
                alignItems: 'center',
                justifyContent: 'space-between',
                backgroundColor: isSelected ? 'rgba(25, 118, 210, 0.08) !important' : 'transparent',
                color: isSelected ? '#1976d2 !important' : 'text.secondary',
                '&:hover': {
                    backgroundColor: isSelected ? 'rgba(25, 118, 210, 0.12) !important' : 'rgba(0, 0, 0, 0.04)',
                },
                borderLeft: 'none',
                borderRadius: '4px',
                margin: '2px 6px',
                width: 'calc(100% - 16px)',
                transition: 'all 0.2s ease-in-out',
                boxSizing: 'border-box',
                minHeight: '40px',
                padding: '8px 12px',
                // 确保内容区域完全左对齐
                '& .MuiMenuItem-root': {
                    justifyContent: 'flex-start',
                }
            }}
        >
            <Box sx={{
                display: 'flex',
                alignItems: 'center',
                flex: 1,
                justifyContent: 'flex-start',
                minWidth: 0,
                // 确保图标和文字紧密对齐
                gap: '8px',
            }}>
                <ListItemIcon sx={{
                    minWidth: '32px !important', // 稍微减小图标区域宽度
                    color: isSelected ? '#1976d2 !important' : 'text.secondary',
                    display: 'flex',
                    alignItems: 'center',
                    justifyContent: 'flex-start',
                    margin: 0, // 移除margin
                    flexShrink: 0,
                }}>
                    {icon}
                </ListItemIcon>
                <Typography variant="inherit" color="textSecondary" sx={{ ml: 1, display: 'flex', alignItems: 'center' }}>
                    {translate(name)}
                </Typography>
                {sidebarIsOpen && (
                    <Typography
                        variant="inherit"
                        sx={{
                            color: isSelected ? '#1976d2 !important' : 'text.secondary',
                            fontWeight: isSelected ? 600 : 400,
                            flex: 1,
                            minWidth: 0,
                            overflow: 'hidden',
                            textOverflow: 'ellipsis',
                            whiteSpace: 'nowrap',
                            textAlign: 'left',
                            lineHeight: '1.5',
                        }}
                    >
                        {translate(name)}
                    </Typography>
                )}
            </Box>
            <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 24 }}>
                {isOpen ? <KeyboardArrowDownIcon fontSize="small" sx={{color: 'text.secondary'}} /> : <KeyboardArrowRightIcon fontSize="small" sx={{color: 'text.secondary'}} />}
            </Box>
            {/* 箭头图标 */}
            {sidebarIsOpen && (
                <Box sx={{
                    display: 'flex',
                    alignItems: 'center',
                    minWidth: '20px',
                    justifyContent: 'flex-end',
                    flexShrink: 0,
                    marginLeft: '8px',
                }}>
                    {isOpen ?
                        <KeyboardArrowDownIcon fontSize="small" sx={{color: isSelected ? '#1976d2 !important' : 'text.secondary'}} /> :
                        <KeyboardArrowRightIcon fontSize="small" sx={{color: isSelected ? '#1976d2 !important' : 'text.secondary'}} />
                    }
                </Box>
            )}
        </MenuItem>
    );
    return (
        <div>
        <Box sx={{ width: '100%' }}>
            {sidebarIsOpen || isOpen ? (
                header
            ) : (
@@ -48,27 +119,18 @@
                    dense={dense}
                    component="div"
                    disablePadding
                    // sx={{
                    //     '& .MuiMenuItem-root': {
                    //         transition:
                    //             'padding-left 195ms cubic-bezier(0.4, 0, 0.6, 1) 0ms',
                    //         paddingLeft: theme =>
                    //             sidebarIsOpen
                    //                 ? theme.spacing(4)
                    //                 : theme.spacing(2),
                    //     },
                    //     // 显示二级菜单的icon
                    //     '& .RaMenuItemLink-icon': {
                    //         visibility: 'visible !important',
                    //         minWidth: '24px'
                    //     }
                    // }}
                    sx={{
                        paddingLeft: 2,
                        '& .MuiMenuItem-root': {
                            paddingLeft: 3,
                        },
                    }}
                >
                    {children}
                </List>
            </Collapse>
        </div>
        </Box>
    );
};
export default SubMenu;
export default SubMenu;
rsf-admin/src/page/ResourceContent.js
@@ -63,6 +63,7 @@
import outStatisticItem from './statistics/outStockItem';
import inStatisticItem from './statistics/inStockItem';
import statisticCount from './statistics/stockStatisticNum';
import preparation from "./orders/preparation";
const ResourceContent = (node) => {
  switch (node.component) {
@@ -184,6 +185,8 @@
      return inStatisticItem;
    case "statisticCount":
      return statisticCount;
    case "preparation":
      return preparation;
    default:
      return {
        list: ListGuesser,
rsf-admin/src/page/basicInfo/companys/CompanysList.jsx
@@ -134,15 +134,14 @@
                    preferenceKey='companys'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    omit={['id', 'createTime', 'createBy', 'memo','createBy$','updateBy$','statusBool','province','city','address']}
                    omit={['id', 'nameEn', 'contact', 'tel', 'email', 'pcode', 'createTime', 'createBy', 'memo','createBy$','updateBy$', 'updateTime','statusBool','province','city','address']}
                >
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.companys.code" />
                    <TextField source="name" label="table.field.companys.name" />
                    <TextField source="name" label="table.field.companys.name" />
                    <TextField source="nameEn" label="table.field.companys.nameEn" />
                    <TextField source="breifCode" label="table.field.companys.breifCode" />
                    <DictField source="type" label="table.field.companys.type" dictTypeCode={'sys_companys_type'} />
                    {/* <DictField source="type" label="table.field.companys.type" dictTypeCode={'sys_companys_type'} /> */}
                    <TextField source="contact" label="table.field.companys.contact" />
                    <TextField source="tel" label="table.field.companys.tel" />
                    <TextField source="email" label="table.field.companys.email" />
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -171,38 +171,38 @@
                    <NumberField key="id" source="id" />,
                    <TextField key="code" source="code" label="table.field.matnr.code" />,
                    <TooltipField key="name" source="name" label="table.field.matnr.name" cellClassName="name" />,                    
                    <TextField key="shipperId$" source="shipperId$" label="table.field.matnr.shipperId" />,
                    // <TextField key="shipperId$" source="shipperId$" label="table.field.matnr.shipperId" />,
                    <ReferenceField key="groupId" source="groupId" label="table.field.matnr.groupId" reference="matnrGroup" link={false} sortable={false}>
                        <TextField source="name" />
                    </ReferenceField>,
                    <TextField key="platCode" source="platCode" label="table.field.matnr.platCode" />,
                    // <TextField key="platCode" source="platCode" label="table.field.matnr.platCode" />,
                    <TextField key="spec" source="spec" label="table.field.matnr.spec" />,
                    <TextField key="model" source="model" label="table.field.matnr.model" />,
                    <NumberField key="weight" source="weight" label="table.field.matnr.weight" />,
                    <TextField key="describle" source="describle" label="table.field.matnr.describle" />,
                    <NumberField key="nromNum" source="nromNum" label="table.field.matnr.nromNum" />,
                    // <NumberField key="weight" source="weight" label="table.field.matnr.weight" />,
                    // <TextField key="describle" source="describle" label="table.field.matnr.describle" />,
                    // <NumberField key="nromNum" source="nromNum" label="table.field.matnr.nromNum" />,
                    <TextField key="unit" source="unit" label="table.field.matnr.unit" />,
                    <TextField key="purchaseUnit" source="purchaseUnit" label="table.field.matnr.purUnit" />,
                    // <TextField key="purchaseUnit" source="purchaseUnit" label="table.field.matnr.purUnit" />,
                    <TextField key="stockUnit" source="stockUnit" label="table.field.matnr.stockUnit" />,
                    <TextField key="stockLeval$" source="stockLeval$" label="table.field.matnr.stockLevel" sortable={false} />,
                    <TextField key="flagLabelMange$" source="flagLabelMange$" label="table.field.matnr.isLabelMange" sortable={false} />,
                    <NumberField key="safeQty" source="safeQty" label="table.field.matnr.safeQty" />,
                    <NumberField key="minQty" source="minQty" label="table.field.matnr.minQty" />,
                    <NumberField key="maxQty" source="maxQty" label="table.field.matnr.maxQty" />,
                    <NumberField key="stagn" source="stagn" label="table.field.matnr.stagn" />,
                    <NumberField key="valid" source="valid" label="table.field.matnr.valid" />,
                    <NumberField key="validWarn" source="validWarn" label="table.field.matnr.validWarn" />,
                    <BooleanField key="flagCheck" source="flagCheck" label="table.field.matnr.flagCheck" sortable={false} />,
                    <ReferenceField key="updateBy" source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
                    </ReferenceField>,
                    <DateField key="updateTime" source="updateTime" label="common.field.updateTime" showTime />,
                    <ReferenceField key="createBy" source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
                    </ReferenceField>,
                    <DateField key="createTime" source="createTime" label="common.field.createTime" showTime />,
                    // <TextField key="stockLeval$" source="stockLeval$" label="table.field.matnr.stockLevel" sortable={false} />,
                    // <TextField key="flagLabelMange$" source="flagLabelMange$" label="table.field.matnr.isLabelMange" sortable={false} />,
                    // <NumberField key="safeQty" source="safeQty" label="table.field.matnr.safeQty" />,
                    // <NumberField key="minQty" source="minQty" label="table.field.matnr.minQty" />,
                    // <NumberField key="maxQty" source="maxQty" label="table.field.matnr.maxQty" />,
                    // <NumberField key="stagn" source="stagn" label="table.field.matnr.stagn" />,
                    // <NumberField key="valid" source="valid" label="table.field.matnr.valid" />,
                    // <NumberField key="validWarn" source="validWarn" label="table.field.matnr.validWarn" />,
                    // <BooleanField key="flagCheck" source="flagCheck" label="table.field.matnr.flagCheck" sortable={false} />,
                    // <ReferenceField key="updateBy" source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                    //     <TextField source="nickname" />
                    // </ReferenceField>,
                    // <DateField key="updateTime" source="updateTime" label="common.field.updateTime" showTime />,
                    // <ReferenceField key="createBy" source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
                    //     <TextField source="nickname" />
                    // </ReferenceField>,
                    // <DateField key="createTime" source="createTime" label="common.field.createTime" showTime />,
                    <BooleanField key="statusBool" source="statusBool" label="common.field.status" sortable={false} />,
                    <TextField key="memo" source="memo" label="common.field.memo" sortable={false} />,
                    // <TextField key="memo" source="memo" label="common.field.memo" sortable={false} />,
                ]
                const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
                const opt = <WrapperField key="opt" cellClassName="fixed" className="fixed" label="common.field.opt">
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
@@ -50,11 +50,11 @@
        label: 'table.field.matnrGroup.name',
        Width: 100,
    },
    {
        id: 'parentId',
        label: 'table.field.matnrGroup.parentId',
        minWidth: 100,
    }
    // {
    //     id: 'parCode',
    //     label: 'table.field.matnrGroup.parCode',
    //     minWidth: 100,
    // }
];
const getIconComponent = (iconStr) => {
rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx
@@ -129,13 +129,13 @@
                    preferenceKey='warehouse'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false} 
                    omit={['id', 'createTime', 'createBy', 'memo', 'longitude', 'latgitude', 'length', 'width', 'height']}
                    omit={['id', 'factory', 'createTime', 'createBy', 'memo', 'longitude', 'latgitude', 'length', 'width', 'height']}
                >
                    <NumberField source="id" />
                    <TextField source="factory" label="table.field.warehouse.factory" />
                    <TextField source="name" label="table.field.warehouse.name" />
                    <TextField source="code" label="table.field.warehouse.code" />
                    <TextField source="name" label="table.field.warehouse.name" />
                    <TextField source="address" label="table.field.warehouse.address" />
                    <TextField source="factory" label="table.field.warehouse.factory" />
                    <TextField source="longitude" label="table.field.warehouse.longitude" />
                    <TextField source="latgitude" label="table.field.warehouse.latgitude" />
                    <NumberField source="length" label="table.field.warehouse.length" />
rsf-admin/src/page/dashboard/NbCard.jsx
@@ -25,74 +25,329 @@
const NbCard = (props) => {
    const { tasks, total, ...rset } = props;
    const translate = useTranslate();
    // 状态管理屏幕高度
    const [screenHeight, setScreenHeight] = React.useState(window.innerHeight);
    const [containerHeight, setContainerHeight] = React.useState('100vh');
    const display = 'display';
    // 监听窗口大小变化
    React.useEffect(() => {
        const handleResize = () => {
            setScreenHeight(window.innerHeight);
        };
        window.addEventListener('resize', handleResize);
        // 计算容器高度(减去可能的头部导航栏高度)
        const calculateContainerHeight = () => {
            const headerHeight = 64; // 假设头部导航栏高度为64px
            const padding = 16; // 上下边距
            return `calc(${screenHeight}px - ${headerHeight + padding * 2}px)`;
        };
        setContainerHeight(calculateContainerHeight());
        return () => {
            window.removeEventListener('resize', handleResize);
        };
    }, [screenHeight]);
    return (
        <>
        <Box sx={{
            height: containerHeight, // 动态计算的高度
            maxHeight: 690, //containerHeight,
            display: 'flex',
            flexDirection: 'column',
            minHeight: '400px', // 最小高度保证
            // overflowY: 'auto'
        }}>
            <CardWithIcon
                icon={CommentIcon}
                title={translate('page.dashboard.pending_reviews')}
                subtitle={total}
                {...rset}
                sx={{
                    flex: 1,
                    display: 'flex',
                    flexDirection: 'column',
                    height: '100%',
                    minHeight: 0,
                }}
            >
                <List sx={{ display }}>
                    {tasks?.map((record) => (
                        <ListItem key={record.id} disablePadding>
                            <ListItemButton
                                alignItems="flex-start"
                                component={Link}
                                to={`/task/${record.id}`}
                            >
                                <Grid container item md={12}>
                                    <Box sx={{ display: 'flex' }}>
                                        <Box sx={{ display: 'flex', padding: '1em' }}>
                                            <Typography color="textSecondary">{translate("table.field.task.taskCode")}:</Typography>
                                            <Typography color="textSecondary">{record?.taskCode}</Typography>
                                        </Box>
                                    </Box>
                                    <Box sx={{ display: 'flex' }}>
                                        <Box sx={{ display: 'flex', padding: '1em' }}>
                                            <Typography color="textSecondary">{translate("table.field.task.taskType")}:</Typography>
                                            <Typography color="textSecondary" maxWidth="200" overflow="hidden">{record?.taskType$}</Typography>
                                        </Box>
                                    </Box>
                                    <Box sx={{ display: 'flex' }}>
                                        <Box sx={{ display: 'flex', padding: '1em' }}>
                                            <Typography color="textSecondary">{translate("table.field.task.taskStatus")}:</Typography>
                                            <Typography color="textSecondary">{record?.taskStatus$}</Typography>
                                        </Box>
                                    </Box>
                                    <Box sx={{ display: 'flex' }}>
                                        <Box sx={{ display: 'flex', padding: '1em' }}>
                                            <Typography color="textSecondary">{translate("table.field.task.startTime")}:</Typography>
                                            <Typography color="textSecondary">{record?.createTime}</Typography>
                                        </Box>
                                    </Box>
                                </Grid>
                            </ListItemButton>
                            <Spacer />
                        </ListItem>
                    ))}
                </List>
                <Box flexGrow={1}>&nbsp;</Box>
                {/* <Button
                    sx={{ borderRadius: 0 }}
                    component={Link}
                    to="/task"
                    size="small"
                    color="primary"
                >
                    <Box p={1} sx={{ color: 'primary.main' }}>
                        {translate('pos.dashboard.all_reviews')}
                {/* 内容容器 - 自适应高度 */}
                <Box sx={{
                    flex: 1,
                    display: 'flex',
                    flexDirection: 'column',
                    minHeight: 0,
                    height: '100%',
                }}>
                    {/* 列表区域 - 自动滚动 */}
                    <Box sx={{
                        flex: 1,
                        overflow: 'auto',
                        minHeight: 0,
                        '&::-webkit-scrollbar': {
                            width: '6px',
                        },
                        '&::-webkit-scrollbar-track': {
                            background: 'transparent',
                        },
                        '&::-webkit-scrollbar-thumb': {
                            background: '#ccc',
                            borderRadius: '3px',
                            '&:hover': {
                                background: '#aaa',
                            }
                        }
                    }}>
                        <List sx={{ py: 0, minHeight: 'min-content' }}>
                            {tasks?.length > 0 ? (
                                tasks.map((record) => (
                                    <ListItem
                                        key={record.id}
                                        disablePadding
                                        sx={{
                                            borderBottom: '1px solid',
                                            borderColor: 'divider',
                                            '&:last-child': {
                                                borderBottom: 'none',
                                            }
                                        }}
                                    >
                                        <ListItemButton
                                            component={Link}
                                            to={`/task/${record.id}`}
                                            sx={{
                                                py: 1.5,
                                                px: 2,
                                                '&:hover': {
                                                    backgroundColor: 'action.hover',
                                                }
                                            }}
                                        >
                                            <Grid container spacing={1}>
                                                {/* 第一行:任务编码和类型 */}
                                                <Grid item xs={12} sx={{ display: 'flex', alignItems: 'center' }}>
                                                    <Box sx={{
                                                        display: 'flex',
                                                        alignItems: 'center',
                                                        minWidth: 0,
                                                        flex: 1,
                                                        mr: 2
                                                    }}>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                fontWeight: 600,
                                                                color: 'primary.main',
                                                                minWidth: '80px',
                                                                flexShrink: 0,
                                                            }}
                                                        >
                                                            {translate("table.field.task.taskCode")}:
                                                        </Typography>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                color: 'text.primary',
                                                                fontWeight: 500,
                                                                overflow: 'hidden',
                                                                textOverflow: 'ellipsis',
                                                                whiteSpace: 'nowrap',
                                                            }}
                                                        >
                                                            {record?.taskCode}
                                                        </Typography>
                                                    </Box>
                                                    <Box sx={{
                                                        display: 'flex',
                                                        alignItems: 'center',
                                                        minWidth: 0,
                                                        flex: 1
                                                    }}>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                fontWeight: 600,
                                                                color: 'primary.main',
                                                                minWidth: '80px',
                                                                flexShrink: 0,
                                                            }}
                                                        >
                                                            {translate("table.field.task.taskType")}:
                                                        </Typography>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                color: 'text.primary',
                                                                overflow: 'hidden',
                                                                textOverflow: 'ellipsis',
                                                                whiteSpace: 'nowrap',
                                                            }}
                                                            title={record?.taskType$}
                                                        >
                                                            {record?.taskType$}
                                                        </Typography>
                                                    </Box>
                                                </Grid>
                                                {/* 第二行:状态和时间 */}
                                                <Grid item xs={12} sx={{ display: 'flex', alignItems: 'center' }}>
                                                    <Box sx={{
                                                        display: 'flex',
                                                        alignItems: 'center',
                                                        minWidth: 0,
                                                        flex: 1,
                                                        mr: 2
                                                    }}>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                fontWeight: 600,
                                                                color: 'primary.main',
                                                                minWidth: '80px',
                                                                flexShrink: 0,
                                                            }}
                                                        >
                                                            {translate("table.field.task.taskStatus")}:
                                                        </Typography>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                color: getStatusColor(record?.taskStatus$),
                                                                fontWeight: 600,
                                                                px: 1,
                                                                py: 0.5,
                                                                borderRadius: 1,
                                                                backgroundColor: getStatusBackground(record?.taskStatus$),
                                                                fontSize: '0.75rem',
                                                            }}
                                                        >
                                                            {record?.taskStatus$}
                                                        </Typography>
                                                    </Box>
                                                    <Box sx={{
                                                        display: 'flex',
                                                        alignItems: 'center',
                                                        minWidth: 0,
                                                        flex: 1
                                                    }}>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                fontWeight: 600,
                                                                color: 'primary.main',
                                                                minWidth: '80px',
                                                                flexShrink: 0,
                                                            }}
                                                        >
                                                            {translate("table.field.task.startTime")}:
                                                        </Typography>
                                                        <Typography
                                                            variant="body2"
                                                            sx={{
                                                                color: 'text.secondary',
                                                                fontFamily: 'monospace',
                                                                fontSize: '0.875rem',
                                                            }}
                                                        >
                                                            {formatDateTime(record?.createTime)}
                                                        </Typography>
                                                    </Box>
                                                </Grid>
                                            </Grid>
                                        </ListItemButton>
                                    </ListItem>
                                ))
                            ) : (
                                // 空状态提示 - 居中显示
                                <Box sx={{
                                    display: 'flex',
                                    alignItems: 'center',
                                    justifyContent: 'center',
                                    height: '100%',
                                    minHeight: 120,
                                    color: 'text.secondary'
                                }}>
                                    <Typography variant="body2">
                                        {translate('common.noData')}
                                    </Typography>
                                </Box>
                            )}
                        </List>
                    </Box>
                </Button> */}
                    {/* 底部按钮区域 - 固定在底部 */}
                    {tasks?.length > 0 && (
                        <Box sx={{
                            borderTop: '1px solid',
                            borderColor: 'divider',
                            flexShrink: 0,
                            mt: 'auto',
                        }}>
                            <Button
                                component={Link}
                                to="/task"
                                size="small"
                                color="primary"
                                fullWidth
                                sx={{
                                    borderRadius: 0,
                                    py: 1,
                                    fontSize: '0.875rem',
                                    fontWeight: 500,
                                }}
                            >
                                {translate('pos.dashboard.all_reviews')}
                            </Button>
                        </Box>
                    )}
                </Box>
            </CardWithIcon>
        </>
        </Box>
    );
};
const Spacer = () => <span style={{ width: '1em', }} />;
// 状态颜色映射
const getStatusColor = (status) => {
    const statusMap = {
        'pending': 'warning.main',
        'completed': 'success.main',
        'processing': 'info.main',
        'cancelled': 'error.main',
        'failed': 'error.main',
    };
    return statusMap[status?.toLowerCase()] || 'text.secondary';
};
// 状态背景色
const getStatusBackground = (status) => {
    const backgroundMap = {
        'pending': 'warning.light',
        'completed': 'success.light',
        'processing': 'info.light',
        'cancelled': 'error.light',
        'failed': 'error.light',
    };
    return backgroundMap[status?.toLowerCase()] || 'grey.100';
};
export default NbCard;
// 格式化日期时间
const formatDateTime = (dateTime) => {
    if (!dateTime) return '-';
    try {
        return new Date(dateTime).toLocaleDateString('zh-CN', {
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit'
        });
    } catch {
        return dateTime;
    }
};
export default NbCard;
rsf-admin/src/page/dashboard/NbList.jsx
@@ -21,12 +21,27 @@
    return (
        <Card sx={{
            flex: 1,
            boxShadow: 2,
            maxWidth: 598,
            marginTop: 1
        }}>
            <CardHeader title={translate('page.dashboard.list.stock')} />
            <Box sx={{ maxHeight: 500, overflowY: 'auto',}}>
                <List dense={true}>
            <CardHeader
                title={translate('page.dashboard.list.stock')}
                sx={{
                    pb: 1,
                    '& .MuiCardHeader-title': {
                        fontSize: '1.1rem',
                        fontWeight: 600,
                    }
                }}
            />
            <Box sx={{ maxHeight: 500, overflowY: 'auto' }}>
                <List dense={true} sx={{ py: 0 }}>
                    {deadStock.map(record => (
                        <PendingOrder key={`record?.id + ${Math.random().toString(36).substr(2, 9)} `} order={record} />
                        <PendingOrder
                            key={`${record?.id}_${Math.random().toString(36).substr(2, 9)}`}
                            order={record}
                        />
                    ))}
                </List>
            </Box>
@@ -37,71 +52,131 @@
export const PendingOrder = (props) => {
    const { order } = props;
    const translate = useTranslate();
    // const { referenceRecord: customer, isPending } = useReference({
    //     reference: 'customers',
    //     id: order.id,
    // });
    return (
        <ListItem disablePadding>
            {/* component={Link} to={`/locItem/${order.id}`} */}
            <ListItemButton >
                {/* <ListItemAvatar>
                    {isPending ? (
                        <Avatar />
                    ) : (
                        <Avatar
                            src={`${customer?.avatar}?size=32x32`}
                            sx={{ bgcolor: 'background.paper' }}
                            alt={`${customer?.first_name} ${customer?.last_name}`}
                        />
                    )}
                </ListItemAvatar> */}
                {/* <ListItemText
                    primary={new Date(order.createTime).toLocaleString('en-GB')}
                    secondary={translate('page.dashboard.list.stock', {
                        name: order.maktx
                    })}
                >
                </ListItemText> */}
                <Grid container item md={12}>
                    <Box sx={{ display: 'flex' }}>
                        <Box sx={{ display: 'flex', padding: '1em' }}>
                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.matnrCode")}:</Typography>
                            <Typography color="textSecondary">{order?.matnrCode}</Typography>
        <ListItem
            disablePadding
            sx={{
                borderBottom: '1px solid',
                borderColor: 'divider',
                '&:last-child': {
                    borderBottom: 'none',
                }
            }}
        >
            <ListItemButton
                sx={{
                    py: 1.5,
                    '&:hover': {
                        backgroundColor: 'action.hover',
                    }
                }}
            >
                <Grid container spacing={1}>
                    {/* 第一行:物料编码和名称 */}
                    <Grid item xs={12} sx={{ display: 'flex', alignItems: 'center' }}>
                        <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0, flex: 1 }}>
                            <Typography
                                variant="body2"
                                sx={{
                                    fontWeight: 600,
                                    color: 'primary.main',
                                    minWidth: '120px',
                                    flexShrink: 0,
                                }}
                            >
                                {translate("table.field.asnOrderItem.matnrCode")}:
                            </Typography>
                            <Typography
                                variant="body2"
                                sx={{
                                    color: 'text.primary',
                                    overflow: 'hidden',
                                    textOverflow: 'ellipsis',
                                    whiteSpace: 'nowrap',
                                }}
                            >
                                {order?.matnrCode}
                            </Typography>
                        </Box>
                    </Box>
                    <Box sx={{ display: 'flex' }}>
                        <Box sx={{ display: 'flex', padding: '1em' }}>
                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.maktx")}:</Typography>
                            <Typography color="textSecondary" maxWidth="200" overflow="hidden">{order?.maktx}</Typography>
                        <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0, flex: 1 }}>
                            <Typography
                                variant="body2"
                                sx={{
                                    fontWeight: 600,
                                    color: 'primary.main',
                                    minWidth: '80px',
                                    flexShrink: 0,
                                }}
                            >
                                {translate("table.field.asnOrderItem.maktx")}:
                            </Typography>
                            <Typography
                                variant="body2"
                                sx={{
                                    color: 'text.primary',
                                    overflow: 'hidden',
                                    textOverflow: 'ellipsis',
                                    whiteSpace: 'nowrap',
                                }}
                                title={order?.maktx} // 添加title提示完整内容
                            >
                                {order?.maktx}
                            </Typography>
                        </Box>
                    </Box>
                    <Box sx={{ display: 'flex' }}>
                        <Box sx={{ display: 'flex', padding: '1em' }}>
                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.anfme")}:</Typography>
                            <Typography color="textSecondary">{order?.anfme}</Typography>
                    </Grid>
                    {/* 第二行:数量和日期 */}
                    <Grid item xs={12} sx={{ display: 'flex', alignItems: 'center' }}>
                        <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0, flex: 1 }}>
                            <Typography
                                variant="body2"
                                sx={{
                                    fontWeight: 600,
                                    color: 'primary.main',
                                    minWidth: '120px',
                                    flexShrink: 0,
                                }}
                            >
                                {translate("table.field.asnOrderItem.anfme")}:
                            </Typography>
                            <Typography
                                variant="body2"
                                sx={{
                                    color: 'text.primary',
                                    fontWeight: 500,
                                }}
                            >
                                {order?.anfme}
                            </Typography>
                        </Box>
                    </Box>
                    <Box sx={{ display: 'flex' }}>
                        <Box sx={{ display: 'flex', padding: '1em' }}>
                            <Typography color="textSecondary">{translate("table.field.locItem.deadTime")}:</Typography>
                            <Typography color="textSecondary">{order?.deadTime}</Typography>
                        <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0, flex: 1 }}>
                            <Typography
                                variant="body2"
                                sx={{
                                    fontWeight: 600,
                                    color: 'primary.main',
                                    minWidth: '120px',
                                    flexShrink: 0,
                                }}
                            >
                                {translate("table.field.locItem.deadTime")}:
                            </Typography>
                            <Typography
                                variant="body2"
                                sx={{
                                    color: order?.deadTime ? 'error.main' : 'text.secondary',
                                    fontWeight: order?.deadTime ? 600 : 400,
                                    fontFamily: 'monospace',
                                }}
                            >
                                {order?.deadTime || '-'}
                            </Typography>
                        </Box>
                    </Box>
                    </Grid>
                </Grid>
                {/* <ListItemSecondaryAction>
                    <Box
                        component="span"
                        sx={{
                            marginRight: '1em',
                            color: 'text.primary',
                        }}
                    >
                        {order.deadTime}
                    </Box>
                </ListItemSecondaryAction> */}
            </ListItemButton>
        </ListItem>
    );
rsf-admin/src/page/dashboard/NbPie.jsx
@@ -13,7 +13,9 @@
        <>
            <Card sx={{
                width: '100%',
                maxWidth: 598,
                maxHeight: 570,
                marginTop: 1,
                flexDirection: 'column',
                flex: '1',
                '& a': {
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
@@ -201,6 +201,11 @@
        <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" />,
        <TextField source="trackCode" label="table.field.asnOrderItem.barcode" />,
        <TextField source="packName" label="table.field.asnOrderItem.packName" />,
        // 银座新增
        <TextField source="trackCode" label="仓库" />,
        <TextField source="trackCode" label="行内号" />,
        <TextField source="packName" label="计划跟踪号" />,
      ]
      const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
      const lastArr = [
@@ -238,7 +243,7 @@
          preferenceKey='asnOrderItem'
          bulkActionButtons={false}
          rowClick={(id, resource, record) => false}
          omit={['id', 'orderId', 'orderCode', 'poDetlId', 'poDetlCode', 'matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode']}
          omit={['id', 'orderId', 'orderCode', 'poDetlId', 'matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode']}
        >
          {columns.map((column) => column)}
        </StyledDatagrid>}
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -158,16 +158,24 @@
            </>}
          rowClick={false}
          expandSingle={true}
          omit={['id', 'createTime', 'createBy', 'memo', 'logisNo', 'poId', 'rleStatus$', 'createBy$']}
          omit={['id', 'code', 'poId', 'arrTime', 'createTime', 'createBy', 'memo', 'logisNo', 'updateBy$', 'updateTime', 'rleStatus$', 'createBy$']}
        >
          <NumberField source="id" />
          <TextField source="code" label="table.field.asnOrder.code" />
          {/* <TextField source="code" label="table.field.asnOrder.code" /> */}
          <TextField source="poCode" label="table.field.asnOrder.poCode" />
          <NumberField source="poId" label="table.field.asnOrder.poId" />
          <TextField source="type$" label="table.field.asnOrder.type" />
          <TextField cellClassName="wkType" source="wkType$" label="table.field.asnOrder.wkType" />
          <NumberField source="anfme" label="table.field.asnOrder.anfme" />
          <NumberField source="qty" label="table.field.asnOrder.qty" />
          {/* 银座新增 */}
          <TextField source="purchaseOrgName" label="采购组织" />
          <TextField source="purchaseUserName" label="采购员" />
          <TextField source="purchaseDate" label="采购日期" />
          <TextField source="supplierId" label="供应商编码" />
          <TextField source="supplierName" label="供应商" />
          <DateField source="arrTime" label="table.field.asnOrder.arrTime" showTime />
          <TextField source="rleStatus$" label="table.field.asnOrder.rleStatus" sortable={false} />
          <TextField source="logisNo" label="table.field.asnOrder.logisNo" />
rsf-admin/src/page/orders/outStock/OutOrderItemList.jsx
@@ -193,6 +193,11 @@
        <TextField source="qrcode" label="table.field.outStockItem.qrcode" />,
        <TextField source="trackCode" label="table.field.outStockItem.barcode" />,
        <TextField source="packName" label="table.field.outStockItem.packName" />,
        // 银座新增
        <TextField source="trackCode" label="仓库" />,
        <TextField source="trackCode" label="行内号" />,
        <TextField source="packName" label="计划跟踪号" />,
      ]
      const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
      const lastArr = [
@@ -230,7 +235,7 @@
          preferenceKey='asnOrderItem'
          bulkActionButtons={false}
          rowClick={(id, resource, record) => false}
          omit={['id', 'orderId', 'orderCode', 'poDetlId', 'poDetlCode', 'platOrderCode','matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode']}
          omit={['id', 'orderId', 'orderCode', 'poDetlId', 'poDetlCode', 'platOrderCode','matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode', 'workQty']}
        >
          {columns.map((column) => column)}
        </StyledDatagrid>}
rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -173,7 +173,7 @@
          bulkActionButtons={<PublicTaskButton setWaveRule={setWaveRule} setSelectIds={setSelectIds} />}
          rowClick={false}
          expandSingle={true}
          omit={['id', 'createTime', 'createBy$', 'memo', 'rleStatus$']}
          omit={['id', 'code', 'createTime', 'createBy$', 'memo', 'rleStatus$', 'logisNo', 'updateBy$', 'workQty', 'updateTime']}
        >
          <NumberField source="id" />
          <TextField source="code" label="table.field.outStock.code" />
@@ -191,6 +191,14 @@
          <DateField source="createTime" label="common.field.createTime" showTime />
          <BillStatusField cellClassName="status" source="exceStatus" label="table.field.outStock.exceStatus" />
          <TextField source="memo" label="common.field.memo" sortable={false} />
          {/* 银座新增 */}
          <TextField source="saleOrgName" label="销售组织" />
          <TextField source="saleUserName" label="销售员" />
          <TextField source="saleDate" label="出库日期" />
          <TextField source="customerId" label="客户编码" />
          <TextField source="customerName" label="客户" />
          <WrapperField cellClassName="opt" label="common.field.opt" >
            <MyButton setCreateDialog={setManualDialog} setmodalType={setmodalType} />
            <EditButton label="toolbar.detail" icon={(<DetailsIcon />)}></EditButton>
rsf-admin/src/page/orders/preparation/MatPreparationItemList.jsx
New file
@@ -0,0 +1,209 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useFetcher, useNavigate } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    FilterButton,
    useTranslate,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    useRefresh,
    DateInput,
    useNotify,
    SelectInput,
    useListContext,
    NumberInput,
    useGetRecordId,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material';
import MyCreateButton from "../components/MyCreateButton";
import PageDrawer from "../components/PageDrawer";
import { styled } from '@mui/material/styles';
// import TaskItemCreate from "./TaskItemCreate";
import request from '@/utils/request';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto',
        maring: '1em'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 220
    },
}));
const filters = [
    <SearchInput source="condition" alwaysOn />,
    // <DateInput label='common.time.after' source="timeStart" />,
    // <DateInput label='common.time.before' source="timeEnd" />,
    <NumberInput source="taskId" label="table.field.taskItem.taskId" />,
    <NumberInput source="orderId" label="table.field.taskItem.orderId" />,
    <NumberInput source="orderType" label="table.field.taskItem.orderType" />,
    <NumberInput source="orderItemId" label="table.field.taskItem.orderItemId" />,
    <NumberInput source="matnrId" label="table.field.taskItem.matnrId" />,
    <TextInput source="maktx" label="table.field.taskItem.maktx" />,
    <TextInput source="matnrCode" label="table.field.taskItem.matnrCode" />,
    <TextInput source="unit" label="table.field.taskItem.unit" />,
    <NumberInput source="anfme" label="table.field.taskItem.anfme" />,
    <TextInput source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
    <TextInput source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
    <TextInput source="projectCode" label="table.field.asnOrderItem.projectCode" />,
    <TextInput source="batch" label="table.field.taskItem.batch" />,
    <TextInput source="spec" label="table.field.taskItem.spec" />,
    <TextInput source="model" label="table.field.taskItem.model" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
        source="status"
        choices={[
            { id: '1', name: 'common.enums.statusTrue' },
            { id: '0', name: 'common.enums.statusFalse' },
        ]}
        resettable
    />,
]
const MatPreparationItemList = () => {
    const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const recordId = useGetRecordId();
    return (
        <Box display="flex">
            <List
                resource="preparationItem"
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.preparationItem"}
                empty={false}
                pagination={false}
                filters={filters}
                filter={{ taskId: recordId }}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */}
                        <SelectColumnsButton preferenceKey='preparationItem' />
                        {/* <MyExportButton /> */}
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <DynamicFields />
            </List>
            <TaskItemCreate
                open={createDialog}
                setOpen={setCreateDialog} />
            <PageDrawer
                title='PreparationItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
export default MatPreparationItemList;
const DynamicFields = (props) => {
    const translate = useTranslate();
    const notify = useNotify();
    const [columns, setColumns] = useState([]);
    const { isLoading } = useListContext();
    const refresh = useRefresh();
    useEffect(() => {
        getDynamicFields();
    }, []);
    const getDynamicFields = async () => {
        const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
        if (code == 200) {
            const arr = [
                <NumberField source="id" />,
                // <NumberField source="taskId" label="table.field.taskItem.taskId" />,
                // <NumberField source="orderId" label="table.field.taskItem.orderId" />,
                // <NumberField source="orderType$" label="table.field.taskItem.orderType" />,
                // <NumberField source="wkType$" label="table.field.taskItem.wkType" />,
                <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" />,
                <NumberField source="matnrId" label="table.field.taskItem.matnrId" />,
                <TextField source="maktx" label="table.field.taskItem.maktx" />,
                <TextField source="matnrCode" label="table.field.taskItem.matnrCode" />,
                <TextField source="unit" label="table.field.taskItem.unit" />,
                <NumberField source="anfme" label="table.field.taskItem.anfme" />,
                <TextField source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
                <TextField source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
                <TextField source="projectCode" label="table.field.asnOrderItem.projectCode" />,
                <TextField source="batch" label="table.field.taskItem.batch" />,
                <TextField source="isptResult$" label="table.field.taskItem.isptResult" />,
                <TextField source="spec" label="table.field.taskItem.spec" />,
                <TextField source="model" label="table.field.taskItem.model" />,
            ]
            const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
            const lastArr = [
                <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                    <TextField source="nickname" />
                </ReferenceField>,
                <DateField source="updateTime" label="common.field.updateTime" showTime />,
                <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
                    <TextField source="nickname" />
                </ReferenceField>,
                <DateField source="createTime" label="common.field.createTime" showTime />,
                <BooleanField source="statusBool" label="common.field.status" sortable={false} />,
                <TextField source="memo" label="common.field.memo" sortable={false} />,
            ]
            setColumns([...arr, ...fields, ...lastArr]);
        } else {
            notify(msg);
        }
    }
    return (
        <Box sx={{ position: 'relative', minHeight: "60vh", }}>
            {isLoading && (
                <LinearProgress
                    sx={{
                        height: "2px",
                        position: 'absolute',
                        top: 0,
                        left: 0,
                        right: 0,
                    }}
                />
            )}
            {columns.length > 0 &&
                <StyledDatagrid
                    preferenceKey='preparationItem'
                    bulkActionButtons={false}
                    rowClick={false}
                    // expand={() => <TaskItemPanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId', 'platWorkCode', 'projectCode','statusBool']}
                >
                    {columns.map((column) => column)}
                </StyledDatagrid>}
        </Box>
    )
}
rsf-admin/src/page/orders/preparation/MatPreparationList.jsx
New file
@@ -0,0 +1,422 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import request from '@/utils/request';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    FilterButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useRefresh,
    TextField,
    NumberField,
    DateField,
    AutocompleteInput,
    BooleanField,
    TextInput,
    DateInput,
    SelectInput,
    NumberInput,
    Button,
    EditButton,
} from 'react-admin';
import { Box, Typography, Card, Stack, Drawer } from '@mui/material';
import { styled } from '@mui/material/styles';
import SwapVertIcon from '@mui/icons-material/SwapVert';
import AlignVerticalTopIcon from '@mui/icons-material/AlignVerticalTop';
import TaskAltIcon from '@mui/icons-material/TaskAlt';
import CancelIcon from '@mui/icons-material/Cancel';
import PageDrawer from "../../components/PageDrawer";
import MatPreparationPanel from "./MatPreparationPanel";
import MyField from "../../components/MyField";
import ConfirmButton from "../../components/ConfirmButton";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, AUTO_RUN_CHECK_ORDERS } from '@/config/setting';
import PlayArrowOutlinedIcon from '@mui/icons-material/PlayArrowOutlined';
import PauseIcon from '@mui/icons-material/Pause';
import PauseCircleOutlineIcon from '@mui/icons-material/PauseCircleOutline';
import * as Common from '@/utils/common';
import ColorizeOutlinedIcon from '@mui/icons-material/ColorizeOutlined';
import GradingOutlinedIcon from '@mui/icons-material/GradingOutlined';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 248
    },
    '& .MuiTableCell-root': {
    whiteSpace: 'nowrap',
    overflow: 'visible',
    textOverflow: 'unset'
    }
}));
const MatPreparationList = (props) => {
    const translate = useTranslate();
    const refresh = useRefresh();
    const [drawerVal, setDrawerVal] = useState(false);
    const [autoExce, setAutoExce] = useState(false);
    const dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_warehouse_type')) || [];
    useEffect(() => {
        // getConfig()
    }, [])
    // const getConfig = async () => {
    //     const { data: { code, data, msg } } = await request.get('/config/flag/' + AUTO_RUN_CHECK_ORDERS);
    //     if (code === 200) {
    //         setAutoExce(JSON.parse(data?.val))
    //     }
    // }
    // useEffect(() => {
    //     const interval = setInterval(() => {
    //         refresh();
    //     }, 5000); // 每5秒刷新一次
    //     return () => clearInterval(interval); // 清除定时器
    // }, [refresh])
    const filters = [
        <SearchInput source="condition" alwaysOn />,
        // <DateInput label='common.time.after' source="timeStart" />,
        // <DateInput label='common.time.before' source="timeEnd" />,
        <TextInput source="orderCode" label="table.field.preparation.orderCode" />,
        <NumberInput source="orderStatus" label="table.field.preparation.orderStatus" />,
        <DateInput source="orderTime" label="table.field.preparation.orderTime" />,
        <NumberInput source="anfme" label="table.field.preparation.anfme" />,
        // <AutocompleteInput choices={dict} optionText='label' optionValue="value" source="warehType" label="table.field.task.warehType" />,
        // <TextInput source="orgLoc" label="table.field.task.orgLoc" />,
        // <TextInput source="orgSite" label="table.field.task.orgSite" />,
        // <TextInput source="targLoc" label="table.field.task.targLoc" />,
        // <TextInput source="targSite" label="table.field.task.targSite" />,
        // <TextInput source="barcode" label="table.field.task.barcode" />,
        // <TextInput source="robotCode" label="table.field.task.robotCode" />,
        // <NumberInput source="exceStatus" label="table.field.task.exceStatus" />,
        // <TextInput source="expDesc" label="table.field.task.expDesc" />,
        // <NumberInput source="sort" label="table.field.task.sort" />,
        // <TextInput source="expCode" label="table.field.task.expCode" />,
        // <DateInput source="startTime" label="table.field.task.startTime" />,
        // <DateInput source="endTime" label="table.field.task.endTime" />,
        // <TextInput label="common.field.memo" source="memo" />,
        // <SelectInput
        //     label="common.field.status"
        //     source="status"
        //     choices={[
        //         { id: '1', name: 'common.enums.statusTrue' },
        //         { id: '0', name: 'common.enums.statusFalse' },
        //     ]}
        //     resettable
        // />,
    ]
    return (
        <Box display="flex">
            <List
                queryOptions={{ refetchInterval: 5000 }}
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.preparation"}
                empty={false}
                filters={filters}
                sort={{ field: "sort", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <BulkAutoStartButton autoExce={autoExce} setAutoExce={setAutoExce}/>
                        <BulkAutoPauseButton autoExce={autoExce} setAutoExce={setAutoExce} />
                        <FilterButton />
                        <SelectColumnsButton preferenceKey='preparation' />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='preparation'
                    bulkActionButtons={false}
                    rowClick={false}
                    expand={<MatPreparationPanel />}
                    expandSingle={true}
                    omit={['id', 'sort', 'taskCode', 'createTime', 'createBy$', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'status','warehType$']}
                >
                    <NumberField source="id" />
                    <TextField source="taskCode" label="备料号" />
                    <NumberField source="status" label="table.field.task.exceStatus" />
                    <DateField source="startTime" label="table.field.task.startTime" />
                    <NumberField source="sort" label="数量" />
                    {/* table.field.task.sort */}
                    {/* <TextField source="taskCode" label="table.field.task.taskCode" />
                    <NumberField source="taskStatus$" label="table.field.task.taskStatus" />
                    <NumberField source="taskType$" label="table.field.task.taskType" />
                    <NumberField source="warehType$" label="table.field.task.warehType" />
                    <TextField source="orgLoc" label="table.field.task.orgLoc" />
                    <TextField source="orgSite" label="table.field.task.orgSite" />
                    <TextField source="targLoc" label="table.field.task.targLoc" />
                    <TextField source="targSite" label="table.field.task.targSite" />
                    <TextField source="barcode" label="table.field.task.barcode" />
                    <TextField source="robotCode" label="table.field.task.robotCode" />
                    <NumberField source="exceStatus" label="table.field.task.exceStatus" />
                    <TextField source="expDesc" label="table.field.task.expDesc" />
                    <NumberField source="sort" label="table.field.task.sort" />
                    <TextField source="expCode" label="table.field.task.expCode" />
                    <TextField source="updateBy$" label="common.field.updateBy" />
                    <TextField source="createBy$" label="common.field.createBy" />
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <DateField source="createTime" label="common.field.createTime" showTime />
                    <TextField source="memo" label="common.field.memo" sortable={false} /> */}
                    <WrapperField cellClassName="opt" label="common.field.opt" onClick={(e) => e.stopPropagation()} >
                        <EditButton label="toolbar.detail" />
                        <DoneButton sx={{ padding: '1px', fontSize: '.75rem' }} ></DoneButton>
                        <CancelButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                        <CheckButton />
                        <PickButton />
                        <SetTopButton />
                    </WrapperField>
                </StyledDatagrid>
            </List>
            <PageDrawer
                title='Preparation Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
export default MatPreparationList;
/**
 * 盘点
 * @returns te
 */
const CheckButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const checkClick = async () => {
        const { data: { code, data, msg } } = await request.post(`/task/check/` + record.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (record?.taskStatus == 199 && record?.taskType == 107 ? <ConfirmButton label={"toolbar.check"} startIcon={<GradingOutlinedIcon />} onConfirm={checkClick} /> : <></>)
}
/**自动下发任务**/
const BulkAutoStartButton = ({ autoExce, setAutoExce }) => {
    const notify = useNotify();
    const startClick = async () => {
        setAutoExce(true)
        const { data: { code, data, msg } } = await request.post('/config/byFlag', { val: true, flag: 'AUTO_RUN_CHECK_ORDERS' });
        if (code === 200) {
            notify(msg);
        } else {
            notify(msg);
        }
    }
    return (
        !autoExce ? <Button label="toolbar.autoStartLocs" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} /> : <></>
    )
}
const BulkAutoPauseButton = ({ autoExce, setAutoExce }) => {
    const notify = useNotify();
    const pauseClick = async () => {
        const { data: { code, data, msg } } = await request.post('/config/byFlag', { val: false, flag: 'AUTO_RUN_CHECK_ORDERS' });
        if (code === 200) {
            notify(msg);
            setAutoExce(false)
        } else {
            notify(msg);
        }
    }
    return (
        autoExce ? <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseIcon />} /> : <></>
    )
}
/**
 * 拣料出库
 * @returns
 */
const PickButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const pickClick = async () => {
        const { data: { code, data, msg } } = await request.post(`/task/pick/` + record.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (
        record?.taskStatus == 199 && record?.taskType == 103 ? <ConfirmButton label={"toolbar.pick"} startIcon={<ColorizeOutlinedIcon />} onConfirm={pickClick} /> : <></>
    )
}
/**
 * 完成操作
 * @returns
 */
const DoneButton = (props) => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const clickComplete = () => {
        completeTask(record)
    };
    //完成任务
    const completeTask = async (row) => {
        const { data: { code, data, msg } } = await request.post(`task/complete/` + row.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (
        ((record?.taskStatus < 98) || (record?.taskType >= 101 && record?.taskStatus < 198)) || (record?.taskType == 11 && record?.taskStatus == 101) ? (<ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskAltIcon />} onConfirm={clickComplete} />) : (<></>)
    )
}
/**
 * 取消按钮
 * @returns
 */
const CancelButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const clickCancel = () => {
        cancleTask(record)
    };
    //取消任务
    const cancleTask = async (row) => {
        const { data: { code, data, msg } } = await request.post(`/task/remove/` + row.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (
        (record.taskStatus == 1 || record.taskStatus == 101) && (record.taskType == 1 || record.taskType == 101 || record.taskType == 10 || record.taskType == 107 || record.taskType == 103 || record.taskType == 11) ?
            <ConfirmButton
                onConfirm={clickCancel}
                startIcon={<CancelIcon />}
                label={"toolbar.cancel"}>
            </ConfirmButton>
            :
            <></>
    )
}
/**
 *  置顶操作
 * @returns
 */
const SetTopButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const clickTop = (event) => {
        event.stopPropagation();
        topTask(record)
    };
    //置顶任务
    const topTask = async (row) => {
        const { data: { code, data, msg } } = await request.post(`/task/top/` + row.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (
        (record.taskStatus == 1 || record.taskStatus == 101) && (record.taskType == 1 || record.taskType == 101 || record.taskType == 10 || record.taskType == 103 || record.taskType == 11) ?
            <Button
                onClick={clickTop}
                label="toolbar.top">
                <AlignVerticalTopIcon />
            </Button>
            :
            <></>
    )
}
/**
 * 批量取消
 * @returns
 */
const BulkCancelButton = () => {
    const record = useRecordContext();
    const clickCancel = () => {
        cancleTask([record])
    };
    //取消任务
    const cancleTask = async (row) => { }
    return (
        <Button
            onClick={clickCancel}
            label="toolbar.cancel">
            <CancelIcon />
        </Button>
    )
}
/**
 * 批量排序
 * @returns
 */
const BulkResortButton = () => {
    const record = useRecordContext();
    const bulkResort = () => {
        resortTask([record])
    };
    //批量排序
    const resortTask = async (row) => { }
    return (
        <Button
            onClick={bulkResort}
            label="toolbar.resort">
            <SwapVertIcon />
        </Button>
    )
}
rsf-admin/src/page/orders/preparation/MatPreparationPanel.jsx
New file
@@ -0,0 +1,89 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import { Box } from '@mui/material';
import {
    List,
    DatagridConfigurable,
    useRecordContext,
    useTranslate,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
} from 'react-admin';
import { styled } from '@mui/material/styles';
import PageDrawer from "../../components/PageDrawer";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const MatPreparationPanel = () => {
    const record = useRecordContext();
    const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    return (
        <>
            <Box display="flex">
                <List resource="preparationItem"
                    sx={{
                        flexGrow: 1,
                        transition: (theme) =>
                            theme.transitions.create(['all'], {
                                duration: theme.transitions.duration.enteringScreen,
                            }),
                        marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    }}
                    filter={{ taskId: record.id }}
                    // title={"menu.taskItem"}
                    pagination={false}
                    empty={false}
                    actions={false}
                >
                    <StyledDatagrid
                        preferenceKey='preparationItem'
                        bulkActionButtons={false}
                        rowClick={false}
                        expandSingle
                        omit={['id', 'taskId', 'createTime', 'createBy$', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']}
                    >
                        <NumberField source="id" />
                        {/* <NumberField source="taskId" label="table.field.taskItem.taskId" /> */}
                        <NumberField source="orderId" label="table.field.preparationItem.orderId" />
                        <NumberField source="orderType$" label="table.field.preparationItem.orderType" />
                        {/* <TextField source="sourceCode" label="table.field.taskItem.sourceCode" /> */}
                        <NumberField source="orderItemId" label="table.field.preparationItem.orderItemId" />
                        <NumberField source="matnrId" label="table.field.preparationItem.matnrId" />
                        <TextField source="maktx" label="table.field.preparationItem.maktx" />
                        <TextField source="matnrCode" label="table.field.preparationItem.matnrCode" />
                        <TextField source="unit" label="table.field.preparationItem.unit" />
                        <NumberField source="anfme" label="table.field.preparationItem.anfme" />
                        <TextField source="batch" label="table.field.preparationItem.batch" />
                        <TextField source="spec" label="table.field.preparationItem.spec" />
                        <TextField source="model" label="table.field.preparationItem.model" />
                        {/* <TextField source="updateBy$" label="common.field.updateBy"/>
                        <TextField source="createBy$" label="common.field.createBy"/>
                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                        <DateField source="createTime" label="common.field.createTime" showTime />
                        <TextField source="memo" label="common.field.memo" sortable={false} /> */}
                    </StyledDatagrid>
                </List>
            </Box>
        </>
    );
};
export default MatPreparationPanel;
rsf-admin/src/page/orders/preparation/MatPreparationPublic.jsx
New file
@@ -0,0 +1,483 @@
import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText } from "@mui/material";
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    Button,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    SimpleForm,
    required,
    Form,
    useRefresh,
    useRedirect,
    useRecordSelection,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting';
import { styled } from '@mui/material/styles';
import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid';
import request from '@/utils/request';
import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined';
import CloseSharpIcon from '@mui/icons-material/CloseSharp';
import ConfirmButton from '../../components/ConfirmButton';
import { Delete, Edit, Add } from '@mui/icons-material';
// import OutStockSiteDialog from "./OutStockSiteDialog";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-maktx': {
        width: 200
    },
    mt: '60px'
    // '& .RaBulkActionsToolbar-toolbar': {
    //     display: 'none'
    // }
}));
const MatPerparationPublic = (props) => {
    const { record, open, setOpen, setManualDialog } = props;
    const notify = useNotify();
    const gridRef = useGridApiRef();
    const [rows, setRows] = useState([]);
    const [fetchRows, setFetchRows] = useState([]);
    const translate = useTranslate();
    const [rowSelectedIds, setRowSelectedIds] = useState([]);
    const [selectedMatnr, setSelectedMatnr] = useState([]);
    const [selectedIds, setSelectedIds] = useState([]);
    const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE });
    const [dialog, setDialog] = useState(false);
    const [selectedValue, setSelectedValue] = useState({});
    useEffect(() => {
        if (selectedMatnr.length < 1) {
            setRows(fetchRows)
        } else {
            const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode));
            setRows(mas)
        }
    }, [selectedMatnr])
    const ComfirmButton = () => {
        const { selectedIds, data } = useListContext();
        const handleRowClick = () => {
            console.log(selectedIds);
            const ids = data.filter(item => selectedIds.includes(item.id)).map(item => item.id);
            setRowSelectedIds(ids);
            const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode);
            //设置库位信息筛选条件
            setSelectedMatnr(mas);
        }
        return (
            <Button label="toolbar.confirm" size="medium" onClick={handleRowClick} />
        )
    };
    const handleClickOpen = () => {
        setDialog(true);
    };
    const handleClose = (value) => {
        setDialog(false);
        setSelectedValue(value);
        if (selectedIds.length == 0) {
            const newRows = rows.map(item => {
                return {
                    ...item,
                    siteNo: value?.site
                }
            })
            setRows(newRows);
        } else {
            const newRows = rows.map(item => {
                return selectedIds.includes(item?.id) ? {
                    ...item,
                    siteNo: value?.site
                } : item
            })
            setRows(newRows);
        }
    };
    useEffect(() => {
        getWaveRule()
    }, [open])
    const getWaveRule = async () => {
        if (formData.waveId == null && formData.waveId == undefined) {
            return
        }
        const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData });
        if (code === 200) {
            // setRows(data)
            setFetchRows(data)
        } else {
            notify(msg);
        }
    }
    const handleChange = (value, name) => {
        setFormData((prevData) => ({
            ...prevData,
            [name]: value
        }));
    };
    return (
        <>
            <Box>
                <Grid sx={{ display: "flex" }} container rowSpacing={2} columnSpacing={2}>
                    <Grid item xl={5.7} gap={2} >
                        <Card>
                            <Form>
                                <ReferenceInput
                                    source="type"
                                    reference="waveRule"
                                >
                                    <AutocompleteInput
                                        label="table.field.waveRule.type"
                                        onChange={(e) => handleChange(e, 'waveId')}
                                        defaultValue={15}
                                        value={formData.type}
                                        validate={required()}
                                    />
                                </ReferenceInput>
                            </Form>
                            <List
                                resource="outStockItem"
                                storeKey='outStockItem'
                                sx={{
                                    flexGrow: 1,
                                    transition: (theme) =>
                                        theme.transitions.create(['all'], {
                                            duration: theme.transitions.duration.enteringScreen,
                                        }),
                                }}
                                title={"menu.outStockItem"}
                                empty={false}
                                filter={{ orderId: record?.id, deleted: 0 }}
                                sort={{ field: "create_time", order: "desc" }}
                                actions={false}
                                pagination={false}
                                perPage={DEFAULT_ITEM_PAGE_SIZE}
                            >
                                <LinearProgress
                                    sx={{ height: "2px", position: 'absolute', top: 0, left: 0, right: 0, }}
                                />
                                <StyledDatagrid
                                    storeKey={"matPerparationPublic"}
                                    preferenceKey='outStockItem'
                                    bulkActionButtons={<>
                                        <ComfirmButton />
                                    </>}
                                    omit={['id', 'splrName', 'qty', 'poCode',]}
                                >
                                    <NumberField source="id" />
                                    <TextField source="asnCode" label="table.field.outStockItem.orderCode" />
                                    <TextField source="poCode" label="table.field.outStockItem.poCode" />
                                    <TextField source="matnrCode" label="table.field.outStockItem.matnrCode" />
                                    <TextField source="maktx" label="table.field.outStockItem.maktx" />
                                    <NumberField source="anfme" label="table.field.outStockItem.anfme" />
                                    <NumberField source="workQty" label="table.field.outStockItem.workQty" />
                                    <NumberField source="qty" label="table.field.outStockItem.qty" />
                                    <TextField source="stockUnit" label="table.field.outStockItem.stockUnit" />
                                    <TextField source="splrName" label="table.field.outStockItem.splrName" />
                                </StyledDatagrid>
                            </List>
                        </Card>
                    </Grid>
                    <Grid item xl={6.3} gap={2}>
                        <Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}>
                            <Box>
                                <PreviewTable
                                    rows={rows}
                                    gridRef={gridRef}
                                    setRows={setRows}
                                    record={record}
                                    formData={formData}
                                    selectedIds={selectedIds}
                                    setDialog={setDialog}
                                    setSelectedIds={setSelectedIds}
                                />
                            </Box>
                            <Box sx={{ textAlign: 'center' }}>
                                <CloseButton setOpen={setOpen} />
                                <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} record={record} />
                            </Box>
                        </Card>
                    </Grid>
                </Grid>
                <Grid>
                    <OutStockSiteDialog
                        selectedValue={selectedValue}
                        open={dialog}
                        onClose={handleClose}
                    />
                </Grid>
            </Box>
        </>
    );
}
const PreviewTable = ({ rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog, formData }) => {
    gridRef.current = useGridApiRef();
    const translate = useTranslate();
    useEffect(() => {
        if (selectedIds.length > 0) {
            console.log(selectedIds);
        }
    }, [selectedIds])
    const baseColumns = [
        // { field: 'id', headerName: 'ID', width: 40 },
        { field: 'locCode', headerName: '库位', width: 110 },
        { field: 'barcode', headerName: '容器', width: 120 },
        { field: 'matnrCode', headerName: '物料编码', width: 120 },
        { field: 'batch', headerName: '批次', width: 90 },
        { field: 'unit', headerName: '单位', width: 60 },
        { field: 'outQty', headerName: '出库数量', width: 110, },
        {
            field: 'anfme', headerName: '库存数量', width: 110,
            renderCell: (params) => (
                <OutStockAnfme value={params.value} />
            )
        },
        {
            field: 'siteNo',
            headerName: '出库口',
            width: 90,
            type: 'singleSelect',
            editable: true,
            renderCell: (params) => (
                <OutStockSiteNo value={params.value} />
            ),
            renderEditCell: (params) => (
                <OutStockSite {...params} />
            ),
        },
    ]
    const optAction = {
        field: 'actions',
        type: 'actions',
        headerName: translate('common.field.opt'),
        with: 120,
        getActions: (params) => [
            <GridActionsCellItem
                icon={<Delete />}
                label="Delete"
                onClick={() => handleDelete(params.row, rows, setRows)}
            />,
        ]
    }
    const columns = (formData.waveId == 15 || formData.waveId == 16) ? [...baseColumns] : [...baseColumns, optAction];
    /**
     * 删除事件
     * @param {*} params
     */
    const handleDelete = (params, rows, setRows) => {
        const outRows = rows.filter(row => {
            return row.id !== params.id
        })
        setRows(outRows)
    }
    const OutStockAnfme = React.memo(function OutStockAnfme(props) {
        const { value } = props;
        return (
            value > 0 ?
                <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                    <span>{value}</span>
                </Box>
                :
                <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                    <span style={{ color: 'red' }}>{translate('common.edit.title.insuffInventory')}</span>
                </Box>
        );
    });
    const OutStockSiteNo = React.memo(function OutStockSiteNo(props) {
        const { value } = props;
        if (!value) {
            return null;
        }
        return (
            <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
                <span>{value}</span>
            </Box>
        );
    });
    const CustomToolBar = () => {
        const selectSiteNo = () => {
            setDialog(true)
        }
        return (
            <Box sx={{
                p: 1,
                display: 'flex',
                justifyContent: 'flex-end',
                borderTop: '1px solid rgba(224, 224, 224, 1)'
            }}>
                <Button
                    onClick={selectSiteNo}
                    variant="outlined"
                    label="toolbar.modiftySite"
                    size="medium"
                    sx={{ mr: 1 }} />
            </Box>
        );
    }
    const OutStockSite = (params) => {
        const { id, field, siteNo, row: { staNos } } = params;
        const apiRef = useGridApiContext();
        const handleChange = async (event) => {
            await apiRef.current.setEditCellValue(
                { id, field, value: event.target.value },
                event,
            );
            apiRef.current.stopCellEditMode({ id, field });
        };
        const handleClose = (event, reason) => {
            if (reason === 'backdropClick') {
                apiRef.current.stopCellEditMode({ id, field });
            }
        };
        return (
            <Select
                value={siteNo}
                onChange={handleChange}
                MenuProps={{
                    onClose: handleClose,
                }}
                sx={{
                    height: '100%',
                    '& .MuiSelect-select': {
                        display: 'flex',
                        alignItems: 'center',
                        pl: 1,
                    },
                }}
                autoFocus
                fullWidth
                open
            >
                {staNos.map((option) => {
                    return (
                        <MenuItem
                            key={option}
                            value={option.staNo}
                        >
                            <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} />
                        </MenuItem>
                    );
                })}
            </Select >
        )
    }
    return (
        <DataGrid
            storeKey={"locItemPreview"}
            rows={rows}
            columns={columns}
            slots={{ toolbar: CustomToolBar }}
            apiRef={gridRef}
            checkboxSelection
            disableRowSelectionOnClick
            hideFooterPagination={true}  // 隐藏分页控件
            hideFooter={false}
            onRowSelectionModelChange={(ids) => {
                setSelectedIds(ids)
            }}
        />
    )
}
//提交按钮
const SubmitButton = ({ selectedIds, setSelectedIds, gridRef, record }) => {
    const notify = useNotify();
    const refresh = useRefresh();
    const redirect = useRedirect();
    const submit = async () => {
        const items = gridRef.current?.getSortedRows();
        const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items, outId: record?.id });
        if (code == 200) {
            refresh();
            redirect("/task")
        } else {
            notify(msg);
        }
    }
    return (
        <ConfirmButton
            label="toolbar.allComfirm"
            variant="contained"
            size="medium"
            onConfirm={submit}
        />
    )
}
//关闭按钮
const CloseButton = ({ setOpen }) => {
    const close = () => {
        setOpen(false)
    }
    return (
        <Button
            label="toolbar.close"
            variant="outlined"
            size="medium"
            onClick={close}
            startIcon={<CloseSharpIcon />}
            sx={{ margin: '3.5em' }} />
    )
}
export default MatPerparationPublic;
rsf-admin/src/page/orders/preparation/index.jsx
New file
@@ -0,0 +1,18 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    ListGuesser,
    EditGuesser,
    ShowGuesser,
} from "react-admin";
import MatPreparationList from "./MatPreparationList";
// import TaskEdit from "./TaskEdit";
export default {
    list: MatPreparationList,
    // edit: TaskEdit,
    show: ShowGuesser,
    recordRepresentation: (record) => {
        return `${record.id}`
    }
};
rsf-admin/src/page/system/menu/MenuList.jsx
@@ -127,6 +127,8 @@
    textOverflow: 'ellipsis',
    whiteSpace: 'nowrap',
    maxWidth: 600,
    // 确保所有单元格有基本的内边距
    padding: '8px 16px',
}));
const TreeTableRow = (props) => {
@@ -139,15 +141,41 @@
    const isOpen = openNodes[row.id] || false;
    // 更明显的透明度渐变
    const getOpacity = (currentDepth) => {
        // 第一级:100%,第二级:75%,第三级:50%,第四级:40%
        const opacities = [1, 0.9, 0.8, 0.7];
        return opacities[currentDepth] || 0.4;
    };
    const opacity = getOpacity(depth);
    return (
        <React.Fragment>
            <StyledTableRow hover tabIndex={-1} key={row.id}>
                <StyledTableCell sx={{ padding: 0 }}>
                    {row.children && (
            <StyledTableRow
                hover
                tabIndex={-1}
                key={row.id}
                sx={{
                    opacity: depth > 0 ? opacity : 1,
                    // 添加背景色渐变增强效果
                    backgroundColor: depth > 0 ? `rgba(0, 0, 0, ${0.02 * (3 - depth)})` : 'inherit',
                }}
            >
                <StyledTableCell sx={{
                    padding: 0,
                    width: 60,
                    // 进一步减小缩进距离到12px
                    paddingLeft: depth * 4
                }}>
                    {row.children && row.children.length > 0 && (
                        <IconButton
                            aria-label="expand row"
                            size="small"
                            onClick={() => toggleNode(row.id)}
                            sx={{
                                opacity: depth > 0 ? opacity : 1,
                            }}
                        >
                            {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}
                        </IconButton>
@@ -164,10 +192,20 @@
                                key={column.id}
                                align={column.align || 'left'}
                                style={{
                                    paddingLeft: idx === 0 && (depth * 16 + 16),
                                    opacity: column.id === 'icon' && .6
                                    // 名称列也使用12px缩进
                                    paddingLeft: idx === 0 ? (depth * 24 + 16) : 16,
                                    // opacity: column.id === 'icon' && .6
                                }}
                                onClick={() => toggleNode(row.id)}
                                onClick={() => column.id === 'name' && toggleNode(row.id)}
                                sx={{
                                    opacity: column.id === 'icon' ? 0.6 : (depth > 0 ? opacity : 1),
                                    color: depth > 0 ? `rgba(0, 0, 0, ${opacity})` : 'inherit',
                                    fontWeight: 400,
                                    // 使用字体大小或颜色来区分层级
                                    fontSize: depth === 0 ? '0.95rem' : '0.9rem',
                                    // 或者使用不同的颜色
                                    color: depth === 0 ? 'text.primary' : `rgba(0, 0, 0, ${opacity})`,
                                }}
                            >
                                {column.format ? column.format(value) : value}
                            </StyledTableCell>
@@ -176,18 +214,30 @@
                })}
                <StyledTableCell>
                    <Tooltip title="Edit">
                        <IconButton onClick={() => onEdit(row)}>
                        <IconButton
                            onClick={() => onEdit(row)}
                            sx={{
                                opacity: depth > 0 ? opacity : 1,
                            }}
                            size="small"
                        >
                            <Edit />
                        </IconButton>
                    </Tooltip>
                    <Tooltip title="Delete">
                        <IconButton onClick={() => onDelete(row)}>
                        <IconButton
                            onClick={() => onDelete(row)}
                            sx={{
                                opacity: depth > 0 ? opacity : 1,
                            }}
                            size="small"
                        >
                            <Delete />
                        </IconButton>
                    </Tooltip>
                </StyledTableCell>
            </StyledTableRow>
            {row.children && isOpen && (
            {row.children && row.children.length > 0 && isOpen && (
                row.children.map((child) => (
                    <TreeTableRow
                        key={child.id}
rsf-admin/src/page/system/role/AssignPermissions.jsx
@@ -12,15 +12,17 @@
const DEFAULT_EXPAND_ALL = true;
const AssignPermissions = (props) => {
    const { role, originMenuIds, setDrawerVal, closeCallback } = props;
    const { role, originMenuIds, setDrawerVal, closeCallback, authType } = props;
    const translate = useTranslate();
    const notify = useNotify();
    console.log("authType"+authType)
    const [loading, setLoading] = useState(false);
    const [treeData, setTreeData] = useState([]);
    const [selectedItems, setSelectedItems] = useState([]);
    const [expandedItems, setExpandedItems] = useState([]);
    const [parmas, setParmas] = useState({ condition: '' });
    const [parmas, setParmas] = useState({ condition: '', authType: authType });
    const toggledItemRef = useRef({});
    const apiRef = useTreeViewApiRef();
rsf-admin/src/page/system/role/RoleList.jsx
@@ -55,7 +55,7 @@
    '& .column-name': {
    },
    '& .opt': {
        width: 260
        width: 450
    },
}));
@@ -63,7 +63,6 @@
    <SearchInput source="condition" alwaysOn />,
    <TextInput source="name" label="table.field.role.name" />,
    <TextInput source="code" label="table.field.role.code" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
@@ -83,6 +82,8 @@
    const [drawerVal, setDrawerVal] = useState(false);
    const [menuIds, setMenuIds] = useState([]);
    const [authType,setAuthType] = useState(0)
    const assign = (record) => {
        request('/role/scope/list', {
@@ -146,7 +147,9 @@
                    <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} />
                        <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} auType={0} setAuthType={setAuthType} label="网页权限&nbsp;&nbsp;&nbsp;" />
                        <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} auType={1} setAuthType={setAuthType} label="PDA权限&nbsp;&nbsp;&nbsp;" />
                        <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} auType={2} setAuthType={setAuthType} label="仓库权限&nbsp;" />
                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                    </WrapperField>
@@ -171,6 +174,7 @@
                    closeCallback={() => {
                        setMenuIds([]);
                    }}
                    authType = {authType}
                />
            </PageDrawer>
        </Box>
@@ -179,14 +183,15 @@
const ScopeButton = (props) => {
    const record = useRecordContext();
    const { assign, ...rest } = props;
    const { assign, auType, setAuthType, label, ...rest } = props;
    return (
        <Button
            variant="text"
            color="primary"
            startIcon={<AssignmentIndIcon />}
            label="common.action.scope"
            label={label}
            onClick={(event) => {
                setAuthType(auType);
                event.stopPropagation();
                assign(record);
            }}
rsf-admin/src/themes/ThemeSwapper.jsx
@@ -41,7 +41,7 @@
                </IconButton>
            </Tooltip>
            {currentTheme?.dark ? <ToggleThemeButton /> : null}
            <Menu open={open} onClose={handleClose} anchorEl={anchorEl}>
            {/* <Menu open={open} onClose={handleClose} anchorEl={anchorEl}>
                {themes.map((theme, index) => (
                    <MenuItem
                        onClick={event => handleChange(event, index)}
@@ -52,7 +52,7 @@
                        {ucFirst(theme.name)}
                    </MenuItem>
                ))}
            </Menu>
            </Menu> */}
        </>
    );
};
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java
New file
@@ -0,0 +1,96 @@
package com.vincent.rsf.server.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.entity.Task;
import com.vincent.rsf.server.manager.entity.TaskItem;
import com.vincent.rsf.server.manager.entity.WkOrder;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.service.OutStockService;
import com.vincent.rsf.server.manager.service.TaskService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
@RestController
@Api(tags = "备料单")
public class MatPreparationController extends BaseController {
    Logger logger = LoggerFactory.getLogger(OutStockController.class);
    @Resource
    private TaskService taskService;
    @PostMapping("/preparation/page")
    public R page(@RequestBody Map<String, Object> map) {
//        JSONObject jsonObject = new JSONObject(map);
//        jsonObject.put("orderCode", "BL25090927787678");
//        jsonObject.put("orderStatus", 1);
//        jsonObject.put("orderTime", new Date());
//        jsonObject.put("anfme", 100);
//        List<JSONObject> list = new ArrayList<>();
//        list.add(jsonObject);
//
//        return R.ok().add(list);
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<Task, BaseParam> pageParam = new PageParam<>(baseParam, Task.class);
        QueryWrapper<Task> queryWrapper = pageParam.buildWrapper(true);
        return R.ok().add(taskService.page(pageParam, queryWrapper));
    }
//    @PreAuthorize("hasAuthority('manager:outStock:list')")
    @PostMapping("/preparation/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(taskService.list());
    }
//    @PreAuthorize("hasAuthority('manager:taskItem:list')")
    @PostMapping("/preparationItem/page")
    public R itemPage(@RequestBody Map<String, Object> map) {
//        BaseParam baseParam = buildParam(map, BaseParam.class);
//        PageParam<TaskItem, BaseParam> pageParam = new PageParam<>(baseParam, TaskItem.class);
//        /**拼接扩展字段*/
//        PageParam<TaskItem, BaseParam> page = taskItemService.page(pageParam, pageParam.buildWrapper(true));
//        List<TaskItem> records = page.getRecords();
//        for (TaskItem record : records) {
//            if (!Objects.isNull(record.getFieldsIndex())) {
//                Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex());
//                record.setExtendFields(fields);
//            }
//        }
//        page.setRecords(records);
        JSONObject jsonObject = new JSONObject(map);
        jsonObject.put("matnrCode", "BL25090927787678");
        jsonObject.put("maktx", "拉杆");
        jsonObject.put("unit", "个");
        jsonObject.put("spec", "铝合金 银色");
        jsonObject.put("model", "大");
        jsonObject.put("anfme", 100);
        jsonObject.put("workQty", 60);
        jsonObject.put("status", 11);
        List<JSONObject> list = new ArrayList<>();
        list.add(jsonObject);
        return R.ok().add(list);
    }
}