From e8f76615d2875e1acf9b28b20657cbca6117ca9f Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 16 五月 2025 18:18:58 +0800
Subject: [PATCH] 1. 即时库存修改

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/StockItemMapper.java                 |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseStockServiceImpl.java |   28 +
 rsf-admin/src/page/statistics/stockManage/WarehouseAside.jsx                                        |   82 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/WarehouseStockMapper.java            |   19 +
 rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml                                      |   51 --
 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java                   |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WarehouseStockParam.java  |   18 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseStockService.java          |    9 
 rsf-server/src/main/resources/mapper/manager/WarehouseStockMapper.xml                               |   30 +
 /dev/null                                                                                           |  121 ------
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java    |  107 +++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/StockItemServiceImpl.java      |   10 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/ViewStockManage.java                 |   95 +++++
 rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx                                    |  112 +++--
 rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx                                    |   45 +-
 rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java                |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java                       |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/ViewStockType.java                    |   19 +
 rsf-admin/src/i18n/zh.js                                                                            |   15 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/StockItemService.java               |    7 
 rsf-server/src/main/resources/mapper/manager/StockItemMapper.xml                                    |    3 
 rsf-admin/src/i18n/en.js                                                                            |    9 
 rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx                                    |  239 ++++++++-----
 23 files changed, 688 insertions(+), 355 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 1891dfd..f0e233f 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -95,6 +95,14 @@
             },
             placeholder: 'Please enter your search content',
         },
+        aside: {
+            category: 'Category',
+            material: 'Material锛坉efault锛�',
+            supplier: 'Supplier',
+            warehouse: 'Warehouse',
+            batch: 'Batch',
+            dynamicFields: 'Dynamic Fields'
+        }
     },
     filters: {
         lastCreated: 'Last created',
@@ -918,6 +926,7 @@
                 type: "type",
                 orderItemId: "orderItemId",
                 wkType: "wkType",
+                aggType: "Agg Type",
                 matnrId: "matnrId",
                 maktx: "maktx",
                 matnrCode: "matnrCode",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 3627f6e..f3bd509 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -96,6 +96,14 @@
             },
             placeholder: '璇疯緭鍏ユ悳绱㈠唴瀹�',
         },
+        aside: {
+            category: '姹囨�诲垎绫�',
+            material: '鐗╂枡锛堥粯璁わ級',
+            supplier: '渚涘簲鍟�',
+            warehouse: '浠撳簱',
+            batch: '鎵规',
+            dynamicFields: '鍔ㄦ�佸瓧娈�'
+        }
     },
     filters: {
         lastCreated: '鏈�杩戝垱寤�',
@@ -927,7 +935,7 @@
                 matnrCode: "鐗╂枡缂栫爜",
                 maktx: "鐗╂枡鍚嶇О",
                 anfme: "鏁伴噺",
-                stockUnit: "stockUnit",
+                stockUnit: "鍗曚綅",
                 workQty: "鎵ц鏁�",
                 purQty: "閲囪喘鏁�",
                 purUnit: "閲囪喘鍗曚綅",
@@ -948,6 +956,7 @@
                 type: "鍗曟嵁绫诲瀷",
                 orderItemId: "鍗曟嵁鏄庣粏ID",
                 wkType: "涓氬姟绫诲瀷",
+                aggType: "姹囨�荤被鍨�",
                 matnrId: "鐗╂枡ID",
                 maktx: "鐗╂枡鍚嶇О",
                 unit: '鍗曚綅',
@@ -977,8 +986,8 @@
                 workQty: '鎵ц鏁�',
                 qty: '涓嶅彲鐢ㄥ簱瀛�',
                 splrId: '渚涘簲鍟�',
-                batch: "渚涘簲鍟嗘壒娆�",
-                splrBatch: "渚涘簲鍟嗘壒娆�",
+                batch: "鎵规",
+                splrBatch: "鎵规",
                 spec: "瑙勬牸",
                 model: "鍨嬪彿",
                 fieldsIndex: "鍔ㄦ�佺储寮�",
diff --git a/rsf-admin/src/page/statistics/stockManage/MatnrListAside.jsx b/rsf-admin/src/page/statistics/stockManage/MatnrListAside.jsx
deleted file mode 100644
index dd93b57..0000000
--- a/rsf-admin/src/page/statistics/stockManage/MatnrListAside.jsx
+++ /dev/null
@@ -1,121 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import request from '@/utils/request';
-import {
-    SavedQueriesList,
-    FilterLiveSearch,
-    useNotify,
-    useListContext,
-    SearchInput
-} from 'react-admin';
-import BookmarkIcon from '@mui/icons-material/BookmarkBorder';
-import { Box, Typography, Card, CardContent, useTheme, Input } from '@mui/material';
-import { RichTreeView } from "@mui/x-tree-view/RichTreeView";
-import { TreeItem2 } from "@mui/x-tree-view/TreeItem2";
-
-
-const MatListAside = () => {
-    const theme = useTheme();
-    const notify = useNotify();
-    const { setFilters } = useListContext(); // 鑾峰彇鍒楄〃涓婁笅鏂�
-    const [selectedOption, setSelectedOption] = useState(null);
-    const [treeData, setTreeData] = useState([]);
-    const [defaultIds, setDefaultIds] = useState(['65']);
-    const [condition, setCondition] = useState('');
-
-    const haveChildren = (item) => {
-        if (Array.isArray(item)) {
-            return item.map((k) => haveChildren(k));
-        }
-
-        if (item && typeof item === 'object') {
-            if (item.id !== undefined) {
-                item.id = item.id.toString();
-            }
-
-            if (item.children && Array.isArray(item.children)) {
-                item.children = haveChildren(item.children);
-            }
-        }
-
-        return item;
-    };
-    useEffect(() => {
-        http()
-    }, [condition]);
-
-    const http = () => {
-        request.post('/matnrGroup/tree', { condition })
-            .then(res => {
-                if (res?.data?.code === 200) {
-                    let data = res.data.data;
-                    let items = haveChildren(data)
-                    setTreeData(items)
-                    setDefaultIds([items.at(0).id])
-
-                } else {
-                    notify(res.data.msg);
-                }
-            })
-            .catch(error => {
-                notify('Error fetching tree data');
-            });
-
-    }
-    const handleNodeSelect = (event, nodeId) => {
-        setFilters({ groupId: nodeId });
-    };
-    const handleSearch = (e) => {
-        setCondition(e.target.value)
-    };
-
-
-    const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) {
-        return <input type="checkbox" ref={ref} {...props} />;
-    });
-
-    const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) {
-        return (
-            <TreeItem2
-                {...props}
-                ref={ref}
-                slots={{
-                    checkbox: CustomCheckbox,
-                }}
-            />
-        );
-    });
-
-
-    return (
-        <Card
-            sx={{
-                order: -1,
-                mr: 2,
-                mt: 8,
-                alignSelf: 'flex-start',
-                border: theme.palette.mode === 'light' && '1px solid #e0e0e3',
-                width: 250,
-                minWidth: 150,
-                height: `100%`,
-            }}
-        >
-            <CardContent>
-                <Input
-                    placeholder="鎼滅储鐗╂枡鍒嗙粍"
-                    sx={{ '--Input-focused': 1, marginBottom: '10px' }}
-                    onChange={handleSearch}
-                />
-                <RichTreeView
-                    defaultExpandedItems={defaultIds}
-                    expansionTrigger="iconContainer"
-                    items={treeData}
-                    slots={CustomTreeItem}
-                    onItemClick={handleNodeSelect} // 鐩戝惉鑺傜偣鐐瑰嚮浜嬩欢
-                />
-
-            </CardContent>
-        </Card>
-    )
-}
-
-export default MatListAside;
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseAside.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseAside.jsx
new file mode 100644
index 0000000..4ee352c
--- /dev/null
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseAside.jsx
@@ -0,0 +1,82 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import request from '@/utils/request';
+import {
+    SavedQueriesList,
+    FilterLiveSearch,
+    useNotify,
+    useListContext,
+    SearchInput,
+    FilterList,
+    FilterListItem,
+} from 'react-admin';
+import BookmarkIcon from '@mui/icons-material/BookmarkBorder';
+import { Box, Typography, Card, CardContent, useTheme, Input } from '@mui/material';
+import CategoryIcon from '@mui/icons-material/LocalOffer';
+
+
+const WarehouseAside = () => {
+    const [isSelect, setIsSelect] = useState(false); 
+    const isSelected = (value, filters) => {
+        const aggType = filters.aggType || [];
+        return aggType.includes(value.aggType);
+    };
+
+    const toggleFilter = (value, filters) => {
+        const aggType = filters.type || [];
+        return {
+            aggType: value.aggType,
+        };
+    };
+
+    return (
+        <Card
+            sx={{
+                order: -1,
+                mr: 2,
+                mt: 8,
+                alignSelf: 'flex-start',
+                width: 250,
+                minWidth: 150,
+                height: `87%`,
+                "& .MuiTypography-root": {fontSize: '1rem'}
+            }}
+        >
+            <FilterList label="common.aside.category" icon={<CategoryIcon />} sx={{ml: 2}}>
+                <FilterListItem
+                    label="common.aside.material"
+                    value={{ aggType: 'matnr' }}
+                    isSelected={isSelected}
+                    toggleFilter={toggleFilter}
+                />
+                <FilterListItem
+                    label="common.aside.supplier"
+                    value={{ aggType: 'supplier' }}
+                    isSelected={isSelected}
+                    toggleFilter={toggleFilter}
+                />
+                <FilterListItem
+                    label="common.aside.warehouse"
+                    value={{ aggType: 'warehouse' }}
+                    isSelected={isSelected}
+                    toggleFilter={toggleFilter}
+                />
+                <FilterListItem
+                    label="common.aside.batch"
+                    value={{ aggType: 'batch' }}
+                    isSelected={isSelected}
+                    toggleFilter={toggleFilter}
+                />
+                <FilterListItem
+                    label="common.aside.dynamicFields"
+                    value={{ aggType: 'fieldsIndex' }}
+                    isSelected={isSelected}
+                    toggleFilter={toggleFilter}
+                />
+            </FilterList>
+
+        </Card>
+
+    )
+}
+
+export default WarehouseAside;
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
index 236bf9a..7eaff96 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseHistories.jsx
@@ -40,7 +40,7 @@
 } from 'react-admin';
 import DialogCloseButton from "../../components/DialogCloseButton";
 import { styled } from '@mui/material/styles';
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting';
 import { Grid, Stack, width } from "@mui/system";
 import request from '@/utils/request';
 import SaveIcon from '@mui/icons-material/Save';
@@ -118,7 +118,7 @@
                 aria-hidden
                 fullWidth
                 disableRestoreFocus
-                maxWidth="lg"
+                maxWidth="xl"
             >
                 <DialogTitle id="form-dialog-title" sx={{
                     position: 'sticky',
@@ -133,58 +133,64 @@
                 <Grid container rowSpacing={2} columnSpacing={2}>
                     <DialogContent>
                         <Grid item sx={24}>
-                            <List
-                                storeKey="selectPurchase"
-                                resource="purchase/filters"
-                                sx={{
-                                    flexGrow: 1,
-                                    marginTop: 8,
-                                    height: 500,
-                                    transition: (theme) =>
-                                        theme.transitions.create(['all'], {
-                                            duration: theme.transitions.duration.enteringScreen,
-                                        }),
-                                    marginRight: 0,
-                                }}
-                                // filters={<CustomFilter />}
-                                queryOptions={{ meta: { ...params } }}
-                                empty={false}
-                                sort={{ field: "create_time", order: "desc" }}
-                                actions={false}
-                                perPage={DEFAULT_PAGE_SIZE}
-                            >
-                                <StyledDatagrid
-                                    preferenceKey='selectPurchase'
-                                    bulkActionButtons={
-                                        <>
-                                            <ConfirmSelectButton
-                                                setOpen={setOpen}
-                                                setPoItemDialog={setPoItemDialog}
-                                                setItem={setItem}
-                                                mutationMode="pessimistic" />
-                                        </>
-                                    }
-                                    rowClick={false}
-                                    expand={false}
-                                    expandSingle={true}
-                                    omit={['id', 'createTime', 'createBy', 'channel', 'platCode', 'memo', 'channel', 'startTime', 'workQty', 'endTime']}
+                            <Box display="flex">
+                                <List
+                                    resource="warehouse/stock/histories"
+                                    sx={{
+                                        flexGrow: 1,
+                                        transition: (theme) =>
+                                            theme.transitions.create(['all'], {
+                                                duration: theme.transitions.duration.enteringScreen,
+                                            }),
+                                        marginRight: 0,
+                                    }}
+                                    title={"menu.stockItem"}
+                                    empty={false}
+                                    filter={{ stock: record }}
+                                    sort={{ field: "create_time", order: "desc" }}
+                                    actions={(
+                                        <TopToolbar>
+                                            <SelectColumnsButton preferenceKey='stockHistories' />
+                                            {/* <MyExportButton /> */}
+                                        </TopToolbar>
+                                    )}
+                                    perPage={DEFAULT_ITEM_PAGE_SIZE}
                                 >
-                                    <NumberField source="id" />
-                                    <TextField source="code" label="table.field.purchase.code" />
-                                    <TextField source="type$" label="table.field.purchase.type" />
-                                    <TextField source="wkType$" label="table.field.purchase.wkType" />
-                                    <TextField source="source" label="table.field.purchase.source" />
-                                    <NumberField source="anfme" label="table.field.purchase.anfme" />
-                                    <NumberField source="qty" label="table.field.purchase.qty" />
-                                    <TextField source="channel" label="table.field.purchase.channel" />
-                                    <TextField source="platCode" label="table.field.purchase.platCode" />
-                                    <DateField source="preArr" label="table.field.purchase.preArr" showTime />
-                                    <DateField source="startTime" label="table.field.purchase.startTime" showTime />
-                                    <DateField source="endTime" label="table.field.purchase.endTime" showTime />
-                                    <TextField source="project" label="table.field.purchase.project" />
-                                    <TextField source="memo" label="common.field.memo" sortable={false} />
-                                </StyledDatagrid>
-                            </List>
+                                    <StyledDatagrid
+                                        preferenceKey='stockHistories'
+                                        bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                                        rowClick={(id, resource, record) => false}
+                                        expand={false}
+                                        expandSingle={true}
+                                        omit={['id', 'createTime', 'orderId', 'sourceItemId', 'matnrId', 'createBy', 'barcode', 'splrCode', 'splrBatch', 'updateBy$', 'createBy$', 'memo']}
+                                    >
+                                        <NumberField source="id" />
+                                        <NumberField source="orderId" label="table.field.stockItem.orderId" />
+                                        <TextField source="orderCode" label="table.field.stockItem.orderCode" />
+                                        <TextField source="sourceItemId" label="table.field.stockItem.sourceItemId" />
+                                        <TextField source="matnrId" label="table.field.stockItem.matnrId" />
+                                        <TextField source="matnrCode" label="table.field.stockItem.matnrCode" />
+                                        <TextField source="maktx" label="table.field.stockItem.maktx" />
+                                        <NumberField source="anfme" label="table.field.stockItem.anfme" />
+                                        <TextField source="stockUnit" label="table.field.stockItem.stockUnit" />
+                                        <NumberField source="workQty" label="table.field.stockItem.workQty" />
+                                        <NumberField source="qty" label="table.field.stockItem.qty" />
+                                        <TextField source="splrCode" label="table.field.stockItem.splrCode" />
+                                        <TextField source="batch" label="table.field.stockItem.batch" />
+                                        <TextField source="splrBatch" label="table.field.stockItem.splrBatch" />
+                                        <TextField source="splrName" label="table.field.stockItem.splrName" />
+                                        <TextField source="trackCode" label="table.field.stockItem.trackCode" />
+                                        <TextField source="barcode" label="table.field.stockItem.barcode" />
+                                        <TextField source="prodTime" label="table.field.stockItem.prodTime" />
+                                        <TextField source="packName" label="table.field.stockItem.packName" />
+                                        <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 />
+                                        <TextField source="memo" label="common.field.memo" sortable={false} />
+                                    </StyledDatagrid>
+                                </List>
+                            </Box>
                         </Grid>
                     </DialogContent>
                 </Grid>
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
index deaf6ff..d540252 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
@@ -50,7 +50,6 @@
 import SaveIcon from '@mui/icons-material/Save';
 import request from '@/utils/request';
 import { Add, Edit, Delete } from '@mui/icons-material';
-import _, { set } from 'lodash';
 import { DataGrid, useGridApiRef, GRID_DATE_COL_DEF, GRID_DATETIME_COL_DEF, getGridDateOperators, useGridApiContext } from '@mui/x-data-grid';
 import { LocalizationProvider, DatePicker, DateTimePicker } from '@mui/x-date-pickers';
 import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
@@ -103,16 +102,16 @@
     const handleSubmit = async () => {
         setFinally()
         setDisabled(true)
-        const parmas = {
-            "purchaseId": record,
-            "items": tabelData,
-        }
-        const res = await request.post(`/asnOrder/purchases/save`, parmas);
-        if (res?.data?.code === 200) {
-            notify(res.data.msg);
-        } else {
-            notify(res.data.msg);
-        }
+        // const parmas = {
+        //     "purchaseId": record,
+        //     "items": tabelData,
+        // }
+        // const res = await request.post(`/asnOrder/purchases/save`, parmas);
+        // if (res?.data?.code === 200) {
+        //     notify(res.data.msg);
+        // } else {
+        //     notify(res.data.msg);
+        // }
         setOpen(false);
         refresh();
         resetData()
@@ -120,7 +119,7 @@
     };
 
     const requestGetBody = async () => {
-        const res = await request.post(`warehouse/stock/page`, { matnrCode: record });
+        const res = await request.post(`warehouse/stock/info`, { stock: record, aggType: record?.aggType });
         if (res?.data?.code === 200) {
             setTableData(res.data.data.records)
         } else {
@@ -236,20 +235,26 @@
 
     const [columns, setColumns] = useState([
         {
+            field: 'warehouse',
+            headerName: translate('table.field.warehouseStock.warehouse'),
+            width: 130,
+            editable: false,
+        },
+        {
             field: 'matnrCode',
             headerName: translate('table.field.asnOrderItem.matnrCode'),
             width: 130,
             editable: false,
         },
         {
-            field: 'matnrName',
+            field: 'maktx',
             headerName: translate('table.field.asnOrderItem.maktx'),
             width: 250,
             editable: false,
         },
         {
-            field: 'splrName',
-            headerName: translate('table.field.asnOrderItem.splrName') + "*",
+            field: 'locCode',
+            headerName: translate('table.field.warehouseStock.locCode'),
             minWidth: 150,
             flex: 1,
             editable: false,
@@ -258,15 +263,15 @@
             ),
         },
         {
-            field: 'platItemId',
-            headerName: translate('table.field.asnOrderItem.platItemId') + "*",
+            field: 'batch',
+            headerName: translate('table.field.warehouseStock.splrBatch'),
             minWidth: 100,
             flex: 1,
             editable: false,
         },
         {
             field: 'anfme',
-            headerName: translate('table.field.asnOrderItem.anfme') + "*",
+            headerName: translate('table.field.warehouseStock.anfme'),
             type: 'number',
             minWidth: 100,
             flex: 1,
@@ -275,7 +280,7 @@
         },
         {
             field: 'qty',
-            headerName: translate('table.field.asnOrderItem.qty') + "*",
+            headerName: translate('table.field.warehouseStock.qty'),
             type: 'number',
             minWidth: 100,
             flex: 1,
@@ -283,7 +288,7 @@
         },
         {
             field: 'unit',
-            headerName: translate('table.field.asnOrderItem.stockUnit'),
+            headerName: translate('table.field.warehouseStock.unit'),
             minWidth: 100,
             flex: 1,
             editable: false,
diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
index 376e6ab..b50474b 100644
--- a/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
+++ b/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx
@@ -31,22 +31,19 @@
     ReferenceArrayInput,
     useRefresh,
     AutocompleteInput,
+    required,
     DeleteButton,
     Button,
 } from 'react-admin';
 import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material';
 import { styled } from '@mui/material/styles';
-import EmptyData from "../../components/EmptyData";
-import MyCreateButton from "../../components/MyCreateButton";
 import MyExportButton from '../../components/MyExportButton';
-import PageDrawer from "../../components/PageDrawer";
 import MyField from "../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
 import request from '@/utils/request';
-import WarehouseStockCreate from "./WarehouseStockCreate";
 import WarehouseStockInfo from "./WarehouseStockInfo";
-import MatnrListAside from "./MatnrListAside";
+import MatnrListAside from "./WarehouseAside";
+import WarehouseHistories from "./WarehouseHistories";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -58,126 +55,188 @@
     '& .column-name': {
     },
     '& .opt': {
-        width: 220
+        width: 180
     },
 }));
 
-const filters = [
-    <SearchInput source="condition" alwaysOn />,
-    <NumberInput source="locId" label="table.field.locItem.locId" />,
-    <TextInput source="locCode" label="table.field.locItem.locCode" />,
-    <TextInput source="type" label="table.field.locItem.type" />,
-    <NumberInput source="orderItemId" label="table.field.locItem.orderItemId" />,
-    <NumberInput source="wkType" label="table.field.locItem.wkType" />,
-    <NumberInput source="matnrId" label="table.field.locItem.matnrId" />,
-    <TextInput source="maktx" label="table.field.locItem.maktx" />,
-    <TextInput source="unit" label="table.field.locItem.unit" />,
-    <NumberInput source="anfme" label="table.field.locItem.anfme" />,
-    <NumberInput source="workQty" label="table.field.locItem.workQty" />,
-    <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" />,
-]
 
 const WarehouseStockList = () => {
     const translate = useTranslate();
     const [createDialog, setCreateDialog] = useState(false);
-    const [matnrCode, setMatnrCode] = useState('');
+    const [select, setSelect] = useState({});
     const [drawerVal, setDrawerVal] = useState(false);
 
+    const filters = [
+        <SearchInput source="condition" alwaysOn />,
+        <NumberInput source="locId" label="table.field.locItem.locId" />,
+        <TextInput source="locCode" label="table.field.locItem.locCode" />,
+        <TextInput source="type" label="table.field.locItem.type" />,
+        <ReferenceInput source="aggType" reference="dictData" filter={{ dictTypeCode: 'sys_stock_summary_code' }} alwaysOn>
+            <AutocompleteInput optionText='label' optionValue="value" label="table.field.locItem.aggType" />
+        </ReferenceInput>,
+        <NumberInput source="orderItemId" label="table.field.locItem.orderItemId" />,
+        <NumberInput source="wkType" label="table.field.locItem.wkType" />,
+        <NumberInput source="matnrId" label="table.field.locItem.matnrId" />,
+        <TextInput source="maktx" label="table.field.locItem.maktx" />,
+        <TextInput source="unit" label="table.field.locItem.unit" />,
+        <NumberInput source="anfme" label="table.field.locItem.anfme" />,
+        <NumberInput source="workQty" label="table.field.locItem.workQty" />,
+        <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" />,
+    ]
+
     return (
-        <Box display="flex">
-            <List
-                sx={{
-                    flexGrow: 1,
-                    transition: (theme) =>
-                        theme.transitions.create(['all'], {
-                            duration: theme.transitions.duration.enteringScreen,
-                        }),
-                    marginRight: 0,
-                }}
-                resource="warehouse/stock"
-                title={"common.button.detail"}
-                empty={false}
-                filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
-                actions={(
-                    <TopToolbar>
-                        <FilterButton />
-                        <SelectColumnsButton preferenceKey='locItem' />
-                    </TopToolbar>
-                )}
-                perPage={DEFAULT_PAGE_SIZE}
-            >
+        <>
+            <Box display="flex">
+                <List
+                    sx={{
+                        flexGrow: 1,
+                        transition: (theme) =>
+                            theme.transitions.create(['all'], {
+                                duration: theme.transitions.duration.enteringScreen,
+                            }),
+                        marginRight: 0,
+                    }}
+                    resource="warehouse/stock"
+                    title={"common.button.detail"}
+                    empty={false}
+                    filters={filters}
+                    sort={{ field: "create_time", order: "desc" }}
+                    actions={(
+                        <TopToolbar>
+                            <FilterButton />
+                            <SelectColumnsButton preferenceKey='viewStockManage' />
+                            <MyExportButton />
+                        </TopToolbar>
+                    )}
+                    perPage={DEFAULT_PAGE_SIZE}
+                    aside={<MatnrListAside />}
+                >
+                    <DynamicFields
+                        setDrawerVal={setDrawerVal}
+                        setCreateDialog={setCreateDialog}
+                        setSelect={setSelect}
+                    />
+                </List>
+                <WarehouseStockInfo
+                    open={createDialog}
+                    setOpen={setCreateDialog}
+                    record={select}
+                />
+                <WarehouseHistories
+                    open={drawerVal}
+                    setOpen={setDrawerVal}
+                    record={select}
+                />
+            </Box>
+        </>
+    )
+}
+
+export default WarehouseStockList;
+
+
+const DynamicFields = (props) => {
+    const {setDrawerVal, setCreateDialog, setSelect} = 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.warehouseStock.locId" />,
+                <TextField source="locCode" label="table.field.warehouseStock.locCode" />,
+                <NumberField source="orderId" label="table.field.warehouseStock.orderId" />,
+                <NumberField source="orderItemId" label="table.field.warehouseStock.orderItemId" />,
+                <NumberField source="matnrId" label="table.field.warehouseStock.matnrId" />,
+                <TextField source="matnrCode" label="table.field.warehouseStock.matnrCode" />,
+                <TextField source="maktx" label="table.field.warehouseStock.maktx" />,
+                <NumberField source="anfme" label="table.field.warehouseStock.anfme" />,
+                <NumberField source="workQty" label="table.field.warehouseStock.qty" />,
+                <TextField source="spec" label="table.field.warehouseStock.spec" />,
+                <TextField source="model" label="table.field.warehouseStock.model" />,
+                <TextField source="batch" label="table.field.warehouseStock.batch" />,
+                <TextField source="unit" label="table.field.warehouseStock.unit" />,
+                <TextField source="fieldsIndex" label="table.field.warehouseStock.fieldsIndex" />,
+            ]
+            const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
+            const lastArr = [
+                <TextField source="updateBy$" label="common.field.updateBy" />,
+                <DateField source="updateTime" label="common.field.updateTime" showTime />,
+                <WrapperField cellClassName="opt" label="common.field.opt">
+                    <HistoriesButton setDrawerVal={setDrawerVal} setSelect={setSelect} />
+                    <StockInfoButton setCreateDialog={setCreateDialog} setSelect={setSelect} />
+                </WrapperField>
+            ]
+            setColumns([...arr, ...fields, ...lastArr]);
+        } 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'
+                    preferenceKey='viewStockManage'
                     bulkActionButtons={false}
                     rowClick={false}
                     expand={false}
                     expandSingle={true}
                     omit={['id', 'createTime', 'locId', 'spec', 'model', 'locCode', 'orderId', 'orderItemId', 'matnrId', 'splrBatch', 'createBy', 'memo', 'fieldsIndex']}
                 >
-                    <NumberField source="id" />
-                    <NumberField source="locId" label="table.field.warehouseStock.locId" />
-                    <TextField source="locCode" label="table.field.warehouseStock.locCode" />
-                    <NumberField source="orderId" label="table.field.warehouseStock.orderId" />
-                    <NumberField source="orderItemId" label="table.field.warehouseStock.orderItemId" />
-                    <NumberField source="matnrId" label="table.field.warehouseStock.matnrId" />
-                    <TextField source="matnrCode" label="table.field.warehouseStock.matnrCode" />
-                    <TextField source="maktx" label="table.field.warehouseStock.maktx" />
-                    <NumberField source="anfme" label="table.field.warehouseStock.anfme" />
-                    <NumberField source="workQty" label="table.field.warehouseStock.qty" />
-                    <TextField source="spec" label="table.field.warehouseStock.spec" />
-                    <TextField source="model" label="table.field.warehouseStock.model" />
-                    {/* <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField> */}
-                    {/* <ReferenceField source="splrId" label="table.field.warehouseStock.splrId" reference="companys">
-                        <TextField source="name" filterToQuery={(val) => ({ name: val })} />
-                    </ReferenceField>, */}
-                    <TextField source="batch" label="table.field.warehouseStock.batch" />
-                    <TextField source="unit" label="table.field.warehouseStock.unit" />
-                    <TextField source="fieldsIndex" label="table.field.warehouseStock.fieldsIndex" />
-                    <TextField source="updateBy$" label="common.field.updateBy" />
-                    <DateField source="updateTime" label="common.field.updateTime" showTime />
-                    <WrapperField cellClassName="opt" label="common.field.opt">
-                        <StockInfoButton />
-                        <HistoriesButton setCreateDialog={setCreateDialog} setMatnrCode={setMatnrCode} />
-                    </WrapperField>
-                </StyledDatagrid>
-            </List>
-            <WarehouseStockInfo
-                open={createDialog}
-                setOpen={setCreateDialog}
-                record={matnrCode}
-            />
+                    {columns.map((column) => column)}
+                </StyledDatagrid>}
         </Box>
     )
 }
 
-export default WarehouseStockList;
 
-const HistoriesButton = ({ setCreateDialog , setMatnrCode}) => {
+const HistoriesButton = ({ setDrawerVal, setSelect }) => {
     const record = useRecordContext();
     const historyClick = (event) => {
         event.stopPropagation();
-        setCreateDialog(true)
-        setMatnrCode(record?.matnrCode)
+        setDrawerVal(true)
+        setSelect(record)
     }
     return (
         <Button label="common.button.histories" onClick={historyClick}></Button>
     )
 }
 
-const StockInfoButton = () => {
+const StockInfoButton = ({ setCreateDialog, setSelect }) => {
+    const record = useRecordContext();
+    const {filterValues} = useListContext();
     const stockClick = (event) => {
         event.stopPropagation();
+        setCreateDialog(true)
+        const objRecord = {...record, ...filterValues}
+        setSelect(objRecord)
     }
 
     return (
         <Button label="common.button.detail" onClick={stockClick}></Button>
     )
 }
-
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java
index eac0cb9..b4a2137 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java
@@ -49,7 +49,8 @@
                         "sys_role_menu",
                         "sys_menu",
                         "man_loc_type_rela",
-                        "man_qly_inspect_result"
+                        "man_qly_inspect_result",
+                        "view_stock_manage"
                 ).contains(tableName);
             }
         };
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
index 72b4b86..e83b13b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
@@ -1,13 +1,17 @@
 package com.vincent.rsf.server.manager.controller;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.common.utils.FieldsUtils;
-import com.vincent.rsf.server.manager.entity.LocItem;
-import com.vincent.rsf.server.manager.entity.WaitPakinItem;
+import com.vincent.rsf.server.manager.controller.params.WarehouseStockParam;
+import com.vincent.rsf.server.manager.entity.StockItem;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
+import com.vincent.rsf.server.manager.enums.ViewStockType;
 import com.vincent.rsf.server.manager.service.WarehouseStockService;
 import com.vincent.rsf.server.system.controller.BaseController;
 import io.swagger.annotations.Api;
@@ -34,19 +38,108 @@
     @PreAuthorize("hasAuthority('manager:locItem:list')")
     @PostMapping("/page")
     public R page(@RequestBody Map<String, Object> param) {
+        if (Objects.isNull(param)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
         BaseParam baseParam = buildParam(param, BaseParam.class);
-        PageParam<LocItem, BaseParam> pageParam = new PageParam<>(baseParam, LocItem.class);
-        QueryWrapper<LocItem> queryWrapper = pageParam.buildWrapper(true);
-        IPage<LocItem> pageResult = warehouseStockService.pageByStock(pageParam, queryWrapper);
-        List<LocItem> records = pageResult.getRecords();
-        for (LocItem record : records) {
+        PageParam<ViewStockManage, BaseParam> pageParam = new PageParam<>(baseParam, ViewStockManage.class);
+        WarehouseStockParam stockParam = JSONObject.parseObject(JSONObject.toJSONString(param), WarehouseStockParam.class);
+        String type = stockParam.getAggType();
+        ViewStockManage stock = stockParam.getStock();
+        QueryWrapper<ViewStockManage> wrapper = new QueryWrapper<>();
+
+        if (type.equals(ViewStockType.VIEW_STOCK_TYPE_SUPPLIER.val)) {
+            wrapper.groupBy("splr_id");
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_BATCH.val)) {
+            wrapper.groupBy("batch");
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_WAREHOUSE.val)) {
+            wrapper.groupBy("warehouse");
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_FIELDSINDEX.val)) {
+            wrapper.groupBy("fields_index");
+        } else {
+            wrapper.groupBy("matnr_id");
+        }
+        IPage<ViewStockManage> pageResult = warehouseStockService.pageByStock(pageParam, wrapper);
+        List<ViewStockManage> records = pageResult.getRecords();
+        for (ViewStockManage record : records) {
             if (!Objects.isNull(record.getFieldsIndex())) {
                 Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex());
                 record.setExtendFields(fields);
             }
         }
         pageResult.setRecords(records);
+
         return R.ok(pageResult);
     }
 
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/histories/page")
+    public R histories(@RequestBody Map<String, Object> param) {
+        if (Objects.isNull(param)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        BaseParam baseParam = buildParam(param, BaseParam.class);
+        PageParam<StockItem, BaseParam> pageParam = new PageParam<>(baseParam, StockItem.class);
+        WarehouseStockParam stockParam = JSONObject.parseObject(JSONObject.toJSONString(param), WarehouseStockParam.class);
+        String type = stockParam.getAggType();
+        ViewStockManage stock = stockParam.getStock();
+        QueryWrapper<StockItem> wrapper = new QueryWrapper<>();
+
+        if (type.equals(ViewStockType.VIEW_STOCK_TYPE_SUPPLIER.val)) {
+            wrapper.eq("sprl_id", stock.getSplrId());
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_BATCH.val)) {
+            wrapper.eq("batch", stock.getBatch());
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_WAREHOUSE.val)) {
+            wrapper.eq("warehouse", stock.getWarehouse());
+        } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_FIELDSINDEX.val)) {
+            wrapper.eq("fields_index", stock.getFieldsIndex());
+        } else {
+            wrapper.eq("matnr_id", stock.getMatnrId());
+        }
+        IPage<StockItem> pageResult = warehouseStockService.pageByHistories(pageParam, wrapper);
+
+        List<StockItem> records = pageResult.getRecords();
+        for (StockItem record : records) {
+            if (!Objects.isNull(record.getFieldsIndex())) {
+                Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex());
+                record.setExtendFields(fields);
+            }
+        }
+        pageResult.setRecords(records);
+
+        return R.ok(pageResult);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/info")
+    public R stockInfo(@RequestBody Map<String, Object> param) {
+        if (Objects.isNull(param)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        BaseParam baseParam = buildParam(param, BaseParam.class);
+        PageParam<ViewStockManage, BaseParam> pageParam = new PageParam<>(baseParam, ViewStockManage.class);
+        WarehouseStockParam stockParam = JSONObject.parseObject(JSONObject.toJSONString(param), WarehouseStockParam.class);
+        String type = stockParam.getAggType();
+        if (Objects.isNull(type)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        ViewStockManage stock = stockParam.getStock();
+        LambdaQueryWrapper<ViewStockManage> wrapper = new LambdaQueryWrapper<ViewStockManage>();
+
+        if (type.equals(ViewStockType.VIEW_STOCK_TYPE_SUPPLIER.val)) {
+            wrapper.eq(ViewStockManage::getSplrId, stock.getSplrId());
+       } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_BATCH.val)) {
+            wrapper.eq(ViewStockManage::getBatch, stock.getBatch());
+       } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_WAREHOUSE.val)) {
+            wrapper.eq(ViewStockManage::getWarehouse, stock.getWarehouse());
+       } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_FIELDSINDEX.val)) {
+            wrapper.eq(ViewStockManage::getFieldsIndex, stock.getFieldsIndex());
+        } else {
+            wrapper.eq(ViewStockManage::getMatnrCode, stock.getMatnrCode());
+       }
+
+        return R.ok(warehouseStockService.page(pageParam, wrapper));
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WarehouseStockParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WarehouseStockParam.java
new file mode 100644
index 0000000..a3b6a0e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WarehouseStockParam.java
@@ -0,0 +1,18 @@
+package com.vincent.rsf.server.manager.controller.params;
+
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WarehouseStockParam implements Serializable {
+
+    @ApiModelProperty("姹囨�荤被鍨�")
+    private String aggType;
+
+    @ApiModelProperty("姹囨�诲崟鎹�")
+    private ViewStockManage stock;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
index 26902ab..441bcfb 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
@@ -22,6 +22,7 @@
 import com.vincent.rsf.server.system.service.UserService;
 import com.vincent.rsf.server.system.entity.User;
 import java.io.Serializable;
+import java.util.Map;
 
 @Data
 @Accessors(chain = true)
@@ -139,6 +140,8 @@
     @ApiModelProperty(value= "璺熻釜鐮�")
     private String trackCode;
 
+    @ApiModelProperty("瀛楁绱㈠紩")
+    private String fieldsIndex;
     /**
      * 鏉″舰鐮�
      */
@@ -156,6 +159,10 @@
      */
     @ApiModelProperty(value= "鍖呰鍚嶇О")
     private String packName;
+
+    @ApiModelProperty("姹囨�荤被鍨�")
+    @TableField(exist = false)
+    private String aggType;
 
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
@@ -209,6 +216,11 @@
     @ApiModelProperty(value= "澶囨敞")
     private String memo;
 
+
+    @ApiModelProperty("鎵╁睍瀛楁")
+    @TableField(exist = false)
+    private Map<String, String> extendFields;
+
     public StockItem() {}
 
     public StockItem(Long orderId,String orderCode,Long sourceItemId,Long matnrId,String matnrCode,String maktx,Double anfme,String stockUnit,Double workQty,Double purQty,String purUnit,Double qty,String splrCode,String batch,String splrBatch,String splrName,String trackCode,String barcode,String prodTime,String packName,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/ViewStockManage.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/ViewStockManage.java
new file mode 100644
index 0000000..572b579
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/ViewStockManage.java
@@ -0,0 +1,95 @@
+package com.vincent.rsf.server.manager.entity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+@Data
+@Accessors(chain = true)
+@TableName("view_stock_manage")
+public class ViewStockManage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    private Long id;
+
+    @ApiModelProperty("搴撲綅ID")
+    private Long locId;
+
+    @ApiModelProperty("搴撲綅鍙�")
+    private String locCode;
+
+    @ApiModelProperty("浠撳簱")
+    @TableField(exist = false)
+    private String warehouse;
+
+    @ApiModelProperty("鍗曟嵁绫诲瀷")
+    private String type;
+
+    @ApiModelProperty("涓氬姟绫诲瀷")
+    private Short wkType;
+
+    @ApiModelProperty("璁㈠崟鏄庣粏ID")
+    private Long orderItemId;
+
+    @ApiModelProperty("鐗╂枡ID")
+    private Long matnrId;
+
+    @ApiModelProperty("鐗╂枡鍚嶇О")
+    private String maktx;
+
+    @ApiModelProperty("鐗╂枡缂栫爜")
+    private String matnrCode;
+
+    @ApiModelProperty("渚涘簲鍟咺D")
+    private Long splrId;
+
+    @ApiModelProperty("鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty("鍙敤搴撳瓨")
+    private Double anfme;
+
+    @ApiModelProperty("")
+    private Double qty;
+
+    @ApiModelProperty("涓嶅彲鐢ㄥ簱瀛�")
+    private Double workQty;
+
+    @ApiModelProperty("鎵规")
+    private String batch;
+
+    @ApiModelProperty("瑙勬牸")
+    private String spec;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String model;
+
+    @ApiModelProperty("瀛楁绱㈠紩")
+    private String fieldsIndex;
+
+    @ApiModelProperty("鏇存柊浜哄憳")
+    private Long updateBy;
+
+    @ApiModelProperty("鍒涘缓浜哄憳")
+    private Long createBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    @ApiModelProperty("鍔ㄦ�佸瓧娈� ")
+    @TableField(exist = false)
+    private Map<String, String> extendFields;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/ViewStockType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/ViewStockType.java
new file mode 100644
index 0000000..b7b0dfe
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/ViewStockType.java
@@ -0,0 +1,19 @@
+package com.vincent.rsf.server.manager.enums;
+
+
+public enum ViewStockType {
+    VIEW_STOCK_TYPE_MATNR("matnr", "鎸夌墿鏂欐眹鎬�"),
+    VIEW_STOCK_TYPE_SUPPLIER("supplier", "鎸変緵搴斿晢姹囨��"),
+    VIEW_STOCK_TYPE_WAREHOUSE("warehouse", "鎸変粨搴撴眹鎬�"),
+    VIEW_STOCK_TYPE_BATCH("batch", "鎸夋壒娆℃眹鎬�"),
+    VIEW_STOCK_TYPE_FIELDSINDEX("fieldsIndex", "鎸夊姩鎬佹墿灞曞瓧娈垫眹鎬�"),
+    ;
+    ViewStockType(String val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+
+    public String val;
+    public String desc;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
index 669805d..f26306f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
@@ -7,6 +7,7 @@
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.entity.LocItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -15,5 +16,5 @@
 @Repository
 public interface LocItemMapper extends BaseMapper<LocItem> {
 
-    IPage<LocItem> pageByStock(PageParam<LocItem, BaseParam> pageParam, @Param(Constants.WRAPPER) QueryWrapper<LocItem> queryWrapper);
+    IPage<ViewStockManage> pageByStock(PageParam<ViewStockManage, BaseParam> pageParam, @Param(Constants.WRAPPER) QueryWrapper<ViewStockManage> queryWrapper);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/StockItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/StockItemMapper.java
index f7a0edf..04609d5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/StockItemMapper.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/StockItemMapper.java
@@ -1,7 +1,12 @@
 package com.vincent.rsf.server.manager.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.entity.StockItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 
@@ -9,4 +14,5 @@
 @Repository
 public interface StockItemMapper extends BaseMapper<StockItem> {
 
+    IPage<StockItem> historiesByParams(PageParam<ViewStockManage, BaseParam> pageParam,  QueryWrapper<StockItem> wrapper);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/WarehouseStockMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/WarehouseStockMapper.java
new file mode 100644
index 0000000..c4da168
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/WarehouseStockMapper.java
@@ -0,0 +1,19 @@
+package com.vincent.rsf.server.manager.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface WarehouseStockMapper extends BaseMapper<ViewStockManage> {
+
+    IPage<ViewStockManage> pageByStock(PageParam<ViewStockManage, BaseParam> pageParam, @Param(Constants.WRAPPER) QueryWrapper<ViewStockManage> queryWrapper);
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/StockItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/StockItemService.java
index eaa2eb4..d27c7fc 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/StockItemService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/StockItemService.java
@@ -1,8 +1,15 @@
 package com.vincent.rsf.server.manager.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.manager.entity.Stock;
 import com.vincent.rsf.server.manager.entity.StockItem;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
 
 public interface StockItemService extends IService<StockItem> {
 
+    IPage<StockItem> pageByHistories(PageParam<StockItem, BaseParam> pageParam, QueryWrapper<StockItem> wrapper);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseStockService.java
index 164a367..b9e71d6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseStockService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseStockService.java
@@ -5,9 +5,12 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
-import com.vincent.rsf.server.manager.entity.LocItem;
+import com.vincent.rsf.server.manager.entity.StockItem;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
 
-public interface WarehouseStockService extends IService<LocItem> {
+public interface WarehouseStockService extends IService<ViewStockManage> {
 
-    IPage<LocItem> pageByStock(PageParam<LocItem, BaseParam> pageParam, QueryWrapper<LocItem> queryWrapper);
+    IPage<ViewStockManage> pageByStock(PageParam<ViewStockManage, BaseParam> pageParam, QueryWrapper<ViewStockManage> queryWrapper);
+
+    IPage<StockItem> pageByHistories(PageParam<StockItem, BaseParam> pageParam, QueryWrapper<StockItem> wrapper);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/StockItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/StockItemServiceImpl.java
index cf29b9a..22dcbf4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/StockItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/StockItemServiceImpl.java
@@ -1,5 +1,10 @@
 package com.vincent.rsf.server.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
 import com.vincent.rsf.server.manager.mapper.StockItemMapper;
 import com.vincent.rsf.server.manager.entity.StockItem;
 import com.vincent.rsf.server.manager.service.StockItemService;
@@ -9,4 +14,9 @@
 @Service("stockItemService")
 public class StockItemServiceImpl extends ServiceImpl<StockItemMapper, StockItem> implements StockItemService {
 
+    @Override
+    public IPage<StockItem> pageByHistories(PageParam<StockItem, BaseParam> pageParam, QueryWrapper<StockItem> wrapper) {
+        IPage<StockItem> result =  this.page(pageParam, wrapper);;
+        return result;
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseStockServiceImpl.java
index 951809a..c146643 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WarehouseStockServiceImpl.java
@@ -5,13 +5,19 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
-import com.vincent.rsf.server.manager.entity.LocItem;
-import com.vincent.rsf.server.manager.mapper.LocItemMapper;
+import com.vincent.rsf.server.manager.entity.StockItem;
+import com.vincent.rsf.server.manager.entity.ViewStockManage;
+import com.vincent.rsf.server.manager.mapper.WarehouseStockMapper;
+import com.vincent.rsf.server.manager.service.StockItemService;
 import com.vincent.rsf.server.manager.service.WarehouseStockService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service("warehouseStockService")
-public class WarehouseStockServiceImpl extends ServiceImpl<LocItemMapper, LocItem> implements WarehouseStockService {
+public class WarehouseStockServiceImpl extends ServiceImpl<WarehouseStockMapper, ViewStockManage> implements WarehouseStockService {
+
+    @Autowired
+    private StockItemService stockItemService;
 
     /**
      * @author Ryan
@@ -20,8 +26,20 @@
      * @version 1.0
      */
     @Override
-    public IPage<LocItem> pageByStock(PageParam<LocItem, BaseParam> pageParam, QueryWrapper<LocItem> queryWrapper) {
-        IPage<LocItem>  results = this.baseMapper.pageByStock(pageParam, queryWrapper);
+    public IPage<ViewStockManage> pageByStock(PageParam<ViewStockManage, BaseParam> pageParam, QueryWrapper<ViewStockManage> queryWrapper) {
+        IPage<ViewStockManage>  results = this.baseMapper.pageByStock(pageParam, queryWrapper);
+        return results;
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/5/16
+     * @description: 鑾峰彇鍏ュ嚭搴撴槑缁�
+     * @version 1.0
+     */
+    @Override
+    public IPage<StockItem> pageByHistories(PageParam<StockItem, BaseParam> pageParam, QueryWrapper<StockItem> wrapper) {
+        IPage<StockItem>  results = stockItemService.pageByHistories(pageParam, wrapper);
         return results;
     }
 }
diff --git a/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
index 852c4b5..90ad348 100644
--- a/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
+++ b/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
@@ -2,55 +2,4 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.vincent.rsf.server.manager.mapper.LocItemMapper">
 
-    <select id="pageByStock" resultType="com.vincent.rsf.server.manager.entity.LocItem">
-        SELECT *
-        FROM (SELECT id,
-                     loc_id,
-                     loc_code,
-                     type,
-                     order_item_id,
-                     wk_type,
-                     matnr_id,
-                     maktx,
-                     matnr_code,
-                     unit,
-                     SUM(anfme)    anfme,
-                     SUM(qty)      qty,
-                     SUM(work_qty) work_qty,
-                     batch,
-                     spec,
-                     model,
-                     fields_index,
-                     update_by,
-                     create_by,
-                     update_time,
-                     create_time
-              FROM man_loc_item
-              GROUP BY matnr_id
-              UNION ALL
-              SELECT id,
-                     ''          AS loc_id,
-                     ''          AS loc_code,
-                     type,
-                     asn_item_id AS order_item_id,
-                     wk_type,
-                     matnr_id,
-                     maktx,
-                     matnr_code,
-                     unit,
-                     SUM(anfme)     anfme,
-                     SUM(qty)       qty,
-                     SUM(work_qty)  work_qty,
-                     batch,
-                     spec,
-                     model,
-                     fields_index,
-                     update_by,
-                     create_by,
-                     update_time,
-                     create_time
-              FROM man_warehouse_areas_item
-              GROUP BY matnr_id) t
-                ${ew.customSqlSegment}
-    </select>
 </mapper>
diff --git a/rsf-server/src/main/resources/mapper/manager/StockItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/StockItemMapper.xml
index 929b4e8..2a543bc 100644
--- a/rsf-server/src/main/resources/mapper/manager/StockItemMapper.xml
+++ b/rsf-server/src/main/resources/mapper/manager/StockItemMapper.xml
@@ -2,4 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.vincent.rsf.server.manager.mapper.StockItemMapper">
 
+    <select id="historiesByParams" resultType="com.vincent.rsf.server.manager.entity.StockItem">
+
+    </select>
 </mapper>
diff --git a/rsf-server/src/main/resources/mapper/manager/WarehouseStockMapper.xml b/rsf-server/src/main/resources/mapper/manager/WarehouseStockMapper.xml
new file mode 100644
index 0000000..e0ccacc
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/manager/WarehouseStockMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.manager.mapper.WarehouseStockMapper">
+    <select id="pageByStock" resultType="com.vincent.rsf.server.manager.entity.ViewStockManage">
+        SELECT id,
+               loc_id,
+               loc_code,
+               type,
+               order_item_id,
+               wk_type,
+               matnr_id,
+               maktx,
+               matnr_code,
+               splr_id,
+               unit,
+               SUM(anfme)    anfme,
+               SUM(qty)      qty,
+               SUM(work_qty) work_qty,
+               batch,
+               spec,
+               model,
+               fields_index,
+               update_by,
+               create_by,
+               update_time,
+               create_time
+        FROM view_stock_manage
+            ${ew.customSqlSegment}
+    </select>
+</mapper>

--
Gitblit v1.9.1