Commit 78063a4c87ed50ba0bef331e82be99b9e18e4e44
1 parent
c81dc397
feat: 开票功能开发
Showing
5 changed files
with
245 additions
and
66 deletions
src/pages/Invoice/components/InvoiceDetailImportModal.tsx
0 → 100644
1 | +import { RESPONSE_CODE } from '@/constants/enum'; | |
2 | +import { postServiceInvoiceImportInvoiceDetails } from '@/services'; | |
3 | +import { ModalForm, ProFormUploadDragger } from '@ant-design/pro-components'; | |
4 | +import { Button, Form, message } from 'antd'; | |
5 | + | |
6 | +export default ({ recordId }) => { | |
7 | + const [form] = Form.useForm(); | |
8 | + return ( | |
9 | + <ModalForm | |
10 | + title="新建表单" | |
11 | + trigger={<Button type="primary">导入明细</Button>} | |
12 | + form={form} | |
13 | + autoFocusFirstInput | |
14 | + modalProps={{ | |
15 | + destroyOnClose: true, | |
16 | + onCancel: () => console.log('run'), | |
17 | + }} | |
18 | + submitTimeout={2000} | |
19 | + onFinish={async (values) => { | |
20 | + const formData = new FormData(); | |
21 | + // console.log(fileList[0] as RcFile) | |
22 | + // formData.append('file', fileList[0] as RcFile); | |
23 | + formData.append('invoiceRecordId', recordId); | |
24 | + formData.append('detailsExcel', values.detailsExcel[0].originFileObj); | |
25 | + // You can use any AJAX library you like | |
26 | + const res = await postServiceInvoiceImportInvoiceDetails({ | |
27 | + data: formData, | |
28 | + headers: { | |
29 | + 'Content-Type': | |
30 | + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq', | |
31 | + }, | |
32 | + }); | |
33 | + if (res.result === RESPONSE_CODE.SUCCESS) { | |
34 | + message.success('导入成功'); | |
35 | + return true; | |
36 | + } | |
37 | + }} | |
38 | + > | |
39 | + <ProFormUploadDragger name="detailsExcel" label="导入明细表" /> | |
40 | + </ModalForm> | |
41 | + ); | |
42 | +}; | ... | ... |
src/pages/Invoice/components/InvoiceDetailTable.tsx
1 | +import InvoiceDetailImportModal from '@/pages/Invoice/components/InvoiceDetailImportModal'; | |
1 | 2 | import type { ProColumns } from '@ant-design/pro-components'; |
2 | 3 | import { |
3 | 4 | EditableProTable, |
4 | 5 | ProCard, |
5 | 6 | ProFormField, |
6 | 7 | } from '@ant-design/pro-components'; |
7 | -import { Button } from 'antd'; | |
8 | 8 | import { useEffect, useState } from 'react'; |
9 | 9 | |
10 | -export default ({ details, updateDetails, readOnly }) => { | |
10 | +export default ({ recordId, details, updateDetails, readOnly }) => { | |
11 | 11 | const [editableKeys, setEditableRowKeys] = useState([]); |
12 | 12 | |
13 | 13 | useEffect(() => { |
... | ... | @@ -56,7 +56,7 @@ export default ({ details, updateDetails, readOnly }) => { |
56 | 56 | { |
57 | 57 | title: '金额', |
58 | 58 | readonly: readOnly, |
59 | - dataIndex: 'taxPrice', | |
59 | + dataIndex: 'totalPrice', | |
60 | 60 | valueType: 'digit', |
61 | 61 | width: '30%', |
62 | 62 | }, |
... | ... | @@ -109,16 +109,7 @@ export default ({ details, updateDetails, readOnly }) => { |
109 | 109 | } |
110 | 110 | toolBarRender={() => { |
111 | 111 | return [ |
112 | - <Button | |
113 | - type="primary" | |
114 | - key="save" | |
115 | - onClick={() => { | |
116 | - // dataSource 就是当前数据,可以调用 api 将其保存 | |
117 | - console.log(details); | |
118 | - }} | |
119 | - > | |
120 | - 保存数据 | |
121 | - </Button>, | |
112 | + <InvoiceDetailImportModal key={'import'} recordId={recordId} />, | |
122 | 113 | ]; |
123 | 114 | }} |
124 | 115 | editable={{ | ... | ... |
src/pages/Invoice/components/InvoiceRecordDetailModal.tsx
... | ... | @@ -43,24 +43,24 @@ export default ({ id }) => { |
43 | 43 | }; |
44 | 44 | getPayees(); |
45 | 45 | }, []); |
46 | + const getRecord = async (id) => { | |
47 | + let ret = await postServiceInvoiceGetInvoiceRecord({ | |
48 | + query: { | |
49 | + id: id, | |
50 | + }, | |
51 | + }); | |
52 | + const updatedInvoiceDetails = ret.data.invoiceDetails?.map( | |
53 | + (item, index) => ({ | |
54 | + ...item, // 保留原有属性 | |
55 | + tid: index + 1, // 添加tid属性,这里以T开头,后面跟索引+1,仅作示例,实际可根据需求生成tid | |
56 | + }), | |
57 | + ); | |
58 | + setDetailTableData(updatedInvoiceDetails); | |
59 | + setInitialValues(ret.data); | |
60 | + }; | |
46 | 61 | useEffect(() => { |
47 | - const initRecord = async (id) => { | |
48 | - let ret = await postServiceInvoiceGetInvoiceRecord({ | |
49 | - query: { | |
50 | - id: id, | |
51 | - }, | |
52 | - }); | |
53 | - const updatedInvoiceDetails = ret.data.invoiceDetails?.map( | |
54 | - (item, index) => ({ | |
55 | - ...item, // 保留原有属性 | |
56 | - tid: index + 1, // 添加tid属性,这里以T开头,后面跟索引+1,仅作示例,实际可根据需求生成tid | |
57 | - }), | |
58 | - ); | |
59 | - setDetailTableData(updatedInvoiceDetails); | |
60 | - setInitialValues(ret.data); | |
61 | - }; | |
62 | 62 | if (!visible) { |
63 | - initRecord(id); | |
63 | + getRecord(id); | |
64 | 64 | } |
65 | 65 | }, [visible]); |
66 | 66 | |
... | ... | @@ -330,6 +330,7 @@ export default ({ id }) => { |
330 | 330 | 订单信息 |
331 | 331 | <hr /> |
332 | 332 | <InvoiceDetailTable |
333 | + recordId={id} | |
333 | 334 | details={detailTableData} |
334 | 335 | updateDetails={updateDetails} |
335 | 336 | readOnly={readOnly} | ... | ... |
src/services/definition.ts
... | ... | @@ -2477,9 +2477,9 @@ export interface InvoiceDetail { |
2477 | 2477 | specification?: string; |
2478 | 2478 | /** @format int64 */ |
2479 | 2479 | subOrderId?: number; |
2480 | - /** @format int32 */ | |
2480 | + /** @format double */ | |
2481 | 2481 | taxPrice?: number; |
2482 | - /** @format int32 */ | |
2482 | + /** @format double */ | |
2483 | 2483 | taxRate?: number; |
2484 | 2484 | /** |
2485 | 2485 | * @description | ... | ... |
src/services/request.ts
... | ... | @@ -54,6 +54,7 @@ import type { |
54 | 54 | MaterialUnitListRes, |
55 | 55 | MeasureUnitListRes, |
56 | 56 | MessageQueryDTO, |
57 | + ModelAndView, | |
57 | 58 | OrderAddVO, |
58 | 59 | OrderAuditLogQueryVO, |
59 | 60 | OrderBaseInfoQueryVO, |
... | ... | @@ -1539,9 +1540,7 @@ export interface GetErrorResponse { |
1539 | 1540 | * @description |
1540 | 1541 | * OK |
1541 | 1542 | */ |
1542 | - 200: { | |
1543 | - [propertyName: string]: any; | |
1544 | - }; | |
1543 | + 200: ModelAndView; | |
1545 | 1544 | /** |
1546 | 1545 | * @description |
1547 | 1546 | * Unauthorized |
... | ... | @@ -1562,9 +1561,9 @@ export interface GetErrorResponse { |
1562 | 1561 | export type GetErrorResponseSuccess = GetErrorResponse[200]; |
1563 | 1562 | /** |
1564 | 1563 | * @description |
1565 | - * error | |
1564 | + * errorHtml | |
1566 | 1565 | * @tags basic-error-controller |
1567 | - * @produces * | |
1566 | + * @produces text/html | |
1568 | 1567 | */ |
1569 | 1568 | export const getError = /* #__PURE__ */ (() => { |
1570 | 1569 | const method = 'get'; |
... | ... | @@ -1588,9 +1587,7 @@ export interface PutErrorResponse { |
1588 | 1587 | * @description |
1589 | 1588 | * OK |
1590 | 1589 | */ |
1591 | - 200: { | |
1592 | - [propertyName: string]: any; | |
1593 | - }; | |
1590 | + 200: ModelAndView; | |
1594 | 1591 | /** |
1595 | 1592 | * @description |
1596 | 1593 | * Created |
... | ... | @@ -1616,9 +1613,9 @@ export interface PutErrorResponse { |
1616 | 1613 | export type PutErrorResponseSuccess = PutErrorResponse[200]; |
1617 | 1614 | /** |
1618 | 1615 | * @description |
1619 | - * error | |
1616 | + * errorHtml | |
1620 | 1617 | * @tags basic-error-controller |
1621 | - * @produces * | |
1618 | + * @produces text/html | |
1622 | 1619 | * @consumes application/json |
1623 | 1620 | */ |
1624 | 1621 | export const putError = /* #__PURE__ */ (() => { |
... | ... | @@ -1643,9 +1640,7 @@ export interface PostErrorResponse { |
1643 | 1640 | * @description |
1644 | 1641 | * OK |
1645 | 1642 | */ |
1646 | - 200: { | |
1647 | - [propertyName: string]: any; | |
1648 | - }; | |
1643 | + 200: ModelAndView; | |
1649 | 1644 | /** |
1650 | 1645 | * @description |
1651 | 1646 | * Created |
... | ... | @@ -1671,9 +1666,9 @@ export interface PostErrorResponse { |
1671 | 1666 | export type PostErrorResponseSuccess = PostErrorResponse[200]; |
1672 | 1667 | /** |
1673 | 1668 | * @description |
1674 | - * error | |
1669 | + * errorHtml | |
1675 | 1670 | * @tags basic-error-controller |
1676 | - * @produces * | |
1671 | + * @produces text/html | |
1677 | 1672 | * @consumes application/json |
1678 | 1673 | */ |
1679 | 1674 | export const postError = /* #__PURE__ */ (() => { |
... | ... | @@ -1698,9 +1693,7 @@ export interface DeleteErrorResponse { |
1698 | 1693 | * @description |
1699 | 1694 | * OK |
1700 | 1695 | */ |
1701 | - 200: { | |
1702 | - [propertyName: string]: any; | |
1703 | - }; | |
1696 | + 200: ModelAndView; | |
1704 | 1697 | /** |
1705 | 1698 | * @description |
1706 | 1699 | * No Content |
... | ... | @@ -1721,9 +1714,9 @@ export interface DeleteErrorResponse { |
1721 | 1714 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; |
1722 | 1715 | /** |
1723 | 1716 | * @description |
1724 | - * error | |
1717 | + * errorHtml | |
1725 | 1718 | * @tags basic-error-controller |
1726 | - * @produces * | |
1719 | + * @produces text/html | |
1727 | 1720 | */ |
1728 | 1721 | export const deleteError = /* #__PURE__ */ (() => { |
1729 | 1722 | const method = 'delete'; |
... | ... | @@ -1747,9 +1740,7 @@ export interface OptionsErrorResponse { |
1747 | 1740 | * @description |
1748 | 1741 | * OK |
1749 | 1742 | */ |
1750 | - 200: { | |
1751 | - [propertyName: string]: any; | |
1752 | - }; | |
1743 | + 200: ModelAndView; | |
1753 | 1744 | /** |
1754 | 1745 | * @description |
1755 | 1746 | * No Content |
... | ... | @@ -1770,9 +1761,9 @@ export interface OptionsErrorResponse { |
1770 | 1761 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; |
1771 | 1762 | /** |
1772 | 1763 | * @description |
1773 | - * error | |
1764 | + * errorHtml | |
1774 | 1765 | * @tags basic-error-controller |
1775 | - * @produces * | |
1766 | + * @produces text/html | |
1776 | 1767 | * @consumes application/json |
1777 | 1768 | */ |
1778 | 1769 | export const optionsError = /* #__PURE__ */ (() => { |
... | ... | @@ -1797,9 +1788,7 @@ export interface HeadErrorResponse { |
1797 | 1788 | * @description |
1798 | 1789 | * OK |
1799 | 1790 | */ |
1800 | - 200: { | |
1801 | - [propertyName: string]: any; | |
1802 | - }; | |
1791 | + 200: ModelAndView; | |
1803 | 1792 | /** |
1804 | 1793 | * @description |
1805 | 1794 | * No Content |
... | ... | @@ -1820,9 +1809,9 @@ export interface HeadErrorResponse { |
1820 | 1809 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; |
1821 | 1810 | /** |
1822 | 1811 | * @description |
1823 | - * error | |
1812 | + * errorHtml | |
1824 | 1813 | * @tags basic-error-controller |
1825 | - * @produces * | |
1814 | + * @produces text/html | |
1826 | 1815 | * @consumes application/json |
1827 | 1816 | */ |
1828 | 1817 | export const headError = /* #__PURE__ */ (() => { |
... | ... | @@ -1847,9 +1836,7 @@ export interface PatchErrorResponse { |
1847 | 1836 | * @description |
1848 | 1837 | * OK |
1849 | 1838 | */ |
1850 | - 200: { | |
1851 | - [propertyName: string]: any; | |
1852 | - }; | |
1839 | + 200: ModelAndView; | |
1853 | 1840 | /** |
1854 | 1841 | * @description |
1855 | 1842 | * No Content |
... | ... | @@ -1870,9 +1857,9 @@ export interface PatchErrorResponse { |
1870 | 1857 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; |
1871 | 1858 | /** |
1872 | 1859 | * @description |
1873 | - * error | |
1860 | + * errorHtml | |
1874 | 1861 | * @tags basic-error-controller |
1875 | - * @produces * | |
1862 | + * @produces text/html | |
1876 | 1863 | * @consumes application/json |
1877 | 1864 | */ |
1878 | 1865 | export const patchError = /* #__PURE__ */ (() => { |
... | ... | @@ -7132,6 +7119,77 @@ export const postOrderErpUsersUpdatePass = /* #__PURE__ */ (() => { |
7132 | 7119 | return request; |
7133 | 7120 | })(); |
7134 | 7121 | |
7122 | +/** @description request parameter type for postOrderImportImportInvoiceProject */ | |
7123 | +export interface PostOrderImportImportInvoiceProjectOption { | |
7124 | + /** | |
7125 | + * @description | |
7126 | + * file | |
7127 | + */ | |
7128 | + formData: { | |
7129 | + /** | |
7130 | + @description | |
7131 | + file */ | |
7132 | + file: File; | |
7133 | + }; | |
7134 | +} | |
7135 | + | |
7136 | +/** @description response type for postOrderImportImportInvoiceProject */ | |
7137 | +export interface PostOrderImportImportInvoiceProjectResponse { | |
7138 | + /** | |
7139 | + * @description | |
7140 | + * OK | |
7141 | + */ | |
7142 | + 200: ServerResult; | |
7143 | + /** | |
7144 | + * @description | |
7145 | + * Created | |
7146 | + */ | |
7147 | + 201: any; | |
7148 | + /** | |
7149 | + * @description | |
7150 | + * Unauthorized | |
7151 | + */ | |
7152 | + 401: any; | |
7153 | + /** | |
7154 | + * @description | |
7155 | + * Forbidden | |
7156 | + */ | |
7157 | + 403: any; | |
7158 | + /** | |
7159 | + * @description | |
7160 | + * Not Found | |
7161 | + */ | |
7162 | + 404: any; | |
7163 | +} | |
7164 | + | |
7165 | +export type PostOrderImportImportInvoiceProjectResponseSuccess = | |
7166 | + PostOrderImportImportInvoiceProjectResponse[200]; | |
7167 | +/** | |
7168 | + * @description | |
7169 | + * 导入发票项目 | |
7170 | + * @tags 导入 | |
7171 | + * @produces * | |
7172 | + * @consumes multipart/form-data | |
7173 | + */ | |
7174 | +export const postOrderImportImportInvoiceProject = /* #__PURE__ */ (() => { | |
7175 | + const method = 'post'; | |
7176 | + const url = '/order/import/importInvoiceProject'; | |
7177 | + function request( | |
7178 | + option: PostOrderImportImportInvoiceProjectOption, | |
7179 | + ): Promise<PostOrderImportImportInvoiceProjectResponseSuccess> { | |
7180 | + return requester(request.url, { | |
7181 | + method: request.method, | |
7182 | + ...option, | |
7183 | + }) as unknown as Promise<PostOrderImportImportInvoiceProjectResponseSuccess>; | |
7184 | + } | |
7185 | + | |
7186 | + /** http method */ | |
7187 | + request.method = method; | |
7188 | + /** request url */ | |
7189 | + request.url = url; | |
7190 | + return request; | |
7191 | +})(); | |
7192 | + | |
7135 | 7193 | /** @description request parameter type for postOrderImportImportWeightAndVolume */ |
7136 | 7194 | export interface PostOrderImportImportWeightAndVolumeOption { |
7137 | 7195 | /** |
... | ... | @@ -8685,6 +8743,93 @@ export const postServiceInvoiceGetInvoiceRecord = /* #__PURE__ */ (() => { |
8685 | 8743 | return request; |
8686 | 8744 | })(); |
8687 | 8745 | |
8746 | +/** @description request parameter type for postServiceInvoiceImportInvoiceDetails */ | |
8747 | +export interface PostServiceInvoiceImportInvoiceDetailsOption { | |
8748 | + /** | |
8749 | + * @description | |
8750 | + * detailsExcel | |
8751 | + */ | |
8752 | + formData: { | |
8753 | + /** | |
8754 | + @description | |
8755 | + detailsExcel */ | |
8756 | + detailsExcel: File; | |
8757 | + }; | |
8758 | +} | |
8759 | + | |
8760 | +/** @description request parameter type for postServiceInvoiceImportInvoiceDetails */ | |
8761 | +export interface PostServiceInvoiceImportInvoiceDetailsOption { | |
8762 | + /** | |
8763 | + * @description | |
8764 | + * invoiceRecordId | |
8765 | + * @format int64 | |
8766 | + */ | |
8767 | + query: { | |
8768 | + /** | |
8769 | + @description | |
8770 | + invoiceRecordId | |
8771 | + @format int64 */ | |
8772 | + invoiceRecordId: number; | |
8773 | + }; | |
8774 | +} | |
8775 | + | |
8776 | +/** @description response type for postServiceInvoiceImportInvoiceDetails */ | |
8777 | +export interface PostServiceInvoiceImportInvoiceDetailsResponse { | |
8778 | + /** | |
8779 | + * @description | |
8780 | + * OK | |
8781 | + */ | |
8782 | + 200: ServerResult; | |
8783 | + /** | |
8784 | + * @description | |
8785 | + * Created | |
8786 | + */ | |
8787 | + 201: any; | |
8788 | + /** | |
8789 | + * @description | |
8790 | + * Unauthorized | |
8791 | + */ | |
8792 | + 401: any; | |
8793 | + /** | |
8794 | + * @description | |
8795 | + * Forbidden | |
8796 | + */ | |
8797 | + 403: any; | |
8798 | + /** | |
8799 | + * @description | |
8800 | + * Not Found | |
8801 | + */ | |
8802 | + 404: any; | |
8803 | +} | |
8804 | + | |
8805 | +export type PostServiceInvoiceImportInvoiceDetailsResponseSuccess = | |
8806 | + PostServiceInvoiceImportInvoiceDetailsResponse[200]; | |
8807 | +/** | |
8808 | + * @description | |
8809 | + * 导入发票明细 | |
8810 | + * @tags 发票 | |
8811 | + * @produces * | |
8812 | + * @consumes multipart/form-data | |
8813 | + */ | |
8814 | +export const postServiceInvoiceImportInvoiceDetails = /* #__PURE__ */ (() => { | |
8815 | + const method = 'post'; | |
8816 | + const url = '/service/invoice/importInvoiceDetails'; | |
8817 | + function request( | |
8818 | + option: PostServiceInvoiceImportInvoiceDetailsOption, | |
8819 | + ): Promise<PostServiceInvoiceImportInvoiceDetailsResponseSuccess> { | |
8820 | + return requester(request.url, { | |
8821 | + method: request.method, | |
8822 | + ...option, | |
8823 | + }) as unknown as Promise<PostServiceInvoiceImportInvoiceDetailsResponseSuccess>; | |
8824 | + } | |
8825 | + | |
8826 | + /** http method */ | |
8827 | + request.method = method; | |
8828 | + /** request url */ | |
8829 | + request.url = url; | |
8830 | + return request; | |
8831 | +})(); | |
8832 | + | |
8688 | 8833 | /** @description request parameter type for postServiceInvoiceInvoiceWriteOff */ |
8689 | 8834 | export interface PostServiceInvoiceInvoiceWriteOffOption { |
8690 | 8835 | /** | ... | ... |