skyouc
2025-07-24 bfc43ca0e4683c1c0322a6cad5d5be2bc07decc3
rsf-admin/src/page/orders/wave/WaveList.jsx
@@ -1,5 +1,4 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
@@ -8,49 +7,39 @@
    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,
    useRefresh,
    useRedirect,
    AutocompleteInput,
    Button,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import WaveCreate from "./WaveCreate";
import WavePanel from "./WavePanel";
import EmptyData from "../../components/EmptyData";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
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 MyField from "../../components/MyField";
import request from '@/utils/request';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import PublicIcon from '@mui/icons-material/Public';
import ItemToTaskModal from "./ItemToTaskModal";
import ConfirmButton from "../../components/ConfirmButton";
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': {
@@ -62,56 +51,77 @@
    '& .column-name': {
    },
    '& .opt': {
        width: 260
        width: 200
    },
}));
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" />,
    <SelectInput source="type" label="table.field.wave.type"
        choices={[
            { id: 0, name: '手动' },
            { id: 1, name: '自动' },
        ]}
    />,
    <SelectInput source="exceStatus" label="table.field.wave.exceStatus"
        choices={[
            { id: 0, name: '初始化' },
            { id: 1, name: '生成任务' },
            { id: 2, name: '任务播种' },
            { id: 3, 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
    />,
]
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,
@@ -124,6 +134,8 @@
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <BulkAutoStartButton autoExce={autoExce} setAutoExce={setAutoExce} />
                        <BulkAutoPauseButton autoExce={autoExce} setAutoExce={setAutoExce} />
                        <FilterButton />
                        <SelectColumnsButton preferenceKey='wave' />
                    </TopToolbar>
@@ -132,29 +144,36 @@
            >
                <StyledDatagrid
                    preferenceKey='wave'
                    bulkActionButtons={false}
                    bulkActionButtons={
                        <>
                            <BulkStartButton />
                        </>
                    }
                    rowClick={(id, resource, record) => false}
                    expand={false}
                    expandSingle={false}
                    omit={['id', 'createTime', 'createBy', 'memo', 'createBy$']}
                    expand={<WavePannel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'createBy$','memo']}
                >
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.wave.code" />
                    <TextField source="type$" label="table.field.wave.type" sortable={false} />
                    <TextField source="exceStatus$" label="table.field.wave.exceStatus" sortable={false} />
                    <NumberField source="anfme" label="table.field.wave.anfme" />
                    <NumberField source="qty" label="table.field.wave.qty" />
                    <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" />
                    <DateField source="createTime" label="common.field.createTime" showTime />
                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                    <CustomProcess source="progress" label="table.field.wave.progress" />
                    <TextField source="memo" label="common.field.memo" sortable={false} />
                    <TextField source="exceStatus$" label="table.field.wave.exceStatus" sortable={false} />
                    <WrapperField cellClassName="opt" label="common.field.opt">
                        <PublicTaskButton setSelectIds={setSelectIds} setDetailDialog={setDetailDialog} />
                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                        <PauseButton />
                        <ContinueButton />
                        <StopWaveButton />
                        <EditButton label="toolbar.detail" sx={{ padding: '1px', fontSize: '.75rem' }} />
                    </WrapperField>
                </StyledDatagrid>
            </List>
@@ -179,17 +198,141 @@
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' /> : <></>
        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 />} /> : <></>
    )
}