index.tsx 7.45 KB
import ButtonConfirm from '@/components/ButtomConfirm';
import EllipsisDiv from '@/components/Div/EllipsisDiv';
import AddInvoiceDrawerForm from '@/pages/Invoice/Invoice/components/AddInvoiceDrawerForm';
import BankImportModal from '@/pages/Invoice/Invoice/components/BankImportModal';
import InvoiceVerificationModal from '@/pages/Invoice/Invoice/components/InvoiceVerificationModal';
import InvoiceWriteOffModal from '@/pages/Invoice/Invoice/components/invoiceWriteOffModal';
import { INVOICE_COLUMNS } from '@/pages/Invoice/constant';
import { INVOCING_STATUS, PAYEE_OPTIONS } from '@/pages/Order/constant';
import {
  postServiceInvoiceDeleteInvoice,
  postServiceInvoiceGetWriteOffRecord,
  postServiceInvoiceQueryInvoice,
} from '@/services';
import { enumValueToLabel, formatDateTime } from '@/utils';
import { formatDate } from '@/utils/time';
import { ActionType, ProTable } from '@ant-design/pro-components';
import { Button, message } from 'antd';
import { useRef, useState } from 'react';

const InvoiceRecord = () => {
  const invoiceActionRef = useRef<ActionType>();
  const [bankImportModalVisible, setBankImportModalVisible] = useState(false);
  const [invoiceVerificationVisible, setInvoiceVerificationVisible] =
    useState(false);
  const [invoiceId, setInvoiceId] = useState(undefined);
  const reloadInvoiceTable = () => {
    invoiceActionRef.current?.reload();
  };

  const getTableCellText = (target: any) => {
    if (!target) {
      return '';
    }

    if (target.props) {
      return target.props.text;
    }

    return target;
  };
  /**
   * 加载发票列表表格的各个列格式
   */
  const invoicecColumnsInit = () => {
    let columns = INVOICE_COLUMNS.map((item) => {
      let newItem = { ...item };
      let dataIndex = item.dataIndex;
      let dataType = item.valueType;

      newItem.render = (text, record) => {
        let textValue = record[dataIndex];

        if (dataType === 'dateRange' || dataType === 'date') {
          textValue = formatDate(textValue);
        }

        if (dataType === 'dateTime') {
          textValue = formatDateTime(textValue);
        }

        if (dataType === 'money') {
          textValue = '¥' + textValue;
        }

        switch (dataIndex) {
          case 'invoiceStatus':
            return (
              <EllipsisDiv
                text={enumValueToLabel(
                  getTableCellText(textValue),
                  INVOCING_STATUS,
                )}
              />
            );

          case 'payee':
            return (
              <EllipsisDiv
                text={enumValueToLabel(
                  getTableCellText(textValue),
                  PAYEE_OPTIONS,
                )}
              />
            );

          default:
            return <EllipsisDiv text={getTableCellText(textValue)} />;
        }
      };

      return newItem;
    });

    columns.push({
      title: '操作',
      valueType: 'option',
      key: 'option',
      fixed: 'right',
      width: 160,
      render: (text, record) => {
        let btns = [];
        if (!record.writeOffId) {
          btns.push(
            <InvoiceWriteOffModal
              getData={() => {
                return {
                  invoices: [record],
                };
              }}
              key="writeOff"
              triggerButton={
                <Button size={'small'} type="link">
                  核销
                </Button>
              }
              readOnly={false}
            />,
          );
        }

        if (record.writeOffId) {
          btns.push(
            <InvoiceWriteOffModal
              getData={async () => {
                const res = await postServiceInvoiceGetWriteOffRecord({
                  data: { id: record.writeOffId },
                });
                const data = res.data;
                return {
                  invoiceWriteOffId: data.id,
                  invoices: data.invoiceDtos,
                  bankStatements: data.bankStatementDtos,
                };
              }}
              key="writeOff"
              triggerButton={<Button type="link">核销记录</Button>}
              readOnly={true}
            />,
          );
        }

        if (record.paths?.includes('queryInvoiceDetails')) {
          btns.push(
            <Button
              className="p-0"
              key="view"
              type="link"
              onClick={() => {
                setInvoiceVerificationVisible(true);
                setInvoiceId(record.id);
              }}
            >
              查看
            </Button>,
          );
        }

        if (record.paths?.includes('deleteInvoice')) {
          btns.push(
            <ButtonConfirm
              key="delete"
              className="p-0"
              title={
                '确认删除发票号码为[ ' + record.invoiceNumber + ' ]的发票吗?'
              }
              text="删除"
              onConfirm={async () => {
                let res = await postServiceInvoiceDeleteInvoice({
                  data: { invoiceId: record.invoiceId },
                });
                if (res) {
                  message.success(res.message);
                  reloadInvoiceTable();
                }
              }}
            />,
          );
        }
        return btns;
      },
    });

    return columns;
  };

  return (
    <div className="invoice-index">
      <ProTable
        columns={invoicecColumnsInit()}
        actionRef={invoiceActionRef}
        cardBordered
        pagination={{
          pageSize: 10,
        }}
        request={async (params) => {
          const res = await postServiceInvoiceQueryInvoice({
            data: { ...params },
          });
          if (res) {
            return {
              data: res?.data?.data || [],
              total: res?.data?.total || 0,
            };
          }
        }}
        columnsState={{
          persistenceKey: 'pro-table-singe-demos',
          persistenceType: 'localStorage',
          defaultValue: {
            option: { fixed: 'right', disable: true },
          },
          onChange(value) {
            console.log('value: ', value);
          },
        }}
        rowKey="id"
        search={{
          labelWidth: 'auto',
        }}
        options={{
          setting: {
            listsHeight: 400,
          },
        }}
        form={{}}
        dateFormatter="string"
        headerTitle="发票列表"
        scroll={{ x: 1400, y: 360 }}
        toolBarRender={() => [
          <AddInvoiceDrawerForm
            onClose={() => {
              invoiceActionRef.current?.reload();
            }}
            key="add"
          ></AddInvoiceDrawerForm>,
          <InvoiceWriteOffModal
            readOnly={false}
            getData={() => ({})}
            key="writeOff"
            triggerButton={<Button type="primary">核销</Button>}
          />,
        ]}
      />

      {bankImportModalVisible ? (
        <BankImportModal
          setVisible={setBankImportModalVisible}
          onClose={() => {
            setBankImportModalVisible(false);
            invoiceActionRef.current?.reload();
          }}
        ></BankImportModal>
      ) : (
        ''
      )}

      {invoiceVerificationVisible ? (
        <InvoiceVerificationModal
          setVisible={setInvoiceVerificationVisible}
          invoiceId={invoiceId}
          onClose={() => {
            invoiceActionRef.current?.reload();
          }}
        ></InvoiceVerificationModal>
      ) : (
        ''
      )}
    </div>
  );
};

export default InvoiceRecord;