Commit 533125578465ffd668f3116600dee6162fe16bf2

Authored by 曾国涛
1 parent 49568dac

feat(Invoice): 为表格添加行选择功能并优化相关模型- 在 enum.ts 中添加了新的服务常量

- 在 InvoiceRecord 组件中实现了行选择功能- 添加了 ReissueModal 组件用于处理选中行的重新发行操作
- 优化了 waitProcessRecord 组件的代码结构
.umirc.ts
@@ -104,6 +104,12 @@ export default defineConfig({ @@ -104,6 +104,12 @@ export default defineConfig({
104 component: './Invoice/InvoiceVerification', 104 component: './Invoice/InvoiceVerification',
105 }, 105 },
106 { 106 {
  107 + name: '重开发票记录',
  108 + path: 'reissueRecord',
  109 + icon: 'BookOutlined',
  110 + component: './Invoice/ReissueRecord',
  111 + },
  112 + {
107 name: '手动开票白名单', 113 name: '手动开票白名单',
108 path: 'OldInvoicingWhiteList', 114 path: 'OldInvoicingWhiteList',
109 icon: 'BookOutlined', 115 icon: 'BookOutlined',
src/models/enum.ts
1 -import { postServiceConstPayees } from '@/services'; 1 +import {
  2 + postServiceConstInvoiceFlushStatus,
  3 + postServiceConstInvoiceReissueRecordStatus,
  4 + postServiceConstPayees,
  5 +} from '@/services';
2 import { useCallback } from 'react'; 6 import { useCallback } from 'react';
3 7
4 export default () => { 8 export default () => {
@@ -6,5 +10,13 @@ export default () => { @@ -6,5 +10,13 @@ export default () => {
6 const result = await postServiceConstPayees(); 10 const result = await postServiceConstPayees();
7 return result.data; 11 return result.data;
8 }, []); 12 }, []);
9 - return { getPayees }; 13 + const getInvoiceReissueRecordStatus = useCallback(async () => {
  14 + const result = await postServiceConstInvoiceReissueRecordStatus();
  15 + return result.data;
  16 + }, []);
  17 + const getInvoiceFlushStatus = useCallback(async () => {
  18 + const result = await postServiceConstInvoiceFlushStatus();
  19 + return result.data;
  20 + }, []);
  21 + return { getPayees, getInvoiceReissueRecordStatus, getInvoiceFlushStatus };
10 }; 22 };
src/pages/Invoice/Invoice/components/ReissueModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postServiceInvoiceReissueInvoices } from '@/services';
  3 +import { ModalForm, ProFormTextArea } from '@ant-design/pro-components';
  4 +import { Button, Form, message } from 'antd';
  5 +
  6 +export default ({ invoiceIds, onClose }) => {
  7 + const [form] = Form.useForm<{ name: string; company: string }>();
  8 + return (
  9 + <ModalForm<{
  10 + name: string;
  11 + company: string;
  12 + }>
  13 + title="重新开票"
  14 + trigger={<Button type="primary">重新开票</Button>}
  15 + form={form}
  16 + autoFocusFirstInput
  17 + modalProps={{
  18 + destroyOnClose: true,
  19 + onCancel: () => console.log('run'),
  20 + }}
  21 + submitTimeout={2000}
  22 + onFinish={async (values) => {
  23 + const res = await postServiceInvoiceReissueInvoices({
  24 + data: {
  25 + invoiceIds,
  26 + ...values,
  27 + },
  28 + });
  29 + if (res.result === RESPONSE_CODE.SUCCESS) {
  30 + message.success('重新开票');
  31 + return true;
  32 + }
  33 + }}
  34 + onOpenChange={(visible) => {
  35 + if (!visible) {
  36 + onClose();
  37 + }
  38 + }}
  39 + >
  40 + <ProFormTextArea
  41 + name="notes"
  42 + label="重开原因"
  43 + rules={[{ required: true, message: '重开原因必填' }]}
  44 + placeholder="请输入重新开票的原因"
  45 + />
  46 + </ModalForm>
  47 + );
  48 +};
src/pages/Invoice/Invoice/index.tsx
@@ -3,6 +3,7 @@ import EllipsisDiv from &#39;@/components/Div/EllipsisDiv&#39;; @@ -3,6 +3,7 @@ import EllipsisDiv from &#39;@/components/Div/EllipsisDiv&#39;;
3 import AddInvoiceDrawerForm from '@/pages/Invoice/Invoice/components/AddInvoiceDrawerForm'; 3 import AddInvoiceDrawerForm from '@/pages/Invoice/Invoice/components/AddInvoiceDrawerForm';
4 import BankImportModal from '@/pages/Invoice/Invoice/components/BankImportModal'; 4 import BankImportModal from '@/pages/Invoice/Invoice/components/BankImportModal';
5 import InvoiceVerificationModal from '@/pages/Invoice/Invoice/components/InvoiceVerificationModal'; 5 import InvoiceVerificationModal from '@/pages/Invoice/Invoice/components/InvoiceVerificationModal';
  6 +import ReissueModal from '@/pages/Invoice/Invoice/components/ReissueModal';
6 import InvoiceWriteOffModal from '@/pages/Invoice/Invoice/components/invoiceWriteOffModal'; 7 import InvoiceWriteOffModal from '@/pages/Invoice/Invoice/components/invoiceWriteOffModal';
7 import { INVOICE_COLUMNS } from '@/pages/Invoice/constant'; 8 import { INVOICE_COLUMNS } from '@/pages/Invoice/constant';
8 import { INVOCING_STATUS, PAYEE_OPTIONS } from '@/pages/Order/constant'; 9 import { INVOCING_STATUS, PAYEE_OPTIONS } from '@/pages/Order/constant';
@@ -17,9 +18,8 @@ import { downloadFile } from &#39;@/services/order&#39;; @@ -17,9 +18,8 @@ import { downloadFile } from &#39;@/services/order&#39;;
17 import { enumValueToLabel, formatDateTime } from '@/utils'; 18 import { enumValueToLabel, formatDateTime } from '@/utils';
18 import { formatDate } from '@/utils/time'; 19 import { formatDate } from '@/utils/time';
19 import { ActionType, ProTable } from '@ant-design/pro-components'; 20 import { ActionType, ProTable } from '@ant-design/pro-components';
20 -import { Button, message } from 'antd'; 21 +import { Button, Space, Table, message } from 'antd';
21 import { useRef, useState } from 'react'; 22 import { useRef, useState } from 'react';
22 -  
23 const InvoiceRecord = () => { 23 const InvoiceRecord = () => {
24 const invoiceActionRef = useRef<ActionType>(); 24 const invoiceActionRef = useRef<ActionType>();
25 const [bankImportModalVisible, setBankImportModalVisible] = useState(false); 25 const [bankImportModalVisible, setBankImportModalVisible] = useState(false);
@@ -229,6 +229,37 @@ const InvoiceRecord = () =&gt; { @@ -229,6 +229,37 @@ const InvoiceRecord = () =&gt; {
229 pagination={{ 229 pagination={{
230 pageSizeOptions: ['10', '20', '50', '100'], 230 pageSizeOptions: ['10', '20', '50', '100'],
231 }} 231 }}
  232 + rowSelection={{
  233 + // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  234 + // 注释该行则默认不显示下拉选项
  235 + selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
  236 + }}
  237 + tableAlertRender={({ selectedRowKeys, onCleanSelected }) => {
  238 + return (
  239 + <Space size={24}>
  240 + <span>
  241 + 已选 {selectedRowKeys.length} 项
  242 + <a style={{ marginInlineStart: 8 }} onClick={onCleanSelected}>
  243 + 取消选择
  244 + </a>
  245 + </span>
  246 + </Space>
  247 + );
  248 + }}
  249 + tableAlertOptionRender={({ selectedRowKeys, onCleanSelected }) => {
  250 + console.log('selected' + JSON.stringify(selectedRowKeys));
  251 + return (
  252 + <Space size={16}>
  253 + <ReissueModal
  254 + invoiceIds={selectedRowKeys}
  255 + onClose={() => {
  256 + invoiceActionRef.current?.reload();
  257 + onCleanSelected();
  258 + }}
  259 + />
  260 + </Space>
  261 + );
  262 + }}
232 request={async (params) => { 263 request={async (params) => {
233 const res = await postServiceInvoiceQueryInvoice({ 264 const res = await postServiceInvoiceQueryInvoice({
234 data: { ...params }, 265 data: { ...params },
src/pages/Invoice/ReissueRecord/components/Audit.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postServiceInvoiceReissueAudit } from '@/services';
  3 +import { ModalForm, ProFormText } from '@ant-design/pro-components';
  4 +import { Button, Form, message } from 'antd';
  5 +
  6 +export default (recordId) => {
  7 + const [form] = Form.useForm<{ name: string; company: string }>();
  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 + submitter={{
  20 + searchConfig: {
  21 + submitText: '通过',
  22 + resetText: '取消',
  23 + },
  24 + render: (props, defaultDoms) => {
  25 + console.log('props', JSON.stringify(form.setFieldsValue));
  26 + return [
  27 + ...defaultDoms,
  28 + <Button
  29 + key="ok"
  30 + onClick={async () => {
  31 + const res = await postServiceInvoiceReissueAudit({
  32 + body: {
  33 + //...values,
  34 + ...form.setFieldsValue,
  35 + recordId,
  36 + },
  37 + });
  38 + if (res.result === RESPONSE_CODE.SUCCESS) {
  39 + message.success('提交成功');
  40 + return true;
  41 + }
  42 + return false;
  43 + }}
  44 + >
  45 + ok
  46 + </Button>,
  47 + ];
  48 + },
  49 + }}
  50 + onFinish={async (values) => {
  51 + const res = await postServiceInvoiceReissueAudit({
  52 + body: {
  53 + ...values,
  54 + recordId,
  55 + },
  56 + });
  57 + if (res.result === RESPONSE_CODE.SUCCESS) {
  58 + message.success('提交成功');
  59 + return true;
  60 + }
  61 + return false;
  62 + }}
  63 + >
  64 + <ProFormText width="xs" name="notes" label="备注" />
  65 + </ModalForm>
  66 + );
  67 +};
src/pages/Invoice/ReissueRecord/index.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import Audit from '@/pages/Invoice/ReissueRecord/components/Audit';
  3 +import {
  4 + postServiceConstBeforeInvoicingInvoiceRecordStatus,
  5 + postServiceInvoiceReissueRecords,
  6 +} from '@/services';
  7 +import { enumToSelect } from '@/utils';
  8 +import { useModel } from '@@/exports';
  9 +import type { ActionType, ProColumns } from '@ant-design/pro-components';
  10 +import { ProTable, TableDropdown } from '@ant-design/pro-components';
  11 +import { useRef } from 'react';
  12 +
  13 +export const waitTimePromise = async (time: number = 100) => {
  14 + return new Promise((resolve) => {
  15 + setTimeout(() => {
  16 + resolve(true);
  17 + }, time);
  18 + });
  19 +};
  20 +
  21 +export const waitTime = async (time: number = 100) => {
  22 + await waitTimePromise(time);
  23 +};
  24 +
  25 +type GithubIssueItem = {
  26 + url: string;
  27 + id: number;
  28 + number: number;
  29 + title: string;
  30 + labels: {
  31 + name: string;
  32 + color: string;
  33 + }[];
  34 + state: string;
  35 + comments: number;
  36 + created_at: string;
  37 + updated_at: string;
  38 + closed_at?: string;
  39 +};
  40 +
  41 +export default () => {
  42 + const actionRef = useRef<ActionType>();
  43 + const { getInvoiceFlushStatus } = useModel('enum');
  44 + const columns: ProColumns<GithubIssueItem>[] = [
  45 + {
  46 + dataIndex: 'index',
  47 + valueType: 'indexBorder',
  48 + width: 48,
  49 + },
  50 + {
  51 + title: '重开的发票',
  52 + dataIndex: 'invoiceNumbers',
  53 + render: (_, record) => {
  54 + return record.invoiceNumbers?.join(',');
  55 + },
  56 + hideInSearch: true,
  57 + },
  58 + {
  59 + title: '重开原因',
  60 + dataIndex: 'notes',
  61 + ellipsis: true,
  62 + hideInSearch: true,
  63 + },
  64 + {
  65 + title: '申请人',
  66 + dataIndex: 'createByName',
  67 + ellipsis: true,
  68 + hideInSearch: true,
  69 + },
  70 + {
  71 + title: '申请时间',
  72 + dataIndex: 'createTime',
  73 + ellipsis: true,
  74 + hideInSearch: true,
  75 + },
  76 + {
  77 + title: '审核状态',
  78 + dataIndex: 'statusText',
  79 + ellipsis: true,
  80 + hideInSearch: true,
  81 + },
  82 + {
  83 + title: '冲红状态',
  84 + dataIndex: 'flushStatusText',
  85 + ellipsis: true,
  86 + hideInSearch: true,
  87 + },
  88 + {
  89 + title: '财务负责人',
  90 + dataIndex: 'financeManager',
  91 + ellipsis: true,
  92 + hideInSearch: true,
  93 + },
  94 + {
  95 + title: '冲红时间',
  96 + dataIndex: 'flushDatetime',
  97 + ellipsis: true,
  98 + hideInSearch: true,
  99 + },
  100 +
  101 + {
  102 + title: '发票号码',
  103 + dataIndex: 'invoiceNumber',
  104 + hideInTable: true,
  105 + },
  106 + {
  107 + title: '申请人',
  108 + dataIndex: 'createByName',
  109 + hideInTable: true,
  110 + },
  111 + {
  112 + title: '重开原因',
  113 + dataIndex: 'notes',
  114 + hideInTable: true,
  115 + },
  116 + {
  117 + title: '申请时间',
  118 + valueType: 'dateRange',
  119 + hideInTable: true,
  120 + search: {
  121 + transform: (value) => {
  122 + if (value) {
  123 + return {
  124 + createDatetimeGe: value[0],
  125 + createDatetimeLe: value[1],
  126 + };
  127 + }
  128 + },
  129 + },
  130 + },
  131 + {
  132 + title: '审核状态',
  133 + valueType: 'select',
  134 + key: 'status',
  135 + dataIndex: 'status',
  136 + filters: true,
  137 + onFilter: true,
  138 + hideInTable: true,
  139 + request: async () => {
  140 + const res = await postServiceConstBeforeInvoicingInvoiceRecordStatus();
  141 + return enumToSelect(res.data);
  142 + },
  143 + },
  144 + {
  145 + title: '冲红状态',
  146 + valueType: 'select',
  147 + key: 'flushStatus',
  148 + dataIndex: 'flushStatus',
  149 + filters: true,
  150 + onFilter: true,
  151 + hideInTable: true,
  152 + request: async () => {
  153 + const res = await getInvoiceFlushStatus();
  154 + return enumToSelect(res);
  155 + },
  156 + },
  157 + {
  158 + title: '财务负责人',
  159 + dataIndex: 'financeManager',
  160 + ellipsis: true,
  161 + hideInTable: true,
  162 + },
  163 + {
  164 + title: '冲红时间',
  165 + valueType: 'dateRange',
  166 + hideInTable: true,
  167 + search: {
  168 + transform: (value) => {
  169 + if (value) {
  170 + return {
  171 + flushDatetimeGe: value[0],
  172 + flushDatetimeLe: value[1],
  173 + };
  174 + }
  175 + },
  176 + },
  177 + },
  178 +
  179 + {
  180 + title: '操作',
  181 + valueType: 'option',
  182 + key: 'option',
  183 + render: (text, record, _, action) => [
  184 + <Audit key={'audit'} recordId={record.id} />,
  185 + <a
  186 + href={record.url}
  187 + target="_blank"
  188 + rel="noopener noreferrer"
  189 + key="view"
  190 + >
  191 + 查看
  192 + </a>,
  193 + <TableDropdown
  194 + key="actionGroup"
  195 + onSelect={() => action?.reload()}
  196 + menus={[
  197 + { key: 'copy', name: '复制' },
  198 + { key: 'delete', name: '删除' },
  199 + ]}
  200 + />,
  201 + ],
  202 + },
  203 + ];
  204 + return (
  205 + <ProTable<GithubIssueItem>
  206 + columns={columns}
  207 + actionRef={actionRef}
  208 + cardBordered
  209 + request={async (params) => {
  210 + const res = await postServiceInvoiceReissueRecords({
  211 + data: {
  212 + ...params,
  213 + },
  214 + });
  215 + if (res.result === RESPONSE_CODE.SUCCESS) {
  216 + return {
  217 + data: res?.data?.data,
  218 + total: res?.data?.total || 0,
  219 + };
  220 + }
  221 + return {
  222 + data: [],
  223 + success: false,
  224 + };
  225 + }}
  226 + editable={{
  227 + type: 'multiple',
  228 + }}
  229 + columnsState={{
  230 + persistenceKey: 'pro-table-singe-demos',
  231 + persistenceType: 'localStorage',
  232 + defaultValue: {
  233 + option: { fixed: 'right', disable: true },
  234 + },
  235 + onChange(value) {
  236 + console.log('value: ', value);
  237 + },
  238 + }}
  239 + rowKey="id"
  240 + search={{
  241 + labelWidth: 'auto',
  242 + }}
  243 + options={{
  244 + setting: {
  245 + listsHeight: 400,
  246 + },
  247 + }}
  248 + form={{
  249 + // 由于配置了 transform,提交的参数与定义的不同这里需要转化一下
  250 + syncToUrl: (values, type) => {
  251 + if (type === 'get') {
  252 + return {
  253 + ...values,
  254 + created_at: [values.startTime, values.endTime],
  255 + };
  256 + }
  257 + return values;
  258 + },
  259 + }}
  260 + pagination={{
  261 + pageSize: 5,
  262 + onChange: (page) => console.log(page),
  263 + }}
  264 + dateFormatter="string"
  265 + headerTitle="高级表格"
  266 + />
  267 + );
  268 +};
src/pages/Invoice/waitProcessRecord/index.tsx
@@ -33,7 +33,6 @@ const InvoiceRecord = () =&gt; { @@ -33,7 +33,6 @@ const InvoiceRecord = () =&gt; {
33 const [invoiceRecordDetailVisible, setInvoiceRecordDetailVisible] = 33 const [invoiceRecordDetailVisible, setInvoiceRecordDetailVisible] =
34 useState(false); 34 useState(false);
35 const [invoiceRecord, setInvoiceRecord] = useState({}); 35 const [invoiceRecord, setInvoiceRecord] = useState({});
36 -  
37 useEffect(() => { 36 useEffect(() => {
38 async function extracted() { 37 async function extracted() {
39 let invoiceTypeRet = await postServiceConstInvoiceType(); 38 let invoiceTypeRet = await postServiceConstInvoiceType();
src/pages/Order/OrderList/InvoicingDrawerForm.tsx
@@ -31,7 +31,7 @@ import { @@ -31,7 +31,7 @@ import {
31 ProFormText, 31 ProFormText,
32 ProFormTextArea, 32 ProFormTextArea,
33 } from '@ant-design/pro-components'; 33 } from '@ant-design/pro-components';
34 -import { Button, Divider, Form, Space, Table, Tooltip, message } from 'antd'; 34 +import { Button, Divider, Form, Space, Tooltip, message } from 'antd';
35 import { useEffect, useRef, useState } from 'react'; 35 import { useEffect, useRef, useState } from 'react';
36 36
37 export default ({ 37 export default ({
@@ -88,6 +88,7 @@ export default ({ @@ -88,6 +88,7 @@ export default ({
88 subOrderIdsName: '开票订单', 88 subOrderIdsName: '开票订单',
89 }); 89 });
90 types.set('reissue', { title: '重新申请', subOrderIdsName: '重开订单' }); 90 types.set('reissue', { title: '重新申请', subOrderIdsName: '重开订单' });
  91 +
91 function copyToClipboard(text: string) { 92 function copyToClipboard(text: string) {
92 // 创建一个临时的textarea元素 93 // 创建一个临时的textarea元素
93 const textarea = document.createElement('textarea'); 94 const textarea = document.createElement('textarea');
@@ -110,6 +111,7 @@ export default ({ @@ -110,6 +111,7 @@ export default ({
110 document.body.removeChild(textarea); 111 document.body.removeChild(textarea);
111 } 112 }
112 } 113 }
  114 +
113 // 定义一个计算总金额的函数 115 // 定义一个计算总金额的函数
114 const calculateTotalPrice = (index: number) => { 116 const calculateTotalPrice = (index: number) => {
115 const invoiceDetails = form.getFieldValue('invoiceDetails'); 117 const invoiceDetails = form.getFieldValue('invoiceDetails');
@@ -141,44 +143,6 @@ export default ({ @@ -141,44 +143,6 @@ export default ({
141 drawerProps={{ 143 drawerProps={{
142 destroyOnClose: true, 144 destroyOnClose: true,
143 }} 145 }}
144 - rowSelection={{  
145 - // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom  
146 - // 注释该行则默认不显示下拉选项  
147 - selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],  
148 - }}  
149 - tableAlertRender={({  
150 - selectedRowKeys,  
151 - selectedRows,  
152 - onCleanSelected,  
153 - }) => {  
154 - console.log(selectedRowKeys, selectedRows);  
155 - return (  
156 - <Space size={24}>  
157 - <span>  
158 - 已选 {selectedRowKeys.length} 项  
159 - <a style={{ marginInlineStart: 8 }} onClick={onCleanSelected}>  
160 - 取消选择  
161 - </a>  
162 - </span>  
163 - <span>{`容器数量: ${selectedRows.reduce(  
164 - (pre, item) => pre + item.containers,  
165 - 0,  
166 - )} 个`}</span>  
167 - <span>{`调用量: ${selectedRows.reduce(  
168 - (pre, item) => pre + item.callNumber,  
169 - 0,  
170 - )} 次`}</span>  
171 - </Space>  
172 - );  
173 - }}  
174 - tableAlertOptionRender={() => {  
175 - return (  
176 - <Space size={16}>  
177 - <a>批量删除</a>  
178 - <a>导出数据</a>  
179 - </Space>  
180 - );  
181 - }}  
182 submitter={{ 146 submitter={{
183 render: (props, defaultDoms) => { 147 render: (props, defaultDoms) => {
184 return [ 148 return [
src/pages/Order/OrderList/OrderList.tsx
@@ -157,7 +157,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -157,7 +157,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
157 useState<boolean>(false); 157 useState<boolean>(false);
158 const [historyModalVisible, setHistoryModalVisible] = 158 const [historyModalVisible, setHistoryModalVisible] =
159 useState<boolean>(false); 159 useState<boolean>(false);
160 - const [invoicingType, setInvoicingType] = useState<string>('');  
161 const [isRePrintOrder, setIsRePrintOrder] = useState<boolean>(false); 160 const [isRePrintOrder, setIsRePrintOrder] = useState<boolean>(false);
162 const [isSendProduct, setIsSendProduct] = useState<boolean>(false); 161 const [isSendProduct, setIsSendProduct] = useState<boolean>(false);
163 const [isMainOrder, setIsMainOrder] = useState<boolean>(false); 162 const [isMainOrder, setIsMainOrder] = useState<boolean>(false);
@@ -1847,7 +1846,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -1847,7 +1846,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1847 className="p-0" 1846 className="p-0"
1848 type="link" 1847 type="link"
1849 onClick={() => { 1848 onClick={() => {
1850 - setInvoicingType('applyInvoicing');  
1851 setInvoicingDrawerFormVisible(true); 1849 setInvoicingDrawerFormVisible(true);
1852 createOptObject(optRecord.id, record.id); 1850 createOptObject(optRecord.id, record.id);
1853 setIsEdit(false); 1851 setIsEdit(false);
@@ -3478,7 +3476,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -3478,7 +3476,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3478 } 3476 }
3479 3477
3480 createOptObject(null, record.id); 3478 createOptObject(null, record.id);
3481 - setInvoicingType('applyInvoicing');  
3482 setInvoicingDrawerFormVisible(true); 3479 setInvoicingDrawerFormVisible(true);
3483 setIsEdit(false); 3480 setIsEdit(false);
3484 setIsMainOrder(false); 3481 setIsMainOrder(false);
@@ -3520,6 +3517,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -3520,6 +3517,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3520 ) { 3517 ) {
3521 //是审核通过及之后的订单 3518 //是审核通过及之后的订单
3522 if ( 3519 if (
  3520 + orderStatus !== 'UNAUDITED' &&
3523 orderStatus !== 'AUDIT_FAILED' && 3521 orderStatus !== 'AUDIT_FAILED' &&
3524 orderStatus !== 'LEADER_PROCESS' && 3522 orderStatus !== 'LEADER_PROCESS' &&
3525 orderStatus !== 'SALES_CONFIRM' && 3523 orderStatus !== 'SALES_CONFIRM' &&
@@ -4469,7 +4467,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -4469,7 +4467,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4469 onClick={() => { 4467 onClick={() => {
4470 setIsEdit(false); 4468 setIsEdit(false);
4471 setIsMainOrder(true); 4469 setIsMainOrder(true);
4472 - setInvoicingType('applyInvoicing');  
4473 setInvoicingDrawerFormVisible(true); 4470 setInvoicingDrawerFormVisible(true);
4474 }} 4471 }}
4475 disabled={selectedSubOrderKeys?.length === 0} 4472 disabled={selectedSubOrderKeys?.length === 0}
@@ -4533,7 +4530,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -4533,7 +4530,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4533 return; 4530 return;
4534 } 4531 }
4535 }); 4532 });
4536 - setInvoicingType('applyInvoicing');  
4537 //遍历afterInvoicingStatusList 4533 //遍历afterInvoicingStatusList
4538 setInvoicingDrawerFormVisible(true); 4534 setInvoicingDrawerFormVisible(true);
4539 }} 4535 }}
@@ -4541,19 +4537,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -4541,19 +4537,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4541 > 4537 >
4542 申请开票 4538 申请开票
4543 </Button>, 4539 </Button>,
4544 - <Button  
4545 - type="primary"  
4546 - key="inv"  
4547 - onClick={() => {  
4548 - setIsMainOrder(true);  
4549 - setInvoicingType('reissue');  
4550 - //遍历afterInvoicingStatusList  
4551 - setInvoicingDrawerFormVisible(true);  
4552 - }}  
4553 - disabled={selectedSubOrderKeys?.length === 0}  
4554 - >  
4555 - 重新开票  
4556 - </Button>,  
4557 ); 4540 );
4558 4541
4559 if (rolePath?.includes('addOrder')) { 4542 if (rolePath?.includes('addOrder')) {
@@ -5228,7 +5211,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -5228,7 +5211,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
5228 ? [...subOrderSelectedMap.values()].flat() 5211 ? [...subOrderSelectedMap.values()].flat()
5229 : buildSubOrders() 5212 : buildSubOrders()
5230 } 5213 }
5231 - type={invoicingType}  
5232 setVisible={(val: boolean) => { 5214 setVisible={(val: boolean) => {
5233 setInvoicingDrawerFormVisible(val); 5215 setInvoicingDrawerFormVisible(val);
5234 if (!val) { 5216 if (!val) {
src/services/definition.ts
@@ -753,6 +753,7 @@ export interface ApiQueryOrderStatusCountsRequest { @@ -753,6 +753,7 @@ export interface ApiQueryOrderStatusCountsRequest {
753 753
754 export interface ApplyInvoiceDTO { 754 export interface ApplyInvoiceDTO {
755 applyInvoicingNotes?: string; 755 applyInvoicingNotes?: string;
  756 + applyType?: string;
756 /** 757 /**
757 * @description 758 * @description
758 * 开票备注 759 * 开票备注
@@ -920,6 +921,7 @@ export interface ApplyInvoiceDTO { @@ -920,6 +921,7 @@ export interface ApplyInvoiceDTO {
920 receiveEmail?: string; 921 receiveEmail?: string;
921 reissueInvoiceNumbers?: Array<string>; 922 reissueInvoiceNumbers?: Array<string>;
922 reissueInvoiceRecordIds?: Array<number>; 923 reissueInvoiceRecordIds?: Array<number>;
  924 + reissueNotes?: string;
923 /** 925 /**
924 * @description 926 * @description
925 * 订单来源 927 * 订单来源
@@ -1471,6 +1473,7 @@ export interface Invoice { @@ -1471,6 +1473,7 @@ export interface Invoice {
1471 notes?: string; 1473 notes?: string;
1472 payee?: string; 1474 payee?: string;
1473 purchaser?: string; 1475 purchaser?: string;
  1476 + reissueStatus?: string;
1474 sale?: string; 1477 sale?: string;
1475 status?: string; 1478 status?: string;
1476 updateByName?: string; 1479 updateByName?: string;
@@ -2048,6 +2051,13 @@ export interface ItemSaItem { @@ -2048,6 +2051,13 @@ export interface ItemSaItem {
2048 itemValue?: string; 2051 itemValue?: string;
2049 } 2052 }
2050 2053
  2054 +export interface LittleTicketsDO {
  2055 + annexUrl?: string;
  2056 + assignPeople?: string;
  2057 + detailText?: string;
  2058 + type?: string;
  2059 +}
  2060 +
2051 export interface MainOrderqueryRequest { 2061 export interface MainOrderqueryRequest {
2052 afterInvoicingStatusIsNull?: boolean; 2062 afterInvoicingStatusIsNull?: boolean;
2053 /** @format date */ 2063 /** @format date */
@@ -4085,9 +4095,9 @@ export interface TicketsVo { @@ -4085,9 +4095,9 @@ export interface TicketsVo {
4085 origin?: string; 4095 origin?: string;
4086 result?: string; 4096 result?: string;
4087 resultAnnexName?: string; 4097 resultAnnexName?: string;
4088 - resultAnnexUrl?: string;  
4089 status?: string; 4098 status?: string;
4090 type?: string; 4099 type?: string;
  4100 + typeText?: string;
4091 } 4101 }
4092 4102
4093 export interface ToProcureAuditDto { 4103 export interface ToProcureAuditDto {
@@ -4318,6 +4328,11 @@ export interface UserListRequest { @@ -4318,6 +4328,11 @@ export interface UserListRequest {
4318 * 关键字 4328 * 关键字
4319 */ 4329 */
4320 keywords?: string; 4330 keywords?: string;
  4331 + /**
  4332 + * @description
  4333 + * 余额
  4334 + */
  4335 + nowMoneySearch?: string;
4321 /** @format int32 */ 4336 /** @format int32 */
4322 pageSize?: number; 4337 pageSize?: number;
4323 /** 4338 /**
@@ -4421,6 +4436,7 @@ export interface ApiOrderConfirmReceiveRequest { @@ -4421,6 +4436,7 @@ export interface ApiOrderConfirmReceiveRequest {
4421 } 4436 }
4422 4437
4423 export interface ClientCommunicationInfo { 4438 export interface ClientCommunicationInfo {
  4439 + annexUrl?: string;
4424 assignPeople?: string; 4440 assignPeople?: string;
4425 attachments?: string; 4441 attachments?: string;
4426 /** 4442 /**
@@ -4466,13 +4482,13 @@ export interface ClientCommunicationInfo { @@ -4466,13 +4482,13 @@ export interface ClientCommunicationInfo {
4466 * @format date-time 4482 * @format date-time
4467 */ 4483 */
4468 datetime?: string; 4484 datetime?: string;
  4485 + detailText?: string;
4469 /** @format int64 */ 4486 /** @format int64 */
4470 id?: number; 4487 id?: number;
  4488 + list?: Array<LittleTicketsDO>;
4471 logicDelete?: boolean; 4489 logicDelete?: boolean;
4472 - ticketsAttachments?: string;  
4473 - ticketsDetail?: string; 4490 + ticketsList?: Array<TicketsVo>;
4474 ticketsStatus?: string; 4491 ticketsStatus?: string;
4475 - ticketsType?: string;  
4476 ticketsTypeText?: string; 4492 ticketsTypeText?: string;
4477 /** 4493 /**
4478 * @description 4494 * @description
@@ -4484,6 +4500,7 @@ export interface ClientCommunicationInfo { @@ -4484,6 +4500,7 @@ export interface ClientCommunicationInfo {
4484 * 客户状态 4500 * 客户状态
4485 */ 4501 */
4486 tradeStatusLike?: string; 4502 tradeStatusLike?: string;
  4503 + type?: string;
4487 updateByName?: string; 4504 updateByName?: string;
4488 /** @format date-time */ 4505 /** @format date-time */
4489 updateTime?: string; 4506 updateTime?: string;
@@ -4600,6 +4617,54 @@ export interface InvoiceDetail { @@ -4600,6 +4617,54 @@ export interface InvoiceDetail {
4600 updateTime?: string; 4617 updateTime?: string;
4601 } 4618 }
4602 4619
  4620 +export interface InvoiceReissueRecord {
  4621 + createByName?: string;
  4622 + createByNameLike?: string;
  4623 + /** @format date-time */
  4624 + createDatetimeGe?: string;
  4625 + /** @format date-time */
  4626 + createDatetimeLe?: string;
  4627 + /** @format date-time */
  4628 + createTime?: string;
  4629 + /** @format int32 */
  4630 + current?: number;
  4631 + /** @format int32 */
  4632 + end?: number;
  4633 + financeManager?: string;
  4634 + /** @format date-time */
  4635 + flushDatetime?: string;
  4636 + /** @format date-time */
  4637 + flushDatetimeGe?: string;
  4638 + /** @format date-time */
  4639 + flushDatetimeLe?: string;
  4640 + flushStatus?: string;
  4641 + flushStatusText?: string;
  4642 + /** @format int64 */
  4643 + id?: number;
  4644 + idIn?: Array<number>;
  4645 + invoiceIdIn?: Array<string>;
  4646 + invoiceIds?: Array<number>;
  4647 + invoiceNumber?: string;
  4648 + invoiceNumbers?: Array<string>;
  4649 + logicDelete?: boolean;
  4650 + notes?: string;
  4651 + /** @format int32 */
  4652 + pageSize?: number;
  4653 + passed?: boolean;
  4654 + paths?: Array<string>;
  4655 + recordIds?: Array<number>;
  4656 + reissueStatus?: string;
  4657 + /** @format int32 */
  4658 + start?: number;
  4659 + status?: string;
  4660 + statusText?: string;
  4661 + /** @format int32 */
  4662 + total?: number;
  4663 + updateByName?: string;
  4664 + /** @format date-time */
  4665 + updateTime?: string;
  4666 +}
  4667 +
4603 export interface ResearchGroupAccounts { 4668 export interface ResearchGroupAccounts {
4604 /** 4669 /**
4605 * @description 4670 * @description
src/services/request.ts
@@ -61,6 +61,7 @@ import type { @@ -61,6 +61,7 @@ import type {
61 InvoiceDto, 61 InvoiceDto,
62 InvoiceRecordDTO, 62 InvoiceRecordDTO,
63 InvoiceRecordQueryRequest, 63 InvoiceRecordQueryRequest,
  64 + InvoiceReissueRecord,
64 MainOrderqueryRequest, 65 MainOrderqueryRequest,
65 MaterialListReply, 66 MaterialListReply,
66 MaterialMaterialListReq, 67 MaterialMaterialListReq,
@@ -14902,6 +14903,115 @@ export const postServiceConstInitInvoiceDetailNames = /* #__PURE__ */ (() =&gt; { @@ -14902,6 +14903,115 @@ export const postServiceConstInitInvoiceDetailNames = /* #__PURE__ */ (() =&gt; {
14902 return request; 14903 return request;
14903 })(); 14904 })();
14904 14905
  14906 +/** @description response type for postServiceConstInvoiceFlushStatus */
  14907 +export interface PostServiceConstInvoiceFlushStatusResponse {
  14908 + /**
  14909 + * @description
  14910 + * OK
  14911 + */
  14912 + 200: ServerResult;
  14913 + /**
  14914 + * @description
  14915 + * Created
  14916 + */
  14917 + 201: any;
  14918 + /**
  14919 + * @description
  14920 + * Unauthorized
  14921 + */
  14922 + 401: any;
  14923 + /**
  14924 + * @description
  14925 + * Forbidden
  14926 + */
  14927 + 403: any;
  14928 + /**
  14929 + * @description
  14930 + * Not Found
  14931 + */
  14932 + 404: any;
  14933 +}
  14934 +
  14935 +export type PostServiceConstInvoiceFlushStatusResponseSuccess =
  14936 + PostServiceConstInvoiceFlushStatusResponse[200];
  14937 +/**
  14938 + * @description
  14939 + * 发票冲红状态
  14940 + * @tags front-const-controller
  14941 + * @produces *
  14942 + * @consumes application/json
  14943 + */
  14944 +export const postServiceConstInvoiceFlushStatus = /* #__PURE__ */ (() => {
  14945 + const method = 'post';
  14946 + const url = '/service/const/invoiceFlushStatus';
  14947 + function request(): Promise<PostServiceConstInvoiceFlushStatusResponseSuccess> {
  14948 + return requester(request.url, {
  14949 + method: request.method,
  14950 + }) as unknown as Promise<PostServiceConstInvoiceFlushStatusResponseSuccess>;
  14951 + }
  14952 +
  14953 + /** http method */
  14954 + request.method = method;
  14955 + /** request url */
  14956 + request.url = url;
  14957 + return request;
  14958 +})();
  14959 +
  14960 +/** @description response type for postServiceConstInvoiceReissueRecordStatus */
  14961 +export interface PostServiceConstInvoiceReissueRecordStatusResponse {
  14962 + /**
  14963 + * @description
  14964 + * OK
  14965 + */
  14966 + 200: ServerResult;
  14967 + /**
  14968 + * @description
  14969 + * Created
  14970 + */
  14971 + 201: any;
  14972 + /**
  14973 + * @description
  14974 + * Unauthorized
  14975 + */
  14976 + 401: any;
  14977 + /**
  14978 + * @description
  14979 + * Forbidden
  14980 + */
  14981 + 403: any;
  14982 + /**
  14983 + * @description
  14984 + * Not Found
  14985 + */
  14986 + 404: any;
  14987 +}
  14988 +
  14989 +export type PostServiceConstInvoiceReissueRecordStatusResponseSuccess =
  14990 + PostServiceConstInvoiceReissueRecordStatusResponse[200];
  14991 +/**
  14992 + * @description
  14993 + * 发票重开状态
  14994 + * @tags front-const-controller
  14995 + * @produces *
  14996 + * @consumes application/json
  14997 + */
  14998 +export const postServiceConstInvoiceReissueRecordStatus =
  14999 + /* #__PURE__ */ (() => {
  15000 + const method = 'post';
  15001 + const url = '/service/const/invoiceReissueRecordStatus';
  15002 + function request(): Promise<PostServiceConstInvoiceReissueRecordStatusResponseSuccess> {
  15003 + return requester(request.url, {
  15004 + method: request.method,
  15005 + }) as unknown as Promise<PostServiceConstInvoiceReissueRecordStatusResponseSuccess>;
  15006 + }
  15007 +
  15008 + /** http method */
  15009 + request.method = method;
  15010 + /** request url */
  15011 + request.url = url;
  15012 + return request;
  15013 + })();
  15014 +
14905 /** @description response type for postServiceConstInvoiceType */ 15015 /** @description response type for postServiceConstInvoiceType */
14906 export interface PostServiceConstInvoiceTypeResponse { 15016 export interface PostServiceConstInvoiceTypeResponse {
14907 /** 15017 /**
@@ -17775,6 +17885,148 @@ export const postServiceInvoiceReissue = /* #__PURE__ */ (() =&gt; { @@ -17775,6 +17885,148 @@ export const postServiceInvoiceReissue = /* #__PURE__ */ (() =&gt; {
17775 return request; 17885 return request;
17776 })(); 17886 })();
17777 17887
  17888 +/** @description request parameter type for postServiceInvoiceReissueAudit */
  17889 +export interface PostServiceInvoiceReissueAuditOption {
  17890 + /**
  17891 + * @description
  17892 + * dto
  17893 + */
  17894 + body: {
  17895 + /**
  17896 + @description
  17897 + dto */
  17898 + dto: InvoiceReissueRecord;
  17899 + };
  17900 +}
  17901 +
  17902 +/** @description response type for postServiceInvoiceReissueAudit */
  17903 +export interface PostServiceInvoiceReissueAuditResponse {
  17904 + /**
  17905 + * @description
  17906 + * OK
  17907 + */
  17908 + 200: ServerResult;
  17909 + /**
  17910 + * @description
  17911 + * Created
  17912 + */
  17913 + 201: any;
  17914 + /**
  17915 + * @description
  17916 + * Unauthorized
  17917 + */
  17918 + 401: any;
  17919 + /**
  17920 + * @description
  17921 + * Forbidden
  17922 + */
  17923 + 403: any;
  17924 + /**
  17925 + * @description
  17926 + * Not Found
  17927 + */
  17928 + 404: any;
  17929 +}
  17930 +
  17931 +export type PostServiceInvoiceReissueAuditResponseSuccess =
  17932 + PostServiceInvoiceReissueAuditResponse[200];
  17933 +/**
  17934 + * @description
  17935 + * ReissueAudit
  17936 + * @tags 发票
  17937 + * @produces *
  17938 + * @consumes application/json
  17939 + */
  17940 +export const postServiceInvoiceReissueAudit = /* #__PURE__ */ (() => {
  17941 + const method = 'post';
  17942 + const url = '/service/invoice/reissue/audit';
  17943 + function request(
  17944 + option: PostServiceInvoiceReissueAuditOption,
  17945 + ): Promise<PostServiceInvoiceReissueAuditResponseSuccess> {
  17946 + return requester(request.url, {
  17947 + method: request.method,
  17948 + ...option,
  17949 + }) as unknown as Promise<PostServiceInvoiceReissueAuditResponseSuccess>;
  17950 + }
  17951 +
  17952 + /** http method */
  17953 + request.method = method;
  17954 + /** request url */
  17955 + request.url = url;
  17956 + return request;
  17957 +})();
  17958 +
  17959 +/** @description request parameter type for postServiceInvoiceReissueInvoices */
  17960 +export interface PostServiceInvoiceReissueInvoicesOption {
  17961 + /**
  17962 + * @description
  17963 + * dto
  17964 + */
  17965 + body: {
  17966 + /**
  17967 + @description
  17968 + dto */
  17969 + dto: InvoiceReissueRecord;
  17970 + };
  17971 +}
  17972 +
  17973 +/** @description response type for postServiceInvoiceReissueInvoices */
  17974 +export interface PostServiceInvoiceReissueInvoicesResponse {
  17975 + /**
  17976 + * @description
  17977 + * OK
  17978 + */
  17979 + 200: ServerResult;
  17980 + /**
  17981 + * @description
  17982 + * Created
  17983 + */
  17984 + 201: any;
  17985 + /**
  17986 + * @description
  17987 + * Unauthorized
  17988 + */
  17989 + 401: any;
  17990 + /**
  17991 + * @description
  17992 + * Forbidden
  17993 + */
  17994 + 403: any;
  17995 + /**
  17996 + * @description
  17997 + * Not Found
  17998 + */
  17999 + 404: any;
  18000 +}
  18001 +
  18002 +export type PostServiceInvoiceReissueInvoicesResponseSuccess =
  18003 + PostServiceInvoiceReissueInvoicesResponse[200];
  18004 +/**
  18005 + * @description
  18006 + * 重新开票
  18007 + * @tags 发票
  18008 + * @produces *
  18009 + * @consumes application/json
  18010 + */
  18011 +export const postServiceInvoiceReissueInvoices = /* #__PURE__ */ (() => {
  18012 + const method = 'post';
  18013 + const url = '/service/invoice/reissueInvoices';
  18014 + function request(
  18015 + option: PostServiceInvoiceReissueInvoicesOption,
  18016 + ): Promise<PostServiceInvoiceReissueInvoicesResponseSuccess> {
  18017 + return requester(request.url, {
  18018 + method: request.method,
  18019 + ...option,
  18020 + }) as unknown as Promise<PostServiceInvoiceReissueInvoicesResponseSuccess>;
  18021 + }
  18022 +
  18023 + /** http method */
  18024 + request.method = method;
  18025 + /** request url */
  18026 + request.url = url;
  18027 + return request;
  18028 +})();
  18029 +
17778 /** @description request parameter type for postServiceInvoiceReissueOld */ 18030 /** @description request parameter type for postServiceInvoiceReissueOld */
17779 export interface PostServiceInvoiceReissueOldOption { 18031 export interface PostServiceInvoiceReissueOldOption {
17780 /** 18032 /**
@@ -17846,6 +18098,77 @@ export const postServiceInvoiceReissueOld = /* #__PURE__ */ (() =&gt; { @@ -17846,6 +18098,77 @@ export const postServiceInvoiceReissueOld = /* #__PURE__ */ (() =&gt; {
17846 return request; 18098 return request;
17847 })(); 18099 })();
17848 18100
  18101 +/** @description request parameter type for postServiceInvoiceReissueRecords */
  18102 +export interface PostServiceInvoiceReissueRecordsOption {
  18103 + /**
  18104 + * @description
  18105 + * dto
  18106 + */
  18107 + body: {
  18108 + /**
  18109 + @description
  18110 + dto */
  18111 + dto: InvoiceReissueRecord;
  18112 + };
  18113 +}
  18114 +
  18115 +/** @description response type for postServiceInvoiceReissueRecords */
  18116 +export interface PostServiceInvoiceReissueRecordsResponse {
  18117 + /**
  18118 + * @description
  18119 + * OK
  18120 + */
  18121 + 200: ServerResult;
  18122 + /**
  18123 + * @description
  18124 + * Created
  18125 + */
  18126 + 201: any;
  18127 + /**
  18128 + * @description
  18129 + * Unauthorized
  18130 + */
  18131 + 401: any;
  18132 + /**
  18133 + * @description
  18134 + * Forbidden
  18135 + */
  18136 + 403: any;
  18137 + /**
  18138 + * @description
  18139 + * Not Found
  18140 + */
  18141 + 404: any;
  18142 +}
  18143 +
  18144 +export type PostServiceInvoiceReissueRecordsResponseSuccess =
  18145 + PostServiceInvoiceReissueRecordsResponse[200];
  18146 +/**
  18147 + * @description
  18148 + * 获取重开记录
  18149 + * @tags 发票
  18150 + * @produces *
  18151 + * @consumes application/json
  18152 + */
  18153 +export const postServiceInvoiceReissueRecords = /* #__PURE__ */ (() => {
  18154 + const method = 'post';
  18155 + const url = '/service/invoice/reissueRecords';
  18156 + function request(
  18157 + option: PostServiceInvoiceReissueRecordsOption,
  18158 + ): Promise<PostServiceInvoiceReissueRecordsResponseSuccess> {
  18159 + return requester(request.url, {
  18160 + method: request.method,
  18161 + ...option,
  18162 + }) as unknown as Promise<PostServiceInvoiceReissueRecordsResponseSuccess>;
  18163 + }
  18164 +
  18165 + /** http method */
  18166 + request.method = method;
  18167 + /** request url */
  18168 + request.url = url;
  18169 + return request;
  18170 +})();
  18171 +
17849 /** @description request parameter type for postServiceInvoiceSucessInvoices */ 18172 /** @description request parameter type for postServiceInvoiceSucessInvoices */
17850 export interface PostServiceInvoiceSucessInvoicesOption { 18173 export interface PostServiceInvoiceSucessInvoicesOption {
17851 /** 18174 /**