ManualInvoiceModal.tsx 3.86 KB
import { RESPONSE_CODE } from '@/constants/enum';
import { PAYEE_OPTIONS } from '@/pages/Order/constant';
import { postServiceOrderInvoicing } from '@/services';
import {
  ModalForm,
  ProFormDatePicker,
  ProFormDigit,
  ProFormSelect,
  ProFormText,
} from '@ant-design/pro-components';
import { Form, message } from 'antd';
import { useState } from 'react';

interface ManualInvoiceModalProps {
  record: any;
  onSuccess?: () => void;
}

const ManualInvoiceModal: React.FC<ManualInvoiceModalProps> = ({
  record,
  onSuccess,
}) => {
  const [form] = Form.useForm();
  const [visible, setVisible] = useState(false);

  // 转换PAYEE_OPTIONS为Select组件需要的格式
  const payeeOptions = Object.entries(PAYEE_OPTIONS).map(([value, label]) => ({
    value,
    label,
  }));

  return (
    <ModalForm
      title="手动开票"
      trigger={
        <a
          key="invoice"
          style={{ color: '#1890ff' }}
          onClick={() => setVisible(true)}
        >
          开票
        </a>
      }
      width={600}
      layout={'horizontal'}
      form={form}
      open={visible}
      onOpenChange={setVisible}
      autoFocusFirstInput
      modalProps={{
        destroyOnClose: true,
      }}
      initialValues={{
        purchaser: record.partyAName,
        payee: record.partyB,
        money: record.price,
      }}
      submitTimeout={2000}
      onFinish={async (values) => {
        try {
          const body = {
            invoiceIdentificationNumber: values.purchaser,
            invoicingTime: values.invoicingTime,
            purchaser: values.purchaser,
            financialReceiptIssuanceTime:
              values.financialReceiptIssuanceTime || values.invoicingTime,
            collectMoneyTime: values.collectMoneyTime || values.invoicingTime,
            invoiceNumber: values.invoiceNumber,
            payee: values.payee,
            money: values.money,
            afterInvoicingStatus: [record.type],
            mainOrderIds: record.mainOrderIds,
            invoiceRecordIds: [record.id],
          };

          // 根据现有组件实现,使用data来传递参数
          const res = await postServiceOrderInvoicing({
            data: body,
          });

          if (res.result === RESPONSE_CODE.SUCCESS) {
            message.success('开票成功');
            if (onSuccess) {
              onSuccess();
            }
            return true;
          } else {
            message.error('开票失败');
            return false;
          }
        } catch (error) {
          message.error('操作失败');
          return false;
        }
      }}
    >
      <ProFormText
        width="md"
        name="purchaser"
        label="抬头名称"
        rules={[{ required: true, message: '请输入抬头名称' }]}
        disabled
      />

      <ProFormText
        width="md"
        name="invoiceType"
        label="发票类型"
        initialValue="普票"
        disabled
      />

      <ProFormDigit
        width="md"
        name="money"
        label="发票金额"
        fieldProps={{
          precision: 2,
          prefix: '¥',
        }}
        rules={[{ required: true, message: '请输入发票金额' }]}
        disabled
      />

      <ProFormSelect
        width="md"
        name="payee"
        label="收款单位"
        options={payeeOptions}
        rules={[{ required: true, message: '请选择收款单位' }]}
        disabled
      />

      <ProFormText
        width="md"
        name="invoiceNumber"
        label="发票号码"
        rules={[{ required: true, message: '请输入发票号码' }]}
      />

      <ProFormDatePicker
        width="md"
        name="invoicingTime"
        label="开票时间"
        rules={[{ required: true, message: '请选择开票时间' }]}
        fieldProps={{
          format: 'YYYY-MM-DD',
        }}
      />
    </ModalForm>
  );
};

export default ManualInvoiceModal;