skyouc
2025-03-25 53eb9e72f7fff791c2d1f7a768441035b57ca7b1
Merge branch 'front' into devlop
10个文件已修改
1个文件已添加
265 ■■■■■ 已修改文件
rsf-admin/src/i18n/en.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/layout/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/TreeSelectInput.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/role/AssignPermissions.jsx 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -292,6 +292,7 @@
                name: "name",
                code: "code",
                parentId: "parentId",
                parCode: "parCode",
            },
            warehouse: {
                name: "name",
@@ -644,6 +645,7 @@
        subzone: 'subzone',
        bindmatnr: 'bind matnr',
        bindloc: 'bind loc',
        batchMatnrGropu: 'batchMatnrGropu',
    },
};
rsf-admin/src/i18n/zh.js
@@ -286,6 +286,7 @@
                name: "名称",
                code: "编码",
                parentId: "上级标识",
                parCode: "上级编码",
            },
            warehouse: {
                name: "仓库名称",
@@ -646,6 +647,7 @@
        subzone: '绑定分区',
        bindmatnr: '绑定物料',
        bindloc: '绑定库位',
        batchMatnrGropu: '批量物料分组',
    },
};
rsf-admin/src/layout/index.jsx
@@ -6,6 +6,7 @@
  <RALayout
    appBar={AppBar}
    menu={MyMenu}
    sx={{ '& .RaLayout-content': { position: 'absolute', left: '200px', overflowY: 'auto', width: 'calc(100% - 200px)', height: 'calc(100% - 50px)' } }}
  >
    {children}
    <CheckForApplicationUpdate />
rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx
@@ -352,7 +352,7 @@
            typeId: selectedItems
        }
        const res = await request.post(`/locAreaMatRela/locType/remove/`, parmas);
        const res = await request.post(`/locAreaMatRela/locType/remove`, parmas);
        if (res?.data?.code === 200) {
            reload()
            notify(res.data.msg);
rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx
New file
@@ -0,0 +1,153 @@
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';
import StatusSelectInput from "../../components/StatusSelectInput";
import TreeSelectInput from "@/page/components/TreeSelectInput";
const InitModal = ({ open, setOpen }) => {
    const refresh = useRefresh();
    const translate = useTranslate();
    const notify = useNotify();
    const [formData, setFormData] = useState({
        'groupId': null
    });
    const { selectedIds, onUnselectItems } = useListContext();
    const handleClose = (event, reason) => {
        if (reason !== "backdropClick") {
            setOpen(false);
            reset()
            refresh();
            onUnselectItems()
        }
    };
    const reset = () => {
        setFormData({
            'groupId': null
        })
    }
    const handleReset = (e) => {
        e.preventDefault();
    };
    const handleChange = (value, name) => {
        setFormData((prevData) => ({
            ...prevData,
            [name]: ['locType', 'type'].includes(name) ? value : +value
        }));
    };
    const removeEmptyKeys = (obj) => {
        return _.pickBy(obj, (value) => {
            if (_.isObject(value)) {
                const newObj = removeEmptyKeys(value);
                return !_.isEmpty(newObj);
            }
            return !_.isNil(value) && (_.isNumber(value) ? value !== 0 : !_.isEmpty(value));
        });
    }
    const handleSubmit = async () => {
        const parmas = {
            ids: selectedIds,
            ...removeEmptyKeys(formData)
        }
        const res = await request.post(`/matnr/group/bind`, parmas);
        if (res?.data?.code === 200) {
            handleClose()
        } else {
            notify(res.data.msg);
        }
    }
    return (
        <Dialog open={open} maxWidth="md" fullWidth>
            <Form onSubmit={handleSubmit}>
                <DialogCloseButton onClose={handleClose} />
                <DialogTitle>{translate('toolbar.batchMatnrGropu')}</DialogTitle>
                <DialogContent sx={{ mt: 2 }}>
                    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
                        <Grid container spacing={2}>
                            <Grid item xs={4}>
                                <TreeSelectInput
                                    label="table.field.locAreaMatRela.groupId"
                                    resource={'matnrGroup'}
                                    source="groupId"
                                    value={formData.groupId}
                                    onChange={(e) => handleChange(+e.target.value, 'groupId')}
                                />
                            </Grid>
                        </Grid>
                    </Box>
                </DialogContent>
                <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
                    <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
                        <Button type="submit" variant="contained" startIcon={<SaveIcon />}>
                            {translate('toolbar.confirm')}
                        </Button>
                    </Box>
                </DialogActions>
            </Form>
        </Dialog>
    );
}
export default InitModal;
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -100,7 +100,6 @@
            redirect="list"
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
            title={"menu.matnr"}
        >
            <SimpleForm
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -54,6 +54,7 @@
import PrintIcon from '@mui/icons-material/Print';
import request from '@/utils/request';
import BatchModal from './BatchModal';
import BatchGropuModal from './BatchGropuModal';
import PrintModal from './PrintModal';
import LinkIcon from '@mui/icons-material/Link';
import BindModal from './BindModal';
@@ -86,10 +87,11 @@
        overflow: 'hidden',
        textOverflow: 'ellipsis',
        display: 'block',
        width: '300px',
        width: '200px',
    },
    '& .RaDatagrid-table': {
        width: '100%'
        width: '100%',
        position: 'relative',
    }
}));
@@ -207,7 +209,7 @@
                    <TextField key="memo" source="memo" label="common.field.memo" sortable={false} />,
                ]
                const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
                const opt = <WrapperField key="opt" cellClassName="opt" label="common.field.opt">
                const opt = <WrapperField key="opt" cellClassName="fixed" className="fixed" label="common.field.opt">
                    <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                    <EnableButton />
                </WrapperField>
@@ -239,6 +241,7 @@
                <StyledDatagrid
                    preferenceKey='matnr'
                    bulkActionButtons={<>
                        <BatchGroupButton />
                        <BatchButton />
                        <BindButton />
                        <PrintButton />
@@ -360,6 +363,29 @@
    )
}
const BatchGroupButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const [createDialog, setCreateDialog] = useState(false);
    return (
        <>
            <Button onClick={() => setCreateDialog(true)} label={"toolbar.batchMatnrGropu"}>
                <EditIcon />
            </Button>
            <BatchGropuModal
                open={createDialog}
                setOpen={setCreateDialog}
            />
        </>
    )
}
const PrintButton = () => {
    const record = useRecordContext();
    const { resource, selectedIds } = useListContext();
@@ -380,7 +406,6 @@
                rows={selectedIds}
            />
        </>
    )
}
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
@@ -93,14 +93,14 @@
                                        validate={required()}
                                    />
                                </Grid>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.matnrGroup.code"
                                        source="code"
                                        parse={v => v}
                                        validate={required()}
                                    />
                                </Grid> */}
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.matnrGroup.parentId"
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
@@ -31,29 +31,59 @@
    Stack,
    Grid,
    Box,
    TextField
} from '@mui/material';
import DialogCloseButton from "@/page/components/DialogCloseButton";
import TreeSelectInput from "@/page/components/TreeSelectInput";
import { useWatch, useFormContext } from "react-hook-form";
import { useWatch, useFormContext, useFieldArray } from "react-hook-form";
import * as Common from '@/utils/common';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
import EditBaseAside from "@/page/components/EditBaseAside";
import CustomerTopToolBar from "@/page/components/EditTopToolBar";
import MemoInput from "@/page/components/MemoInput";
import StatusSelectInput from "@/page/components/StatusSelectInput";
import request from '@/utils/request';
const EditContent = ({ editRecord }) => {
    const { resource } = useCreateContext();
    const translate = useTranslate();
    const { update } = useFieldArray({ name: "parCode" })
    const pChange = (val) => {
        if (val > 0) {
            http(val)
        }
    }
    const http = async (val) => {
        const res = await request.post(`/matnrGroup/page`, { id: val });
        const code = res.data.data.records[0].code || ''
        // setpCode(code)
        editRecord.parCode = code;
        update(code)
    }
    return (
        <Grid container rowSpacing={2} columnSpacing={2}>
            <Grid item xs={6} display="flex" gap={1}>
                <TreeSelectInput
                    label="table.field.matnrGroup.parentId"
                    validate={[required()]}
                    value={editRecord?.parentId}
                    isTranslate
                    resource={resource}
                    onChange={(e) => pChange(e.target.value)}
                />
            </Grid>
            <Grid item xs={6} display="flex" gap={1}>
                <TextInput
                    label="table.field.matnrGroup.parCode"
                    validate={[required()]}
                    source="parCode"
                    value={editRecord?.parCode}
                    parse={v => v}
                    disabled
                />
            </Grid>
            <Grid item xs={6} display="flex" gap={1}>
@@ -64,13 +94,14 @@
                    validate={required()}
                />
            </Grid>
            {/* <Grid item xs={6} display="flex" gap={1}>
            <Grid item xs={6} display="flex" gap={1}>
                <TextInput
                    label="table.field.matnrGroup.code"
                    source="code"
                    parse={v => v}
                    disabled={!!editRecord}
                />
            </Grid> */}
            </Grid>
        </Grid>
    )
}
rsf-admin/src/page/components/TreeSelectInput.jsx
@@ -5,7 +5,7 @@
import * as Common from '@/utils/common';
import { useFormContext } from 'react-hook-form';
const TreeSelectInput = ({ resource, label, source = 'parentId', value, isTranslate = false, ...rest }) => {
const TreeSelectInput = ({ resource, onChange, label, source = 'parentId', value, isTranslate = false, ...rest }) => {
    const translate = useTranslate();
    const { setValue } = useFormContext();
    const [filter, setFilter] = React.useState("");
@@ -38,6 +38,7 @@
            shouldValidate: true,
            shouldDirty: true,
        });
        onChange(event)
    };
    return (
rsf-admin/src/page/system/role/AssignPermissions.jsx
@@ -2,6 +2,7 @@
import {
    useTranslate,
    useNotify,
    TextInput
} from 'react-admin';
import { Box, Button, Card, Stack, CardContent, Skeleton } from '@mui/material';
import { SimpleTreeView, TreeItem, RichTreeView, useTreeViewApiRef } from '@mui/x-tree-view';
@@ -36,7 +37,7 @@
            })
        }
        const http = async () => {
            const res = await request.post('/menu' + '/tree', {});
            const res = await request.post('/menu' + '/tree', { condition: '' });
            if (res?.data?.code === 200) {
                const transformData = transformTree(res.data.data);
                setTreeData(transformData);
@@ -191,9 +192,20 @@
                            </Button>
                        </Box>
                        <Box sx={{
                            display: 'flex',
                            justifyContent: 'flex-start'
                        }}>
                            <Button startIcon={<SaveIcon />} variant="contained" onClick={handleSave}>
                                {translate('ra.action.save')}
                            </Button>
                        </Box>
                        <Box sx={{
                            height: 480,
                            minWidth: 290,
                            overflow: 'auto',
                            marginTop: '10px',
                            padding: 1,
                            borderBottom: '1px solid background.paper',
                            borderRadius: '4px',
@@ -223,14 +235,7 @@
                        </Box>
                    </Box>
                    <Box sx={{
                        display: 'flex',
                        justifyContent: 'flex-start'
                    }}>
                        <Button startIcon={<SaveIcon />} variant="contained" onClick={handleSave}>
                            {translate('ra.action.save')}
                        </Button>
                    </Box>
                </CardContent>
            </Card>
        </>