From bfc43ca0e4683c1c0322a6cad5d5be2bc07decc3 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 24 七月 2025 15:00:44 +0800 Subject: [PATCH] 新增调拔单功能 盘点功能优化 --- rsf-admin/src/page/orders/check/CheckOrderPub.jsx | 261 ++++++++++----------------------------------------- 1 files changed, 53 insertions(+), 208 deletions(-) diff --git a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx index 54babf4..2acd62d 100644 --- a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx +++ b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx @@ -11,21 +11,24 @@ NumberField, ReferenceInput, AutocompleteInput, + useRecordSelection, 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'; import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid'; -import request from '@/utils/request'; import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined'; import CloseSharpIcon from '@mui/icons-material/CloseSharp'; import ConfirmButton from '../../components/ConfirmButton'; import { Delete, Edit, Add } from '@mui/icons-material'; import CheckOrderSiteDialog from "./CheckOrderSiteDialog"; -import { map } from "lodash"; +import CheckPreviewTable from "./CheckPreviewTable"; +import { styled } from '@mui/material/styles'; +import request from '@/utils/request'; + const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -37,24 +40,20 @@ '& .column-maktx': { width: 200 }, - mt: '60px' - // '& .RaBulkActionsToolbar-toolbar': { - // display: 'none' - // } - })); const CheckOrderPub = (props) => { const { record, open, setOpen, setManualDialog } = props; const notify = useNotify(); + const translate = useTranslate(); const gridRef = useGridApiRef(); const [rows, setRows] = useState([]); const [fetchRows, setFetchRows] = useState([]); - const translate = useTranslate(); + const [selectItem, setSelectItem] = useState({}); const [rowSelectedIds, setRowSelectedIds] = useState([]); const [selectedMatnr, setSelectedMatnr] = useState([]); - const [selectedIds, setSelectedIds] = useState([]); + const [leftSelectedIds, setLeftSelectedIds] = useState([]); const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE }); const [dialog, setDialog] = useState(false); const [selectedValue, setSelectedValue] = useState({}); @@ -71,23 +70,27 @@ const getLocs = async (ids) => { - const { data: { code, data, msg } } = await request.post('/check/locs/' + ids); + let params = { matnrCode: ids } + const { data: { code, data, msg } } = await request.post('/check/locs/', params); 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, onUnselectItems } = useListContext(); + const { selectedIds, data, onUnselectItems, } = useListContext(); const handleRowClick = () => { 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() + onUnselectItems(); } return ( record.exceStatus != 3 ? <><Button label="toolbar.confirm" size="medium" onClick={handleRowClick} /></> : <></> @@ -209,20 +212,29 @@ <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} record={record} formData={formData} - selectedIds={selectedIds} + selectedMatnr={selectedMatnr} + leftSelectedIds={leftSelectedIds} setDialog={setDialog} - setSelectedIds={setSelectedIds} + setLeftSelectedIds={setLeftSelectedIds} /> </Box> <Box sx={{ textAlign: 'center' }}> <CloseButton setOpen={setOpen} /> - <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} rowSelectedIds={rowSelectedIds} gridRef={gridRef} record={record} /> + <SubmitButton + leftSelectedIds={leftSelectedIds} + setOpen={setOpen} + setLeftSelectedIds={setLeftSelectedIds} + selectItem={selectItem} + selectedMatnr={selectedMatnr} + rowSelectedIds={rowSelectedIds} + gridRef={gridRef} + record={record} /> </Box> </Card> </Grid> @@ -239,209 +251,42 @@ ); } -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: '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: '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, rowSelectedIds, gridRef, record }) => { +const SubmitButton = ({ leftSelectedIds, setLeftSelectedIds, rowSelectedIds, selectItem, gridRef, record, setOpen, selectedMatnr }) => { const notify = useNotify(); const refresh = useRefresh(); + const translate = useTranslate(); const redirect = useRedirect(); const submit = async () => { const items = gridRef.current?.getSortedRows(); - let selctRecord = items.filter(item => selectedIds.includes(item?.id)); + let selctRecord = items.filter(item => leftSelectedIds.includes(item?.id)); + + if (selctRecord == undefined || selctRecord.length < 1) { + notify(translate('common.msg.locEmpty'), { type: 'error' }); + return + } + //杩囨护锛屽皢搴撲綅娣诲姞鑷崇洏鐐瑰崟鏄庣粏涓� - const records = rowSelectedIds.map(map =>{ + const records = rowSelectedIds.map(map => { return { ...map, items: selctRecord.filter(item => item.matnrCode == map.matnrCode) } }) - - const { data: { code, data, msg } } = await request.post('/check/generate/tasks', records); - if (code == 200) { - refresh(); - redirect("/task") - } else { - notify(msg); - } + + let params = records.filter(record => record?.items.length > 0); + + redirect("/task") + + + // 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 -- Gitblit v1.9.1