import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; 
 | 
import { 
 | 
    List, 
 | 
    DatagridConfigurable, 
 | 
    SearchInput, 
 | 
    TopToolbar, 
 | 
    SelectColumnsButton, 
 | 
    EditButton, 
 | 
    FilterButton, 
 | 
    WrapperField, 
 | 
    useRecordContext, 
 | 
    useTranslate, 
 | 
    useNotify, 
 | 
    useListContext, 
 | 
    TextField, 
 | 
    NumberField, 
 | 
    DateField, 
 | 
    BooleanField, 
 | 
    TextInput, 
 | 
    DateInput, 
 | 
    SelectInput, 
 | 
    NumberInput, 
 | 
    useRefresh, 
 | 
    useRedirect, 
 | 
    AutocompleteInput, 
 | 
    Button, 
 | 
} from 'react-admin'; 
 | 
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_WAVE_AUTO_EXCE } from '@/config/setting'; 
 | 
import PlayArrowOutlinedIcon from '@mui/icons-material/PlayArrowOutlined'; 
 | 
import PauseCircleOutlineIcon from '@mui/icons-material/PauseCircleOutline'; 
 | 
import PauseIcon from '@mui/icons-material/Pause'; 
 | 
import StopCircleOutlinedIcon from '@mui/icons-material/StopCircleOutlined'; 
 | 
import StopOutlinedIcon from '@mui/icons-material/StopOutlined'; 
 | 
import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material'; 
 | 
import ConfirmButton from "../../components/ConfirmButton"; 
 | 
import PageDrawer from "../../components/PageDrawer"; 
 | 
import PublicIcon from '@mui/icons-material/Public'; 
 | 
import ItemToTaskModal from "./ItemToTaskModal"; 
 | 
import { styled } from '@mui/material/styles'; 
 | 
import request from '@/utils/request'; 
 | 
import WaveCreate from "./WaveCreate"; 
 | 
import WavePannel from "./WavePanel" 
 | 
  
 | 
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ 
 | 
    '& .css-1vooibu-MuiSvgIcon-root': { 
 | 
        height: '.9em' 
 | 
    }, 
 | 
    '& .RaDatagrid-row': { 
 | 
        cursor: 'auto' 
 | 
    }, 
 | 
    '& .column-name': { 
 | 
    }, 
 | 
    '& .opt': { 
 | 
        width: 200 
 | 
    }, 
 | 
})); 
 | 
  
 | 
  
 | 
  
 | 
const WaveList = () => { 
 | 
    const translate = useTranslate(); 
 | 
    const [createDialog, setCreateDialog] = useState(false); 
 | 
    const [autoExce, setAutoExce] = useState(false); 
 | 
    const [detailDialog, setDetailDialog] = useState(false); 
 | 
    const [select, setSelectIds] = useState({}); 
 | 
    const [drawerVal, setDrawerVal] = useState(false); 
 | 
    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_wave_exce_status')) || []; 
 | 
  
 | 
    const filters = [ 
 | 
        <SearchInput source="condition" alwaysOn />, 
 | 
        <DateInput label='common.time.after' source="timeStart" alwaysOn />, 
 | 
        <DateInput label='common.time.before' source="timeEnd" alwaysOn />, 
 | 
        <TextInput source="code" label="table.field.wave.code" />, 
 | 
        <AutocompleteInput 
 | 
            choices={dicts} 
 | 
            optionText="label" 
 | 
            label="table.field.wave.exceStatus" 
 | 
            source="exceStatus" 
 | 
            format={value => value || '0'} 
 | 
            optionValue="value" 
 | 
            parse={v => v} 
 | 
            alwaysOn 
 | 
        />, 
 | 
        <SelectInput source="type" label="table.field.wave.type" 
 | 
            choices={[ 
 | 
                { id: 0, name: '手动' }, 
 | 
                { id: 1, name: '自动' }, 
 | 
            ]} 
 | 
        />, 
 | 
        <NumberInput source="anfme" label="table.field.wave.anfme" />, 
 | 
        <NumberInput source="qty" label="table.field.wave.qty" />, 
 | 
        <NumberInput source="orderNum" label="table.field.wave.orderNum" />, 
 | 
        <TextInput label="common.field.memo" source="memo" />, 
 | 
        <SelectInput 
 | 
            label="common.field.status" 
 | 
            source="status" 
 | 
            choices={[ 
 | 
                { id: '1', name: 'common.enums.statusTrue' }, 
 | 
                { id: '0', name: 'common.enums.statusFalse' }, 
 | 
            ]} 
 | 
            resettable 
 | 
        />, 
 | 
    ] 
 | 
  
 | 
  
 | 
    useEffect(() => { 
 | 
        getConfig() 
 | 
    }, []) 
 | 
  
 | 
    const getConfig = async () => { 
 | 
        const { data: { code, data, msg } } = await request.get('/config/flag/' + DEFAULT_WAVE_AUTO_EXCE); 
 | 
        if (code === 200) { 
 | 
            setAutoExce(JSON.parse(data?.val)) 
 | 
        } 
 | 
    } 
 | 
  
 | 
    return ( 
 | 
        <Box display="flex"> 
 | 
            <List 
 | 
                sx={{ 
 | 
                    flexGrow: 1, 
 | 
                    "& .css-k008qs": { 
 | 
                        display: 'block' 
 | 
                    }, 
 | 
                    transition: (theme) => 
 | 
                        theme.transitions.create(['all'], { 
 | 
                            duration: theme.transitions.duration.enteringScreen, 
 | 
                        }), 
 | 
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, 
 | 
                }} 
 | 
                title={"menu.wave"} 
 | 
                empty={false} 
 | 
                filters={filters} 
 | 
                sort={{ field: "create_time", order: "desc" }} 
 | 
                actions={( 
 | 
                    <TopToolbar> 
 | 
                        <BulkAutoStartButton autoExce={autoExce} setAutoExce={setAutoExce} /> 
 | 
                        <BulkAutoPauseButton autoExce={autoExce} setAutoExce={setAutoExce} /> 
 | 
                        <FilterButton /> 
 | 
                        <SelectColumnsButton preferenceKey='wave' /> 
 | 
                    </TopToolbar> 
 | 
                )} 
 | 
                perPage={DEFAULT_PAGE_SIZE} 
 | 
            > 
 | 
                <StyledDatagrid 
 | 
                    preferenceKey='wave' 
 | 
                    bulkActionButtons={ 
 | 
                        <> 
 | 
                            <BulkStartButton /> 
 | 
                        </> 
 | 
                    } 
 | 
                    rowClick={(id, resource, record) => false} 
 | 
                    expand={<WavePannel />} 
 | 
                    expandSingle={true} 
 | 
                    omit={['id', 'createTime', 'createBy', 'createBy$']} 
 | 
                > 
 | 
                    <NumberField source="id" /> 
 | 
                    <TextField source="code" label="table.field.wave.code" /> 
 | 
                    <TextField source="type$" label="table.field.wave.type" sortable={false} /> 
 | 
                    <NumberField source="anfme" label="table.field.wave.anfme" /> 
 | 
                    <NumberField source="groupQty" label="table.field.wave.groupQty" /> 
 | 
                    <NumberField source="workQty" label="table.field.wave.qty" /> 
 | 
                    <NumberField source="orderNum" label="table.field.wave.orderNum" /> 
 | 
                    <DateField source="createTime" label="common.field.createTime" showTime /> 
 | 
                    <TextField source="updateBy$" label="common.field.updateBy" /> 
 | 
                    <DateField source="updateTime" label="common.field.updateTime" showTime /> 
 | 
                    <TextField source="createBy$" label="common.field.createBy" /> 
 | 
                    <CustomProcess source="progress" label="table.field.wave.progress" /> 
 | 
                    <TextField source="exceStatus$" label="table.field.wave.exceStatus" sortable={false} /> 
 | 
                    <TextField source="memo" label="common.field.memo" sortable={false} /> 
 | 
                    <WrapperField cellClassName="opt" label="common.field.opt"> 
 | 
                        <PauseButton /> 
 | 
                        <ContinueButton /> 
 | 
                        <StopWaveButton /> 
 | 
                        <EditButton label="toolbar.detail" sx={{ padding: '1px', fontSize: '.75rem' }} /> 
 | 
                    </WrapperField> 
 | 
                </StyledDatagrid> 
 | 
            </List> 
 | 
            <ItemToTaskModal 
 | 
                open={detailDialog} 
 | 
                record={select} 
 | 
                setOpen={setDetailDialog} 
 | 
            /> 
 | 
            <WaveCreate 
 | 
                open={createDialog} 
 | 
                setOpen={setCreateDialog} 
 | 
            /> 
 | 
            <PageDrawer 
 | 
                title='Wave Detail' 
 | 
                drawerVal={drawerVal} 
 | 
                setDrawerVal={setDrawerVal} 
 | 
            > 
 | 
            </PageDrawer> 
 | 
        </Box> 
 | 
    ) 
 | 
} 
 | 
  
 | 
export default WaveList; 
 | 
  
 | 
const BulkStartButton = () => { 
 | 
    const { data, selectedIds, onUnselectItems } = useListContext(); 
 | 
    // const waveId = useGetRecordId(); 
 | 
    const notify = useNotify(); 
 | 
    const refresh = useRefresh() 
 | 
    const startClick = async () => { 
 | 
        onUnselectItems(); 
 | 
        const { data: { code, data, msg } } = await request.post('/wave/selects/task', { ids: selectedIds }); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
            setAutoExce(false) 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
    } 
 | 
    return ( 
 | 
        <Button label="toolbar.publicWorking" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} variant="outlined" /> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const CustomProcess = () => { 
 | 
    const record = useRecordContext(); 
 | 
    const progress = (record.workQty / record.anfme) * 100 
 | 
    return ( 
 | 
        <> 
 | 
            <LinearProgress variant="determinate" value={progress} /> 
 | 
        </> 
 | 
    ) 
 | 
} 
 | 
  
 | 
  
 | 
const StopWaveButton = () => { 
 | 
    const record = useRecordContext() 
 | 
    const translate = useTranslate() 
 | 
    const refresh = useRefresh() 
 | 
    const notify = useNotify() 
 | 
  
 | 
    const stopClick = async () => { 
 | 
        const { data: { code, data, msg } } = await request.post('/wave/stop/pub/' + record?.id); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    return ( 
 | 
        record?.exceStatus != 3 ? <ConfirmButton label={"toolbar.stopPub"} startIcon={<StopOutlinedIcon />} onConfirm={stopClick} size='small' /> : <></> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const PublicTaskButton = ({ setSelectIds, setDetailDialog }) => { 
 | 
    const record = useRecordContext(); 
 | 
    const notify = useNotify(); 
 | 
    const refresh = useRefresh(); 
 | 
    const redirect = useRedirect(); 
 | 
  
 | 
    const pubClick = async (event) => { 
 | 
        setSelectIds(record); 
 | 
        setDetailDialog(true); 
 | 
    } 
 | 
    return ( 
 | 
        record?.exceStatus == 0 ? <ConfirmButton label={"toolbar.createTask"} startIcon={<PublicIcon />} onConfirm={pubClick} size='small' /> : <></> 
 | 
    ); 
 | 
} 
 | 
  
 | 
const BulkAutoStartButton = ({ autoExce, setAutoExce }) => { 
 | 
    const { data, selectedIds, onUnselectItems } = useListContext(); 
 | 
    const notify = useNotify(); 
 | 
    const startClick = async () => { 
 | 
        onUnselectItems() 
 | 
        setAutoExce(true) 
 | 
        const { data: { code, data, msg } } = await request.post('/config/byFlag', { val: true, flag: 'WaveAutoExce' }); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
    } 
 | 
    return ( 
 | 
        !autoExce ? <Button label="toolbar.start" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} /> : <></> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const BulkAutoPauseButton = ({ autoExce, setAutoExce }) => { 
 | 
    const notify = useNotify(); 
 | 
    const { data, selectedIds, onUnselectItems } = useListContext(); 
 | 
  
 | 
    const pauseClick = async () => { 
 | 
        onUnselectItems() 
 | 
        const { data: { code, data, msg } } = await request.post('/config/byFlag', { val: false, flag: 'WaveAutoExce' }); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
            setAutoExce(false) 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
    } 
 | 
    return ( 
 | 
        autoExce ? <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseIcon />} /> : <></> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const PauseButton = () => { 
 | 
    const notify = useNotify() 
 | 
    const refresh = useRefresh(); 
 | 
    const record = useRecordContext(); 
 | 
    const pauseClick = async () => { 
 | 
        const { data: { code, data, msg } } = await request.post('/wave/pause/pub/' + record?.id); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
        refresh() 
 | 
    } 
 | 
    return ( 
 | 
        record?.exceStatus == 1 ? <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseIcon />} /> : <></> 
 | 
    ) 
 | 
} 
 | 
  
 | 
const ContinueButton = () => { 
 | 
    const notify = useNotify() 
 | 
    const refresh = useRefresh(); 
 | 
    const record = useRecordContext(); 
 | 
    const continueClick = async () => { 
 | 
        const { data: { code, data, msg } } = await request.post('/wave/continue/pub/' + record?.id); 
 | 
        if (code === 200) { 
 | 
            notify(msg); 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
        refresh() 
 | 
    } 
 | 
    return ( 
 | 
        record?.exceStatus == 2 ? <Button label="toolbar.continuePub" onClick={continueClick} startIcon={<PlayArrowOutlinedIcon />} /> : <></> 
 | 
    ) 
 | 
} 
 |