From 031e36213941ad3430da2b0429701e742f09f5d8 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 18 三月 2025 11:14:20 +0800
Subject: [PATCH] Merge branch 'front' into devlop

---
 rsf-admin/src/page/asnOrder/AsnOrderList.jsx                     |   36 +
 rsf-admin/src/page/components/BatchButton.jsx                    |   31 +
 rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx            |   58 ++-
 rsf-admin/src/page/components/TooltipField.jsx                   |   28 +
 rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx                 |    2 
 rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx       |   21 +
 rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx               |    2 
 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx |    4 
 rsf-admin/src/page/basicInfo/loc/InitButton.jsx                  |   74 ++++
 rsf-admin/src/page/basicInfo/loc/LocList.jsx                     |   44 ++
 rsf-admin/src/page/basicInfo/loc/InitModal.jsx                   |  241 +++++++++++++++
 rsf-admin/src/page/basicInfo/loc/LocCreate.jsx                   |   46 ++
 rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx         |   10 
 rsf-admin/src/page/components/BatchModal.jsx                     |   65 ++++
 rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx               |    4 
 rsf-admin/src/page/components/DictionarySelect.jsx               |   45 ++
 rsf-admin/src/i18n/zh.js                                         |   20 +
 rsf-admin/src/page/basicInfo/loc/LocEdit.jsx                     |   41 +
 rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx                 |  115 +++++--
 rsf-admin/src/i18n/en.js                                         |   14 
 rsf-admin/.env                                                   |    4 
 rsf-admin/src/page/asnOrder/AsnOrderModal.jsx                    |    2 
 22 files changed, 799 insertions(+), 108 deletions(-)

diff --git a/rsf-admin/.env b/rsf-admin/.env
index ebc08a7..9669b2c 100644
--- a/rsf-admin/.env
+++ b/rsf-admin/.env
@@ -1,3 +1,3 @@
-VITE_BASE_IP=localhost
-# VITE_BASE_IP=47.76.147.249
+# VITE_BASE_IP=192.168.4.24
+VITE_BASE_IP=47.76.147.249
 VITE_BASE_PORT=8080
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 4596053..602630c 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -68,6 +68,7 @@
             deprecate: 'Deprecate',
             resend: 'RESEND',
             selected: 'selected',
+            batch: 'batch'
         },
         msg: {
             confirm: {
@@ -143,6 +144,13 @@
         fields: 'Extend Fields',
         fieldsItem: 'Extend Fields Items',
         warehouseAreasItem: 'WarehouseAreasItem',
+        endBay: "endBay",
+        endLev: "endLev",
+        endRow: "endRow",
+        locType: "locType",
+        startBay: "startBay",
+        startLev: "startLev",
+        startRow: "startRow",
     },
     table: {
         field: {
@@ -334,6 +342,9 @@
                 barcode: "Barcode",
                 unit: "Unit",
                 size: "Size",
+                length: "length",
+                width: "width",
+                height: "height",
                 row: "Row",
                 col: "Col",
                 lev: "Lev",
@@ -596,6 +607,9 @@
         inspection: "Inspection",
         creatcode: "creatcode",
         print: "print",
+        enable: 'enable',
+        unenable: 'unenable',
+        locInit: 'loc init'
     },
 };
 
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 8c533da..889ea39 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -68,6 +68,7 @@
             deprecate: '搴熷純',
             resend: '閲嶅彂',
             selected: '椤归�変腑',
+            batch: '鎵归噺缂栬緫'
         },
         msg: {
             confirm: {
@@ -121,7 +122,7 @@
         userLogin: '鐧诲綍鏃ュ織',
         customer: '瀹㈡埛琛�',
         shipper: '璐т富淇℃伅',
-        matnr: '鐗╂枡琛�',
+        matnr: '鐗╂枡鏁版嵁',
         matnrGroup: '鐗╂枡鍒嗙粍',
         warehouse: '浠撳簱淇℃伅',
         warehouseAreas: '浠撳簱搴撳尯',
@@ -280,7 +281,7 @@
             matnrGroup: {
                 name: "鍚嶇О",
                 code: "缂栫爜",
-                parentId: "鐖剁被鏍囪瘑",
+                parentId: "涓婄骇鏍囪瘑",
             },
             warehouse: {
                 name: "浠撳簱鍚嶇О",
@@ -326,13 +327,16 @@
                 warehouseId: "浠撳簱",
                 areaId: "搴撳尯",
                 code: "缂栫爜",
-                type: "绫诲瀷",
+                type: "搴撲綅绫诲瀷",
                 name: "鍚嶇О",
                 flagLogic: "铏氭嫙搴撲綅",
                 fucAtrrs: "鍔熻兘灞炴��",
                 barcode: "瀹瑰櫒鐮�",
                 unit: "鍗曚綅",
                 size: "闀�/瀹�/楂�",
+                length: "闀�",
+                width: "瀹�",
+                height: "楂�",
                 row: "鎺�",
                 col: "鍒�",
                 lev: "灞�",
@@ -341,6 +345,13 @@
                 maxPack: "鏈�澶у寘瑁呮暟",
                 flagLabelMange: "鏍囩绠$悊",
                 locAttrs: "灞炴��",
+                endBay: "缁堟鍒�",
+                endLev: "缁堟灞�",
+                endRow: "缁堟鎺�",
+                locType: "瀹界獎绫诲瀷",
+                startBay: "璧峰鍒�",
+                startLev: "璧峰灞�",
+                startRow: "璧峰鎺�",
             },
 
             container: {
@@ -598,6 +609,9 @@
         inspection: "鎶ユ",
         creatcode: "鐢熸垚鏉$爜",
         print: "鎵撳嵃",
+        enable: '鍚敤',
+        unenable: '绂佺敤',
+        locInit: '聽搴撲綅鍒濆鍖�'
     },
 };
 
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
index 96dbf12..095bde5 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -109,7 +109,32 @@
 
 
   const inspection = () => { };
-  const print = () => { };
+
+  const print = () => {
+    const imageUrls = ['https://www.baidu.com/img/flexible/logo/pc/result@2.png',]
+    const iframe = document.createElement('iframe');
+    iframe.style.display = 'none';
+    document.body.appendChild(iframe);
+
+    const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
+    iframeDoc.open();
+    iframeDoc.write('<html><head><title>Print Images</title></head><body>');
+
+    // 灏嗗浘鐗囨彃鍏ュ埌 iframe 涓�
+    imageUrls.forEach((imageUrl) => {
+      iframeDoc.write(`<img src="${imageUrl}" style="margin: 10px;">`);
+    });
+
+    iframeDoc.write('</body></html>');
+    iframeDoc.close();
+
+    // 绛夊緟鍥剧墖鍔犺浇瀹屾垚鍚庤Е鍙戞墦鍗�
+    iframe.contentWindow.onload = () => {
+      iframe.contentWindow.print();
+      // 鎵撳嵃瀹屾垚鍚庣Щ闄� iframe
+      document.body.removeChild(iframe);
+    };
+  };
 
 
   return (
@@ -151,14 +176,7 @@
           omit={['id', 'createTime', 'createBy', 'memo']}
         >
           <NumberField source="id" />
-          <MyField
-            source="code"
-            label="table.field.asnOrder.code"
-            onClick={(event, record, val) => {
-              event.stopPropagation();
-              assign(record);
-            }}
-          />
+          <TextField source="code" label="table.field.asnOrder.code" />
           <TextField source="poCode" label="table.field.asnOrder.poCode" />
           <NumberField source="poId" label="table.field.asnOrder.poId" />
           <TextField source="type" label="table.field.asnOrder.type" />
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
index 2942d22..1b23e74 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
@@ -183,7 +183,7 @@
                                         onBlur={requestSetHead}
                                         variant="outlined"
                                         size="small"
-                                        validate={required()}
+                                        required
                                     />
                                 </Grid>
 
diff --git a/rsf-admin/src/page/basicInfo/loc/InitButton.jsx b/rsf-admin/src/page/basicInfo/loc/InitButton.jsx
new file mode 100644
index 0000000..e3dd2e3
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/loc/InitButton.jsx
@@ -0,0 +1,74 @@
+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,
+    useRefresh,
+    Button
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import InitModal from "./InitModal";
+import LocPanel from "./LocPanel";
+import EmptyData from "../../components/EmptyData";
+import MyCreateButton from "../../components/MyCreateButton";
+import MyExportButton from '../../components/MyExportButton';
+import BatchButton from '../../components/BatchButton';
+import PageDrawer from "../../components/PageDrawer";
+import MyField from "../../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+import DashboardIcon from '@mui/icons-material/Dashboard';
+import request from '@/utils/request';
+import CabinIcon from '@mui/icons-material/Cabin';
+
+const InitButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    // console.log(record)
+
+    return (<>
+        <Button onClick={() => setCreateDialog(true)} label={"toolbar.locInit"}>
+            <CabinIcon />
+        </Button>
+        <InitModal
+            open={createDialog}
+            setOpen={setCreateDialog}
+        />
+    </>
+
+    )
+}
+
+export default InitButton;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/loc/InitModal.jsx b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx
new file mode 100644
index 0000000..ed84903
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx
@@ -0,0 +1,241 @@
+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,
+    useListContext,
+    useRefresh,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Grid,
+    TextField,
+    Box,
+    Button,
+    Paper,
+    TableContainer,
+    Table,
+    TableHead,
+    TableBody,
+    TableRow,
+    TableCell,
+    Tooltip,
+    IconButton,
+    styled
+
+
+} from '@mui/material';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import DictionarySelect from "../../components/DictionarySelect";
+import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
+import SaveIcon from '@mui/icons-material/Save';
+import request from '@/utils/request';
+import { Add, Edit, Delete } from '@mui/icons-material';
+import _ from 'lodash';
+import { DataGrid } from '@mui/x-data-grid';
+
+
+
+
+const InitModal = ({ open, setOpen }) => {
+    const refresh = useRefresh();
+    const translate = useTranslate();
+
+
+    const notify = useNotify();
+
+    const [formData, setFormData] = useState({
+        "areaId": undefined,
+        "endBay": undefined,
+        "endLev": undefined,
+        "endRow": undefined,
+        "locType": "",
+        "startBay": undefined,
+        "startLev": undefined,
+        "startRow": undefined,
+        "type": ""
+    });
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleReset = (e) => {
+        e.preventDefault();
+    };
+
+    const handleChange = (value, name) => {
+        setFormData((prevData) => ({
+            ...prevData,
+            [name]: ['locType', 'type'].includes(name) ? value : +value
+        }));
+    };
+
+    const handleSubmit = async () => {
+        const res = await request.post(`/loc/init`, formData);
+        if (res?.data?.code === 200) {
+            setOpen(false);
+            refresh();
+        } else {
+            notify(res.data.msg);
+        }
+    }
+
+
+    return (
+        <Dialog open={open} maxWidth="md" fullWidth>
+            <DialogCloseButton onClose={handleClose} />
+            <DialogTitle>{translate('toolbar.locInit')}</DialogTitle>
+            <DialogContent sx={{ mt: 2 }}>
+                <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
+                    <Form>
+
+                        <Grid container spacing={2}>
+                            <Grid item xs={4}>
+                                <ReferenceInput
+                                    source="areaId"
+                                    reference="warehouseAreas"
+                                >
+                                    <AutocompleteInput
+                                        label="table.field.loc.areaId"
+                                        optionText="name"
+                                        onChange={(value) => handleChange(value, 'areaId')}
+                                        value={formData.areaId}
+                                        validate={[required()]}
+                                        filterToQuery={(val) => ({ name: val })}
+                                    />
+                                </ReferenceInput>
+
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <DictionarySelect
+                                    label={translate("table.field.loc.locType")}
+                                    name="locType"
+                                    value={formData.locType}
+                                    onChange={(e) => handleChange(e.target.value, 'locType')}
+                                    size="small"
+                                    validate={[required()]}
+                                    dictTypeCode="sys_width_type"
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <DictionarySelect
+                                    label={translate("table.field.loc.type")}
+                                    name="type"
+                                    value={formData.type}
+                                    onChange={(e) => handleChange(e.target.value, 'type')}
+                                    size="small"
+                                    validate={[required()]}
+                                    dictTypeCode="sys_loc_type"
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.startBay")}
+                                    name="startBay"
+                                    value={formData.startBay}
+                                    onChange={(e) => handleChange(e.target.value, 'startBay')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.startLev")}
+                                    name="startLev"
+                                    value={formData.startLev}
+                                    onChange={(e) => handleChange(e.target.value, 'startLev')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.startRow")}
+                                    name="startRow"
+                                    value={formData.startRow}
+                                    onChange={(e) => handleChange(e.target.value, 'startRow')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.endBay")}
+                                    name="endBay"
+                                    value={formData.endBay}
+                                    onChange={(e) => handleChange(e.target.value, 'endBay')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.endLev")}
+                                    name="endLev"
+                                    value={formData.endLev}
+                                    onChange={(e) => handleChange(e.target.value, 'endLev')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                            <Grid item xs={4}>
+                                <TextField
+                                    label={translate("table.field.loc.endRow")}
+                                    name="endRow"
+                                    value={formData.endRow}
+                                    onChange={(e) => handleChange(e.target.value, 'endRow')}
+                                    size="small"
+                                    type="number"
+                                    required
+                                />
+                            </Grid>
+
+                        </Grid>
+                    </Form>
+                </Box>
+            </DialogContent>
+            <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
+                    <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
+                        纭
+                    </Button>
+                </Box>
+            </DialogActions>
+        </Dialog>
+    );
+}
+
+export default InitModal;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx b/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx
index 831412b..0602179 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocCreate.jsx
@@ -119,20 +119,27 @@
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.loc.type"
+                                    <ReferenceInput
                                         source="type"
-                                        parse={v => v}
-                                        validate={required()}
-                                    />
+                                        reference="dictData"
+                                        filter={{ dictTypeCode: 'sys_loc_type' }}
+                                    >
+                                        <AutocompleteInput
+                                            label="table.field.loc.type"
+                                            optionText="label"
+                                            optionValue="value"
+                                            parse={v => v}
+                                            validate={[required()]}
+                                        />
+                                    </ReferenceInput>
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.loc.name"
                                         source="name"
                                         parse={v => v}
                                     />
-                                </Grid>
+                                </Grid> */}
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.loc.flagLogic"
@@ -153,24 +160,41 @@
                                         parse={v => v}
                                     />
                                 </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.loc.unit"
                                         source="unit"
                                         parse={v => v}
                                     />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
+                                </Grid> */}
+                                {/* <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
                                         label="table.field.loc.size"
                                         source="size"
                                         parse={v => v}
                                     />
+                                </Grid> */}
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.loc.length"
+                                        source="length"
+                                        validate={required()}
+                                    />
+                                    <NumberInput
+                                        label="table.field.loc.width"
+                                        source="width"
+                                        validate={required()}
+                                    />
+                                    <NumberInput
+                                        label="table.field.loc.height"
+                                        source="height"
+                                        validate={required()}
+                                    />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.loc.row"
-                                        source="lrow"
+                                        source="row"
                                         validate={required()}
                                     />
                                     <NumberInput
diff --git a/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx b/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx
index c8c7fcb..3ea6793 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocEdit.jsx
@@ -66,7 +66,7 @@
                         <Grid container rowSpacing={2} columnSpacing={2}>
                             <Grid item xs={6} display="flex" gap={1}>
                                 <ReferenceInput
-                                    source="warehouseId$"
+                                    source="warehouseId"
                                     reference="warehouse"
                                 >
                                     <AutocompleteInput
@@ -99,12 +99,19 @@
                                 />
                             </Grid>
                             <Grid item xs={6} display="flex" gap={1}>
-                                <TextInput
-                                    label="table.field.loc.type"
+                                <ReferenceInput
                                     source="type"
-                                    parse={v => v}
-                                    validate={required()}
-                                />
+                                    reference="dictData"
+                                    filter={{ dictTypeCode: 'sys_loc_type' }}
+                                >
+                                    <AutocompleteInput
+                                        label="table.field.loc.type"
+                                        optionText="label"
+                                        optionValue="value"
+                                        parse={v => v}
+                                        validate={[required()]}
+                                    />
+                                </ReferenceInput>
                             </Grid>
                             <Grid item xs={6} display="flex" gap={1}>
                                 <TextInput
@@ -141,10 +148,24 @@
                                 />
                             </Grid>
                             <Grid item xs={6} display="flex" gap={1}>
-                                <TextInput
-                                    label="table.field.loc.size"
-                                    source="size"
-                                    parse={v => v}
+                                <NumberInput
+                                    label="table.field.loc.length"
+                                    source="length"
+                                    validate={required()}
+                                />
+                            </Grid>
+                            <Grid item xs={6} display="flex" gap={1}>
+                                <NumberInput
+                                    label="table.field.loc.width"
+                                    source="width"
+                                    validate={required()}
+                                />
+                            </Grid>
+                            <Grid item xs={6} display="flex" gap={1}>
+                                <NumberInput
+                                    label="table.field.loc.height"
+                                    source="height"
+                                    validate={required()}
                                 />
                             </Grid>
                             <Grid item xs={6} display="flex" gap={1}>
diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
index 1980da5..fbbecc9 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -31,6 +31,8 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    useRefresh,
+    Button
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
@@ -39,10 +41,13 @@
 import EmptyData from "../../components/EmptyData";
 import MyCreateButton from "../../components/MyCreateButton";
 import MyExportButton from '../../components/MyExportButton';
+import InitButton from './InitButton';
 import PageDrawer from "../../components/PageDrawer";
 import MyField from "../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
+import DashboardIcon from '@mui/icons-material/Dashboard';
+import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -60,8 +65,6 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
 
     <NumberField source="warehouseId$" label="table.field.loc.warehouseId" />,
     <NumberField source="areaId$" label="table.field.loc.areaId" />,
@@ -100,6 +103,7 @@
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
 
+
     return (
         <Box display="flex">
             <List
@@ -109,7 +113,7 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.loc"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
@@ -118,6 +122,7 @@
                 actions={(
                     <TopToolbar>
                         <FilterButton />
+                        <InitButton />
                         <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                         <SelectColumnsButton preferenceKey='loc' />
                         <MyExportButton />
@@ -143,7 +148,9 @@
                     <TextField source="fucAtrrs" label="table.field.loc.fucAtrrs" />
                     <TextField source="barcode" label="table.field.loc.barcode" />
                     <TextField source="unit" label="table.field.loc.unit" />
-                    <TextField source="size" label="table.field.loc.size" />
+                    <TextField source="size" label="table.field.loc.length" />
+                    <TextField source="size" label="table.field.loc.width" />
+                    <TextField source="size" label="table.field.loc.height" />
                     <NumberField source="lrow" label="table.field.loc.row" />
                     <NumberField source="col" label="table.field.loc.col" />
                     <NumberField source="lev" label="table.field.loc.lev" />
@@ -164,7 +171,8 @@
                     <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} />
+                        {/* <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> */}
+                        <EnableButton />
                     </WrapperField>
                 </StyledDatagrid>
             </List>
@@ -183,3 +191,29 @@
 }
 
 export default LocList;
+
+const EnableButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const enable = async () => {
+        const res = await request.post('/loc/update', {
+            ...record,
+            status: +!record.status
+        });
+        if (res?.data?.code === 200) {
+            refresh()
+        } else {
+            notify(res.data.msg);
+        }
+    }
+    return (
+        record.status === 1 ?
+            (<Button onClick={enable} label={"toolbar.unenable"}>
+                <DashboardIcon />
+            </Button>) : (<Button onClick={enable} label={"toolbar.enable"}>
+                <DashboardIcon />
+            </Button>)
+
+    )
+}
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
index 47b56d9..98b87e4 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -94,7 +94,7 @@
     //     if (!values.shipperId) errors.shipperId = translate('form.matnr.shipper');
     //     if (!values.groupId) errors.groupId = translate('form.matnr.groupId');
     //     if (!values.code) errors.code = translate('form.matnr.code');
-       
+
     //     return errors;
     // };
 
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index e2e4c63..901038b 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -31,8 +31,11 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    useRefresh,
+    Button
+
 } from 'react-admin';
-import { Box, Typography, Card, Stack,LinearProgress } from '@mui/material';
+import { Box, Typography, Card, Stack, LinearProgress, Tooltip } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import MatnrCreate from "./MatnrCreate";
 import MatnrPanel from "./MatnrPanel";
@@ -40,33 +43,52 @@
 import MyCreateButton from "@/page/components/MyCreateButton";
 import MyExportButton from '@/page/components/MyExportButton';
 import PageDrawer from "@/page/components/PageDrawer";
-import MyField from "@/page/components/MyField";
+import TooltipField from "@/page/components/TooltipField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
 import ImportButton from "../../components/ImportButton";
 import MatListAside from './MatnrListAside';
+import { display, height } from "@mui/system";
+import DashboardIcon from '@mui/icons-material/Dashboard';
+import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
         height: '.9em'
     },
+
     '& .RaDatagrid-row': {
         cursor: 'auto'
+    },
+    '& .RaList-content': {
+        width: '200px'
+    },
+    '& .RaList-main': {
+        minHeight: '80vh'
     },
     '& .column-name': {
     },
     '& .opt': {
         width: 200
     },
+    '& .name': {
+        width: '100px',
+
+    },
+    '& .name .MuiTypography-root': {
+        whiteSpace: 'nowrap',
+        overflow: 'hidden',
+        textOverflow: 'ellipsis',
+        display: 'block',
+        width: '100px',
+    }
 }));
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
 
-    <TextInput source="name" label="table.field.matnr.name" />,
-    <TextInput source="code" label="table.field.matnr.code" />,
+    <TextInput source="name" label="table.field.matnr.name" alwaysOn />,
+    <TextInput source="code" label="table.field.matnr.code" alwaysOn />,
     <ReferenceInput source="shipperId$" label="table.field.matnr.shipperId" reference="shipper">
         <AutocompleteInput label="table.field.matnr.shipperId" optionText="name" filterToQuery={(val) => ({ name: val })} />
     </ReferenceInput>,
@@ -90,14 +112,14 @@
     <SelectInput source="stockLeval" label="table.field.matnr.stockLevel"
         choices={[
             { id: 0, name: ' A' },
-            { id:   1, name: ' B' },
-            { id:   2, name: 'C' },
+            { id: 1, name: ' B' },
+            { id: 2, name: 'C' },
         ]}
     />,
     <SelectInput source="isLabelMange" label="table.field.matnr.isLabelMange"
         choices={[
             { id: 0, name: ' 鍚�' },
-            { id:  1, name: ' 鏄�' },
+            { id: 1, name: ' 鏄�' },
         ]}
     />,
     <NumberInput source="safeQty" label="table.field.matnr.safeQty" />,
@@ -125,31 +147,33 @@
     const { isLoading } = useListContext();
 
     return (
-        <Box sx={{ position: 'relative' }}>
-                {isLoading && (
-                    <LinearProgress
-                        sx={{
-                            height: "2px",
-                            position: 'absolute',
-                            top: 0,
-                            left: 0,
-                            right: 0,
-                        }}
-                    />
-                )}
-            <StyledDatagrid 
+        <Box sx={{ position: 'relative', minHeight: "40vh", }}>
+            {isLoading && (
+                <LinearProgress
+                    sx={{
+                        height: "2px",
+                        position: 'absolute',
+                        top: 0,
+                        left: 0,
+                        right: 0,
+                    }}
+                />
+            )}
+
+            <StyledDatagrid
                 preferenceKey='matnr'
                 bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                 rowClick={(id, resource, record) => false}
                 expand={() => <MatnrPanel />}
                 expandSingle={true}
-                omit={['id','shipperId','platCode','spec','model','weight','color','size','describle'
-                    ,'nromNum','unit','purchaseUnit','stockUnit','stockLeval','isLabelMange','safeQty'
-                    ,'minQty','maxQty','stagn','valid','validWarn','flagCheck','updateTime', 'updateBy'
-                    , 'createTime', 'createBy', 'memo']}
+                omit={['id', 'shipperId', 'platCode', 'spec', 'model', 'weight', 'color', 'size', 'describle'
+                    , 'nromNum', 'unit', 'purchaseUnit', 'stockUnit', 'stockLeval', 'isLabelMange', 'safeQty'
+                    , 'minQty', 'maxQty', 'stagn', 'valid', 'validWarn', 'flagCheck', 'updateTime', 'updateBy'
+                    , 'createTime', 'createBy', 'memo', 'rglarId', 'groupId', 'stockLevel', 'isLabelMange']}
             >
                 <NumberField source="id" />
-                <TextField source="name" label="table.field.matnr.name" />
+
+                <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="name" />
@@ -193,12 +217,13 @@
                 <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} />
+                    {/* <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> */}
+                    <EnableButton />
                 </WrapperField>
             </StyledDatagrid>
         </Box>
     );
-    
+
 }
 
 const MatnrList = () => {
@@ -217,7 +242,7 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.matnr"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
@@ -235,7 +260,7 @@
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
-                aside={ <MatListAside /> }
+                aside={<MatListAside />}
             >
                 <MatnrListContent />
             </List>
@@ -255,4 +280,30 @@
 
 MatnrList.Context = React.createContext()
 
-export default MatnrList;
\ No newline at end of file
+export default MatnrList;
+
+const EnableButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const enable = async () => {
+        const res = await request.post('/loc/update', {
+            ...record,
+            status: +!record.status
+        });
+        if (res?.data?.code === 200) {
+            refresh()
+        } else {
+            notify(res.data.msg);
+        }
+    }
+    return (
+        record.status === 1 ?
+            (<Button onClick={enable} label={"toolbar.unenable"}>
+                <DashboardIcon />
+            </Button>) : (<Button onClick={enable} label={"toolbar.enable"}>
+                <DashboardIcon />
+            </Button>)
+
+    )
+}
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
index 9f5617b..e20ce92 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
@@ -11,14 +11,27 @@
 import { RichTreeView } from "@mui/x-tree-view/RichTreeView";
 import { TreeItem2 } from "@mui/x-tree-view/TreeItem2";
 
-
 const MatListAside = () => {
     const theme = useTheme();
     const notify = useNotify();
     const { setFilters } = useListContext(); // 鑾峰彇鍒楄〃涓婁笅鏂�
     const [selectedOption, setSelectedOption] = useState(null);
     const [treeData, setTreeData] = useState([]);
-    const trees = []
+    // 鐢ㄤ簬绠$悊灞曞紑椤圭殑鐘舵��
+    const [expandedItems, setExpandedItems] = useState([]);
+
+    // 閫掑綊鏀堕泦鎵�鏈夎妭鐐圭殑 id
+    const collectAllNodeIds = (nodes) => {
+        let allIds = [];
+        nodes.forEach((node) => {
+            allIds.push(node.id.toString());
+            if (node.children && Array.isArray(node.children)) {
+                allIds = allIds.concat(collectAllNodeIds(node.children));
+            }
+        });
+        return allIds;
+    };
+
     const haveChildren = (item) => {
         // 濡傛灉 item 鏄竴涓暟缁勶紝閬嶅巻鏁扮粍涓殑姣忎釜鍏冪礌
         if (Array.isArray(item)) {
@@ -40,13 +53,16 @@
 
         return item;
     };
+
     useEffect(() => {
         request.post('/matnrGroup/tree')
             .then(res => {
                 if (res?.data?.code === 200) {
                     let data = res.data.data;
-                    let items = haveChildren(data)
-                    setTreeData(items)
+                    let items = haveChildren(data);
+                    setTreeData(items);
+                    // 褰撴爲鏁版嵁鏇存柊鏃讹紝鏇存柊灞曞紑椤圭姸鎬�
+                    setExpandedItems(collectAllNodeIds(items));
                 } else {
                     notify(res.data.msg);
                 }
@@ -54,12 +70,7 @@
             .catch(error => {
                 notify('Error fetching tree data');
             });
-
-
-
     }, []);
-
-
 
     const treeData1 = [
         {
@@ -68,8 +79,12 @@
             editable: true,
             children: [
                 {
-                    id: 'grid-community', label: '@mui/x-data-grid', editable: true, children: [
-                        { id: 'grid-community22', label: '@mui/x-data-grid', editable: true },]
+                    id: 'grid-community',
+                    label: '@mui/x-data-grid',
+                    editable: true,
+                    children: [
+                        { id: 'grid-community22', label: '@mui/x-data-grid', editable: true },
+                    ],
                 },
                 { id: 'grid-pro', label: '@mui/x-data-grid-pro', editable: true },
                 { id: 'grid-premium', label: '@mui/x-data-grid-premium', editable: true },
@@ -95,15 +110,16 @@
             children: [{ id: 'tree-view-community1', label: '@mui/x-tree-view' }],
         },
     ];
+
     const handleNodeSelect = (event, nodeId) => {
         console.log('Selected Node ID:', nodeId);
         setFilters({ groupId: nodeId });
         // 鍦ㄨ繖閲屽彲浠ユ牴鎹� nodeId 鏇存柊涓诲唴瀹瑰尯鍩�
     };
+
     const handleSearch = () => {
         console.log('Search Input:', selectedOption);
     };
-
 
     const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) {
         return <input type="checkbox" ref={ref} {...props} />;
@@ -121,33 +137,35 @@
         );
     });
 
-
     return (
         <Card
             sx={{
-                display: { xs: 'none', md: 'block', },
                 order: -1,
                 mr: 2,
                 mt: 8,
                 alignSelf: 'flex-start',
                 border: theme.palette.mode === 'light' && '1px solid #e0e0e3',
-                width: 250
+                width: 250,
+                minWidth: 150,
+                height: `calc(100% - 120px)`,
             }}
         >
             <CardContent>
                 <SavedQueriesList icon={<BookmarkIcon />} />
                 <FilterLiveSearch source="condition" />
                 <RichTreeView
-                    defaultExpandedItems={['grid', 'pickers']}
+                    // 浣跨敤 expandedItems 鎺у埗灞曞紑鐘舵��
+                    expandedItems={expandedItems}
+                    // 澶勭悊灞曞紑椤圭姸鎬佺殑鍙樺寲
+                    onExpandedItemsChange={(newExpandedItems) => setExpandedItems(newExpandedItems)}
                     expansionTrigger="iconContainer"
                     items={treeData}
                     slots={CustomTreeItem}
                     onItemClick={handleNodeSelect} // 鐩戝惉鑺傜偣鐐瑰嚮浜嬩欢
-
                 />
             </CardContent>
         </Card>
-    )
-}
+    );
+};
 
-export default MatListAside;
+export default MatListAside;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
index 8436018..92c89df 100644
--- a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
@@ -160,7 +160,7 @@
     const [createDialog, setCreateDialog] = React.useState(false);
     const [editRecord, setEditRecord] = React.useState(null);
     const [openNodes, setOpenNodes] = React.useState({});
-    const [expandAll, setExpandAll] = React.useState(false);
+    const [expandAll, setExpandAll] = React.useState(true);
 
     const http = async () => {
         const res = await request.post(RESOURCE + '/tree', {
@@ -226,6 +226,23 @@
             return newExpandAll;
         });
     };
+
+    // 鍒濆鍖� openNodes 浠ュ睍寮�鎵�鏈夎妭鐐�
+    React.useEffect(() => {
+        if (treeData) {
+            const newOpenNodes = {};
+            const updateOpenNodes = (nodes) => {
+                nodes.forEach(node => {
+                    newOpenNodes[node.id] = true;
+                    if (node.children) {
+                        updateOpenNodes(node.children);
+                    }
+                });
+            };
+            updateOpenNodes(treeData);
+            setOpenNodes(newOpenNodes);
+        }
+    }, [treeData]);
 
     return (
         <div>
@@ -336,4 +353,4 @@
     );
 }
 
-export default MatnrGroupList;
+export default MatnrGroupList;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx b/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx
index 16631c9..d0b4c7c 100644
--- a/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx
+++ b/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx
@@ -145,7 +145,7 @@
   const getMatnrList = async () => {
     const {
       data: { code, data, msg },
-    } = await request.post("/matnr/list", {}).then();
+    } = await request.post("/matnr/list", {});
     if (code === 200) {
       console.log(data);
     } else {
diff --git a/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx b/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx
index f7546dc..a32c132 100644
--- a/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx
@@ -180,7 +180,7 @@
           <Checkbox
             key={row.id}
             checked={row.checked}
-            // onChange={() => { row.checked = !row.checked; }}
+          // onChange={() => { row.checked = !row.checked; }}
           />
         </StyledTableCell>
         {columns.map((column, idx) => {
@@ -626,7 +626,7 @@
           </TableBody>
         </Table>
       </TableContainer>
-      <WhTable data={treeDatas} />
+      {/* <WhTable data={treeDatas} /> */}
     </>
   );
 };
diff --git a/rsf-admin/src/page/components/BatchButton.jsx b/rsf-admin/src/page/components/BatchButton.jsx
new file mode 100644
index 0000000..5a46f8d
--- /dev/null
+++ b/rsf-admin/src/page/components/BatchButton.jsx
@@ -0,0 +1,31 @@
+import EditIcon from '@mui/icons-material/Edit';
+import { useState } from 'react';
+import { Button, useListContext } from 'react-admin';
+import BatchModal from './BatchModal';
+
+const ImportButton = (props) => {
+    const [modalOpen, setModalOpen] = useState(false);
+    const { selectedIds } = useListContext();
+    console.log(selectedIds)
+    const handleOpenModal = () => {
+        setModalOpen(true);
+    };
+
+    const handleCloseModal = () => {
+        setModalOpen(false);
+    };
+
+    return (
+        <>
+            <Button
+                startIcon={<EditIcon />}
+                label="common.action.batch"
+                onClick={handleOpenModal}
+            />
+
+            <BatchModal open={modalOpen} onClose={handleCloseModal} {...props} />
+        </>
+    );
+};
+
+export default ImportButton;
\ No newline at end of file
diff --git a/rsf-admin/src/page/components/BatchModal.jsx b/rsf-admin/src/page/components/BatchModal.jsx
new file mode 100644
index 0000000..e2107c7
--- /dev/null
+++ b/rsf-admin/src/page/components/BatchModal.jsx
@@ -0,0 +1,65 @@
+import { useEffect, useState, createContext, useContext } from 'react';
+import { Box, CircularProgress, Stack, Typography } from '@mui/material';
+import Alert from '@mui/material/Alert';
+import Dialog from '@mui/material/Dialog';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+import DialogTitle from '@mui/material/DialogTitle';
+import MuiLink from '@mui/material/Link';
+import {
+    Button,
+    FileField,
+    FileInput,
+    Form,
+    Toolbar,
+    useRefresh,
+    useTranslate,
+    useNotify
+} from 'react-admin';
+import { Link } from 'react-router-dom';
+import DialogCloseButton from './DialogCloseButton';
+import { usePapaParse } from './usePapaParse';
+import MatnrList from '../basicInfo/matnr/MatnrList';
+import request from '@/utils/request'
+import SaveIcon from '@mui/icons-material/Save';
+
+const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {} }) => {
+    const refresh = useRefresh();
+    const translate = useTranslate();
+
+
+    const notify = useNotify();
+
+
+
+    const handleClose = () => {
+        onClose();
+    };
+
+    const handleReset = (e) => {
+        e.preventDefault();
+    };
+
+    const handleSubmit = () => {
+    };
+
+
+    return (
+        <Dialog open={open} maxWidth="md" fullWidth>
+            <DialogCloseButton onClose={handleClose} />
+            <DialogTitle>{translate('common.action.batch')}</DialogTitle>
+            <DialogContent>
+                <div>1</div>
+            </DialogContent>
+            <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
+                    <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
+                        纭
+                    </Button>
+                </Box>
+            </DialogActions>
+        </Dialog>
+    );
+}
+
+export default ImportModal;
\ No newline at end of file
diff --git a/rsf-admin/src/page/components/DictionarySelect.jsx b/rsf-admin/src/page/components/DictionarySelect.jsx
new file mode 100644
index 0000000..43dc811
--- /dev/null
+++ b/rsf-admin/src/page/components/DictionarySelect.jsx
@@ -0,0 +1,45 @@
+import EditIcon from '@mui/icons-material/Edit';
+import { useState, useEffect } from 'react';
+import {
+    Button, useListContext, SelectInput,
+    required,
+    useTranslate, useNotify
+} from 'react-admin';
+import request from '@/utils/request';
+
+const DictionarySelect = (props) => {
+    const { dictTypeCode, name, ...parmas } = props;
+    const { selectedIds } = useListContext();
+    const translate = useTranslate();
+    const notify = useNotify();
+    const [list, setList] = useState([])
+
+    useEffect(() => {
+        http()
+    }, [dictTypeCode]);
+
+    const http = async () => {
+        const res = await request.post('/dictData/page', { dictTypeCode });
+        if (res?.data?.code === 200) {
+
+            setList(res.data.data.records.map((item) => {
+                return {
+                    id: item.value,
+                    name: item.value
+                }
+            }))
+        } else {
+            notify(res.data.msg);
+        }
+    }
+
+    return (
+        <SelectInput
+            source={name}
+            choices={list}
+            {...parmas}
+        />
+    );
+};
+
+export default DictionarySelect;
\ No newline at end of file
diff --git a/rsf-admin/src/page/components/TooltipField.jsx b/rsf-admin/src/page/components/TooltipField.jsx
new file mode 100644
index 0000000..8eb6937
--- /dev/null
+++ b/rsf-admin/src/page/components/TooltipField.jsx
@@ -0,0 +1,28 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import {
+    useRecordContext,
+} from 'react-admin';
+import { Box, Typography, Card, Stack, Tooltip } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+
+const MyField = ({ source, onClick }) => {
+    const record = useRecordContext();
+    const theme = useTheme();
+
+    return record ? (
+        <Box
+
+        >
+            <Typography
+                variant="body2"
+            >
+                <Tooltip title={record[source]} placement="top">
+                    <span>{record[source]}</span>
+                </Tooltip>
+
+            </Typography >
+        </Box>
+    ) : null;
+}
+
+export default MyField;
\ No newline at end of file
diff --git a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx b/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
index f8a68f3..8a95d66 100644
--- a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
+++ b/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
@@ -60,8 +60,6 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
 
     <TextInput source="uuid" label="table.field.warehouseAreas.uuid" />,
     <TextInput source="name" label="table.field.warehouseAreas.name" />,
@@ -73,19 +71,19 @@
     <SelectInput source="flagMinus" label="table.field.warehouseAreas.flagMinus"
         choices={[
             { id: 0, name: '鍚�' },
-            { id:  1, name: '鏄�' },
+            { id: 1, name: '鏄�' },
         ]}
     />,
     <SelectInput source="flagLabelMange" label="table.field.warehouseAreas.flagLabelMange"
         choices={[
             { id: 0, name: ' 鍚�' },
-            { id:  1, name: ' 鏄�' },
+            { id: 1, name: ' 鏄�' },
         ]}
     />,
     <SelectInput source="flagMix" label="table.field.warehouseAreas.flagMix"
         choices={[
             { id: 0, name: '鍚�' },
-            { id:  1, name: '鏄�' },
+            { id: 1, name: '鏄�' },
         ]}
     />,
 
@@ -116,7 +114,7 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.warehouseAreas"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
index 65fc752..9b03b48 100644
--- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
+++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
@@ -60,8 +60,6 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
 
     <NumberInput source="areaId" label="table.field.warehouseAreasItem.areaId" />,
     <TextInput source="areaName" label="table.field.warehouseAreasItem.areaName" />,
@@ -109,7 +107,7 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.warehouseAreasItem"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}

--
Gitblit v1.9.1