From 23253548dca45ef77746e1d1b1e9a02c6a261d37 Mon Sep 17 00:00:00 2001
From: verou <857149855@qq.com>
Date: 星期六, 22 三月 2025 15:37:00 +0800
Subject: [PATCH] feat:物料库区绑定

---
 rsf-admin/src/page/basicInfo/loc/BindModal.jsx                     |    0 
 rsf-admin/src/page/basicInfo/locType/BindModal.jsx                 |    0 
 rsf-admin/src/page/basicInfo/matnr/BindModal.jsx                   |  186 ++++++++++++++++++++++++++++++++++++++++++++++
 rsf-admin/src/page/basicInfo/locAreaMatRela/LocAreaMatRelaList.jsx |   10 +-
 rsf-admin/src/i18n/zh.js                                           |    2 
 rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx                   |   26 ++++++
 rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx               |    8 +-
 rsf-admin/src/page/basicInfo/loc/LocList.jsx                       |    8 +-
 8 files changed, 226 insertions(+), 14 deletions(-)

diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 6319e61..bec9beb 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -129,7 +129,7 @@
         loc: '搴撲綅',
         locType: '搴撲綅绫诲瀷',
         locArea: '閫昏緫鍒嗗尯',
-        locAreaMatRela: '鐗╂枡缁戝畾',
+        locAreaMatRela: '搴撳尯鐗╂枡鍏崇郴',
         container: '瀹瑰櫒绠$悊',
         contract: '鍚堝悓淇℃伅',
         qlyInspect: '璐ㄦ淇℃伅',
diff --git a/rsf-admin/src/page/basicInfo/loc/MatnrModal.jsx b/rsf-admin/src/page/basicInfo/loc/BindModal.jsx
similarity index 100%
rename from rsf-admin/src/page/basicInfo/loc/MatnrModal.jsx
rename to rsf-admin/src/page/basicInfo/loc/BindModal.jsx
diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
index 8acee82..1053f48 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -38,7 +38,7 @@
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import LocCreate from "./LocCreate";
-import MatnrModal from "./MatnrModal";
+import BindModal from "./BindModal";
 import EmptyData from "../../components/EmptyData";
 import DynamicField from "../../components/DynamicField";
 import MyCreateButton from "../../components/MyCreateButton";
@@ -148,7 +148,7 @@
                     bulkActionButtons={
                         <>
                             <BatchButton />
-                            <MatnrButton />
+                            <BindButton />
                             <SubzoneButton />
                             <BulkDeleteButton />
                         </>
@@ -285,7 +285,7 @@
     )
 }
 
-const MatnrButton = () => {
+const BindButton = () => {
     const record = useRecordContext();
     const notify = useNotify();
     const refresh = useRefresh();
@@ -299,7 +299,7 @@
                 <LinkIcon />
             </Button>
 
-            <MatnrModal
+            <BindModal
                 open={createDialog}
                 setOpen={setCreateDialog}
             />
diff --git a/rsf-admin/src/page/basicInfo/locAreaMatRela/LocAreaMatRelaList.jsx b/rsf-admin/src/page/basicInfo/locAreaMatRela/LocAreaMatRelaList.jsx
index dcb16d5..c4c916d 100644
--- a/rsf-admin/src/page/basicInfo/locAreaMatRela/LocAreaMatRelaList.jsx
+++ b/rsf-admin/src/page/basicInfo/locAreaMatRela/LocAreaMatRelaList.jsx
@@ -120,12 +120,12 @@
                     omit={['id', 'createTime', 'createBy', 'memo']}
                 >
                     <NumberField source="id" />
-                    <NumberField source="areaId" label="table.field.locAreaMatRela.areaId" />
+                    <NumberField source="areaId$" label="table.field.locAreaMatRela.areaId" />
                     <TextField source="code" label="table.field.locAreaMatRela.code" />
-                    <NumberField source="matnrId" label="table.field.locAreaMatRela.matnrId" />
-                    <NumberField source="groupId" label="table.field.locAreaMatRela.groupId" />
-                    <NumberField source="locTypeId" label="table.field.locAreaMatRela.locTypeId" />
-                    <NumberField source="locId" label="table.field.locAreaMatRela.locId" />
+                    <NumberField source="matnrId$" label="table.field.locAreaMatRela.matnrId" />
+                    <NumberField source="groupId$" label="table.field.locAreaMatRela.groupId" />
+                    <NumberField source="locTypeId$" label="table.field.locAreaMatRela.locTypeId" />
+                    <NumberField source="locId$" label="table.field.locAreaMatRela.locId" />
 
                     <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                         <TextField source="nickname" />
diff --git a/rsf-admin/src/page/basicInfo/locType/MatnrModal.jsx b/rsf-admin/src/page/basicInfo/locType/BindModal.jsx
similarity index 100%
rename from rsf-admin/src/page/basicInfo/locType/MatnrModal.jsx
rename to rsf-admin/src/page/basicInfo/locType/BindModal.jsx
diff --git a/rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx b/rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx
index 58ad20e..5fd0003 100644
--- a/rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx
+++ b/rsf-admin/src/page/basicInfo/locType/LocTypeList.jsx
@@ -45,7 +45,7 @@
 import PageDrawer from "../../components/PageDrawer";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
-import MatnrModal from "./MatnrModal";
+import BindModal from "./BindModal";
 import LinkIcon from '@mui/icons-material/Link';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -115,7 +115,7 @@
                 <StyledDatagrid
                     preferenceKey='locType'
                     bulkActionButtons={<>
-                        <MatnrButton />
+                        <BindButton />
                         <BulkDeleteButton />
                     </>}
                     rowClick={(id, resource, record) => false}
@@ -159,7 +159,7 @@
 
 export default LocTypeList;
 
-const MatnrButton = () => {
+const BindButton = () => {
     const record = useRecordContext();
     const notify = useNotify();
     const refresh = useRefresh();
@@ -173,7 +173,7 @@
                 <LinkIcon />
             </Button>
 
-            <MatnrModal
+            <BindModal
                 open={createDialog}
                 setOpen={setCreateDialog}
             />
diff --git a/rsf-admin/src/page/basicInfo/matnr/BindModal.jsx b/rsf-admin/src/page/basicInfo/matnr/BindModal.jsx
new file mode 100644
index 0000000..3ada880
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/matnr/BindModal.jsx
@@ -0,0 +1,186 @@
+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,
+    SelectArrayInput
+} 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 MatnrModal = ({ open, setOpen }) => {
+    const refresh = useRefresh();
+    const translate = useTranslate();
+
+
+    const notify = useNotify();
+
+    const [formData, setFormData] = useState({
+        areaId: null,
+        locId: null,
+    });
+
+    const { selectedIds, onUnselectItems } = useListContext();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+            reset()
+            refresh();
+            onUnselectItems()
+        }
+    };
+
+    const reset = () => {
+        setFormData({
+            areaId: null,
+            locId: null,
+        })
+    }
+
+    const handleReset = (e) => {
+        e.preventDefault();
+    };
+
+    const handleChange = (value, name) => {
+        setFormData((prevData) => ({
+            ...prevData,
+            [name]: value
+        }));
+        refresh()
+    };
+
+    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 = {
+            matnrId: selectedIds,
+            areaId: formData.areaId,
+            locId: formData.locId,
+        }
+
+        const res = await request.post(`/locAreaMatRela/matnr/bind`, parmas);
+        if (res?.data?.code === 200) {
+            handleClose()
+
+        } else {
+            notify(res.data.msg);
+        }
+
+
+    }
+
+    const [groupId, setGroupId] = useState();
+
+    const warehouseChange = (e) => {
+        setGroupId(e.target.value)
+    }
+
+    return (
+        <Dialog open={open} maxWidth="md" fullWidth>
+            <Form onSubmit={handleSubmit}>
+                <DialogCloseButton onClose={handleClose} />
+                <DialogTitle>{translate('toolbar.bindloc')}</DialogTitle>
+                <DialogContent sx={{ mt: 2 }}>
+                    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
+                        <Grid container spacing={2}>
+                            <Grid item xs={4}>
+                                <ReferenceInput
+                                    source="areaId"
+                                    reference="warehouseAreas"
+                                >
+                                    <AutocompleteInput
+                                        label="table.field.loc.areaId"
+                                        optionText="name"
+                                        onChange={(value) => handleChange(value, 'areaId')}
+                                        value={formData.areaId}
+                                        validate={required()}
+                                        filterToQuery={(val) => ({ name: val })}
+                                    />
+                                </ReferenceInput>
+
+                            </Grid>
+
+
+                            <Grid item xs={4}>
+                                <ReferenceArrayInput source="locId" reference="loc" >
+                                    <SelectArrayInput
+                                        label="table.field.locAreaMatRela.locId"
+                                        validate={required()}
+                                        optionText={'code'}
+                                        value={formData.locId}
+                                        onChange={(e) => handleChange(e.target.value, 'locId')}
+                                    />
+                                </ReferenceArrayInput>
+
+                            </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 MatnrModal;
\ No newline at end of file
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index e27b5e6..23079ee 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -55,6 +55,8 @@
 import request from '@/utils/request';
 import BatchModal from './BatchModal';
 import PrintModal from './PrintModal';
+import LinkIcon from '@mui/icons-material/Link';
+import BindModal from './BindModal';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -238,6 +240,7 @@
                     preferenceKey='matnr'
                     bulkActionButtons={<>
                         <BatchButton />
+                        <BindButton />
                         <PrintButton />
                         <BulkDeleteButton mutationMode={OPERATE_MODE} />
                     </>}
@@ -379,4 +382,27 @@
         </>
 
     )
+}
+
+const BindButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+
+
+    const [createDialog, setCreateDialog] = useState(false);
+
+    return (
+        <>
+            <Button onClick={() => setCreateDialog(true)} label={"toolbar.bindloc"}>
+                <LinkIcon />
+            </Button>
+
+            <BindModal
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+        </>
+
+    )
 }
\ No newline at end of file

--
Gitblit v1.9.1