From 97c21abaebf6cb6cf15f8a7e3830676533d90dac Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期三, 26 十一月 2025 13:06:31 +0800
Subject: [PATCH] 添加库存明细功能

---
 rsf-admin/src/page/locItem/LocItemList.jsx |  269 +++++++++++++++++++++++++++--------------------------
 1 files changed, 136 insertions(+), 133 deletions(-)

diff --git a/rsf-admin/src/page/locItem/LocItemList.jsx b/rsf-admin/src/page/locItem/LocItemList.jsx
index 69f7261..9b3e38b 100644
--- a/rsf-admin/src/page/locItem/LocItemList.jsx
+++ b/rsf-admin/src/page/locItem/LocItemList.jsx
@@ -27,20 +27,20 @@
     DateInput,
     SelectInput,
     NumberInput,
+    useRefresh,
     ReferenceInput,
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
-    useRefresh,
-    Button,
-    useList,
 } from 'react-admin';
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import { Box, Typography, Card, Stack } from '@mui/material';
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
+import { Box, Typography, Card, Stack , LinearProgress} from '@mui/material';
 import { styled } from '@mui/material/styles';
-import LocListAside from "./LocListAside";
+import LocItemCreate from "./LocItemCreate";
+import EmptyData from "../components/EmptyData";
+import PageDrawer from "../components/PageDrawer";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -52,99 +52,40 @@
     '& .column-name': {
     },
     '& .opt': {
-        width: 180
+        width: 200
     },
-    '& .type .MuiTypography-root': {
-        whiteSpace: 'nowrap',
-        overflow: 'hidden',
-        textOverflow: 'ellipsis',
-        display: 'block',
-        width: 'auto',
-    },
-    '& .MuiTableCell-root': {
-        whiteSpace: 'nowrap',
-        overflow: 'visible',
-        textOverflow: 'unset'
-    }
 }));
 
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <NumberInput source="locId" label="table.field.locItem.locId" />,
+    <TextInput source="locCode" label="table.field.locItem.locCode" />,
+    <NumberInput source="matnrId" label="table.field.locItem.matnrId" />,
+    <TextInput source="maktx" label="table.field.locItem.maktx" />,
+    <TextInput source="matnrCode" label="table.field.locItem.matnrCode" />,
+    <TextInput source="unit" label="table.field.locItem.unit" />,
+    <NumberInput source="anfme" label="table.field.locItem.anfme" />,
+    <NumberInput source="qty" label="table.field.locItem.qty" />,
+    <TextInput source="batch" label="table.field.locItem.batch" />,
+    <TextInput source="spec" label="table.field.locItem.spec" />,
+    <TextInput source="model" label="table.field.locItem.model" />,
+    <TextInput source="fieldsIndex" label="table.field.locItem.fieldsIndex" />,
+    <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 LocItemList = () => {
-    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_loc_use_stas')) || [];
-    const locType = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_loc_type')) || [];
+    const translate = useTranslate();
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
-    const [initDialog, setInitDialog] = useState(false);
-    const translate = useTranslate();
-    const refresh = useRefresh();
-    const notify = useNotify();
-
-    const filters = [
-        <SearchInput source="condition" alwaysOn />,
-        <ReferenceInput
-            source="warehouseId"
-            label="table.field.loc.warehouseId"
-            reference="warehouse"
-        >
-            <AutocompleteInput
-                label="table.field.loc.warehouseId"
-                optionText="name"
-                filterToQuery={(val) => ({ name: val })}
-            />
-        </ReferenceInput>,
-        <ReferenceInput
-            source="areaId"
-            label="table.field.loc.areaId"
-            reference="warehouseAreas"
-        >
-            <AutocompleteInput
-                label="table.field.loc.areaId"
-                optionText="name"
-                filterToQuery={(val) => ({ name: val })}
-            />
-        </ReferenceInput>,
-        <AutocompleteInput
-            choices={dicts}
-            optionText="label"
-            label="table.field.loc.useStatus"
-            source="useStatus"
-            optionValue="value"
-            parse={v => v}
-
-        />,
-        <TextInput source="code" label="table.field.loc.code" />,
-        <AutocompleteInput
-            choices={locType}
-            optionText="label"
-            label="table.field.loc.type"
-            source="type"
-            optionValue="value"
-            parse={v => v}
-        />,
-        <TextInput source="name" label="table.field.loc.name" />,
-        <NumberInput source="flagLogic" label="table.field.loc.flagLogic" />,
-        <TextInput source="fucAtrrs" label="table.field.loc.fucAtrrs" />,
-        <TextInput source="barcode" label="table.field.loc.barcode" />,
-        <TextInput source="unit" label="table.field.loc.unit" />,
-        <TextInput source="size" label="table.field.loc.size" />,
-        <NumberInput source="row" label="table.field.loc.row" />,
-        <NumberInput source="col" label="table.field.loc.col" />,
-        <NumberInput source="lev" label="table.field.loc.lev" />,
-        <NumberInput source="channel" label="table.field.loc.channel" />,
-        <NumberInput source="maxParts" label="table.field.loc.maxParts" />,
-        <NumberInput source="maxPack" label="table.field.loc.maxPack" />,
-        <NumberInput source="flagLabelMange" label="table.field.loc.flagLabelMange" />,
-        <TextInput source="locAttrs" label="table.field.loc.locAttrs" />,
-        <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
-        />,
-    ]
 
     return (
         <Box display="flex">
@@ -155,57 +96,119 @@
                         theme.transitions.create(['all'], {
                             duration: theme.transitions.duration.enteringScreen,
                         }),
-                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
-                storeKey="locItem"
-                resource="loc/items"
                 title={"menu.locItem"}
-                empty={false}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
-                        {/* <SelectColumnsButton preferenceKey='loc' /> */}
+                        <SelectColumnsButton preferenceKey='locItem' />
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
-                aside={<LocListAside />}
             >
-                <StyledDatagrid
-                    preferenceKey='locItem'
-                    align="left"
-                    bulkActionButtons={false}
-                    rowClick={() => false}
-                    omit={['id', 'createTime', 'createBy$', 'memo', 'updateTime', 'updateBy', 'statusBool', 'length', 'width', 'height']}
-                >
-                    <NumberField source="id" />
-                    <NumberField source="warehouseId$" label="table.field.loc.warehouseId" />
-                    <NumberField source="areaId$" label="table.field.loc.areaId" />
-                    <TextField source="code" label="table.field.loc.code" />
-                    <TextField source="typeIds$" label="table.field.loc.type" cellClassName="type" />
-                    <TextField source="barcode" label="table.field.loc.barcode" />
-                    <TextField source="length" label="table.field.loc.length" />
-                    <TextField source="width" label="table.field.loc.width" />
-                    <TextField source="height" label="table.field.loc.height" />
-                    <NumberField source="row" label="table.field.loc.row" />
-                    <NumberField source="col" label="table.field.loc.col" />
-                    <NumberField source="lev" label="table.field.loc.lev" />
-                    <NumberField source="channel" label="table.field.loc.channel" />
-                    <TextField source="useStatus$" label="table.field.loc.useStatus" />
-                    <TextField source="updateBy$" label="common.field.updateBy" />
-                    <DateField source="updateTime" label="common.field.updateTime" showTime align="left" />
-                    <TextField source="createBy$" label="common.field.createBy" />
-                    <DateField source="createTime" label="common.field.createTime" showTime align="left" />
-                    <BooleanField source="statusBool" label="common.field.status" sortable={false} align="left" />
-                    <TextField source="memo" label="common.field.memo" sortable={false} />
-                    <WrapperField cellClassName="opt" label="common.field.opt">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} resource="locItem" label="toolbar.detail" />
-                    </WrapperField>
-                </StyledDatagrid>
+                <DynamicFields />
             </List>
+            <LocItemCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='LocItem Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
         </Box>
     )
 }
 
-export default LocItemList;
\ No newline at end of file
+export default LocItemList;
+
+
+const DynamicFields = (props) => {
+    const translate = useTranslate();
+    const notify = useNotify();
+    const [columns, setColumns] = useState([]);
+    const { isLoading } = useListContext();
+    const refresh = useRefresh();
+    useEffect(() => {
+        getDynamicFields();
+    }, []);
+
+    const getDynamicFields = async () => {
+        const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
+        if (code == 200) {
+            const arr = [
+                <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" />,
+                <TextField source="batch" label="table.field.locItem.batch" />,
+                <NumberField source="splrId" label="table.field.locItem.splrId" />,
+                <TextField source="spec" label="table.field.locItem.spec" />,
+                <TextField source="model" label="table.field.locItem.model" />
+            ]
+            const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
+            const lastArr = [
+                <DateField source="updateTime" label="common.field.updateTime" showTime />,
+                <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                    <TextField source="nickname" />
+                </ReferenceField>,
+                <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                    <TextField source="nickname" />
+                </ReferenceField>,
+                <DateField source="createTime" label="common.field.createTime" showTime />,
+                <TextField source="memo" label="common.field.memo" sortable={false} />,
+            ]
+            setColumns([...arr, ...fields, ...lastArr]);
+
+            data.map(el => {
+                var i = 0;
+                filters.map((item) => {
+                    if (item.key === el.fields) {
+                        i = 1;
+                    }
+                })
+                i === 0 && filters.push(<TextInput key={el.fields} source={el.fields} label={el.fieldsAlise}  alwaysOn/>)
+            })
+
+        } else {
+            notify(msg);
+        }
+    }
+
+    return (
+        <Box sx={{ position: 'relative', minHeight: "60vh", }}>
+            {isLoading && (
+                <LinearProgress
+                    sx={{
+                        height: "2px",
+                        position: 'absolute',
+                        top: 0,
+                        left: 0,
+                        right: 0,
+                    }}
+                />
+            )}
+            {columns.length > 0 &&
+                <StyledDatagrid
+                    preferenceKey='locItem'
+                    bulkActionButtons={false}
+                    rowClick={(id, resource, record) => false}
+                    expand={false}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'splrId', 'locId', 'matnrId']}
+                >
+                    {columns.map((column) => column)}
+                </StyledDatagrid>}
+        </Box>
+    )
+}
\ No newline at end of file

--
Gitblit v1.9.1