table.tsx 4.78 KB
import {
  deleteOrderErpOrderZoNingDelete,
  getOrderErpOrderZoNingSelectAll,
} from '@/services';
import type { ProColumns } from '@ant-design/pro-components';
import { EditableProTable } from '@ant-design/pro-components';
import { Button, Popconfirm, PopconfirmProps, message } from 'antd';
import React, { useRef, useState } from 'react';
import '../index.less';
import { zoningItem, zoningShowItem } from './constant';
import Modal from './modal';

const waitTime = (time: number = 100) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(true);
    }, time);
  });
};

function changeToShow(array: zoningItem[]) {
  console.log(JSON.parse(localStorage.getItem('userInfo')).username);
  const showArray: zoningShowItem[] = array.map((item) => {
    let orderProvinceShowList = '';
    let orderUserShowList = '';
    let orderUserNumberShowList: number[] = [];
    item.orderProvinceVoList.forEach((element, index) => {
      orderProvinceShowList += element.province;
      if (index < item.orderProvinceVoList.length - 1) {
        orderProvinceShowList += '、';
      }
    });

    item.orderUserVoList.forEach((event, index) => {
      orderUserShowList += event.userName;
      orderUserNumberShowList.push(event.uId);
      if (index < item.orderUserVoList.length - 1) {
        orderUserShowList += '、';
      }
    });

    if (orderUserShowList === '') {
      orderUserShowList = '全选';
      orderUserNumberShowList.push(0);
    }

    return {
      id: item.id,
      zoning: item.zoning,
      orderProvinceShowList,
      orderUserShowList,
      orderUserNumberShowList,
    };
  });
  return showArray;
}

export default () => {
  const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  const [dataSource, setDataSource] = useState<readonly zoningItem[]>([]);
  const [position] = useState<'top' | 'bottom' | 'hidden'>('hidden');

  interface ActionType {
    reload: (resetPageIndex?: boolean) => void;
    reloadAndRest: () => void;
    reset: () => void;
    clearSelected?: () => void;
    startEditable: (rowKey: Key) => boolean;
    cancelEditable: (rowKey: Key) => boolean;
  }

  const ref = useRef<ActionType>({
    reload: () => {},
    reloadAndRest: () => {},
    reset: () => {},
    startEditable: () => {},
    cancelEditable: () => {},
  });

  function reload() {
    ref.current.reload();
  }

  const confirm: PopconfirmProps['onConfirm'] = async (id) => {
    await deleteOrderErpOrderZoNingDelete({
      data: id,
    });
    reload();
    message.success('删除成功');
  };

  const cancel: PopconfirmProps['onCancel'] = () => {
    message.error('取消删除');
  };

  const columns: ProColumns<zoningItem>[] = [
    {
      title: '区域名称',
      dataIndex: 'zoning',
      width: 200,
    },
    {
      title: '管辖省份',
      dataIndex: 'orderProvinceShowList',
      readonly: true,
      width: 600,
    },
    {
      title: '负责销售',
      key: 'state',
      dataIndex: 'orderUserShowList',
      valueType: 'select',
      ellipsis: true,
      width: 200,
    },
    {
      title: '操作',
      valueType: 'option',
      width: 200,
      render: (text, record) => [
        <>
          <Modal
            toReload={reload}
            option={'编辑'}
            needEditBody={record}
            key={record.id}
          />
          <Popconfirm
            title="删除此项"
            description="你确定你要删除此项吗?"
            onConfirm={() => {
              confirm(record.id);
            }}
            onCancel={cancel}
            okText="确定"
            cancelText="取消"
          >
            <Button>删除</Button>
          </Popconfirm>
        </>,
      ],
    },
  ];

  return (
    <EditableProTable<zoningItem>
      rowKey="id"
      className="table-index"
      deletePopconfirmMessage
      actionRef={ref}
      headerTitle={
        <Modal toReload={reload} option={'新增区域'} needEditBody={{}}></Modal>
      }
      maxLength={5}
      scroll={{
        x: 960,
      }}
      recordCreatorProps={
        position !== 'hidden'
          ? {
              position: position as 'top',
              record: () => ({ id: (Math.random() * 1000000).toFixed(0) }),
            }
          : false
      }
      loading={false}
      columns={columns}
      request={async () => {
        const res = await getOrderErpOrderZoNingSelectAll();
        if (res) {
          const initDataSource = changeToShow(res.data);
          return { data: initDataSource || [] };
        }
      }}
      value={dataSource}
      onChange={setDataSource}
      editable={{
        type: 'multiple',
        editableKeys,
        onSave: async (rowKey, data, row) => {
          console.log(rowKey, data, row);
          await waitTime(2000);
        },
        onChange: setEditableRowKeys,
      }}
    />
  );
};