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