From c229a84e0a8eb68c974e6d23fa1296e064025d76 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期二, 29 七月 2025 17:09:00 +0800 Subject: [PATCH] 调拔单功能优化 --- rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx | 291 ++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 194 insertions(+), 97 deletions(-) diff --git a/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx b/rsf-admin/src/page/statistics/stockManage/WarehouseStockList.jsx index 376e6ab..94fb604 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': { @@ -55,129 +52,229 @@ '& .RaDatagrid-row': { cursor: 'auto' }, - '& .column-name': { + '& .MuiTableCell-root': { + whiteSpace: 'nowrap', + overflow: 'visible', + textOverflow: 'unset' }, '& .opt': { - width: 220 + width: 180, + whiteSpace: 'normal', + }, + '& .column-maktx': { + maxWidth: '15em', + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', }, })); -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 dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_stock_summary_code')) || []; + const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); - const [matnrCode, setMatnrCode] = useState(''); + const [filters, setFilters] = useState([ + <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" />, + <AutocompleteInput choices={dict} optionText='label' optionValue="value" source="aggType" label="table.field.locItem.aggType" />, + <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 [select, setSelect] = useState({}); const [drawerVal, setDrawerVal] = useState(false); 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} - > - <StyledDatagrid - preferenceKey='locItem' - bulkActionButtons={false} - rowClick={false} - expand={false} - expandSingle={true} - omit={['id', 'createTime', 'locId', 'spec', 'model', 'locCode', 'orderId', 'orderItemId', 'matnrId', 'splrBatch', 'createBy', 'memo', 'fieldsIndex']} + <> + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: 0, + '& .RaAutocompleteInput-textField.MuiFormControl-root.MuiTextField-root': { + width: '200px' + } + }} + resource="warehouse/stock" + title={"common.button.detail"} + empty={false} + // filter={{aggType: "matnr"}} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='viewStockManage' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + aside={<MatnrListAside />} > - <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} - /> - </Box> + <DynamicFields + setDrawerVal={setDrawerVal} + setCreateDialog={setCreateDialog} + setSelect={setSelect} + filters={filters} + /> + </List> + <WarehouseStockInfo + open={createDialog} + setOpen={setCreateDialog} + record={select} + /> + <WarehouseHistories + open={drawerVal} + setOpen={setDrawerVal} + record={select} + /> + </Box> + </> ) } export default WarehouseStockList; -const HistoriesButton = ({ setCreateDialog , setMatnrCode}) => { +const PaginatedRowNumber = () => { const record = useRecordContext(); + const { page, perPage } = useListContext(); + const index = record.__tmp_index !== undefined ? record.__tmp_index : 0; + // const index = record.__tmp_index; // react-admin 鍐呴儴浣跨敤鐨勪复鏃剁储寮� + return <span>{(page - 1) * perPage + index + 1}</span>; +}; + + + +const DynamicFields = (props) => { + const index = 1; + const { setDrawerVal, setCreateDialog, setSelect, filters } = 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="warehouse$" label="table.field.warehouseStock.warehouse" />, + <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]); + + data.map(el => { + var i = 0; + filters.map((item) => { + if (item.key === el.fields) { + i = 1; + } + }) + i === 0 && filters.push(<TextInput key={el.fields} source={el.fields} label={el.fieldsAlise} />) + }) + // setFilters([...filters, ...inputFields]) + + } 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='viewStockManage' + bulkActionButtons={false} + rowClick={false} + expand={false} + expandSingle={true} + omit={['id', 'createTime', 'locId', 'spec', 'model', 'locCode', 'orderId', 'orderItemId', 'matnrId', 'splrBatch', 'createBy', 'memo', 'fieldsIndex','updateBy$']} + > + {columns.map((column) => column)} + </StyledDatagrid>} + </Box> + ) +} + +const HistoriesButton = ({ setDrawerVal, setSelect }) => { + const record = useRecordContext(); + const { filterValues } = useListContext(); const historyClick = (event) => { event.stopPropagation(); - setCreateDialog(true) - setMatnrCode(record?.matnrCode) + setDrawerVal(true) + const objRecord = { ...record, ...filterValues } + setSelect(objRecord) } 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> ) } - -- Gitblit v1.9.1