skyouc
5 天以前 106763754c09ae3637b8c9339139affcdf70dd43
库存调整单添加修改明细
6个文件已修改
3个文件已添加
1个文件已删除
1048 ■■■■ 已修改文件
rsf-admin/src/i18n/en.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/LocReviseCreate.jsx 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/LocRevisePanel.jsx 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx 344 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -912,6 +912,10 @@
                orgAreaName: "Area Name",
                exceTime: "Exce Time"
            },
            reviseLog: {
                reviseId: 'Revise Id',
                reviseCode: 'Revise Code',
            },
            waitPakinItem: {
                pakinId: "pakinId",
                maktx: "maktx",
rsf-admin/src/i18n/zh.js
@@ -949,6 +949,10 @@
                areaName: "库区",
                exceTime: "调整时间",
            },
            reviseLog: {
                reviseId: '调整单ID',
                reviseCode: '调整单',
            },
            waitPakinItem: {
                pakinId: "组托Id",
                maktx: "物料",
rsf-admin/src/page/stockManage/locRevise/LocReviseCreate.jsx
@@ -23,9 +23,12 @@
    CreateBase,
    TopToolbar,
    FilterButton,
    ReferenceField,
    SearchInput,
    List,
    Create,
    useGetOne,
    useRecordContext,
} from 'react-admin';
import {
    Dialog,
@@ -59,6 +62,23 @@
import request from '@/utils/request';
import _, { set } from 'lodash';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const LocReviseCreate = (props) => {
    const { open, setOpen, orderId } = props;
    const tableRef = useRef();
@@ -66,21 +86,14 @@
    const refresh = useRefresh();
    const translate = useTranslate();
    const [tabelData, setTableData] = useState([]);
    const [locRevise, setLocRevise] = useState();
    const [disabled, setDisabled] = useState(false);
    const [isVisible, setIsVisible] = useState("block");
    const [isVisible, setIsVisible] = useState("none");
    const [selectedRows, setSelectedRows] = useState([]);
    const [createDialog, setCreateDialog] = useState(false);
    const [formData, setFormData] = useState({ type: '0', orgAreaId: null, tarAreaId: null, exceTime: null, code: null });
    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_stock_revise_type')) || [];
    const setFinally = () => {
        const rows = tableRef.current.state.editRows;
        for (const key in rows) {
            const find = tabelData.find(item => item.matnrId === +key);
            find.anfme = rows[key].anfme.value;
        }
        setTableData([...tabelData]);
    }
    const FormToolbar = () => {
        return (
@@ -133,26 +146,22 @@
    }
    const mutationOptions = {
        onSuccess: (data) => {
        onSuccess: (id) => {
            setIsVisible("block")
            setDisabled(true)
            setLocRevise(id)
            refresh()
        },
    };
    const handleChange = (value, name) => {
        setFormData((prevData) => ({
            ...prevData,
            [name]: value
        }));
    };
    return (
        <>
            <Box sx={{ padding: 1 }}>
                <Create resource="locRevise"
                <Create
                    resource="locRevise"
                    title={false}
                    mutationOptions={mutationOptions} >
                    // mutationOptions={mutationOptions}
                     >
                    <SimpleForm toolbar={<FormToolbar />}>
                        <Grid container spacing={2} sx={{
                            '& .MuiToolbar-root-RaToolbar-root.RaToolbar-defaultToolbar': {
@@ -202,14 +211,54 @@
                                </Stack>
                            </Box>
                            <Box sx={{ mt: 2 }}>
                                <TransferTableView
                                    tabelData={tabelData}
                                    setTableData={setTableData}
                                    orderId={orderId}
                                    selectedRows={selectedRows}
                                    setSelectedRows={setSelectedRows}
                                    tableRef={tableRef}>
                                </TransferTableView>
                                <List
                                    sx={{
                                        flexGrow: 1,
                                        transition: (theme) =>
                                            theme.transitions.create(['all'], {
                                                duration: theme.transitions.duration.enteringScreen,
                                            }),
                                    }}
                                    resource="reviseLog"
                                    title={"menu.reviseLog"}
                                    empty={false}
                                    filters={false}
                                    sort={{ field: "create_time", order: "desc" }}
                                    actions={false}
                                    perPage={DEFAULT_PAGE_SIZE}
                                >
                                    <StyledDatagrid
                                        preferenceKey='reviseLog'
                                        bulkActionButtons={false}
                                        rowClick={(id, resource, record) => false}
                                        expand={false}
                                        expandSingle={true}
                                        omit={['id', 'reviseId', 'createTime', 'createBy', 'memo']}
                                    >
                                        <NumberField source="id" />
                                        <NumberField source="reviseId" label="table.field.reviseLog.reviseId" />
                                        <TextField source="reviseCode" label="table.field.reviseLog.reviseCode" />
                                        <NumberField source="warehouseId" label="table.field.loc.warehouseId" />
                                        <NumberField source="areaId" label="table.field.loc.areaId" />
                                        <NumberField source="type" label="table.field.loc.type" />
                                        <TextField source="barcode" label="table.field.loc.barcode" />
                                        <TextField source="useStatus" label="table.field.loc.useStatus" />
                                        <NumberField source="channel" label="table.field.loc.channel" />
                                        <NumberField source="row" label="table.field.loc.row" />
                                        <NumberField source="col" label="table.field.loc.col" />
                                        <NumberField source="lev" label="table.field.loc.lev" />
                                        <TextField source="updateBy$" label="common.field.updateBy" />
                                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                                        <TextField source="createBy$" label="common.field.createBy" />
                                        <DateField source="createTime" label="common.field.createTime" showTime />
                                        <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">
                                            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                                        </WrapperField>
                                    </StyledDatagrid>
                                </List>
                            </Box>
                        </Box>
                    </Card>
@@ -217,6 +266,7 @@
                <SelectLocsRevise
                    data={tabelData}
                    queryForm={formData}
                    locRevise={locRevise}
                    open={createDialog}
                    setOpen={setCreateDialog}
                    selectedRows={selectedRows}
rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx
@@ -28,91 +28,100 @@
import CustomerTopToolBar from "@/page/components/EditTopToolBar";
import MemoInput from "@/page/components/MemoInput";
import StatusSelectInput from "@/page/components/StatusSelectInput";
import ReviseLogList from "./ReviseLogList";
const LocReviseEdit = () => {
    const translate = useTranslate();
    const [disabled, setDisabled] = useState(false);
    const FormToolbar = () => {
        return (
            <Toolbar sx={{ justifyContent: 'flex-end' }}>
                <SaveButton disabled={disabled} />
                <DeleteButton mutationMode="optimistic" />
            </Toolbar>
        )
    }
    return (
        <Edit
            redirect="list"
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
        >
            <SimpleForm
                shouldUnregister
                warnWhenUnsavedChanges
                toolbar={false}
                mode="onTouched"
                defaultValues={{}}
                sx={{
                    "& .MuiFormLabel-root.MuiInputLabel-root.Mui-disabled": {
                        bgcolor: 'white',
                        WebkitTextFillColor: "rgba(0, 0, 0)"
                    },
                    "& .MuiInputBase-input.MuiFilledInput-input.Mui-disabled": {
                        bgcolor: 'white',
                        WebkitTextFillColor: "rgba(0, 0, 0)"
                    }
                }}
            // validate={(values) => { }}
        <>
            <Edit
                redirect="list"
                mutationMode={EDIT_MODE}
                actions={<CustomerTopToolBar />}
                aside={<EditBaseAside />}
            >
                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
                    <Grid item xs={24} md={12}>
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.main')}
                        </Typography>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.locRevise.code"
                                source="code"
                                parse={v => v}
                                readOnly
                            />
                            <SelectInput
                                label="table.field.locRevise.type"
                                source="type"
                                choices={[
                                    { id: 0, name: ' 库存调整' },
                                    { id: 2, name: ' 盘点调整' },
                                ]}
                                readOnly
                            />
                            <NumberInput
                                label="table.field.locRevise.anfme"
                                source="anfme"
                                readOnly
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.locRevise.reviseQty"
                                source="reviseQty"
                                readOnly
                            />
                            <SelectInput
                                label="table.field.locRevise.exceStatus"
                                source="exceStatus"
                                choices={[
                                    { id: 0, name: '未执行' },
                                    { id: 1, name: '执行中' },
                                    { id: 2, name: '执行完成' },
                                ]}
                                readOnly
                            />
                            <TextInput
                                label="table.field.locRevise.areaName"
                                source="orgAreaName"
                                parse={v => v}
                                readOnly
                            />
                        </Stack>
                <SimpleForm
                    shouldUnregister
                    warnWhenUnsavedChanges
                    toolbar={<FormToolbar />}
                    mode="onTouched"
                    defaultValues={{}}
                    // sx={{
                    //     "& .MuiFormLabel-root.MuiInputLabel-root.Mui-disabled": {
                    //         bgcolor: 'white',
                    //         WebkitTextFillColor: "rgba(0, 0, 0)"
                    //     },
                    //     "& .MuiInputBase-input.MuiFilledInput-input.Mui-disabled": {
                    //         bgcolor: 'white',
                    //         WebkitTextFillColor: "rgba(0, 0, 0)"
                    //     }
                    // }}
                    validate={(values) => { }}
                >
                    <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
                        <Grid item xs={24} md={12}>
                            <Typography variant="h6" gutterBottom>
                                {translate('common.edit.title.main')}
                            </Typography>
                            <Stack direction='row' gap={2}>
                                <TextInput
                                    label="table.field.locRevise.code"
                                    source="code"
                                    parse={v => v}
                                    readOnly
                                />
                                <SelectInput
                                    label="table.field.locRevise.type"
                                    source="type"
                                    choices={[
                                        { id: 0, name: ' 库存调整' },
                                        { id: 2, name: ' 盘点调整' },
                                    ]}
                                />
                                <NumberInput
                                    label="table.field.locRevise.anfme"
                                    source="anfme"
                                />
                            </Stack>
                            <Stack direction='row' gap={2}>
                                <NumberInput
                                    label="table.field.locRevise.reviseQty"
                                    source="reviseQty"
                                />
                                <SelectInput
                                    label="table.field.locRevise.exceStatus"
                                    source="exceStatus"
                                    choices={[
                                        { id: 0, name: '未执行' },
                                        { id: 1, name: '执行中' },
                                        { id: 2, name: '执行完成' },
                                    ]}
                                />
                                <TextInput
                                    label="table.field.locRevise.areaName"
                                    source="orgAreaName"
                                    parse={v => v}
                                />
                            </Stack>
                        </Grid>
                    </Grid>
                </Grid>
            </SimpleForm>
        </Edit >
                </SimpleForm>
            </Edit >
            <ReviseLogList />
        </>
    )
}
rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx
@@ -37,12 +37,8 @@
import MyExportButton from '@/page/components/MyExportButton';
import PageEditDrawer from "@/page/components/PageEditDrawer";
import { Box, Typography, Card, Stack } from '@mui/material';
import PageDrawer from "@/page/components/PageDrawer";
import EmptyData from "@/page/components/EmptyData";
import LocReviseCreate from "./LocReviseCreate";
import MyField from "@/page/components/MyField";
import { styled } from '@mui/material/styles';
import LocRevisePanel from "./LocRevisePanel";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
rsf-admin/src/page/stockManage/locRevise/LocRevisePanel.jsx
File was deleted
rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
New file
@@ -0,0 +1,344 @@
import React, { useState, useEffect } from "react";
import {
    Dialog,
    DialogActions,
    DialogContent,
    DialogTitle,
    Stack,
    Grid,
    Box,
    Button,
    Paper,
    styled,
    Tooltip,
    IconButton,
    TextField,
} from '@mui/material';
import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
import { useTranslate, useNotify, useRefresh, DatagridConfigurable, useGetOne } from 'react-admin';
import DialogCloseButton from "../../components/DialogCloseButton";
import { Add, Edit, Delete, Save } from '@mui/icons-material';
import SaveIcon from '@mui/icons-material/Save';
import { DataGrid } from '@mui/x-data-grid';
import request from '@/utils/request';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .opt': {
        width: 180
    },
}));
const LocsReviseDetl = (props) => {
    const { open, setOpen, locRevise } = 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 [selectedRows, setSelectedRows] = useState([]);
    const [isLoading, setIsLoading] = useState(false);
    const [tableData, setTableData] = useState([]);
    const [rowCount, setRowCount] = useState(0);
    const translate = useTranslate();
    const refresh = useRefresh();
    const notify = useNotify();
    const handleChange = (e) => {
        const { name, value } = e.target;
        setFormData(() => ({
            ...formData,
            [name]: value
        }));
    };
    const handleSubmit = () => {
        const selectedData = tableData.filter(item => selectedRows.includes(item.id));
        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,
            }
        }));
        saveReviseLog(value);
    };
    const saveReviseLog = async (values) => {
        const parmas = {
            reviseId: locRevise,
            items: values,
        }
        const res = await request.post(`/reviseLog/items/save`, parmas);
        if (res?.data?.code === 200) {
            setOpen(false);
            refresh()
        } else {
            notify(res.data.msg);
        }
    }
    const getData = async () => {
        setIsLoading(true)
        const res = await request.post(`/locItem/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="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,
                            marginRight: 1,
                            transition: (theme) =>
                                theme.transitions.create(['all'], {
                                    duration: theme.transitions.duration.enteringScreen,
                                }),
                        }}
                        resource="loc"
                        title={"menu.loc"}
                        empty={false}
                        filter={{ useStatus: 'F' }}
                        filters={filters}
                        sort={{ field: "'row'" }}
                        actions={false}
                        perPage={DEFAULT_PAGE_SIZE}
                        aside={false}
                    >
                        <StyledDatagrid
                            preferenceKey='loc'
                            align="left"
                            bulkActionButtons={false}
                            rowClick={() => false}
                            omit={['id', 'areaId', 'type', 'barcode']}
                        >
                            <NumberField source="id" />
                            <TextField source="code" label="table.field.locItem.locCode" />
                        </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"
                                />
                            </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%' }}>
                        <AsnWareModalTable
                            tableData={tableData}
                            setTableData={setTableData}
                            page={page}
                            rowCount={rowCount}
                            setPage={setPage}
                            isLoading={isLoading}
                            selectedRows={selectedRows}
                            setSelectedRows={setSelectedRows}
                        />
                    </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>
    );
};
export default LocsReviseDetl;
const AsnWareModalTable = ({ tableData, setTableData, page, isLoading, pageSize, setPage, rowCount, selectedRows, setSelectedRows }) => {
    const translate = useTranslate();
    const notify = useNotify();
    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'),
            width: 130,
            editable: false,
        },
        {
            field: 'typeIds$',
            headerName: translate('table.field.loc.type'),
            minWidth: 100,
            flex: 1,
            editable: false,
        },
        {
            field: 'barcode',
            headerName: translate('table.field.loc.barcode'),
            minWidth: 100,
            flex: 1,
            editable: false,
        },
        {
            field: 'useStatus$',
            headerName: translate('table.field.loc.useStatus') + "*",
            minWidth: 100,
            flex: 1,
            editable: false,
        },
        {
            field: 'channel',
            headerName: translate('table.field.loc.channel'),
            minWidth: 100,
            flex: 1,
            editable: false,
        },
        {
            field: 'row',
            headerName: translate('table.field.loc.row'),
            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 handleSelectionChange = (ids) => {
        setSelectedRows(ids)
    };
    return (
        <div style={{ width: '100%' }}>
            <DataGrid
                sx={{ height: 600 }}
                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>
    );
};
rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
New file
@@ -0,0 +1,114 @@
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,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import * as Common from '@/utils/common';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const ReviseLogItemList = () => {
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const translate = useTranslate();
    const record = useRecordContext();
    return (
        <Box display="flex">
            <List
                resource="reviseLogItem"
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                }}
                title={"menu.reviseLogItem"}
                empty={false}
                filters={false}
                filter={{reviseLogId: record?.id}}
                sort={{ field: "create_time", order: "desc" }}
                actions={false}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='reviseLogItem'
                    bulkActionButtons={false}
                    rowClick={(id, resource, record) => false}
                    expand={false}
                    expandSingle={true}
                    omit={['id', 'locId', 'matnrId', 'createTime', 'createBy', 'memo']}
                >
                    <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="unit" label="table.field.locItem.unit" />
                    <NumberField source="anfme" label="table.field.locItem.anfme" />
                    <NumberField source="reviseQty" label="table.field.locItem.reviseQty" />
                    <TextField source="batch" label="table.field.locItem.batch" />
                    <TextField source="spec" label="table.field.locItem.spec" />
                    <TextField source="model" label="table.field.locItem.model" />
                    <TextField source="fieldsIndex" label="table.field.locItem.fieldsIndex" />
                    <TextField source="updateBy$" label="common.field.updateBy" />
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <TextField source="createBy" label="common.field.createBy" />
                    <DateField source="createTime" label="common.field.createTime" showTime />
                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                    <TextField source="memo" label="common.field.memo" sortable={false} />
                </StyledDatagrid>
            </List>
        </Box>
    )
}
export default ReviseLogItemList;
rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
New file
@@ -0,0 +1,177 @@
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,
    useGetRecordId,
    Button,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import MyCreateButton from "@/page/components/MyCreateButton";
import { Box, Typography, Card, Stack } from '@mui/material';
import ReviseLogItemList from "./ReviseLogItemList";
import SelectLocsRevise from "./SelectLocsRevise";
import EditIcon from '@mui/icons-material/Edit';
import LocsReviseDetl from "./LocsReviseDetl";
import { styled } from '@mui/material/styles';
import * as Common from '@/utils/common';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
    <NumberInput source="reviseId" label="table.field.reviseLog.reviseId" />,
    <TextInput source="reviseCode" label="table.field.reviseLog.reviseCode" />,
    <NumberInput source="warehouseId" label="table.field.loc.warehouseId" />,
    <NumberInput source="areaId" label="table.field.loc.areaId" />,
    <NumberInput source="type" label="table.field.loc.type" />,
    <TextInput source="barcode" label="table.field.loc.barcode" />,
    <TextInput source="useStatus" label="table.field.loc.useStatus" />,
    <NumberInput source="channel" label="table.field.loc.channel" />,
    <NumberInput source="row" label="table.field.loc.row" />,
    <NumberInput source="col" label="table.field.loc.col" />,
    <NumberInput source="lev" label="table.field.loc.lev" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
        source="status"
        choices={[
            { id: '1', name: 'common.enums.statusTrue' },
            { id: '0', name: 'common.enums.statusFalse' },
        ]}
        resettable
    />,
]
const ReviseLogList = () => {
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const translate = useTranslate();
    const orderId = useGetRecordId();
    return (
        <Box display="flex">
            <List
                resource="reviseLog"
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                }}
                title={"menu.reviseLog"}
                empty={false}
                filters={filters}
                filter={{ reviseId: orderId }}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true); }} />
                        <SelectColumnsButton preferenceKey='check' />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='reviseLog'
                    bulkActionButtons={false}
                    rowClick={(id, resource, record) => false}
                    expand={<ReviseLogItemList />}
                    expandSingle={true}
                    omit={['id', 'reviseId', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <NumberField source="reviseId" label="table.field.reviseLog.reviseId" />
                    <TextField source="reviseCode" label="table.field.reviseLog.reviseCode" />
                    <NumberField source="warehouseId" label="table.field.loc.warehouseId" />
                    <NumberField source="areaId" label="table.field.loc.areaId" />
                    <NumberField source="type" label="table.field.loc.type" />
                    <TextField source="barcode" label="table.field.loc.barcode" />
                    <TextField source="useStatus" label="table.field.loc.useStatus" />
                    <NumberField source="channel" label="table.field.loc.channel" />
                    <NumberField source="row" label="table.field.loc.row" />
                    <NumberField source="col" label="table.field.loc.col" />
                    <NumberField source="lev" label="table.field.loc.lev" />
                    <TextField source="updateBy$" label="common.field.updateBy" />
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <TextField source="createBy$" label="common.field.createBy" />
                    <DateField source="createTime" label="common.field.createTime" showTime />
                    <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}/>
                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} redirect={false} />
                    </WrapperField>
                </StyledDatagrid>
            </List>
            <SelectLocsRevise
                locRevise={orderId}
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <LocsReviseDetl
                open={drawerVal}
                setOpen={setDrawerVal}
            />
        </Box>
    )
}
export default ReviseLogList;
const EditLocRevise = ({ setDrawerVal }) => {
    const record = useRecordContext();
    const editRevise = () => {
        console.log(record);
        setDrawerVal(true)
    }
    return (
        <Button label="common.button.edit" startIcon={<EditIcon />} onClick={editRevise}></Button>
    )
}
rsf-admin/src/page/stockManage/locRevise/SelectLocsRevise.jsx
@@ -16,9 +16,8 @@
} from '@mui/material';
import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
import { useTranslate, useNotify, useRefresh, DatagridConfigurable} from 'react-admin';
import { useTranslate, useNotify, useRefresh, DatagridConfigurable, useGetOne } from 'react-admin';
import DialogCloseButton from "../../components/DialogCloseButton";
import TreeSelectInput from "@/page/components/TreeSelectInput";
import { Add, Edit, Delete, Save } from '@mui/icons-material';
import SaveIcon from '@mui/icons-material/Save';
import { DataGrid } from '@mui/x-data-grid';
@@ -31,21 +30,18 @@
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 180
    },
}));
const SelectLocsRevise = (props) => {
    const { open, setOpen, data, setData } = props;
    const { open, setOpen, locRevise } = 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 });
@@ -65,16 +61,8 @@
        }));
    };
    const reset = () => {
        setFormData({
            code: '',
            useStatus: 'F',
        })
    }
    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 selectedData = tableData.filter(item => selectedRows.includes(item.id));
        const value = selectedData.map((el => {
            return {
                id: el.id,
@@ -89,11 +77,24 @@
                useStatus: el.useStatus,
                warehouseId: el.warehouseId,
            }
        }))
        setData([...data, ...value]);
        setOpen(false);
        reset();
        }));
        saveReviseLog(value);
    };
    const saveReviseLog = async (values) => {
        const parmas = {
            reviseId: locRevise,
            items: values,
        }
        const res = await request.post(`/reviseLog/items/save`, parmas);
        if (res?.data?.code === 200) {
            setOpen(false);
            refresh()
        } else {
            notify(res.data.msg);
        }
    }
    const getData = async () => {
        setIsLoading(true)
@@ -106,12 +107,10 @@
        if (res?.data?.code === 200) {
            setTableData(res.data.data.records);
            setRowCount(res.data?.data?.total);
        } else {
            notify(res.data.msg);
        }
        setIsLoading(false)
    };
    useEffect(() => {