From b31c46000e83273cc9a27686dc0aef7bece2b027 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 06 八月 2025 14:06:59 +0800
Subject: [PATCH] 库存调整功能优化

---
 rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx     |   11 
 rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx    |  296 ++++++++++++++++-------------
 rsf-admin/src/page/stockManage/locRevise/SelectMatnrInfo.jsx   |  261 ++++++++++++++++++++++++++
 rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx |    7 
 rsf-admin/src/i18n/zh.js                                       |    2 
 rsf-admin/src/i18n/en.js                                       |    2 
 rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx  |    2 
 7 files changed, 441 insertions(+), 140 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index e9073c7..bb04d47 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1133,8 +1133,10 @@
                 trackCode: "trackCode",
                 unit: "unit",
                 anfme: "anfme",
+                outQty: 'Revise Qty',
                 qty: 'Qty',
                 workQty: 'Work Qty',
+                reviseQty: 'Revise Qty',
                 batch: "batch",
                 splrBatch: "splrBatch",
                 spec: "spec",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index f33d267..74d5ae8 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -1138,9 +1138,11 @@
                 maktx: "鐗╂枡鍚嶇О",
                 unit: '鍗曚綅',
                 anfme: '鏁伴噺',
+                outQty: '璋冩暣鏁伴噺',
                 matnrCode: "鐗╂枡缂栫爜",
                 trackCode: "璺熻釜鐮�",
                 workQty: '鎵ц鏁�',
+                reviseQty: '瀹為檯鏁伴噺',
                 qty: '瀹屾垚鏁�',
                 batch: "鎵规",
                 splrBatch: "鎵规",
diff --git a/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx b/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
index 2ec826c..04602df 100644
--- a/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useRef } from "react";
 import {
     Dialog,
     DialogActions,
@@ -19,8 +19,9 @@
 import { useTranslate, useNotify, useRefresh, DatagridConfigurable, useGetOne } from 'react-admin';
 import DialogCloseButton from "../../components/DialogCloseButton";
 import { Add, Edit, Delete, Save } from '@mui/icons-material';
+import { DataGrid, useGridApiRef } from '@mui/x-data-grid';
+import SelectMatnrInfo from "./SelectMatnrInfo";
 import SaveIcon from '@mui/icons-material/Save';
-import { DataGrid } from '@mui/x-data-grid';
 import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -36,22 +37,27 @@
 }));
 
 const LocsReviseDetl = (props) => {
-    const { open, setOpen, locRevise } = props;
+    const { open, setOpen, record } = props;
     const handleClose = (event, reason) => {
         if (reason !== "backdropClick") {
             setOpen(false);
         }
     };
+
     const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_stock_revise_type')) || [];
     const [page, setPage] = useState({ page: DEFAULT_START_PAGE, pageSize: DEFAULT_PAGE_SIZE });
-    const [formData, setFormData] = useState({ useStatus: 'F', code: null });
+    const [formData, setFormData] = useState({ locCode: record?.locCode });
     const [selectedRows, setSelectedRows] = useState([]);
     const [isLoading, setIsLoading] = useState(false);
     const [tableData, setTableData] = useState([]);
+    const [openMatnr, setOpenMatnr] = useState();
+    const [dyFields, setDyFields] = useState([]);
     const [rowCount, setRowCount] = useState(0);
     const translate = useTranslate();
     const refresh = useRefresh();
     const notify = useNotify();
+    const tableRef = useRef()
+
 
     const handleChange = (e) => {
         const { name, value } = e.target;
@@ -62,20 +68,21 @@
     };
 
     const handleSubmit = () => {
-        const selectedData = tableData.filter(item => selectedRows.includes(item.id));
+        const rows = tableRef.current.getSelectedRows();
+        const selectedData = [...rows.entries()].map(([Key, value]) => value)
         const value = selectedData.map((el => {
             return {
                 id: el.id,
-                code: el.code,
-                areaId: el.areaId,
-                barcode: el.barcode || '',
-                channel: el.channel || '',
-                col: el.col,
-                lev: el.lev,
-                row: el.row,
-                type: el.type,
-                useStatus: el.useStatus,
-                warehouseId: el.warehouseId,
+                locCode: el.locCode,
+                matnrId: el.matnrId,
+                maktx: el.maktx || '',
+                matnrCode: el.matnrCode || '',
+                batch: el.batch,
+                anfme: el.anfme,
+                reviseQty: el.reviseQty,
+                spec: el.spec,
+                model: el.model,
+                unit: el.unit,
             }
         }));
 
@@ -84,10 +91,12 @@
 
     const saveReviseLog = async (values) => {
         const parmas = {
-            reviseId: locRevise,
+            reviseLogId: record?.id,
             items: values,
         }
-        const res = await request.post(`/reviseLog/items/save`, parmas);
+        console.log(values);
+
+        const res = await request.post(`/reviseLogItem/items/save`, parmas);
         if (res?.data?.code === 200) {
             setOpen(false);
             refresh()
@@ -98,8 +107,10 @@
 
     const getData = async () => {
         setIsLoading(true)
+        console.log(formData);
+
         const res = await request.post(`/locItem/page`, {
-            ...formData,
+            locCode: record?.locCode,
             current: page?.page,
             pageSize: page?.pageSize,
             orderBy: "create_time desc"
@@ -118,31 +129,33 @@
     }, [open, page]);
 
     const handleSearch = () => {
-        getData()
+        // getData()
+        setOpenMatnr(true)
     };
 
     return (
-        <Dialog
-            open={open}
-            onClose={handleClose}
-            aria-labelledby="form-dialog-title"
-            fullWidth
-            disableRestoreFocus
-            maxWidth="xl"
-        >
-            <DialogTitle id="form-dialog-title" sx={{
-                position: 'sticky',
-                top: 0,
-                backgroundColor: 'background.paper',
-                zIndex: 1000
-            }}>
-                {translate("common.action.newAddMats")}
-                <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                    <DialogCloseButton onClose={handleClose} />
-                </Box>
-            </DialogTitle>
-            <DialogContent sx={{ mt: 2 }}>
-                {/* <Box>
+        <>
+            <Dialog
+                open={open}
+                onClose={handleClose}
+                aria-labelledby="form-dialog-title"
+                fullWidth
+                disableRestoreFocus
+                maxWidth="xl"
+            >
+                <DialogTitle id="form-dialog-title" sx={{
+                    position: 'sticky',
+                    top: 0,
+                    backgroundColor: 'background.paper',
+                    zIndex: 1000
+                }}>
+                    {translate("common.action.newAddMats")}
+                    <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                        <DialogCloseButton onClose={handleClose} />
+                    </Box>
+                </DialogTitle>
+                <DialogContent sx={{ mt: 2 }}>
+                    {/* <Box>
                     <List
                         sx={{
                             flexGrow: 1,
@@ -174,157 +187,174 @@
                         </StyledDatagrid>
                     </List>
                 </Box> */}
-                <Box>
-                    <Box component="form" onSubmit={handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
-                        <Grid container spacing={2} md={6}>
-                            <Grid item md={4}>
-                                <TextField
-                                    label={translate('table.field.locItem.locCode')}
-                                    name="code"
-                                    value={formData.code}
-                                    onChange={handleChange}
-                                    size="small"
-                                />
+                    <Box>
+                        <Box component="form" onSubmit={handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 3, justifyContent: 'flex-end' }}>
+                            <Grid item md={12} sx={{ justifyContent: 'flex-end', display: 'flex' }}>
+                                <Button variant="text" onClick={handleSearch}>{translate("page.whMat.title.add")}</Button>
                             </Grid>
-                            <Grid item md={2} sx={{ margin: 'auto' }}>
-                                <Button variant="contained" onClick={handleSearch}>{translate("toolbar.query")}</Button>
-                            </Grid>
-                        </Grid>
+                        </Box>
+                        <Box sx={{ mt: 2, height: 600, width: '100%' }}>
+                            <SelectReviseMatnr
+                                page={page}
+                                setPage={setPage}
+                                tableRef={tableRef}
+                                rowCount={rowCount}
+                                dyFields={dyFields}
+                                isLoading={isLoading}
+                                tableData={tableData}
+                                selectedRows={selectedRows}
+                                setDyFields={setDyFields}
+                                setTableData={setTableData}
+                                setSelectedRows={setSelectedRows}
+                            />
+                        </Box>
                     </Box>
-                    <Box sx={{ mt: 2, height: 600, width: '100%' }}>
-                        <AsnWareModalTable
-                            tableData={tableData}
-                            setTableData={setTableData}
-                            page={page}
-                            rowCount={rowCount}
-                            setPage={setPage}
-                            isLoading={isLoading}
-                            selectedRows={selectedRows}
-                            setSelectedRows={setSelectedRows}
-                        />
+                </DialogContent>
+                <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                    <Box sx={{ width: '100%', display: 'flex', justifyContent: 'flex-end' }}>
+                        <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
+                            {translate('toolbar.confirm')}
+                        </Button>
                     </Box>
-                </Box>
-            </DialogContent>
-            <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'flex-end' }}>
-                    <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
-                        {translate('toolbar.confirm')}
-                    </Button>
-                </Box>
-            </DialogActions>
-        </Dialog>
+                </DialogActions>
+            </Dialog>
+            <SelectMatnrInfo open={openMatnr} setOpen={setOpenMatnr} setData={setTableData} data={tableData} />
+        </>
     );
 };
 
 export default LocsReviseDetl;
 
-const AsnWareModalTable = ({ tableData, setTableData, page, isLoading, pageSize, setPage, rowCount, selectedRows, setSelectedRows }) => {
+const SelectReviseMatnr = ({ tableData, setTableData, page, isLoading, setPage, rowCount, selectedRows, setSelectedRows, tableRef, setDyFields, dyFields }) => {
     const translate = useTranslate();
     const notify = useNotify();
-
+    const [dynamicFields, setDynamicFields] = useState([]);
     const [columns, setColumns] = useState([
         {
-            field: 'code',
-            headerName: translate('table.field.locItem.locCode'),
-            width: 110,
-            editable: false,
-        },
-        {
-            field: 'warehouseId$',
-            headerName: translate('table.field.loc.warehouseId'),
-            minWidth: 100,
-            flex: 1,
-            editable: false,
-        },
-        {
-            field: 'areaId$',
-            headerName: translate('table.field.loc.areaId'),
+            field: 'matnrCode',
+            headerName: translate('table.field.locItem.matnrCode'),
             width: 130,
             editable: false,
         },
         {
-            field: 'typeIds$',
-            headerName: translate('table.field.loc.type'),
+            field: 'maktx',
+            headerName: translate('table.field.locItem.maktx'),
             minWidth: 100,
             flex: 1,
             editable: false,
         },
         {
-            field: 'barcode',
-            headerName: translate('table.field.loc.barcode'),
+            field: 'batch',
+            headerName: translate('table.field.locItem.batch'),
+            minWidth: 100,
+            flex: 1,
+            editable: true,
+        },
+        {
+            field: 'anfme',
+            headerName: translate('table.field.locItem.anfme') + "*",
             minWidth: 100,
             flex: 1,
             editable: false,
         },
         {
-            field: 'useStatus$',
-            headerName: translate('table.field.loc.useStatus') + "*",
+            field: 'reviseQty',
+            headerName: translate('table.field.locItem.outQty') + "*",
+            minWidth: 100,
+            type: 'number',
+            flex: 1,
+            editable: true,
+        },
+        {
+            field: 'spec',
+            headerName: translate('table.field.locItem.spec'),
             minWidth: 100,
             flex: 1,
             editable: false,
         },
         {
-            field: 'channel',
-            headerName: translate('table.field.loc.channel'),
+            field: 'model',
+            headerName: translate('table.field.locItem.model'),
             minWidth: 100,
             flex: 1,
             editable: false,
         },
         {
-            field: 'row',
-            headerName: translate('table.field.loc.row'),
+            field: 'unit',
+            headerName: translate('table.field.locItem.unit'),
             minWidth: 100,
             flex: 1,
             editable: false,
         },
-        {
-            field: 'col',
-            headerName: translate('table.field.loc.col'),
-            minWidth: 100,
-            flex: 1,
-            editable: false,
-        },
-        {
-            field: 'lev',
-            headerName: translate('table.field.loc.lev'),
-            minWidth: 100,
-            flex: 1,
-            editable: false,
-        },
-        // {
-        //     field: 'action',
-        //     headerName: '鎿嶄綔',
-        //     width: 140,
-        //     lockPosition: 'left',
-        //     renderCell: (params) => (
-        //         <Tooltip title="Delete">
-        //             <IconButton onClick={() => handleDelete(params.row)}>
-        //                 <Delete />
-        //             </IconButton>
-        //             <IconButton onClick={() => handleDelete(params.row)}>
-        //                 <Save />
-        //             </IconButton>
-        //         </Tooltip>
-        //     ),
-        // }
     ])
 
+    const operate = {
+        field: 'action',
+        headerName: '鎿嶄綔',
+        width: 140,
+        lockPosition: 'left',
+        renderCell: (params) => (
+            <Tooltip title="Delete">
+                <IconButton onClick={() => handleDelete(params.row)}>
+                    <Delete />
+                </IconButton>
+            </Tooltip>
+        ),
+    }
+
+    const handleDelete = (rows) => {
+        const tableRows = tableData.filter(item => item.matnrCode != rows.matnrCode);
+        setTableData(tableRows);
+    }
 
     const handleSelectionChange = (ids) => {
         setSelectedRows(ids)
     };
+
+    useEffect(() => {
+        if (dynamicFields.length < 1) {
+            getDynamicFields();
+        }
+    }, [dyFields]);
+
+    const getDynamicFields = async () => {
+        const {
+            data: { code, data, msg },
+        } = await request.get("/fields/enable/list");
+        if (code === 200) {
+            const cols = data.map(el => ({
+                field: el.fields,
+                headerName: el.fieldsAlise,
+                minWidth: 100,
+                flex: 1,
+                editable: el.unique,
+                valueGetter: (value, row) => {
+                    return row.extendFields?.[el.fields] || '';
+                },
+            }))
+            setDyFields(data)
+            setDynamicFields(cols);
+            setColumns([...columns, ...cols, operate])
+        } else {
+            notify(msg);
+        }
+    }
+
+    tableRef.current = useGridApiRef();
 
     return (
         <div style={{ width: '100%' }}>
             <DataGrid
                 sx={{ height: 600 }}
                 size="small"
+                apiRef={tableRef}
                 rows={tableData}
                 columns={columns}
                 checkboxSelection
                 onRowSelectionModelChange={handleSelectionChange}
                 selectionModel={selectedRows}
                 disableColumnMenu={true}
+                disableRowSelectionOnClick
                 disableColumnSorting
                 disableMultipleColumnsSorting
                 rowCount={rowCount}
diff --git a/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx b/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
index 504001e..d0a6fec 100644
--- a/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
@@ -73,7 +73,8 @@
                 title={"menu.reviseLogItem"}
                 empty={false}
                 filters={false}
-                filter={{reviseLogId: record?.id}}
+                pagination={false}
+                filter={{ reviseLogId: record?.id }}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={false}
                 perPage={DEFAULT_PAGE_SIZE}
@@ -84,14 +85,14 @@
                     rowClick={(id, resource, record) => false}
                     expand={false}
                     expandSingle={true}
-                    omit={['id', 'locId', 'matnrId', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'locId', 'locCode', 'matnrId', 'fieldsIndex', 'memo', 'statusBool']}
                 >
                     <NumberField source="id" />
                     <NumberField source="locId" label="table.field.locItem.locId" />
                     <TextField source="locCode" label="table.field.locItem.locCode" />
                     <NumberField source="matnrId" label="table.field.locItem.matnrId" />
-                    <TextField source="maktx" label="table.field.locItem.maktx" />
                     <TextField source="matnrCode" label="table.field.locItem.matnrCode" />
+                    <TextField source="maktx" label="table.field.locItem.maktx" />
                     <TextField source="unit" label="table.field.locItem.unit" />
                     <NumberField source="anfme" label="table.field.locItem.anfme" />
                     <NumberField source="reviseQty" label="table.field.locItem.reviseQty" />
diff --git a/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx b/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
index 761ee8f..e5408cf 100644
--- a/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
@@ -88,6 +88,7 @@
 const ReviseLogList = () => {
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
+    const [item, setItem] = useState();
     const translate = useTranslate();
     const orderId = useGetRecordId();
 
@@ -127,6 +128,7 @@
                     <NumberField source="id" />
                     <NumberField source="reviseId" label="table.field.reviseLog.reviseId" />
                     <TextField source="reviseCode" label="table.field.reviseLog.reviseCode" />
+                    <TextField source="locCode" label="table.field.locItem.locCode" />
                     <NumberField source="warehouseId" label="table.field.loc.warehouseId" />
                     <NumberField source="areaId" label="table.field.loc.areaId" />
                     <NumberField source="type" label="table.field.loc.type" />
@@ -143,7 +145,7 @@
                     <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
-                        <EditLocRevise setDrawerVal={setDrawerVal}/>
+                        <EditLocRevise setDrawerVal={setDrawerVal} setItem={setItem} />
                         <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} redirect={false} />
                     </WrapperField>
                 </StyledDatagrid>
@@ -155,6 +157,7 @@
             />
             <LocsReviseDetl
                 open={drawerVal}
+                record={item}
                 setOpen={setDrawerVal}
             />
         </Box>
@@ -163,11 +166,13 @@
 
 export default ReviseLogList;
 
-const EditLocRevise = ({ setDrawerVal }) => {
+const EditLocRevise = ({ setDrawerVal, setItem }) => {
     const record = useRecordContext();
+    console.log("=======>");
+    console.log(record);
     const editRevise = () => {
-        console.log(record);
         setDrawerVal(true)
+        setItem(record)
     }
 
     return (
diff --git a/rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx b/rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx
index ab887f6..4052be8 100644
--- a/rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx
@@ -66,7 +66,7 @@
         const value = selectedData.map((el => {
             return {
                 id: el.id,
-                code: el.code,
+                locCode: el.code,
                 areaId: el.areaId,
                 barcode: el.barcode || '',
                 channel: el.channel || '',
diff --git a/rsf-admin/src/page/stockManage/locRevise/SelectMatnrInfo.jsx b/rsf-admin/src/page/stockManage/locRevise/SelectMatnrInfo.jsx
new file mode 100644
index 0000000..3ee7df3
--- /dev/null
+++ b/rsf-admin/src/page/stockManage/locRevise/SelectMatnrInfo.jsx
@@ -0,0 +1,261 @@
+import React, { useState, useEffect } from "react";
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    TextField,
+    Box,
+    Button,
+    Paper,
+    styled
+} from '@mui/material';
+
+import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import DialogCloseButton from "../../components/DialogCloseButton";
+import { useTranslate, useNotify, useRefresh } from 'react-admin';
+import TreeSelectInput from "@/page/components/TreeSelectInput";
+import QueryStatsIcon from '@mui/icons-material/QueryStats';
+import SaveIcon from '@mui/icons-material/Save';
+import { DataGrid } from '@mui/x-data-grid';
+import request from '@/utils/request';
+
+const SelectMatnrInfo = (props) => {
+    const { open, setOpen, data, setData } = props;
+    const translate = useTranslate();
+    const refresh = useRefresh();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const [page, setPage] = useState({ page: DEFAULT_START_PAGE, pageSize: DEFAULT_PAGE_SIZE });
+    const [selectedRows, setSelectedRows] = useState([]);
+    const [isLoading, setIsLoading] = useState(false);
+    const [tableData, setTableData] = useState([]);
+    const [formData, setFormData] = useState({});
+    const [dyFields, setDyFields] = useState([]);
+    const [rowCount, setRowCount] = useState(0);
+    const handleChange = (e) => {
+        const { name, value } = e.target;
+        setFormData(() => ({
+            [name]: value
+        }));
+    };
+
+    const reset = () => {
+        setFormData({
+            name: null,
+            code: null,
+        })
+    }
+
+    const handleSubmit = () => {
+        const hasarr = data.map(el => +el.id)
+        const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id)));
+        const value = selectedData.map((el => {
+            const dynamicFields = dyFields.reduce((acc, item) => {
+                acc[item.fields] = el['extendFields']?.[item.fields] || '';
+                return acc;
+            }, {});
+            return {
+                id: el.id,
+                matnrId: el.id,
+                maktx: el.name,
+                matnrCode: el.code,
+                batch: el.splrBatch,
+                unit: el.stockUnit || '',
+                spec: el.spec,
+                model: el.model,
+                fieldsIndex: el.fieldsIndex,
+                purUnit: el.purchaseUnit || '',
+                ...dynamicFields
+            }
+        }))
+        setData([...data, ...value]);
+        setOpen(false);
+        reset();
+    };
+
+    const getData = async () => {
+        setIsLoading(true)
+        const res = await request.post(`/matnr/page`, {
+            ...formData,
+            current: page?.page,
+            pageSize: page?.pageSize,
+            orderBy: "create_time desc"
+        });
+        if (res?.data?.code === 200) {
+            setTableData(res.data.data.records);
+            setRowCount(res.data?.data?.total);
+        } else {
+            notify(res.data.msg);
+        }
+        setIsLoading(false)
+    };
+
+    useEffect(() => {
+        getData();
+    }, [open, page]);
+
+    const handleSearch = () => {
+        getData()
+    };
+
+    return (
+        <Dialog
+            open={open}
+            onClose={handleClose}
+            aria-labelledby="form-dialog-title"
+            fullWidth
+            disableRestoreFocus
+            maxWidth="lg"
+        >
+            <DialogTitle id="form-dialog-title" sx={{
+                position: 'sticky',
+                top: 0,
+                backgroundColor: 'background.paper',
+                zIndex: 1000
+            }}>
+                {translate("common.action.newAddMats")}
+                <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                    <DialogCloseButton onClose={handleClose} />
+                </Box>
+            </DialogTitle>
+            <DialogContent sx={{ mt: 2, }}>
+                <Box component="form" onSubmit={handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
+                    <Grid container spacing={2}>
+                        <Grid item md={3}>
+                            <TextField
+                                label={translate('table.field.matnr.name')}
+                                name="name"
+                                value={formData.name}
+                                onChange={handleChange}
+                                size="small"
+                            />
+                        </Grid>
+                        <Grid item md={3}>
+                            <TextField
+                                label={translate('table.field.matnr.code')}
+                                name="code"
+                                value={formData.code}
+                                onChange={handleChange}
+                                size="small"
+                            />
+                        </Grid>
+                        <Grid item md={3} sx={{display: "flex", margin: 2}}>
+                            <Button variant="contained" onClick={handleSearch} startIcon={<QueryStatsIcon />}>{translate("toolbar.query")}</Button>
+                        </Grid>
+                    </Grid>
+                </Box>
+                <Box sx={{ mt: 2, height: 400, width: '100%' }}>
+                    <AsnWareModalTable
+                        tableData={tableData}
+                        setTableData={setTableData}
+                        dyFields={dyFields}
+                        page={page}
+                        rowCount={rowCount}
+                        setPage={setPage}
+                        isLoading={isLoading}
+                        setDyFields={setDyFields}
+                        selectedRows={selectedRows}
+                        setSelectedRows={setSelectedRows}
+                    />
+                </Box>
+            </DialogContent>
+            <DialogActions sx={{ position: 'sticky', bottom: 1, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'flex-end' }}>
+                    <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}>
+                        {translate('toolbar.confirm')}
+                    </Button>
+                </Box>
+            </DialogActions>
+        </Dialog>
+    );
+};
+
+export default SelectMatnrInfo;
+
+const AsnWareModalTable = ({ tableData, setTableData, page, isLoading, pageSize, setPage, rowCount, selectedRows, setSelectedRows, dyFields, setDyFields }) => {
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const [columns, setColumns] = useState([
+        // { field: 'id', headerName: 'ID', width: 100 },
+        { field: 'name', headerName: translate('table.field.matnr.name'), width: 300 },
+        { field: 'code', headerName: translate('table.field.matnr.code'), width: 200 },
+        { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), width: 100 },
+        { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 },
+        { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 },
+        { field: 'weight', headerName: translate('table.field.matnr.weight'), width: 100 },
+        { field: 'describle', headerName: translate('table.field.matnr.describle'), width: 100 },
+        { field: 'nromNum', headerName: translate('table.field.matnr.nromNum'), width: 100 },
+        { field: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 },
+        { field: 'purchaseUnit', headerName: translate('table.field.matnr.purUnit'), width: 100 },
+        { field: 'stockUnit', headerName: translate('table.field.matnr.stockUnit'), width: 100 },
+        { field: 'stockLeval$', headerName: translate('table.field.matnr.stockLevel'), width: 100, sortable: false },
+    ])
+
+
+    const handleSelectionChange = (ids) => {
+        setSelectedRows(ids)
+    };
+
+    useEffect(() => {
+        getDynamicFields();
+    }, []);
+
+    const getDynamicFields = async () => {
+        const {
+            data: { code, data, msg },
+        } = await request.get("/fields/enable/list");
+        if (code === 200) {
+            const cols = data.map(el => ({
+                field: el.fields,
+                headerName: el.fieldsAlise,
+                minWidth: 100,
+                flex: 1,
+                editable: el.unique,
+                valueGetter: (value, row) => {
+                    return row.extendFields?.[el.fields] || '';
+                },
+            }))
+            setDyFields(data)
+            setColumns([...columns, ...cols])
+        } else {
+            notify(msg);
+        }
+    }
+
+    return (
+        <div style={{ height: 400, width: '100%' }}>
+            <DataGrid
+                size="small"
+                rows={tableData}
+                columns={columns}
+                checkboxSelection
+                onRowSelectionModelChange={handleSelectionChange}
+                selectionModel={selectedRows}
+                disableColumnMenu={true}
+                disableColumnSorting
+                disableMultipleColumnsSorting
+                rowCount={rowCount}
+                paginationMode="server"
+                paginationModel={page}
+                onPaginationModelChange={setPage}
+                loading={isLoading}
+                slotProps={{
+                    loadingOverlay: {
+                        variant: 'linear-progress',
+                        noRowsVariant: 'linear-progress',
+                    },
+                }}
+            />
+        </div>
+    );
+};
\ No newline at end of file

--
Gitblit v1.9.1