From 53eb9e72f7fff791c2d1f7a768441035b57ca7b1 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 25 三月 2025 11:23:55 +0800
Subject: [PATCH] Merge branch 'front' into devlop
---
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx | 41 +++++++-
rsf-admin/src/page/components/TreeSelectInput.jsx | 3
rsf-admin/src/i18n/zh.js | 2
rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx | 153 ++++++++++++++++++++++++++++++
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | 33 +++++
rsf-admin/src/i18n/en.js | 2
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx | 4
rsf-admin/src/page/system/role/AssignPermissions.jsx | 23 ++-
rsf-admin/src/layout/index.jsx | 1
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx | 1
rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx | 2
11 files changed, 242 insertions(+), 23 deletions(-)
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index fe02573..dfb832c 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/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',
},
};
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 7044fee..a1976a7 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -286,6 +286,7 @@
name: "鍚嶇О",
code: "缂栫爜",
parentId: "涓婄骇鏍囪瘑",
+ parCode: "涓婄骇缂栫爜",
},
warehouse: {
name: "浠撳簱鍚嶇О",
@@ -646,6 +647,7 @@
subzone: '缁戝畾鍒嗗尯',
bindmatnr: '缁戝畾鐗╂枡',
bindloc: '缁戝畾搴撲綅',
+ batchMatnrGropu: '鎵归噺鐗╂枡鍒嗙粍',
},
};
diff --git a/rsf-admin/src/layout/index.jsx b/rsf-admin/src/layout/index.jsx
index 40f6657..9d105ce 100644
--- a/rsf-admin/src/layout/index.jsx
+++ b/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 />
diff --git a/rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx b/rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx
index 18268bf..7620e16 100644
--- a/rsf-admin/src/page/basicInfo/locAreaMat/LocAreaMatPanel.jsx
+++ b/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);
diff --git a/rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx b/rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx
new file mode 100644
index 0000000..135c251
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/matnr/BatchGropuModal.jsx
@@ -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;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 2264d6e..def6d1a 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
+++ b/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
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index 5dc0c6c..9bf7cfc 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
+++ b/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}
/>
</>
-
)
}
diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
index 6e2a958..4c9aa78 100644
--- a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
+++ b/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"
diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
index ad0a7d7..b2d9744 100644
--- a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
+++ b/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>
)
}
diff --git a/rsf-admin/src/page/components/TreeSelectInput.jsx b/rsf-admin/src/page/components/TreeSelectInput.jsx
index 8243ce1..569451a 100644
--- a/rsf-admin/src/page/components/TreeSelectInput.jsx
+++ b/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 (
diff --git a/rsf-admin/src/page/system/role/AssignPermissions.jsx b/rsf-admin/src/page/system/role/AssignPermissions.jsx
index 134163b..a70bc66 100644
--- a/rsf-admin/src/page/system/role/AssignPermissions.jsx
+++ b/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>
</>
--
Gitblit v1.9.1