skyouc
2025-03-26 d222393e6c4c11fd0b3ef4284a2b2f09b9cd49da
Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
2个文件已修改
1个文件已添加
166 ■■■■■ 已修改文件
rsf-admin/src/page/basicInfo/loc/LocList.jsx 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocListAside.jsx 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -55,6 +55,8 @@
import request from '@/utils/request';
import DiscountIcon from '@mui/icons-material/Discount';
import LinkIcon from '@mui/icons-material/Link';
import InitModal from "./InitModal";
import LocListAside from "./LocListAside";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -139,7 +141,7 @@
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const [initDialog, setInitDialog] = useState(false);
    return (
        <Box display="flex">
@@ -153,7 +155,33 @@
                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.loc"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                empty={<EmptyData
                    children={
                        <Box sx={{ gap: 2, display: 'flex' }}>
                            <Button
                                variant="contained"
                                color="primary"
                                sx={{
                                    fontSize: '1em',
                                    mt: 2
                                }}
                                onClick={() => { setCreateDialog(true) }}>
                                {translate('create.empty.button')}
                            </Button>
                            <Button
                                variant="contained"
                                color="primary"
                                sx={{
                                    fontSize: '1em',
                                    mt: 2
                                }}
                                onClick={() => { setInitDialog(true) }}>
                                {translate('toolbar.locInit')}
                            </Button>
                        </Box>
                    }
                    onClick={() => { }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
@@ -166,6 +194,7 @@
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
                aside={<LocListAside />}
            >
                <StyledDatagrid
                    preferenceKey='loc'
@@ -232,6 +261,11 @@
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
            <InitModal
                open={initDialog}
                setOpen={setInitDialog}
            />
        </Box>
    )
}
@@ -272,6 +306,7 @@
    const [createDialog, setCreateDialog] = useState(false);
    return (
        <>
            <Button onClick={() => setCreateDialog(true)} label={"toolbar.batch"}>
rsf-admin/src/page/basicInfo/loc/LocListAside.jsx
New file
@@ -0,0 +1,125 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import request from '@/utils/request';
import {
    SavedQueriesList,
    FilterLiveSearch,
    useNotify,
    useListContext,
    SearchInput
} from 'react-admin';
import BookmarkIcon from '@mui/icons-material/BookmarkBorder';
import { Box, Typography, Card, CardContent, useTheme, Input } from '@mui/material';
import { RichTreeView } from "@mui/x-tree-view/RichTreeView";
import { TreeItem2 } from "@mui/x-tree-view/TreeItem2";
import { useTreeViewApiRef } from '@mui/x-tree-view/hooks';
const LocListAside = () => {
    const theme = useTheme();
    const notify = useNotify();
    const { setFilters } = useListContext(); // 获取列表上下文
    const [selectedOption, setSelectedOption] = useState(null);
    const [treeData, setTreeData] = useState([]);
    const [defaultIds, setDefaultIds] = useState(['65']);
    const [condition, setCondition] = useState('');
    const haveChildren = (item) => {
        if (Array.isArray(item)) {
            return item.map((k) => haveChildren(k));
        }
        if (item && typeof item === 'object') {
            if (item.id !== undefined) {
                item.id = item.id.toString();
            }
            if (item.children && Array.isArray(item.children)) {
                item.children = haveChildren(item.children);
            }
        }
        return item;
    };
    useEffect(() => {
        http()
    }, [condition]);
    const http = () => {
        request.post('/matnrGroup/tree', { condition })
            .then(res => {
                if (res?.data?.code === 200) {
                    let data = res.data.data;
                    let items = haveChildren(data)
                    setTreeData(items)
                    setDefaultIds([items.at(0).id])
                } else {
                    notify(res.data.msg);
                }
            })
            .catch(error => {
                notify('Error fetching tree data');
            });
    }
    const handleNodeSelect = (event, nodeId) => {
        console.log(nodeId);
        // setFilters({ groupId: nodeId });
    };
    const handleSearch = (e) => {
        setCondition(e.target.value)
    };
    const apiRef = useTreeViewApiRef();
    const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) {
        return <input type="checkbox" ref={ref} {...props} />;
    });
    const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) {
        return (
            <TreeItem2
                {...props}
                ref={ref}
                slots={{
                    checkbox: CustomCheckbox,
                }}
            />
        );
    });
    return (
        <Card
            sx={{
                order: -1,
                mr: 2,
                mt: 8,
                alignSelf: 'flex-start',
                border: theme.palette.mode === 'light' && '1px solid #e0e0e3',
                width: 250,
                minWidth: 150,
                height: `100%`,
            }}
        >
            <CardContent>
                {/* <Input
                    placeholder="搜索库位"
                    sx={{ '--Input-focused': 1, marginBottom: '10px' }}
                    onChange={handleSearch}
                /> */}
                <RichTreeView
                    defaultExpandedItems={defaultIds}
                    expansionTrigger="iconContainer"
                    items={treeData}
                    slots={CustomTreeItem}
                    apiRef={apiRef}
                    onItemClick={handleNodeSelect} // 监听节点点击事件
                />
            </CardContent>
        </Card>
    )
}
export default LocListAside;
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -196,7 +196,7 @@
                    <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" />,
                    <NumberField key="flagCheck" source="flagCheck" label="table.field.matnr.flagCheck" />,
                    <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>,