From 7a671b62b0a1388c9933a0d9bd698a6eb8b048ed Mon Sep 17 00:00:00 2001
From: whycq <913841844@qq.com>
Date: 星期一, 24 二月 2025 14:45:54 +0800
Subject: [PATCH] #

---
 rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx      |   46 ++
 rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx |    3 
 rsf-admin/src/i18n/zh.js                                   |   15 
 rsf-admin/src/i18n/en.js                                   |   14 
 rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx         |  465 +++++++++++++++-----------
 rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx           |  464 +++++++++++++++-----------
 6 files changed, 603 insertions(+), 404 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 0d2fe64..634a934 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -417,6 +417,20 @@
                 },
             },
         },
+        matnr: {
+            title: {
+                basic: 'basic info',
+                control: 'control',
+                batchRole: 'batch role',
+            }
+        },
+        
+    },
+    form: {
+        matnr: {
+            shipper: 'shipper is required',
+            groupId: 'groupId is required',
+        }
     }
 };
 
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index de93393..afff7b2 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -1,3 +1,4 @@
+import { s } from "motion/react-client";
 import chineseMessages from "./core/chineseMessages";
 
 const customChineseMessages = {
@@ -429,6 +430,20 @@
                 },
             },
         },
+        matnr: {
+            title: {
+                basic: '鍩虹灞炴��',
+                control: '鎺у埗灞炴��',
+                batchRole: '鎵规瑙勫垯',
+            }
+        }
+    },
+    form: {
+        matnr: {
+            name: '鐗╂枡鍚嶇О涓嶈兘涓虹┖',
+            shipper: '璐т富涓嶈兘涓虹┖',
+            groupId: '鍒嗙粍涓嶈兘涓虹┖',
+        }
     }
 };
 
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
index 7d92209..6e5f23e 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -26,16 +26,53 @@
     Stack,
     Grid,
     Box,
+    Tabs,
+    Tab,
 } from '@mui/material';
+import PropTypes from 'prop-types';
 import DialogCloseButton from "@/page/components/DialogCloseButton";
 import StatusSelectInput from "@/page/components/StatusSelectInput";
 import MemoInput from "@/page/components/MemoInput";
+import { tr } from "date-fns/locale";
 
+function CustomTabPanel(props) {
+    const { children, value, index, ...other } = props;
+
+    return (
+        <div
+            role="tabpanel"
+            hidden={value !== index}
+            id={`simple-tabpanel-${index}`}
+            aria-labelledby={`simple-tab-${index}`}
+            {...other}
+        >
+            {value === index && <Box sx={{ p: 3 }}>{children}</Box>}
+        </div>
+    );
+}
+
+CustomTabPanel.propTypes = {
+    children: PropTypes.node,
+    index: PropTypes.number.isRequired,
+    value: PropTypes.number.isRequired,
+};
+
+function a11yProps(index) {
+    return {
+        id: `simple-tab-${index}`,
+        'aria-controls': `simple-tabpanel-${index}`,
+    };
+}
 const MatnrCreate = (props) => {
     const { open, setOpen } = props;
 
     const translate = useTranslate();
     const notify = useNotify();
+    const [value, setValue] = React.useState(0);
+
+    const handleChange = (event, newValue) => {
+        setValue(newValue);
+    };
 
     const handleClose = (event, reason) => {
         if (reason !== "backdropClick") {
@@ -50,6 +87,19 @@
 
     const handleError = async (error) => {
         notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+    const validateForm = (values) => {
+        const errors = {};
+        if (!values.shipperId) {
+            errors.shipperId = translate('form.matnr.shipper');
+        }
+        if (!values.groupId) {
+            errors.groupId = translate('form.matnr.groupId');
+        }
+        if (!values.name) {
+            errors.name = translate('form.matnr.name');
+        }
+        return errors;
     };
 
     return (
@@ -69,7 +119,7 @@
                     disableRestoreFocus
                     maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
                 >
-                    <Form>
+                    <Form validate={validateForm}>
                         <DialogTitle id="form-dialog-title" sx={{
                             position: 'sticky',
                             top: 0,
@@ -83,206 +133,231 @@
                             </Box>
                         </DialogTitle>
                         <DialogContent sx={{ mt: 2 }}>
-                            <Grid container rowSpacing={2} columnSpacing={2}>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.name"
-                                        source="name"
-                                        parse={v => v}
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.code"
-                                        source="code"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <ReferenceInput
-                                        source="shipperId"
-                                        reference="shipper"
-                                    >
-                                        <AutocompleteInput
-                                            label="table.field.matnr.shipperId"
-                                            optionText="name"
-                                            filterToQuery={(val) => ({ name: val })}
+                            <Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
+                                <Tab label={translate('page.matnr.title.basic')} {...a11yProps(0)} />
+                                <Tab label={translate('page.matnr.title.control')} {...a11yProps(1)} />
+                                <Tab label={translate('page.matnr.title.batchRole')} {...a11yProps(2)} />
+                            </Tabs>
+                            <CustomTabPanel value={value} index={0}>
+                                <Grid container rowSpacing={2} columnSpacing={2}>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.name"
+                                            validate={[required()]}
+                                            source="name"
+                                            parse={v => v}
+                                            autoFocus
                                         />
-                                    </ReferenceInput>
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <ReferenceInput
-                                        source="groupId"
-                                        reference="matnrGroup"
-                                    >
-                                        <AutocompleteInput
-                                            label="table.field.matnr.groupId"
-                                            optionText="code"
-                                            filterToQuery={(val) => ({ code: val })}
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.code"
+                                            required
+                                            source="code"
+                                            parse={v => v}
                                         />
-                                    </ReferenceInput>
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <ReferenceInput
-                                        source="rglarId"
-                                        reference="rglarId"
-                                    >
-                                        <AutocompleteInput
-                                            label="table.field.matnr.rglarId"
-                                            optionText="code"
-                                            filterToQuery={(val) => ({ code: val })}
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <ReferenceInput
+                                            source="shipperId"
+                                            reference="shipper"
+                                        >
+                                            <AutocompleteInput
+                                                label="table.field.matnr.shipperId"
+                                                optionText="name"
+                                                validate={[required()]}
+                                                filterToQuery={(val) => ({ name: val })}
+                                            />
+                                        </ReferenceInput>
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <ReferenceInput
+                                            source="groupId"
+                                            reference="matnrGroup"
+                                        >
+                                            <AutocompleteInput
+                                                label="table.field.matnr.groupId"
+                                                optionText="code"
+                                                validate={[required()]}
+                                                filterToQuery={(val) => ({ code: val })}
+                                            />
+                                        </ReferenceInput>
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.erpCode"
+                                            source="erpCode"
+                                            required
+                                            parse={v => v}
                                         />
-                                    </ReferenceInput>
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.erpCode"
-                                        source="erpCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.spec"
-                                        source="spec"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.model"
-                                        source="model"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.weight"
-                                        source="weight"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.color"
-                                        source="color"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.size"
-                                        source="size"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.describle"
-                                        source="describle"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.nromNum"
-                                        source="nromNum"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.unit"
-                                        source="unit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.purUnit"
-                                        source="purchaseUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.matnr.stockUnit"
-                                        source="stockUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <SelectInput
-                                        label="table.field.matnr.stockLevel"
-                                        source="stockLevel"
-                                        choices={[
-                                            { id: 0, name: ' A' },
-                                            { id:   1, name: ' B' },
-                                            { id:   2, name: 'C' },
-                                        ]}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <SelectInput
-                                        label="table.field.matnr.isLabelMange"
-                                        source="isLabelMange"
-                                        choices={[
-                                            { id: 0, name: ' 鍚�' },
-                                            { id:  1, name: ' 鏄�' },
-                                        ]}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.safeQty"
-                                        source="safeQty"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.minQty"
-                                        source="minQty"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.maxQty"
-                                        source="maxQty"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.stagn"
-                                        source="stagn"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.valid"
-                                        source="valid"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.validWarn"
-                                        source="validWarn"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.matnr.flagCheck"
-                                        source="flagCheck"
-                                    />
-                                </Grid>
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.spec"
+                                            source="spec"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.model"
+                                            source="model"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.weight"
+                                            source="weight"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.color"
+                                            source="color"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.size"
+                                            source="size"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.describle"
+                                            source="describle"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.nromNum"
+                                            source="nromNum"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.unit"
+                                            source="unit"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.purUnit"
+                                            source="purchaseUnit"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <TextInput
+                                            label="table.field.matnr.stockUnit"
+                                            source="stockUnit"
+                                            parse={v => v}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <SelectInput
+                                            label="table.field.matnr.stockLevel"
+                                            source="stockLevel"
+                                            choices={[
+                                                { id: 0, name: ' A' },
+                                                { id: 1, name: ' B' },
+                                                { id: 2, name: 'C' },
+                                            ]}
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <SelectInput
+                                            label="table.field.matnr.isLabelMange"
+                                            source="isLabelMange"
+                                            choices={[
+                                                { id: 0, name: ' 鍚�' },
+                                                { id: 1, name: ' 鏄�' },
+                                            ]}
+                                        />
+                                    </Grid>
 
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <StatusSelectInput />
+
+                                    <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>
-                                <Grid item xs={12} display="flex" gap={1}>
-                                    <Stack direction="column" spacing={1} width={'100%'}>
-                                        <MemoInput />
-                                    </Stack>
+                            </CustomTabPanel>
+                            <CustomTabPanel value={value} index={1}>
+                                <Grid container rowSpacing={2} columnSpacing={2}>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.safeQty"
+                                            source="safeQty"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.minQty"
+                                            source="minQty"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.maxQty"
+                                            source="maxQty"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.stagn"
+                                            source="stagn"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.valid"
+                                            source="valid"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <NumberInput
+                                            label="table.field.matnr.validWarn"
+                                            source="validWarn"
+                                        />
+                                    </Grid>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <SelectInput
+                                            label="table.field.matnr.flagCheck"
+                                            source="flagCheck"
+                                            choices={[
+                                                { id: 0, name: ' 鍚�' },
+                                                { id: 1, name: ' 鏄�' },
+                                            ]}
+                                        />
+                                    </Grid>
                                 </Grid>
-                            </Grid>
+                            </CustomTabPanel>
+                            <CustomTabPanel value={value} index={2}>
+                                <Grid container rowSpacing={2} columnSpacing={2}>
+                                    <Grid item xs={6} display="flex" gap={1}>
+                                        <ReferenceInput
+                                            source="rglarId"
+                                            reference="rglarId"
+                                        >
+                                            <AutocompleteInput
+                                                label="table.field.matnr.rglarId"
+                                                optionText="code"
+                                                filterToQuery={(val) => ({ code: val })}
+                                            />
+                                        </ReferenceInput>
+                                    </Grid>
+                                </Grid>
+                            </CustomTabPanel>
                         </DialogContent>
                         <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
                             <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 49e84ab..d90d6ff 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -20,8 +20,9 @@
     useRecordContext,
     DeleteButton,
 } from 'react-admin';
+import PropTypes from 'prop-types';
 import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
+import { Stack, Grid, Box, Typography, Tabs, Tab, } from '@mui/material';
 import * as Common from '@/utils/common';
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
 import EditBaseAside from "@/page/components/EditBaseAside";
@@ -31,7 +32,6 @@
 
 const FormToolbar = () => {
     const { getValues } = useFormContext();
-
     return (
         <Toolbar sx={{ justifyContent: 'space-between' }}>
             <SaveButton />
@@ -40,9 +40,51 @@
     )
 }
 
+function CustomTabPanel(props) {
+    const { children, value, index, ...other } = props;
+
+    return (
+        <div
+            role="tabpanel"
+            hidden={value !== index}
+            id={`simple-tabpanel-${index}`}
+            aria-labelledby={`simple-tab-${index}`}
+            {...other}
+        >
+            {value === index && <Box sx={{ p: 3 }}>{children}</Box>}
+        </div>
+    );
+}
+
+CustomTabPanel.propTypes = {
+    children: PropTypes.node,
+    index: PropTypes.number.isRequired,
+    value: PropTypes.number.isRequired,
+};
+
+function a11yProps(index) {
+    return {
+        id: `simple-tab-${index}`,
+        'aria-controls': `simple-tabpanel-${index}`,
+    };
+}
+
 const MatnrEdit = () => {
     const translate = useTranslate();
-
+    const [value, setValue] = React.useState(0);
+    const handleChange = (event, newValue) => {
+        setValue(newValue);
+    };
+    const validateForm = (values) => {
+        const errors = {};
+        if (!values.shipperId) {
+            errors.shipperId = translate('form.matnr.shipper');
+        }
+        if (!values.groupId) {
+            errors.groupId = translate('form.matnr.groupId');
+        }
+        return errors;
+    };
     return (
         <Edit
             redirect="list"
@@ -56,210 +98,232 @@
                 toolbar={<FormToolbar />}
                 mode="onTouched"
                 defaultValues={{}}
+                validate={validateForm}
             // validate={(values) => { }}
             >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
+                <Grid container width={{ xs: '20%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+
+                    <Grid item xs={12} md={10}>
                         <Typography variant="h6" gutterBottom>
                             {translate('common.edit.title.main')}
                         </Typography>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.name"
-                                source="name"
-                                parse={v => v}
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.code"
-                                source="code"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <ReferenceInput
-                                source="shipperId"
-                                reference="shipper"
-                                perPage={REFERENCE_INPUT_PAGESIZE}
-                            >
-                                <AutocompleteInput
-                                    label="table.field.matnr.shipperId"
-                                    optionText="name"
-                                    filterToQuery={(val) => ({ name: val })}
-                                />
-                            </ReferenceInput>
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <ReferenceInput
-                                source="groupId"
-                                reference="matnrGroup"
-                                perPage={REFERENCE_INPUT_PAGESIZE}
-                            >
-                                <AutocompleteInput
-                                    label="table.field.matnr.groupId"
-                                    optionText="code"
-                                    filterToQuery={(val) => ({ code: val })}
-                                />
-                            </ReferenceInput>
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <ReferenceInput
-                                source="rglarId"
-                                reference="rglarId"
-                                perPage={REFERENCE_INPUT_PAGESIZE}
-                            >
-                                <AutocompleteInput
-                                    label="table.field.matnr.rglarId"
-                                    optionText="code"
-                                    filterToQuery={(val) => ({ code: val })}
-                                />
-                            </ReferenceInput>
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.erpCode"
-                                source="erpCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.spec"
-                                source="spec"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.model"
-                                source="model"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.weight"
-                                source="weight"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.color"
-                                source="color"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.size"
-                                source="size"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.describle"
-                                source="describle"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.nromNum"
-                                source="nromNum"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.unit"
-                                source="unit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.purUnit"
-                                source="purUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.matnr.stockUnit"
-                                source="stockUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <SelectInput
-                                label="table.field.matnr.stockLevel"
-                                source="stockLevel"
-                                choices={[
-                                    { id: 0, name: ' A' },
-                                    { id:   1, name: ' B' },
-                                    { id:   2, name: 'C' },
-                                ]}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <SelectInput
-                                label="table.field.matnr.isLabelMange"
-                                source="isLabelMange"
-                                choices={[
-                                    { id: 0, name: ' 鍚�' },
-                                    { id:  1, name: ' 鏄�' },
-                                ]}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.safeQty"
-                                source="safeQty"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.minQty"
-                                source="minQty"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.maxQty"
-                                source="maxQty"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.stagn"
-                                source="stagn"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.valid"
-                                source="valid"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.validWarn"
-                                source="validWarn"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.matnr.flagCheck"
-                                source="flagCheck"
-                            />
-                        </Stack>
+                        <Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
+                            <Tab label={translate('page.matnr.title.basic')} {...a11yProps(0)} />
+                            <Tab label={translate('page.matnr.title.control')} {...a11yProps(1)} />
+                            <Tab label={translate('page.matnr.title.batchRole')} {...a11yProps(2)} />
+                        </Tabs>
 
+                        <CustomTabPanel value={value} index={0}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.name"
+                                        source="name"
+                                        parse={v => v}
+                                        required
+                                        autoFocus
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.code"
+                                        source="code"
+                                        required
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <ReferenceInput
+                                        source="shipperId"
+                                        reference="shipper"
+                                        perPage={REFERENCE_INPUT_PAGESIZE}
+                                    >
+                                        <AutocompleteInput
+                                            validate={[required()]}
+                                            label="table.field.matnr.shipperId"
+                                            optionText="name"
+                                            filterToQuery={(val) => ({ name: val })}
+                                        />
+                                    </ReferenceInput>
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <ReferenceInput
+                                        source="groupId"
+                                        reference="matnrGroup"
+                                        perPage={REFERENCE_INPUT_PAGESIZE}
+                                    >
+                                        <AutocompleteInput
+                                            label="table.field.matnr.groupId"
+                                            optionText="code"
+                                            validate={[required()]}
+                                            filterToQuery={(val) => ({ code: val })}
+                                        />
+                                    </ReferenceInput>
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <ReferenceInput
+                                        source="rglarId"
+                                        reference="rglarId"
+                                        perPage={REFERENCE_INPUT_PAGESIZE}
+                                    >
+                                        <AutocompleteInput
+                                            label="table.field.matnr.rglarId"
+                                            optionText="code"
+                                            filterToQuery={(val) => ({ code: val })}
+                                        />
+                                    </ReferenceInput>
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.erpCode"
+                                        source="erpCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.spec"
+                                        source="spec"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.weight"
+                                        source="weight"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.color"
+                                        source="color"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.size"
+                                        source="size"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.describle"
+                                        source="describle"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.nromNum"
+                                        source="nromNum"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.unit"
+                                        source="unit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.purUnit"
+                                        source="purUnit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.stockUnit"
+                                        source="stockUnit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <SelectInput
+                                        label="table.field.matnr.stockLevel"
+                                        source="stockLevel"
+                                        choices={[
+                                            { id: 0, name: ' A' },
+                                            { id: 1, name: ' B' },
+                                            { id: 2, name: 'C' },
+                                        ]}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <SelectInput
+                                        label="table.field.matnr.isLabelMange"
+                                        source="isLabelMange"
+                                        choices={[
+                                            { id: 0, name: ' 鍚�' },
+                                            { id: 1, name: ' 鏄�' },
+                                        ]}
+                                        validate={required()}
+                                    />
+                                </Grid>
+
+
+
+                            </Grid>
+
+                        </CustomTabPanel>
+                        <CustomTabPanel value={value} index={1}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.safeQty"
+                                        source="safeQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.minQty"
+                                        source="minQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.maxQty"
+                                        source="maxQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.stagn"
+                                        source="stagn"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.validWarn"
+                                        source="validWarn"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.valid"
+                                        source="valid"
+                                    />
+                                </Grid>
+                            </Grid>
+                        </CustomTabPanel>
+                        <CustomTabPanel value={value} index={2}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.matnr.flagCheck"
+                                        source="flagCheck"
+                                    />
+                                </Grid>
+                            </Grid>
+                        </CustomTabPanel>
                     </Grid>
-                    <Grid item xs={12} md={4}>
+
+
+                    <Grid item xs={12} md={2}>
                         <Typography variant="h6" gutterBottom>
                             {translate('common.edit.title.common')}
                         </Typography>
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
index d61f6a8..5246f3a 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
@@ -18,13 +18,41 @@
     const { setFilters } = useListContext(); // 鑾峰彇鍒楄〃涓婁笅鏂�
     const [selectedOption, setSelectedOption] = useState(null);
     const [treeData, setTreeData] = useState([]);
+    const trees = []
+    const haveChildren = (item) => {
+        // 濡傛灉 item 鏄竴涓暟缁勶紝閬嶅巻鏁扮粍涓殑姣忎釜鍏冪礌
+        if (Array.isArray(item)) {
+            return item.map((k) => haveChildren(k));
+        }
 
+        // 濡傛灉 item 鏄竴涓璞�
+        if (item && typeof item === 'object') {
+            // 灏� id 杞崲涓哄瓧绗︿覆
+            if (item.id !== undefined) {
+                item.id = item.id.toString();
+            }
+
+            // 濡傛灉瀛樺湪 children锛岄�掑綊澶勭悊 children
+            if (item.children && Array.isArray(item.children)) {
+                item.children = haveChildren(item.children);
+            }
+        }
+
+        return item;
+    };
     useEffect(() => {
         request.post('/matnrGroup/tree')
             .then(res => {
                 console.log('Tree Data:', res);
                 if (res?.data?.code === 200) {
-                    setTreeData(res.data.data);
+                    let data = res.data.data;
+                    // for (let k of data) {
+                    //     k.id = k.id.toString();
+
+                    // }
+                    let items = haveChildren(data)
+                    setTreeData(items)
+                    console.log('Tree Data:', items);
                 } else {
                     notify(res.data.msg);
                 }
@@ -32,10 +60,10 @@
             .catch(error => {
                 notify('Error fetching tree data');
             });
-        
-        
-        
-    },[]);
+
+
+
+    }, []);
 
 
 
@@ -79,7 +107,7 @@
         // 鍦ㄨ繖閲屽彲浠ユ牴鎹� nodeId 鏇存柊涓诲唴瀹瑰尯鍩�
     };
     const handleSearch = () => {
-            console.log('Search Input:', selectedOption);
+        console.log('Search Input:', selectedOption);
     };
 
 
@@ -114,12 +142,12 @@
         >
             <CardContent>
                 <SavedQueriesList icon={<BookmarkIcon />} />
-                <FilterLiveSearch source="condition"  />
+                <FilterLiveSearch source="condition" />
                 <RichTreeView
                     defaultExpandedItems={['grid', 'pickers']}
                     expansionTrigger="iconContainer"
-                    items={ treeData }
-                    slots={ CustomTreeItem }
+                    items={treeData}
+                    slots={CustomTreeItem}
                     onItemClick={handleNodeSelect} // 鐩戝惉鑺傜偣鐐瑰嚮浜嬩欢
 
                 />
diff --git a/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
index b2127b6..5b87ef9 100644
--- a/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
@@ -88,6 +88,7 @@
                                     <TextInput
                                         label="table.field.warehouse.name"
                                         source="name"
+                                        required
                                         parse={v => v}
                                         autoFocus
                                     />
@@ -103,6 +104,7 @@
                                     <TextInput
                                         label="table.field.warehouse.factory"
                                         source="factory"
+                                        required
                                         parse={v => v}
                                     />
                                 </Grid>
@@ -110,6 +112,7 @@
                                     <TextInput
                                         label="table.field.warehouse.address"
                                         source="address"
+                                        required
                                         parse={v => v}
                                     />
                                 </Grid>

--
Gitblit v1.9.1