verou
2025-03-19 f9a1b57d35529f8b8162e6dc7956d7b78375edd4
fix:货位可多选
12个文件已修改
7个文件已添加
674 ■■■■■ 已修改文件
rsf-admin/src/i18n/en.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/ResourceContent.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/companys/CompanysList.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocCreate.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocEdit.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocList.jsx 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locType/LocTypeCreate.jsx 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locType/LocTypeEdit.jsx 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locType/LocTypePanel.jsx 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locType/index.jsx 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/DictField.jsx 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/DynamicField.jsx 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ImportModal.jsx 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/TreeSelectInput.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -107,7 +107,6 @@
    },
    menu: {
        dashboard: 'Dashboard',
        basicInfo: 'BasicInfo',
        settings: 'Settings',
        basicInfo: 'BasicInfo',
        system: 'System',
@@ -128,6 +127,7 @@
        warehouse: 'Warehouse',
        warehouseAreas: 'WarehouseAreas',
        loc: 'Loc',
        locType: 'LocType',
        container: 'Container',
        contract: 'Contract',
        qlyInspect: 'QlyInspect',
@@ -355,6 +355,11 @@
                locAttrs: "LocAttrs",
                useStatus: 'useStatus'
            },
            locType: {
                uuid: "uuid",
                name: "name",
                regex: "regex",
            },
            container: {
                code: "Code",
                name: "Name",
rsf-admin/src/i18n/zh.js
@@ -127,6 +127,7 @@
        warehouse: '仓库信息',
        warehouseAreas: '仓库库区',
        loc: '基础库位',
        locType: '库位类型',
        container: '容器管理',
        contract: '合同信息',
        qlyInspect: '质检信息',
@@ -354,7 +355,10 @@
                startRow: "起始排",
                useStatus: '库位状态'
            },
            locType: {
                name: "库位类型",
                regex: "规则表达式",
            },
            container: {
                code: "编码",
                name: "名称",
rsf-admin/src/page/ResourceContent.js
@@ -25,6 +25,7 @@
import dictType from './system/dicts/dictType';
import dictData from './system/dicts/dictData';
import companys from './basicInfo/companys';
import locType from './basicInfo/locType';
import serialRuleItem from './system/serialRuleItem';
import serialRule from './system/serialRule';
import whMat from './basicInfo/whMat';
@@ -100,6 +101,8 @@
            return fields;
        case 'fieldsItem':
            return fieldsItem;
        case 'locType':
            return locType;
        default:
            return {
                list: ListGuesser,
rsf-admin/src/page/basicInfo/companys/CompanysList.jsx
@@ -40,7 +40,7 @@
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
import PageDrawer from "../../components/PageDrawer";
import MyField from "../../components/MyField";
import DictField from "../../components/DictField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
@@ -130,7 +130,7 @@
                    <TextField source="name" label="table.field.companys.name" />
                    <TextField source="nameEn" label="table.field.companys.nameEn" />
                    <TextField source="breifCode" label="table.field.companys.breifCode" />
                    <TextField source="type" label="table.field.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/loc/LocCreate.jsx
@@ -16,6 +16,7 @@
    useDataProvider,
    useNotify,
    Form,
    SelectArrayInput,
    useCreateController,
} from 'react-admin';
import {
@@ -133,7 +134,7 @@
                                            validate={[required()]}
                                        />
                                    </ReferenceInput> */}
                                    <AutocompleteInput
                                    {/* <AutocompleteInput
                                        choices={dicts}
                                        source="type"
                                        optionText="label"
@@ -141,7 +142,10 @@
                                        optionValue="value"
                                        parse={v => v}
                                        validate={[required()]}
                                    />
                                    /> */}
                                    <ReferenceArrayInput source="typeIds" reference="locType" >
                                        <SelectArrayInput label="table.field.loc.type" />
                                    </ReferenceArrayInput>
                                </Grid>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
rsf-admin/src/page/basicInfo/loc/LocEdit.jsx
@@ -10,6 +10,7 @@
    DateInput,
    SelectInput,
    ReferenceInput,
    SelectArrayInput,
    ReferenceArrayInput,
    AutocompleteInput,
    SaveButton,
@@ -99,7 +100,7 @@
                                />
                            </Grid>
                            <Grid item xs={6} display="flex" gap={1}>
                                <AutocompleteInput
                                {/* <AutocompleteInput
                                    choices={dicts}
                                    source="type"
                                    optionText="label"
@@ -107,7 +108,10 @@
                                    optionValue="value"
                                    parse={v => v}
                                    validate={[required()]}
                                />
                                /> */}
                                <ReferenceArrayInput source="typeIds" reference="locType" >
                                    <SelectArrayInput label="table.field.loc.type" />
                                </ReferenceArrayInput>
                            </Grid>
                            <Grid item xs={6} display="flex" gap={1}>
                                <TextInput
rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -32,13 +32,15 @@
    AutocompleteInput,
    DeleteButton,
    useRefresh,
    Button
    Button,
    useList
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import LocCreate from "./LocCreate";
import LocPanel from "./LocPanel";
import EmptyData from "../../components/EmptyData";
import DynamicField from "../../components/DynamicField";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
import InitButton from './InitButton';
@@ -50,6 +52,7 @@
import DashboardIcon from '@mui/icons-material/Dashboard';
import EditIcon from '@mui/icons-material/Edit';
import request from '@/utils/request';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -105,7 +108,10 @@
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const dynamicFields = [
        { type: 'text', source: 'code', label: '测试1' },
        { type: 'text', source: 'type$', label: '测试2' },
    ];
    return (
        <Box display="flex">
            <List
@@ -176,11 +182,15 @@
                    <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} />
                    {/* <DynamicField fields={dynamicFields} /> */}
                    <WrapperField cellClassName="opt" label="common.field.opt">
                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                        {/* <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> */}
                        <EnableButton />
                    </WrapperField>
                </StyledDatagrid>
            </List>
            <LocCreate
rsf-admin/src/page/basicInfo/locType/LocTypeCreate.jsx
New file
@@ -0,0 +1,132 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    CreateBase,
    useTranslate,
    TextInput,
    NumberInput,
    BooleanInput,
    DateInput,
    SaveButton,
    SelectInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    Toolbar,
    required,
    useDataProvider,
    useNotify,
    Form,
    useCreateController,
} from 'react-admin';
import {
    Dialog,
    DialogActions,
    DialogContent,
    DialogTitle,
    Stack,
    Grid,
    Box,
} from '@mui/material';
import DialogCloseButton from "../../components/DialogCloseButton";
import StatusSelectInput from "../../components/StatusSelectInput";
import MemoInput from "../../components/MemoInput";
const LocTypeCreate = (props) => {
    const { open, setOpen } = props;
    const translate = useTranslate();
    const notify = useNotify();
    const handleClose = (event, reason) => {
        if (reason !== "backdropClick") {
            setOpen(false);
        }
    };
    const handleSuccess = async (data) => {
        setOpen(false);
        notify('common.response.success');
    };
    const handleError = async (error) => {
        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
    };
    return (
        <>
            <CreateBase
                record={{}}
                transform={(data) => {
                    return data;
                }}
                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
            >
                <Dialog
                    open={open}
                    onClose={handleClose}
                    aria-labelledby="form-dialog-title"
                    fullWidth
                    disableRestoreFocus
                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
                >
                    <Form>
                        <DialogTitle id="form-dialog-title" sx={{
                            position: 'sticky',
                            top: 0,
                            backgroundColor: 'background.paper',
                            zIndex: 1000
                        }}
                        >
                            {translate('create.title')}
                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
                                <DialogCloseButton onClose={handleClose} />
                            </Box>
                        </DialogTitle>
                        <DialogContent sx={{ mt: 2 }}>
                            <Grid container rowSpacing={2} columnSpacing={2}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.locType.uuid"
                                        source="uuid"
                                        parse={v => v}
                                        autoFocus
                                    />
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.locType.name"
                                        source="name"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.locType.regex"
                                        source="regex"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <StatusSelectInput />
                                </Grid>
                                <Grid item xs={12} display="flex" gap={1}>
                                    <Stack direction="column" spacing={1} width={'100%'}>
                                        <MemoInput />
                                    </Stack>
                                </Grid>
                            </Grid>
                        </DialogContent>
                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
                                <SaveButton />
                            </Toolbar>
                        </DialogActions>
                    </Form>
                </Dialog>
            </CreateBase>
        </>
    )
}
export default LocTypeCreate;
rsf-admin/src/page/basicInfo/locType/LocTypeEdit.jsx
New file
@@ -0,0 +1,104 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    Edit,
    SimpleForm,
    FormDataConsumer,
    useTranslate,
    TextInput,
    NumberInput,
    BooleanInput,
    DateInput,
    SelectInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    SaveButton,
    Toolbar,
    Labeled,
    NumberField,
    required,
    useRecordContext,
    DeleteButton,
} from 'react-admin';
import { useWatch, useFormContext } from "react-hook-form";
import { Stack, Grid, Box, Typography } from '@mui/material';
import * as Common from '@/utils/common';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
import EditBaseAside from "../../components/EditBaseAside";
import CustomerTopToolBar from "../../components/EditTopToolBar";
import MemoInput from "../../components/MemoInput";
import StatusSelectInput from "../../components/StatusSelectInput";
const FormToolbar = () => {
    const { getValues } = useFormContext();
    return (
        <Toolbar sx={{ justifyContent: 'space-between' }}>
            <SaveButton />
            <DeleteButton mutationMode="optimistic" />
        </Toolbar>
    )
}
const LocTypeEdit = () => {
    const translate = useTranslate();
    return (
        <Edit
            redirect="list"
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
        >
            <SimpleForm
                shouldUnregister
                warnWhenUnsavedChanges
                toolbar={<FormToolbar />}
                mode="onTouched"
                defaultValues={{}}
            // validate={(values) => { }}
            >
                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
                    <Grid item xs={12} md={8}>
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.main')}
                        </Typography>
                        {/* <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.locType.uuid"
                                source="uuid"
                                parse={v => v}
                                autoFocus
                            />
                        </Stack> */}
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.locType.name"
                                source="name"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.locType.regex"
                                source="regex"
                                parse={v => v}
                            />
                        </Stack>
                    </Grid>
                    <Grid item xs={12} md={4}>
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.common')}
                        </Typography>
                        <StatusSelectInput />
                        <Box mt="2em" />
                        <MemoInput />
                    </Grid>
                </Grid>
            </SimpleForm>
        </Edit >
    )
}
export default LocTypeEdit;
rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx
New file
@@ -0,0 +1,153 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    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,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import LocTypeCreate from "./LocTypeCreate";
import LocTypePanel from "./LocTypePanel";
import EmptyData from "../../components/EmptyData";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
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 filters = [
    <SearchInput source="condition" alwaysOn />,
    <TextInput source="uuid" label="table.field.locType.uuid" />,
    <TextInput source="name" label="table.field.locType.name" />,
    <TextInput source="regex" label="table.field.locType.regex" />,
    <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 LocTypeList = () => {
    const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    return (
        <Box display="flex">
            <List
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.locType"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='locType' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='locType'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <LocTypePanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    {/* <TextField source="uuid" label="table.field.locType.uuid" /> */}
                    <TextField source="name" label="table.field.locType.name" />
                    <TextField source="regex" label="table.field.locType.regex" />
                    <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} />
                    <WrapperField cellClassName="opt" label="common.field.opt">
                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                    </WrapperField>
                </StyledDatagrid>
            </List>
            <LocTypeCreate
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <PageDrawer
                title='LocType Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
export default LocTypeList;
rsf-admin/src/page/basicInfo/locType/LocTypePanel.jsx
New file
@@ -0,0 +1,69 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
import {
    useTranslate,
    useRecordContext,
} from 'react-admin';
import PanelTypography from "../../components/PanelTypography";
import * as Common from '@/utils/common'
const LocTypePanel = () => {
    const record = useRecordContext();
    if (!record) return null;
    const translate = useTranslate();
    return (
        <>
            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
                <CardContent>
                    <Grid container spacing={2}>
                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
                            <Typography variant="h6" gutterBottom align="left" sx={{
                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
                                whiteSpace: 'nowrap',
                                overflow: 'hidden',
                                textOverflow: 'ellipsis',
                            }}>
                                {Common.camelToPascalWithSpaces(translate('table.field.locType.name'))}: {record.name}
                            </Typography>
                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
                            <Typography variant="h6" gutterBottom align="right" >
                                ID: {record.id}
                            </Typography>
                        </Grid>
                    </Grid>
                    <Grid container spacing={2}>
                        <Grid item xs={12} container alignContent="flex-end">
                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
                            </Typography>
                        </Grid>
                    </Grid>
                    <Box height={20}>&nbsp;</Box>
                    <Grid container spacing={2}>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.locType.uuid"
                                property={record.uuid}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.locType.name"
                                property={record.name}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.locType.regex"
                                property={record.regex}
                            />
                        </Grid>
                    </Grid>
                </CardContent>
            </Card >
        </>
    );
};
export default LocTypePanel;
rsf-admin/src/page/basicInfo/locType/index.jsx
New file
@@ -0,0 +1,18 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    ListGuesser,
    EditGuesser,
    ShowGuesser,
} from "react-admin";
import LocTypeList from "./LocTypeList";
import LocTypeEdit from "./LocTypeEdit";
export default {
    list: LocTypeList,
    edit: LocTypeEdit,
    show: ShowGuesser,
    recordRepresentation: (record) => {
        return `${record.name}`
    }
};
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -33,7 +33,7 @@
import DialogCloseButton from "@/page/components/DialogCloseButton";
import StatusSelectInput from "@/page/components/StatusSelectInput";
import MemoInput from "@/page/components/MemoInput";
import { tr } from "date-fns/locale";
import TreeSelectInput from "@/page/components/TreeSelectInput";
function CustomTabPanel(props) {
    const { children, value, index, ...other } = props;
@@ -154,10 +154,7 @@
                                        />
                                    </Grid>
                                    <Grid item xs={6} display="flex" gap={1}>
                                        <ReferenceInput
                                            source="shipperId"
                                            reference="shipper"
                                        >
                                        <ReferenceInput source="shipperId" reference="companys" filter={{ type: 'shipper' }}>
                                            <AutocompleteInput
                                                label="table.field.matnr.shipperId"
                                                optionText="name"
@@ -167,17 +164,11 @@
                                        </ReferenceInput>
                                    </Grid>
                                    <Grid item xs={6} display="flex" gap={1}>
                                        <ReferenceInput
                                        <TreeSelectInput
                                            label="table.field.matnr.groupId"
                                            resource={'matnrGroup'}
                                            source="groupId"
                                            reference="matnrGroup"
                                        >
                                            <AutocompleteInput
                                                label="table.field.matnr.groupId"
                                                optionText="name"
                                                validate={[required()]}
                                                filterToQuery={(val) => ({ name: val })}
                                            />
                                        </ReferenceInput>
                                        />
                                    </Grid>
                                    <Grid item xs={6} display="flex" gap={1}>
                                        <TextInput
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -29,6 +29,7 @@
import CustomerTopToolBar from "@/page/components/EditTopToolBar";
import MemoInput from "@/page/components/MemoInput";
import StatusSelectInput from "@/page/components/StatusSelectInput";
import TreeSelectInput from "@/page/components/TreeSelectInput";
const FormToolbar = () => {
    const { getValues } = useFormContext();
@@ -122,11 +123,7 @@
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <ReferenceInput
                                        source="shipperId"
                                        reference="shipper"
                                        perPage={REFERENCE_INPUT_PAGESIZE}
                                    >
                                    <ReferenceInput source="shipperId" reference="companys" filter={{ type: 'shipper' }}>
                                        <AutocompleteInput
                                            validate={[required()]}
                                            label="table.field.matnr.shipperId"
@@ -136,20 +133,26 @@
                                    </ReferenceInput>
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <ReferenceInput
                                    {/* <ReferenceInput
                                        source="groupId"
                                        reference="matnrGroup"
                                        perPage={REFERENCE_INPUT_PAGESIZE}
                                    >
                                        <AutocompleteInput
                                            label="table.field.matnr.groupId"
                                            optionText="code"
                                            optionText="label"
                                            validate={[required()]}
                                            filterToQuery={(val) => ({ code: val })}
                                        />
                                    </ReferenceInput>
                                    </ReferenceInput> */}
                                    <TreeSelectInput
                                        label="table.field.matnr.groupId"
                                        resource={'matnrGroup'}
                                        source="groupId"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <ReferenceInput
                                        source="rglarId"
                                        reference="batchRegular"
@@ -161,7 +164,7 @@
                                            filterToQuery={(val) => ({ code: val })}
                                        />
                                    </ReferenceInput>
                                </Grid>
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.matnr.platCode"
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -177,15 +177,16 @@
                <TooltipField source="name" label="table.field.matnr.name" cellClassName="name" />
                <TextField source="code" label="table.field.matnr.code" />
                <ReferenceField source="shipperId" label="table.field.matnr.shipperId" reference="shipper" link={false} sortable={false}>
                <TextField source="shipperId$" label="table.field.matnr.shipperId" />
                {/* <ReferenceField source="shipperId" label="table.field.matnr.shipperId" reference="shipper" link={false} sortable={false}>
                    <TextField source="name" />
                </ReferenceField>
                </ReferenceField> */}
                <ReferenceField source="groupId" label="table.field.matnr.groupId" reference="matnrGroup" link={false} sortable={false}>
                    <TextField source="name" />
                </ReferenceField>
                <ReferenceField source="rglarId" label="table.field.matnr.rglarId" reference="batchRegular" link={false} sortable={false}>
                {/* <ReferenceField source="rglarId" label="table.field.matnr.rglarId" reference="batchRegular" link={false} sortable={false}>
                    <TextField source="code" />
                </ReferenceField>
                </ReferenceField> */}
                <TextField source="platCode" label="table.field.matnr.platCode" />
                <TextField source="spec" label="table.field.matnr.spec" />
                <TextField source="model" label="table.field.matnr.model" />
rsf-admin/src/page/components/DictField.jsx
New file
@@ -0,0 +1,24 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import {
    useRecordContext,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { useTheme } from '@mui/material/styles';
const DictField = ({ source }) => {
    const record = useRecordContext();
    const theme = useTheme();
    const value = JSON.parse(localStorage.getItem('sys_dicts'))?.find(dict => (dict.value == record[source])).label;
    return record ? (
        <Typography
            variant="body2"
        >
            {value}
        </Typography >
    ) : null;
}
export default DictField;
rsf-admin/src/page/components/DynamicField.jsx
New file
@@ -0,0 +1,44 @@
import React, { Fragment } from 'react';
import {
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField
} from 'react-admin';
const DynamicField = ({ fields }) => {
    return (
        <>
            {fields.map((field, index) => {
                switch (field.type) {
                    case 'text':
                        return <TextField key={index} source={field.source} label={field.label} />;
                    case 'number':
                        return <NumberField key={index} source={field.source} label={field.label} />;
                    case 'date':
                        return <DateField key={index} source={field.source} label={field.label} showTime={field.showTime} />;
                    case 'boolean':
                        return <BooleanField key={index} source={field.source} label={field.label} />;
                    case 'reference':
                        return (
                            <ReferenceField
                                key={index}
                                source={field.source}
                                label={field.label}
                                reference={field.reference}
                                link={field.link}
                                sortable={field.sortable}
                            >
                                <TextField source={field.referenceSource} />
                            </ReferenceField>
                        );
                    default:
                        return null;
                }
            })}
        </>
    );
};
export default DynamicField;
rsf-admin/src/page/components/ImportModal.jsx
@@ -79,6 +79,19 @@
        reset();
    };
    const downloadTemplate = async (type) => {
        const res = await request.post(`/${value}/template/download`, {})
        const url = window.URL.createObjectURL(
            new Blob([res.data], { type: res.headers["content-type"] }),
        );
        const link = document.createElement("a");
        link.href = url;
        link.setAttribute("download", `${value}.xlsx`);
        document.body.appendChild(link);
        link.click();
        link.remove();
    }
    return (
        <Dialog open={open} maxWidth="md" fullWidth>
            <DialogCloseButton onClose={handleClose} />
@@ -230,14 +243,7 @@
    );
}
{/**下载打印模板,传入type类型,调用下载模板接口 */ }
const downloadTemplate = (type) => {
    // 下载物料模板
    if (type != undefined && type == 'matnr') {
    }
    console.log('======>');
    console.log(type);
}
function millisecondsToTime(ms) {
    var seconds = Math.floor((ms / 1000) % 60);
rsf-admin/src/page/components/TreeSelectInput.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { useCreateContext, useTranslate } from 'react-admin'
import { useCreateContext, useTranslate, useRecordContext } from 'react-admin'
import { MenuItem, Select, FormControl, InputLabel, Typography } from '@mui/material';
import request from '@/utils/request';
import * as Common from '@/utils/common';
@@ -13,6 +13,9 @@
    const [proxyVal, setProxyVal] = React.useState('');
    const record = useRecordContext()
    const val = value || record[source];
    useEffect(() => {
        const http = async (resource) => {
            const res = await request.post(resource + '/tree', {
@@ -20,7 +23,7 @@
            });
            if (res?.data?.code === 200) {
                setTreeData(Common.flattenTree(res.data.data));
                setProxyVal(value);
                setProxyVal(val);
            } else {
                notify(res.data.msg);
            }