Commit e0a6e25dbb3b7e6493f6bbd6af83cd97d40be384

Authored by zhongnanhuang
1 parent 58e44c5e

feat: update 发票管理页面、财务开票新增字段

.umirc.ts
... ... @@ -46,6 +46,13 @@ export default defineConfig({
46 46 access: 'canReadAdmin',
47 47 },
48 48 {
  49 + name: '发票管理',
  50 + path: '/invoiceManage',
  51 + component: './Invoice',
  52 + icon: 'BookOutlined',
  53 + access: 'canReadAdmin',
  54 + },
  55 + {
49 56 name: '打印',
50 57 path: '/print',
51 58 component: './OrderPrint',
... ...
src/app.ts
... ... @@ -24,7 +24,7 @@ export const layout = () => {
24 24 // rightContentRender: () => <RightContent />,
25 25 // footerRender: () => <Footer />,
26 26 },
27   - collapsed: true,
  27 + // collapsed: true,
28 28 };
29 29 };
30 30  
... ...
src/pages/Invoice/constant.tsx 0 → 100644
  1 +import { TableDropdown } from '@ant-design/pro-components';
  2 +
  3 +export type InvoiceItem = {
  4 + id: number; //id
  5 + invoiceStatus: string; //发票类型:专票/普票
  6 + invoiceNumber: string; //发票号码
  7 + status: string; //状态
  8 + purchaser: string; //购买方
  9 + payee: string; //收款单位
  10 + contacts: string; //联系人
  11 + sale: string; //销售
  12 + money: number; //金额
  13 + invoicingTime: string; //开票日期
  14 + collectionTime: string; //收款时间
  15 + notes: string; //备注
  16 +};
  17 +
  18 +export const INVOICE_COLUMNS = [
  19 + {
  20 + dataIndex: 'invoiceNumber',
  21 + title: '发票号码',
  22 + valueType: 'text',
  23 + },
  24 + {
  25 + dataIndex: 'invoiceStatus',
  26 + title: '发票类型',
  27 + valueType: 'select',
  28 + },
  29 + {
  30 + title: '状态',
  31 + dataIndex: 'status',
  32 + valueType: 'text',
  33 + },
  34 + {
  35 + title: '购买方',
  36 + dataIndex: 'purchaser',
  37 + valueType: 'text',
  38 + },
  39 + {
  40 + title: '收款单位',
  41 + dataIndex: 'payee',
  42 + valueType: 'text',
  43 + },
  44 + {
  45 + title: '联系人',
  46 + dataIndex: 'contacts',
  47 + valueType: 'text',
  48 + },
  49 + {
  50 + title: '销售',
  51 + dataIndex: 'sale',
  52 + valueType: 'text',
  53 + },
  54 + {
  55 + title: '金额',
  56 + dataIndex: 'money',
  57 + valueType: 'money',
  58 + },
  59 + {
  60 + title: '开票日期',
  61 + dataIndex: 'invoicingTime',
  62 + valueType: 'date',
  63 + },
  64 + {
  65 + title: '收款时间',
  66 + dataIndex: 'collectionTime',
  67 + valueType: 'dateTime',
  68 + },
  69 + {
  70 + title: '操作',
  71 + valueType: 'option',
  72 + key: 'option',
  73 + render: (text, record, _, action) => [
  74 + <a
  75 + key="editable"
  76 + onClick={() => {
  77 + action?.startEditable?.(record.id);
  78 + }}
  79 + >
  80 + 编辑
  81 + </a>,
  82 + <a href={record.url} target="_blank" rel="noopener noreferrer" key="view">
  83 + 查看
  84 + </a>,
  85 + <TableDropdown
  86 + key="actionGroup"
  87 + onSelect={() => action?.reload()}
  88 + menus={[
  89 + { key: 'copy', name: '复制' },
  90 + { key: 'delete', name: '删除' },
  91 + ]}
  92 + />,
  93 + ],
  94 + },
  95 +];
... ...
src/pages/Invoice/index.tsx 0 → 100644
  1 +import { INVOICE_COLUMNS, InvoiceItem } from '@/pages/Invoice/constant';
  2 +import { postServiceInvoiceQueryInvoice } from '@/services';
  3 +import { getUserInfo } from '@/utils/user';
  4 +import { EllipsisOutlined, PlusOutlined } from '@ant-design/icons';
  5 +import {
  6 + ActionType,
  7 + PageContainer,
  8 + ProTable,
  9 +} from '@ant-design/pro-components';
  10 +import { history } from '@umijs/max';
  11 +import { Avatar, Button, Dropdown, Tag } from 'antd';
  12 +import { useRef } from 'react';
  13 +
  14 +const userInfo = getUserInfo();
  15 +const InvoicePage = () => {
  16 + const actionRef = useRef<ActionType>();
  17 + return (
  18 + <>
  19 + <PageContainer
  20 + header={{
  21 + title: '发票管理',
  22 + extra: [
  23 + <Avatar key="0" style={{ verticalAlign: 'middle' }} size="large">
  24 + {userInfo?.username}
  25 + </Avatar>,
  26 + <Tag key="nickName">{userInfo?.nickName}</Tag>,
  27 + <Dropdown
  28 + key="dropdown"
  29 + trigger={['click']}
  30 + menu={{
  31 + items: [
  32 + {
  33 + label: '退出登录',
  34 + key: '1',
  35 + onClick: () => {
  36 + localStorage.removeItem('token');
  37 + history.push('/login');
  38 + },
  39 + },
  40 + // {
  41 + // label: '修改密码',
  42 + // key: '2',
  43 + // },
  44 + ],
  45 + }}
  46 + >
  47 + <Button key="4" style={{ padding: '0 8px' }}>
  48 + <EllipsisOutlined />
  49 + </Button>
  50 + </Dropdown>,
  51 + ],
  52 + }}
  53 + >
  54 + <ProTable<InvoiceItem>
  55 + columns={INVOICE_COLUMNS}
  56 + actionRef={actionRef}
  57 + cardBordered
  58 + request={async (params) => {
  59 + const res = await postServiceInvoiceQueryInvoice({
  60 + data: { ...params },
  61 + });
  62 + if (res) {
  63 + return {
  64 + data: res?.data?.data || [],
  65 + total: res?.data?.total || 0,
  66 + };
  67 + }
  68 + }}
  69 + columnsState={{
  70 + persistenceKey: 'pro-table-singe-demos',
  71 + persistenceType: 'localStorage',
  72 + defaultValue: {
  73 + option: { fixed: 'right', disable: true },
  74 + },
  75 + onChange(value) {
  76 + console.log('value: ', value);
  77 + },
  78 + }}
  79 + rowKey="id"
  80 + search={{
  81 + labelWidth: 'auto',
  82 + }}
  83 + options={{
  84 + setting: {
  85 + listsHeight: 400,
  86 + },
  87 + }}
  88 + form={{
  89 + // 由于配置了 transform,提交的参与与定义的不同这里需要转化一下
  90 + syncToUrl: (values, type) => {
  91 + if (type === 'get') {
  92 + return {
  93 + ...values,
  94 + created_at: [values.startTime, values.endTime],
  95 + };
  96 + }
  97 + return values;
  98 + },
  99 + }}
  100 + pagination={{
  101 + pageSize: 5,
  102 + onChange: (page) => console.log(page),
  103 + }}
  104 + dateFormatter="string"
  105 + headerTitle="发票列表"
  106 + toolBarRender={() => [
  107 + <Button
  108 + key="button"
  109 + icon={<PlusOutlined />}
  110 + onClick={() => {
  111 + actionRef.current?.reload();
  112 + }}
  113 + type="primary"
  114 + >
  115 + 新建
  116 + </Button>,
  117 + ]}
  118 + />
  119 + </PageContainer>
  120 + </>
  121 + );
  122 +};
  123 +
  124 +export default InvoicePage;
... ...
src/pages/Order/components/FinancialDrawer.tsx
... ... @@ -12,9 +12,10 @@ import {
12 12 ProFormText,
13 13 ProFormTextArea,
14 14 } from '@ant-design/pro-components';
  15 +import { ProFormDigit } from '@ant-design/pro-form';
15 16 import { Form, message } from 'antd';
16 17 import { useEffect, useState } from 'react';
17   -import { INVOCING_STATUS_OPTIONS_OLD } from '../constant';
  18 +import { INVOCING_STATUS_OPTIONS_OLD, PAYEE_OPTIONS } from '../constant';
18 19  
19 20 export default ({
20 21 mainOrder,
... ... @@ -55,20 +56,13 @@ export default ({
55 56 destroyOnClose: true,
56 57 }}
57 58 submitTimeout={2000}
58   - onFinish={async () => {
  59 + onFinish={async (values) => {
  60 + console.log(values);
59 61 let res;
60   - let body = {
61   - invoicingTime: form.getFieldValue('invoicingTime'),
62   - subIds: subIds,
63   - collectMoneyTime: form.getFieldValue('collectMoneyTime'),
64   - invoicingNotes: form.getFieldValue('invoicingNotes'),
65   - invoicingStatus: form.getFieldValue('invoicingStatus'),
66   - mainorderOrSubOrderInvoicing: isMainOrder,
67   - afterInvoicingStatus: form.getFieldValue('afterInvoicingStatus'),
68   - financialReceiptIssuanceTime: form.getFieldValue(
69   - 'financialReceiptIssuanceTime',
70   - ),
71   - };
  62 + let body = values;
  63 + body.subIds = subIds;
  64 + body.mainOrderId = mainOrder.id;
  65 + body.mainorderOrSubOrderInvoicing = isMainOrder;
72 66 if (isEdit) {
73 67 res = await postServiceOrderEditOrder({ data: body });
74 68 } else {
... ... @@ -148,6 +142,31 @@ export default ({
148 142 label="收款时间"
149 143 initialValue={subOrders[0]?.collectMoneyTime}
150 144 />,
  145 + <ProFormText
  146 + width="lg"
  147 + key="invoiceNumber"
  148 + name="invoiceNumber"
  149 + label="发票号码"
  150 + initialValue={subOrders[0]?.invoiceNumber}
  151 + />,
  152 + <ProFormSelect
  153 + key="payee"
  154 + placeholder="选择收款单位"
  155 + name="payee"
  156 + width="lg"
  157 + label="收款单位"
  158 + options={enumToSelect(PAYEE_OPTIONS)}
  159 + initialValue={subOrders[0]?.payee}
  160 + rules={[{ required: true, message: '收款单位必填' }]}
  161 + />,
  162 +
  163 + <ProFormDigit
  164 + key="money"
  165 + name="money"
  166 + width="lg"
  167 + label="金额"
  168 + rules={[{ required: true, message: '金额必填' }]}
  169 + />,
151 170 ]
152 171 : ''}
153 172  
... ...
src/pages/Order/constant.ts
... ... @@ -42,6 +42,20 @@ export const INVOCING_STATUS_OPTIONS_OLD = {
42 42 INVOICED: '需要开票',
43 43 };
44 44  
  45 +export const PAYEE_OPTIONS = {
  46 + ZHUGUANG_PUBLIC_ACCOUNT: '烛光公账',
  47 + EXPERIMENT_PUBLIC_ACCOUNT: '实验公账',
  48 + NEW_ENERGY_PUBLIC_ACCOUNT: '新能源公账',
  49 + INNOVATION_PUBLIC_ACCOUNT: '创新公账',
  50 + JIANTU_PUBLIC_ACCOUNT: '坚途公账',
  51 + KNOWLEDGE_PUBLIC_ACCOUNT: '知识公账',
  52 + ZHUGUANG_ACCEPTANCE_DRAFT: '烛光承兑汇票',
  53 + LIUPING_ACCOUNT: '刘平账户',
  54 + INNOVATION_ALIPAY: '创新支付宝',
  55 + ZHUGUANG_ALIPAY: '烛光支付宝',
  56 + ZHUGUANG_WISE_COLLECTION: '烛光慧收款',
  57 +};
  58 +
45 59 export const PROCURE_ORDER_STATUS = {
46 60 PROCUREMENT_HAS_BEEN_ORDERED: '已下单',
47 61 PROCURE_NOT_ORDERED: '未下单',
... ...
src/services/definition.ts
... ... @@ -692,24 +692,6 @@ export interface OrderUpdateVO {
692 692 trackStageInfo?: OrderTrackStageVO;
693 693 }
694 694  
695   -export interface ProcureCheckOrderDto {
696   - /**
697   - * @description
698   - * 子订单集合
699   - */
700   - ids?: Array<number>;
701   - /**
702   - * @description
703   - * true表示采购走打印发货流程,false表示选择供应商进行发货
704   - */
705   - procureIsPrintAndSend?: boolean;
706   - /**
707   - * @description
708   - * 供应商姓名
709   - */
710   - supplier?: string;
711   -}
712   -
713 695 export interface ProcureConvertProcureDto {
714 696 /**
715 697 * @description
... ... @@ -728,19 +710,6 @@ export interface ProcureConvertProcureDto {
728 710 subIds?: Array<number>;
729 711 }
730 712  
731   -export interface ProcureConvertWarehouseKeeperDto {
732   - /**
733   - * @description
734   - * 审核备注
735   - */
736   - checkNotes?: string;
737   - /**
738   - * @description
739   - * 子订单id集合
740   - */
741   - subIds?: Array<number>;
742   -}
743   -
744 713 export interface ProcureOrderDto {
745 714 /**
746 715 * @description
... ... @@ -929,28 +898,9 @@ export interface View {
929 898 export interface Dto {
930 899 /**
931 900 * @description
932   - * 发起开票后的开票状态
933   - */
934   - afterInvoicingStatus?: string;
935   - /**
936   - * @description
937   - * 收款时间
938   - * @format date-time
939   - * @example
940   - * 2023-11-12 16:12
941   - */
942   - collectMoneyTime?: string;
943   - /**
944   - * @description
945   - * 采购开收据时间
946   - * @format date-time
947   - */
948   - financialReceiptIssuanceTime?: string;
949   - /**
950   - * @description
951   - * 财务备注
  901 + * 审核备注
952 902 */
953   - invoicingNotes?: string;
  903 + checkNotes?: string;
954 904 /**
955 905 * @description
956 906 * 子订单id集合
... ...
src/services/request.ts
... ... @@ -26,6 +26,7 @@ import type {
26 26 DictionaryQueryVO,
27 27 DictionaryVO,
28 28 Dto,
  29 + ModelAndView,
29 30 OrderAddVO,
30 31 OrderAuditLogQueryVO,
31 32 OrderBaseInfoQueryVO,
... ... @@ -34,9 +35,7 @@ import type {
34 35 OrderProfitAnalysisVo,
35 36 OrderUnlockFieldApplyVO,
36 37 OrderUpdateVO,
37   - ProcureCheckOrderDto,
38 38 ProcureConvertProcureDto,
39   - ProcureConvertWarehouseKeeperDto,
40 39 ProcureOrderDto,
41 40 ProcurePrintDto,
42 41 ProductInformationDto,
... ... @@ -228,9 +227,7 @@ export interface GetErrorResponse {
228 227 * @description
229 228 * OK
230 229 */
231   - 200: {
232   - [propertyName: string]: any;
233   - };
  230 + 200: ModelAndView;
234 231 /**
235 232 * @description
236 233 * Unauthorized
... ... @@ -251,9 +248,9 @@ export interface GetErrorResponse {
251 248 export type GetErrorResponseSuccess = GetErrorResponse[200];
252 249 /**
253 250 * @description
254   - * error
  251 + * errorHtml
255 252 * @tags basic-error-controller
256   - * @produces *
  253 + * @produces text/html
257 254 */
258 255 export const getError = /* #__PURE__ */ (() => {
259 256 const method = 'get';
... ... @@ -277,9 +274,7 @@ export interface PutErrorResponse {
277 274 * @description
278 275 * OK
279 276 */
280   - 200: {
281   - [propertyName: string]: any;
282   - };
  277 + 200: ModelAndView;
283 278 /**
284 279 * @description
285 280 * Created
... ... @@ -305,9 +300,9 @@ export interface PutErrorResponse {
305 300 export type PutErrorResponseSuccess = PutErrorResponse[200];
306 301 /**
307 302 * @description
308   - * error
  303 + * errorHtml
309 304 * @tags basic-error-controller
310   - * @produces *
  305 + * @produces text/html
311 306 * @consumes application/json
312 307 */
313 308 export const putError = /* #__PURE__ */ (() => {
... ... @@ -332,9 +327,7 @@ export interface PostErrorResponse {
332 327 * @description
333 328 * OK
334 329 */
335   - 200: {
336   - [propertyName: string]: any;
337   - };
  330 + 200: ModelAndView;
338 331 /**
339 332 * @description
340 333 * Created
... ... @@ -360,9 +353,9 @@ export interface PostErrorResponse {
360 353 export type PostErrorResponseSuccess = PostErrorResponse[200];
361 354 /**
362 355 * @description
363   - * error
  356 + * errorHtml
364 357 * @tags basic-error-controller
365   - * @produces *
  358 + * @produces text/html
366 359 * @consumes application/json
367 360 */
368 361 export const postError = /* #__PURE__ */ (() => {
... ... @@ -387,9 +380,7 @@ export interface DeleteErrorResponse {
387 380 * @description
388 381 * OK
389 382 */
390   - 200: {
391   - [propertyName: string]: any;
392   - };
  383 + 200: ModelAndView;
393 384 /**
394 385 * @description
395 386 * No Content
... ... @@ -410,9 +401,9 @@ export interface DeleteErrorResponse {
410 401 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
411 402 /**
412 403 * @description
413   - * error
  404 + * errorHtml
414 405 * @tags basic-error-controller
415   - * @produces *
  406 + * @produces text/html
416 407 */
417 408 export const deleteError = /* #__PURE__ */ (() => {
418 409 const method = 'delete';
... ... @@ -436,9 +427,7 @@ export interface OptionsErrorResponse {
436 427 * @description
437 428 * OK
438 429 */
439   - 200: {
440   - [propertyName: string]: any;
441   - };
  430 + 200: ModelAndView;
442 431 /**
443 432 * @description
444 433 * No Content
... ... @@ -459,9 +448,9 @@ export interface OptionsErrorResponse {
459 448 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
460 449 /**
461 450 * @description
462   - * error
  451 + * errorHtml
463 452 * @tags basic-error-controller
464   - * @produces *
  453 + * @produces text/html
465 454 * @consumes application/json
466 455 */
467 456 export const optionsError = /* #__PURE__ */ (() => {
... ... @@ -486,9 +475,7 @@ export interface HeadErrorResponse {
486 475 * @description
487 476 * OK
488 477 */
489   - 200: {
490   - [propertyName: string]: any;
491   - };
  478 + 200: ModelAndView;
492 479 /**
493 480 * @description
494 481 * No Content
... ... @@ -509,9 +496,9 @@ export interface HeadErrorResponse {
509 496 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
510 497 /**
511 498 * @description
512   - * error
  499 + * errorHtml
513 500 * @tags basic-error-controller
514   - * @produces *
  501 + * @produces text/html
515 502 * @consumes application/json
516 503 */
517 504 export const headError = /* #__PURE__ */ (() => {
... ... @@ -536,9 +523,7 @@ export interface PatchErrorResponse {
536 523 * @description
537 524 * OK
538 525 */
539   - 200: {
540   - [propertyName: string]: any;
541   - };
  526 + 200: ModelAndView;
542 527 /**
543 528 * @description
544 529 * No Content
... ... @@ -559,9 +544,9 @@ export interface PatchErrorResponse {
559 544 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
560 545 /**
561 546 * @description
562   - * error
  547 + * errorHtml
563 548 * @tags basic-error-controller
564   - * @produces *
  549 + * @produces text/html
565 550 * @consumes application/json
566 551 */
567 552 export const patchError = /* #__PURE__ */ (() => {
... ... @@ -4790,6 +4775,77 @@ export const postOrderErpUsersUpdatePass = /* #__PURE__ */ (() =&gt; {
4790 4775 return request;
4791 4776 })();
4792 4777  
  4778 +/** @description request parameter type for postServiceInvoiceQueryInvoice */
  4779 +export interface PostServiceInvoiceQueryInvoiceOption {
  4780 + /**
  4781 + * @description
  4782 + * dto
  4783 + */
  4784 + body: {
  4785 + /**
  4786 + @description
  4787 + dto */
  4788 + dto: Dto;
  4789 + };
  4790 +}
  4791 +
  4792 +/** @description response type for postServiceInvoiceQueryInvoice */
  4793 +export interface PostServiceInvoiceQueryInvoiceResponse {
  4794 + /**
  4795 + * @description
  4796 + * OK
  4797 + */
  4798 + 200: ServerResult;
  4799 + /**
  4800 + * @description
  4801 + * Created
  4802 + */
  4803 + 201: any;
  4804 + /**
  4805 + * @description
  4806 + * Unauthorized
  4807 + */
  4808 + 401: any;
  4809 + /**
  4810 + * @description
  4811 + * Forbidden
  4812 + */
  4813 + 403: any;
  4814 + /**
  4815 + * @description
  4816 + * Not Found
  4817 + */
  4818 + 404: any;
  4819 +}
  4820 +
  4821 +export type PostServiceInvoiceQueryInvoiceResponseSuccess =
  4822 + PostServiceInvoiceQueryInvoiceResponse[200];
  4823 +/**
  4824 + * @description
  4825 + * 发票页查询
  4826 + * @tags 发票
  4827 + * @produces *
  4828 + * @consumes application/json
  4829 + */
  4830 +export const postServiceInvoiceQueryInvoice = /* #__PURE__ */ (() => {
  4831 + const method = 'post';
  4832 + const url = '/service/invoice/queryInvoice';
  4833 + function request(
  4834 + option: PostServiceInvoiceQueryInvoiceOption,
  4835 + ): Promise<PostServiceInvoiceQueryInvoiceResponseSuccess> {
  4836 + return requester(request.url, {
  4837 + method: request.method,
  4838 + ...option,
  4839 + }) as unknown as Promise<PostServiceInvoiceQueryInvoiceResponseSuccess>;
  4840 + }
  4841 +
  4842 + /** http method */
  4843 + request.method = method;
  4844 + /** request url */
  4845 + request.url = url;
  4846 + return request;
  4847 +})();
  4848 +
4793 4849 /** @description request parameter type for postServiceOrderAddOrder */
4794 4850 export interface PostServiceOrderAddOrderOption {
4795 4851 /**
... ... @@ -6290,7 +6346,7 @@ export interface PostServiceOrderProcureCheckOrderOption {
6290 6346 /**
6291 6347 @description
6292 6348 dto */
6293   - dto: ProcureCheckOrderDto;
  6349 + dto: Dto;
6294 6350 };
6295 6351 }
6296 6352  
... ... @@ -6432,7 +6488,7 @@ export interface PostServiceOrderProcureConvertWarehouseKeeperOption {
6432 6488 /**
6433 6489 @description
6434 6490 dto */
6435   - dto: ProcureConvertWarehouseKeeperDto;
  6491 + dto: Dto;
6436 6492 };
6437 6493 }
6438 6494  
... ...