check-data.tsx 4.88 KB
import React, { useEffect, useState } from 'react';
import { Button, Checkbox } from 'antd';
import { exportProgress, importDataCheck } from '@/pages/app-view/list/service';
import { handleDownload } from '@/libs/htmlHandle';
interface CheckDataProps {
  changeNext: any;
  taskId: string;
  appCode: string;
  funCode: string;
  viewCode: string;
  importWay: string;
  current: number;
}

const CheckData: React.FC<CheckDataProps> = (props) => {
  const {
    changeNext = () => {},
    taskId,
    appCode,
    funCode,
    viewCode,
    importWay,
    current,
  } = props;
  const [status, setStatus] = useState<string>('loading');
  const [dataStatus, setDataStatus] = useState<any>({
    status: true,
    finalMsg: '',
  });
  const [nextStatus, setNextStatus] = useState<boolean>(false);
  const onChange = (e: any) => {
    setNextStatus(e.target?.checked || false);
  };
  const exportData = (taskType: string) => {
    // taskType: UPLOAD || EXPORT
    exportProgress(appCode, funCode, viewCode, taskType)
      .then((res) => {
        if (res.status === 'PROCESSING') {
          setTimeout(() => {
            exportData('UPLOAD');
          }, 6000);
        } else if (res.status === 'SUCCESS') {
          setDataStatus({
            status: true,
            finalMsg: res.finalMsg,
            downloadUrl: res.downloadUrl || '',
          });
          if (!res.downloadUrl) {
            changeNext(2);
          } else {
            setStatus('error');
          }
        } else {
        }
      })
      .catch(() => {});
  };
  const getCheckData = () => {
    importDataCheck(appCode, funCode, viewCode, taskId, importWay)
      .then((res: any) => {
        if (!res) {
          return;
        }
        if (res.status === 'FAIL') {
          // 文件上传不正确
          setStatus('error');
          setDataStatus({
            status: false,
            finalMsg: res.finalMsg || '文件上传不正确',
          });
        } else if (res.status === 'SUCCESS') {
          setDataStatus({
            status: true,
            finalMsg: res.finalMsg,
            downloadUrl: res.downloadUrl || '',
          });
          if (!res.downloadUrl) {
            // 代表有错误信息
            changeNext(2);
          } else {
            setStatus('error');
          }
        } else if (res.status === 'PROCESSING') {
          setTimeout(() => {
            exportData('UPLOAD');
          }, 3000);
        }
      })
      .catch(() => {});
  };
  useEffect(() => {
    if (!taskId || current !== 1) {
      return;
    }
    setStatus('loading');
    setNextStatus(false);
    getCheckData();
  }, [current]);

  const downloadError = () => {
    handleDownload(dataStatus.downloadUrl, '错误文件.xlsx');
  };

  return (
    <>
      <div className={'qx-import-check'}>
        {status === 'loading' && (
          <div className={'qx-import-check-data'}>
            <img src={require('./img/loading.png')} alt={'校验中'} />
            <div className={'qx-import-check-loading check-describe'}>
              <div>正在对数据进行校验,请等待</div>
              <div className={'dot'}>
                <div className={'dot-item dot1'} />
                <div className={'dot-item dot2'} />
                <div className={'dot-item dot3'} />
              </div>
            </div>
          </div>
        )}
        {status === 'error' && (
          <div className={'qx-import-check-error qx-import-check-data'}>
            <img src={require('./img/error.png')} alt={'校验失败'} />
            {dataStatus.status ? (
              <>
                <div className={'check-describe'}>
                  文件中有{' '}
                  <span style={{ color: '#FF4D4F' }}>
                    {dataStatus.finalMsg}条
                  </span>{' '}
                  错误数据,请{' '}
                  <span
                    style={{ color: '#3499FF', cursor: 'pointer' }}
                    onClick={downloadError}
                  >
                    下载错误文件
                  </span>{' '}
                  修改后{' '}
                  <span
                    style={{ color: '#3499FF', cursor: 'pointer' }}
                    onClick={() => changeNext(0)}
                  >
                    重新上传
                  </span>
                </div>
                <Checkbox onChange={onChange}>
                  跳过校验,错误数据不导入
                </Checkbox>
              </>
            ) : (
              <div className={'check-describe'}>{dataStatus.finalMsg}</div>
            )}
          </div>
        )}
      </div>
      <div className={'qx-import-button'}>
        <Button onClick={() => changeNext(0)}>上一步</Button>
        <Button
          disabled={!nextStatus}
          type="primary"
          onClick={() => changeNext(2)}
        >
          下一步
        </Button>
      </div>
    </>
  );
};

export default CheckData;