From 60a665f3c576f8fe368ddfaabc9117a9c5dd47bf Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期六, 02 八月 2025 09:56:30 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx |  281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 281 insertions(+), 0 deletions(-)

diff --git a/rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx b/rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx
new file mode 100644
index 0000000..70e29ce
--- /dev/null
+++ b/rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx
@@ -0,0 +1,281 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    useNotify,
+    useRefresh,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { Stack, Grid, Box, Typography, Dialog, DialogTitle, DialogContent, TextField, Button, DialogActions } from '@mui/material';
+import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import DialogCloseButton from "../../components/DialogCloseButton.jsx";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import CustomerTopToolBar from "../../components/EditTopToolBar";
+import TreeSelectInput from "@/page/components/TreeSelectInput";
+import EditBaseAside from "../../components/EditBaseAside";
+import MemoInput from "../../components/MemoInput";
+import SaveIcon from '@mui/icons-material/Save';
+import { DataGrid } from '@mui/x-data-grid';
+import * as Common from '@/utils/common';
+import request from '@/utils/request';
+
+
+const CreateBySelectMats = (props) => {
+    const { open, setOpen, data, setData, queryForm } = props;
+    const [page, setPage] = useState({ page: DEFAULT_START_PAGE, pageSize: DEFAULT_PAGE_SIZE });
+    const [rowCount, setRowCount] = useState(0);
+    const [isLoading, setIsLoading] = useState(false);
+    const [formData, setFormData] = useState({});
+    const [tableData, setTableData] = useState([]);
+    const [dyFields, setDyFields] = useState([]);
+    const [pageSize, setPageSize] = useState(25);
+    const [selectedRows, setSelectedRows] = useState([]);
+    const translate = useTranslate();
+    const notify = useNotify();
+    const refresh = useRefresh();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleChange = (e) => {
+        const { name, value } = e.target;
+        setFormData(() => ({
+            [name]: value
+        }));
+    };
+
+    const reset = () => {
+        setFormData({
+            maktx: '',
+            matnrCode: '',
+        })
+    }
+
+    const handleSubmit = () => {
+        const hasarr = data.map(el => +el.matnrId)
+        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.matnrId,
+                maktx: el.maktx,
+                matnrCode: el.matnrCode,
+                anfme: el.anfme,
+                batch: el.batch,
+                spec: el.spec,
+                model: el.model,
+                fieldsIndex: el.fieldsIndex,
+                stockUnit: el.unit || '',
+                ...dynamicFields
+            }
+        }));
+        setData([...data, ...value]);
+        setOpen(false);
+        reset();
+    };
+
+    const getData = async () => {
+        let params = {
+            ...formData,
+            orgAreaId: queryForm?.orgAreaId,
+            current: page?.page,
+            pageSize: page?.pageSize,
+            orderBy: "create_time desc"
+        };
+        setIsLoading(true)
+        const res = await request.post(`/transfer/locs/items`, params);
+        if (res?.data?.code === 200) {
+            const { data } = res.data;
+            setTableData(data?.records);
+            setRowCount(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="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 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="maktx"
+                                value={formData.maktx}
+                                onChange={handleChange}
+                                size="small"
+                            />
+                        </Grid>
+                        <Grid item md={3}>
+                            <TextField
+                                label={translate('table.field.matnr.code')}
+                                name="matnrCode"
+                                value={formData.matnrCode}
+                                onChange={handleChange}
+                                size="small"
+                            />
+                        </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%' }}>
+                    <SelectMatsTableView
+                        tableData={tableData}
+                        setTableData={setTableData}
+                        page={page}
+                        rowCount={rowCount}
+                        pageSize={pageSize}
+                        setPage={setPage}
+                        isLoading={isLoading}
+                        setPageSize={setPageSize}
+                        dyFields={dyFields}
+                        setDyFields={setDyFields}
+                        selectedRows={selectedRows}
+                        setSelectedRows={setSelectedRows}
+                    />
+                </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>
+    );
+}
+
+export default CreateBySelectMats;
+
+
+const SelectMatsTableView = ({ tableData, page, isLoading, pageSize, setPage, setPageSize, rowCount, setTableData, selectedRows, setSelectedRows, dyFields, setDyFields }) => {
+    const translate = useTranslate();
+    const notify = useNotify();
+    const [extendColumns, setExtendColumns] = useState([]);
+
+    const [columns, setColumns] = useState([
+        { field: 'maktx', headerName: translate('table.field.matnr.name'), width: 300 },
+        { field: 'matnrCode', headerName: translate('table.field.matnr.code'), width: 200 },
+        { field: 'locCode', headerName: translate('table.field.locItem.locCode'), width: 100 },
+        { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 },
+        { field: 'batch', headerName: translate('table.field.locItem.batch'), width: 100 },
+        { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 },
+        { field: 'anfme', headerName: translate('table.field.locItem.anfme'), width: 100 },
+        { field: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 },
+        { field: 'wareArea', headerName: translate('table.field.locItem.wareArea'), width: 100, sortable: false },
+    ])
+
+    const handleSelectionChange = (ids) => {
+        setSelectedRows(ids)
+    };
+
+    useEffect(() => {
+        if (extendColumns == undefined || extendColumns.length < 1) {
+            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] || '';
+                },
+            }))
+            setExtendColumns(cols);
+            setDyFields(data)
+            setColumns([...columns, ...cols])
+        } else {
+            notify(msg);
+        }
+    }
+
+    return (
+        <div style={{ height: 590, width: '100%' }}>
+            <DataGrid
+                rows={tableData}
+                rowCount={rowCount}
+                columns={columns}
+                paginationMode="server"
+                paginationModel={page}
+                checkboxSelection
+                onPaginationModelChange={setPage}
+                onRowSelectionModelChange={handleSelectionChange}
+                selectionModel={selectedRows}
+                disableColumnMenu={true}
+                disableColumnSorting
+                disableMultipleColumnsSorting
+                loading={isLoading}
+                slotProps={{
+                    loadingOverlay: {
+                        variant: 'linear-progress',
+                        noRowsVariant: 'linear-progress',
+                    },
+                }}
+            />
+        </div>
+    );
+};

--
Gitblit v1.9.1