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