Commit 7937df0645768844bc86221d091cade0d6106756

Authored by 曾国涛
1 parent 1b5105f2

feat: 手动开票功能开发

src/pages/Invoice/components/ManualInvoicingModal.tsx 0 → 100644
  1 +import UploadC from '@/pages/Invoice/components/UploadSingleImg';
  2 +import { postOrderErpOrderStagesUpload } from '@/services';
  3 +import {
  4 + ModalForm,
  5 + ProFormDatePicker,
  6 + ProFormText,
  7 +} from '@ant-design/pro-components';
  8 +import { Col, Form, Row, message } from 'antd';
  9 +import { RcFile } from 'antd/es/upload';
  10 +
  11 +export default () => {
  12 + const [form] = Form.useForm<{ name: string; company: string }>();
  13 + return (
  14 + <ModalForm<{
  15 + name: string;
  16 + company: string;
  17 + }>
  18 + title="手动开票"
  19 + trigger={<a type="primary">手动开票</a>}
  20 + width={400}
  21 + layout={'horizontal'}
  22 + form={form}
  23 + autoFocusFirstInput
  24 + modalProps={{
  25 + destroyOnClose: true,
  26 + onCancel: () => console.log('run'),
  27 + }}
  28 + submitTimeout={2000}
  29 + onFinish={async (values) => {
  30 + console.log(values);
  31 + message.success('提交成功');
  32 + return true;
  33 + }}
  34 + >
  35 + <ProFormText width={'md'} name="invoicingPerson" label="开票人" />
  36 + <ProFormText width={'md'} name="invoiceNumber" label="发票号码" />
  37 + <ProFormDatePicker
  38 + fieldProps={{
  39 + format: 'YY-MM-DD',
  40 + }}
  41 + name="invoicingDate"
  42 + label="开票日期"
  43 + />
  44 + <ProFormText hidden name="url" label="發票地址" />
  45 + <Row>
  46 + <Col span={4}>上传发票</Col>
  47 + <Col span={20}>
  48 + <UploadC
  49 + onFilesChange={async (newFileList) => {
  50 + if (newFileList.length > 0) {
  51 + const formData = new FormData();
  52 + formData.append('file', newFileList[0].originFileObj as RcFile);
  53 + const res = await postOrderErpOrderStagesUpload({
  54 + data: formData,
  55 + headers: {
  56 + 'Content-Type':
  57 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  58 + },
  59 + });
  60 + const url = res.data;
  61 + form.setFieldValue('url', url);
  62 + } else {
  63 + form.setFieldValue('url', null);
  64 + }
  65 + }}
  66 + ></UploadC>
  67 + </Col>
  68 + </Row>
  69 + </ModalForm>
  70 + );
  71 +};
src/pages/Invoice/components/UploadSingleImg.tsx 0 → 100644
  1 +import { PlusOutlined } from '@ant-design/icons';
  2 +import type { GetProp, UploadFile, UploadProps } from 'antd';
  3 +import { Image, Upload } from 'antd';
  4 +import { useState } from 'react';
  5 +
  6 +type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0];
  7 +
  8 +const getBase64 = (file: FileType): Promise<string> =>
  9 + new Promise((resolve, reject) => {
  10 + const reader = new FileReader();
  11 + reader.readAsDataURL(file);
  12 + reader.onload = () => resolve(reader.result as string);
  13 + reader.onerror = (error) => reject(error);
  14 + });
  15 +
  16 +export default ({ onFilesChange }) => {
  17 + const [previewOpen, setPreviewOpen] = useState(false);
  18 + const [previewImage, setPreviewImage] = useState('');
  19 + const [fileList, setFileList] = useState<UploadFile[]>([]);
  20 +
  21 + const handlePreview = async (file: UploadFile) => {
  22 + if (!file.url && !file.preview) {
  23 + file.preview = await getBase64(file.originFileObj as FileType);
  24 + }
  25 +
  26 + setPreviewImage(file.url || (file.preview as string));
  27 + setPreviewOpen(true);
  28 + };
  29 +
  30 + const uploadButton = (
  31 + <button style={{ border: 0, background: 'none' }} type="button">
  32 + <PlusOutlined />
  33 + <div style={{ marginTop: 8 }}>Upload</div>
  34 + </button>
  35 + );
  36 + return (
  37 + <>
  38 + <Upload
  39 + listType="picture-card"
  40 + fileList={fileList}
  41 + onPreview={handlePreview}
  42 + onChange={({ fileList: newFileList }) => {
  43 + setFileList(newFileList);
  44 + console.log('file' + JSON.stringify(newFileList));
  45 + onFilesChange(newFileList);
  46 + }}
  47 + >
  48 + {fileList.length >= 1 ? null : uploadButton}
  49 + </Upload>
  50 + {previewImage && (
  51 + <Image
  52 + wrapperStyle={{ display: 'none' }}
  53 + preview={{
  54 + visible: previewOpen,
  55 + onVisibleChange: (visible) => setPreviewOpen(visible),
  56 + afterOpenChange: (visible) => !visible && setPreviewImage(''),
  57 + }}
  58 + src={previewImage}
  59 + />
  60 + )}
  61 + </>
  62 + );
  63 +};
src/pages/Invoice/index.tsx
@@ -5,6 +5,7 @@ import AddInvoiceDrawerForm from &#39;@/pages/Invoice/components/AddInvoiceDrawerFor @@ -5,6 +5,7 @@ import AddInvoiceDrawerForm from &#39;@/pages/Invoice/components/AddInvoiceDrawerFor
5 import InvoiceModal from '@/pages/Invoice/components/InvoiceModal'; 5 import InvoiceModal from '@/pages/Invoice/components/InvoiceModal';
6 import InvoiceRecordDetailModal from '@/pages/Invoice/components/InvoiceRecordDetailModal'; 6 import InvoiceRecordDetailModal from '@/pages/Invoice/components/InvoiceRecordDetailModal';
7 import InvoicingModal from '@/pages/Invoice/components/InvoicingModal'; 7 import InvoicingModal from '@/pages/Invoice/components/InvoicingModal';
  8 +import ManualInvoicingModal from '@/pages/Invoice/components/ManualInvoicingModal';
8 import { 9 import {
9 BANK_STATEMENT_COLUMNS, 10 BANK_STATEMENT_COLUMNS,
10 INVOICE_COLUMNS, 11 INVOICE_COLUMNS,
@@ -334,6 +335,10 @@ const InvoicePage = () =&gt; { @@ -334,6 +335,10 @@ const InvoicePage = () =&gt; {
334 详情 335 详情
335 </a>, 336 </a>,
336 <InvoiceModal key="invoiceModal" recordId={record.id} />, 337 <InvoiceModal key="invoiceModal" recordId={record.id} />,
  338 + <ManualInvoicingModal
  339 + key={'ManualInvoicingModal'}
  340 + record={record}
  341 + ></ManualInvoicingModal>,
337 ]; 342 ];
338 }, 343 },
339 }, 344 },