From 3e36f73770677e756826df1b5824c8e89769659c Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 23 七月 2025 15:27:10 +0800 Subject: [PATCH] 盘点功能优化 --- rsf-admin/src/page/orders/check/CheckOrderPub.jsx | 294 +++++++++++----------------------------------------------- 1 files changed, 57 insertions(+), 237 deletions(-) diff --git a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx index 5b5b530..1947840 100644 --- a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx +++ b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx @@ -3,40 +3,19 @@ import { List, DatagridConfigurable, - SearchInput, - TopToolbar, Button, - SelectColumnsButton, - EditButton, - FilterButton, - CreateButton, - ExportButton, - BulkDeleteButton, - WrapperField, - useRecordContext, useTranslate, useNotify, useListContext, - FunctionField, TextField, NumberField, - DateField, - BooleanField, - ReferenceField, - TextInput, - DateTimeInput, - DateInput, - SelectInput, - NumberInput, ReferenceInput, - ReferenceArrayInput, AutocompleteInput, - DeleteButton, - SimpleForm, required, Form, useRefresh, useRedirect, + TextInput, } from 'react-admin'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting'; import { styled } from '@mui/material/styles'; @@ -47,6 +26,7 @@ import ConfirmButton from '../../components/ConfirmButton'; import { Delete, Edit, Add } from '@mui/icons-material'; import CheckOrderSiteDialog from "./CheckOrderSiteDialog"; +import CheckPreviewTable from "./CheckPreviewTable"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -58,12 +38,7 @@ '& .column-maktx': { width: 200 }, - mt: '60px' - // '& .RaBulkActionsToolbar-toolbar': { - // display: 'none' - // } - })); const CheckOrderPub = (props) => { @@ -85,23 +60,35 @@ setRows(fetchRows) } else { const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode)); - setRows(mas) + let ids = mas.map(item => item.matnrCode); + getLocs(ids) } }, [selectedMatnr]) + const getLocs = async (ids) => { + const { data: { code, data, msg } } = await request.post('/check/locs/' + ids); + if (code === 200) { + setRows(data) + const matnrs = selectedMatnr.filter(item => data.some(bigData => bigData.matnrCode === item)); + // setSelectedMatnr(matnrs) + } else { + notify(msg); + } + } + const ComfirmButton = () => { - const { selectedIds, data } = useListContext(); + const { selectedIds, data, onUnselectItems } = useListContext(); const handleRowClick = () => { - const ids = data.filter(item => selectedIds.includes(item.id)).map(item => item.id); + const ids = data.filter(item => selectedIds.includes(item.id)); setRowSelectedIds(ids); const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode); //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠� setSelectedMatnr(mas); + onUnselectItems() } - return ( - <Button label="toolbar.confirm" size="medium" onClick={handleRowClick} /> + record.exceStatus != 3 ? <><Button label="toolbar.confirm" size="medium" onClick={handleRowClick} /></> : <></> ) }; @@ -139,9 +126,8 @@ if (formData.waveId == null && formData.waveId == undefined) { return } - const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData }); + const { data: { code, data, msg } } = await request.post('/check/order/items', { ...formData }); if (code === 200) { - // setRows(data) setFetchRows(data) } else { notify(msg); @@ -177,8 +163,8 @@ </ReferenceInput> </Form> <List - resource="outStockItem" - storeKey='outStockItem' + resource="checkItem" + storeKey='checkItem' sx={{ flexGrow: 1, transition: (theme) => @@ -186,7 +172,7 @@ duration: theme.transitions.duration.enteringScreen, }), }} - title={"menu.outStockItem"} + title={"menu.checkItem"} empty={false} filter={{ orderId: record?.id, deleted: 0 }} sort={{ field: "create_time", order: "desc" }} @@ -199,22 +185,21 @@ /> <StyledDatagrid storeKey={"outStockPublic"} - preferenceKey='outStockItem' + preferenceKey='checkItem' bulkActionButtons={<> <ComfirmButton /> </>} - omit={['id', 'splrName', 'qty', 'poCode',]} + omit={['id', 'splrName', 'qty',]} > <NumberField source="id" /> - <TextField source="asnCode" label="table.field.outStockItem.asnCode" /> - <TextField source="poCode" label="table.field.outStockItem.poCode" /> - <TextField source="matnrCode" label="table.field.outStockItem.matnrCode" /> - <TextField source="maktx" label="table.field.outStockItem.maktx" /> - <NumberField source="anfme" label="table.field.outStockItem.anfme" /> - <NumberField source="workQty" label="table.field.outStockItem.workQty" /> - <NumberField source="qty" label="table.field.outStockItem.qty" /> - <TextField source="stockUnit" label="table.field.outStockItem.stockUnit" /> - <TextField source="splrName" label="table.field.outStockItem.splrName" /> + <TextField source="orderCode" label="table.field.checkOrderItem.orderCode" /> + <TextField source="matnrCode" label="table.field.checkOrderItem.matnrCode" /> + <TextField source="maktx" label="table.field.checkOrderItem.maktx" /> + <NumberField source="anfme" label="table.field.checkOrderItem.anfme" /> + <NumberField source="workQty" label="table.field.checkOrderItem.workQty" /> + <NumberField source="qty" label="table.field.checkOrderItem.qty" /> + <TextField source="stockUnit" label="table.field.checkOrderItem.stockUnit" /> + <TextField source="splrName" label="table.field.checkOrderItem.splrName" /> </StyledDatagrid> </List> </Card> @@ -222,7 +207,7 @@ <Grid item xl={6.3} gap={2}> <Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}> <Box> - <PreviewTable + <CheckPreviewTable rows={rows} gridRef={gridRef} setRows={setRows} @@ -235,13 +220,13 @@ </Box> <Box sx={{ textAlign: 'center' }}> <CloseButton setOpen={setOpen} /> - <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} record={record} /> + <SubmitButton selectedIds={selectedIds} setOpen={setOpen} setSelectedIds={setSelectedIds} selectedMatnr={selectedMatnr} rowSelectedIds={rowSelectedIds} gridRef={gridRef} record={record} /> </Box> </Card> </Grid> </Grid> <Grid> - <OutStockSiteDialog + <CheckOrderSiteDialog selectedValue={selectedValue} open={dialog} onClose={handleClose} @@ -252,206 +237,41 @@ ); } -const PreviewTable = ({ rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog, formData }) => { - gridRef.current = useGridApiRef(); - const translate = useTranslate(); - - useEffect(() => { - if (selectedIds.length > 0) { - console.log(selectedIds); - } - }, [selectedIds]) - - const baseColumns = [ - // { field: 'id', headerName: 'ID', width: 40 }, - { field: 'locCode', headerName: '搴撲綅', width: 110 }, - { field: 'barcode', headerName: '瀹瑰櫒', width: 120 }, - { field: 'matnrCode', headerName: '鐗╂枡缂栫爜', width: 120 }, - { field: 'batch', headerName: '鎵规', width: 90 }, - { field: 'unit', headerName: '鍗曚綅', width: 60 }, - { field: 'outQty', headerName: '鍑哄簱鏁伴噺', width: 110, }, - { - field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110, - renderCell: (params) => ( - <OutStockAnfme value={params.value} /> - ) - }, - { - field: 'siteNo', - headerName: '鍑哄簱鍙�', - width: 90, - type: 'singleSelect', - editable: true, - renderCell: (params) => ( - <OutStockSiteNo value={params.value} /> - ), - renderEditCell: (params) => ( - <OutStockSite {...params} /> - ), - }, - ] - - const optAction = { - field: 'actions', - type: 'actions', - headerName: translate('common.field.opt'), - with: 120, - getActions: (params) => [ - <GridActionsCellItem - icon={<Delete />} - label="Delete" - onClick={() => handleDelete(params.row, rows, setRows)} - />, - ] - } - - const columns = (formData.waveId == 15 || formData.waveId == 16) ? [...baseColumns] : [...baseColumns, optAction]; - - /** - * 鍒犻櫎浜嬩欢 - * @param {*} params - */ - const handleDelete = (params, rows, setRows) => { - const outRows = rows.filter(row => { - return row.id !== params.id - }) - setRows(outRows) - } - - const OutStockAnfme = React.memo(function OutStockAnfme(props) { - const { value } = props; - return ( - value > 0 ? - <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> - <span>{value}</span> - </Box> - : - <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> - <span style={{ color: 'red' }}>{translate('common.edit.title.insuffInventory')}</span> - </Box> - ); - }); - - const OutStockSiteNo = React.memo(function OutStockSiteNo(props) { - const { value } = props; - if (!value) { - return null; - } - return ( - <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> - <span>{value}</span> - </Box> - ); - }); - - const CustomToolBar = () => { - const selectSiteNo = () => { - setDialog(true) - } - return ( - <Box sx={{ - p: 1, - display: 'flex', - justifyContent: 'flex-end', - borderTop: '1px solid rgba(224, 224, 224, 1)' - }}> - <Button - onClick={selectSiteNo} - variant="outlined" - label="toolbar.modiftySite" - size="medium" - sx={{ mr: 1 }} /> - </Box> - ); - } - - const OutStockSite = (params) => { - const { id, field, siteNo, row: { staNos } } = params; - const apiRef = useGridApiContext(); - const handleChange = async (event) => { - await apiRef.current.setEditCellValue( - { id, field, value: event.target.value }, - event, - ); - apiRef.current.stopCellEditMode({ id, field }); - }; - - const handleClose = (event, reason) => { - if (reason === 'backdropClick') { - apiRef.current.stopCellEditMode({ id, field }); - } - }; - - return ( - <Select - value={siteNo} - onChange={handleChange} - MenuProps={{ - onClose: handleClose, - }} - sx={{ - height: '100%', - '& .MuiSelect-select': { - display: 'flex', - alignItems: 'center', - pl: 1, - }, - }} - autoFocus - fullWidth - open - > - {staNos.map((option) => { - return ( - <MenuItem - key={option} - value={option.staNo} - > - <ListItemText sx={{ overflow: 'hidden' }} primary={option.staNo} /> - </MenuItem> - ); - })} - </Select > - ) - } - - return ( - <DataGrid - storeKey={"locItemPreview"} - rows={rows} - columns={columns} - slots={{ toolbar: CustomToolBar }} - apiRef={gridRef} - checkboxSelection - disableRowSelectionOnClick - hideFooterPagination={true} // 闅愯棌鍒嗛〉鎺т欢 - hideFooter={false} - onRowSelectionModelChange={(ids) => { - setSelectedIds(ids) - }} - /> - ) -} - - //鎻愪氦鎸夐挳 -const SubmitButton = ({ selectedIds, setSelectedIds, gridRef, record }) => { +const SubmitButton = ({ selectedIds, setSelectedIds, rowSelectedIds, gridRef, record, setOpen, selectedMatnr }) => { const notify = useNotify(); const refresh = useRefresh(); + const translate = useTranslate(); const redirect = useRedirect(); const submit = async () => { const items = gridRef.current?.getSortedRows(); - const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items, outId: record?.id }); + let selctRecord = items.filter(item => selectedIds.includes(item?.id)); + if (selctRecord == undefined || selctRecord.length < 1) { + notify(translate('common.msg.locEmpty'), { type: 'error' }); + return + } + + //杩囨护锛屽皢搴撲綅娣诲姞鑷崇洏鐐瑰崟鏄庣粏涓� + const records = rowSelectedIds.map(map => { + return { + ...map, + items: selctRecord.filter(item => item.matnrCode == map.matnrCode) + } + }) + + let params = records.filter(record => record?.items.length > 0); + + const { data: { code, data, msg } } = await request.post('/check/generate/tasks', params); if (code == 200) { refresh(); - redirect("/task") + setOpen(false) } else { notify(msg); } } return ( <ConfirmButton - label="toolbar.allComfirm" + label="toolbar.confirmSelect" variant="contained" size="medium" onConfirm={submit} -- Gitblit v1.9.1