Commit a79e7fb648b89d9df162e4ae64cf80f3e4e23e28
1 parent
979708ac
feat: update 财务合并开票
Showing
6 changed files
with
610 additions
and
69 deletions
src/pages/Order/components/FinancialEditDrawer.tsx
@@ -26,6 +26,16 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | @@ -26,6 +26,16 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | ||
26 | subIds: []; | 26 | subIds: []; |
27 | financialReceiptIssuanceTime: string; | 27 | financialReceiptIssuanceTime: string; |
28 | }>(); | 28 | }>(); |
29 | + | ||
30 | + //回显开收据时间和收款时间 | ||
31 | + if (!isMainOrder) { | ||
32 | + form.setFieldValue('collectMoneyTime', subOrders[0].collectMoneyTime); | ||
33 | + form.setFieldValue( | ||
34 | + 'financialReceiptIssuanceTime', | ||
35 | + subOrders[0].financialReceiptIssuanceTime, | ||
36 | + ); | ||
37 | + } | ||
38 | + | ||
29 | return ( | 39 | return ( |
30 | <DrawerForm<{ | 40 | <DrawerForm<{ |
31 | collectMoneyTime: string; | 41 | collectMoneyTime: string; |
@@ -49,12 +59,18 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | @@ -49,12 +59,18 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | ||
49 | }} | 59 | }} |
50 | submitTimeout={2000} | 60 | submitTimeout={2000} |
51 | onFinish={async (values) => { | 61 | onFinish={async (values) => { |
62 | + let body = { | ||
63 | + ...values, | ||
64 | + mainOrderId: mainOrderId, | ||
65 | + subIds: subOrderIds, | ||
66 | + }; | ||
67 | + | ||
68 | + if (!isMainOrder) { | ||
69 | + body.invoicingStatus = 'UN_INVOICE'; | ||
70 | + } | ||
71 | + | ||
52 | let res = await postServiceOrderNoNeedInvoicingEdit({ | 72 | let res = await postServiceOrderNoNeedInvoicingEdit({ |
53 | - data: { | ||
54 | - ...values, | ||
55 | - mainOrderId: mainOrderId, | ||
56 | - subIds: subOrderIds, | ||
57 | - }, | 73 | + data: body, |
58 | }); | 74 | }); |
59 | if (res.result === RESPONSE_CODE.SUCCESS) { | 75 | if (res.result === RESPONSE_CODE.SUCCESS) { |
60 | message.success(res.message); | 76 | message.success(res.message); |
@@ -115,24 +131,24 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | @@ -115,24 +131,24 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) => { | ||
115 | width="lg" | 131 | width="lg" |
116 | name="financialReceiptIssuanceTime" | 132 | name="financialReceiptIssuanceTime" |
117 | label="开收据时间" | 133 | label="开收据时间" |
118 | - rules={[ | ||
119 | - { | ||
120 | - required: !isMainOrder && invoicingStatus === 'UN_INVOICE', | ||
121 | - message: '开收据时间必填', | ||
122 | - }, | ||
123 | - ]} | 134 | + // rules={[ |
135 | + // { | ||
136 | + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE', | ||
137 | + // message: '开收据时间必填', | ||
138 | + // }, | ||
139 | + // ]} | ||
124 | /> | 140 | /> |
125 | <ProFormDatePicker | 141 | <ProFormDatePicker |
126 | key="collectMoneyTime" | 142 | key="collectMoneyTime" |
127 | width="lg" | 143 | width="lg" |
128 | name="collectMoneyTime" | 144 | name="collectMoneyTime" |
129 | label="收款时间" | 145 | label="收款时间" |
130 | - rules={[ | ||
131 | - { | ||
132 | - required: !isMainOrder && invoicingStatus === 'UN_INVOICE', | ||
133 | - message: '收款时间必填', | ||
134 | - }, | ||
135 | - ]} | 146 | + // rules={[ |
147 | + // { | ||
148 | + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE', | ||
149 | + // message: '收款时间必填', | ||
150 | + // }, | ||
151 | + // ]} | ||
136 | /> | 152 | /> |
137 | </DrawerForm> | 153 | </DrawerForm> |
138 | ); | 154 | ); |
src/pages/Order/components/FinancialMergeDrawer.tsx
0 → 100644
1 | +// import { PlusOutlined } from '@ant-design/icons'; | ||
2 | +import { RESPONSE_CODE } from '@/constants/enum'; | ||
3 | +import { postServiceOrderMergeInvoicing } from '@/services'; | ||
4 | +import { | ||
5 | + DrawerForm, | ||
6 | + ProFormDatePicker, | ||
7 | + ProFormSelect, | ||
8 | + ProFormText, | ||
9 | + ProFormTextArea, | ||
10 | +} from '@ant-design/pro-components'; | ||
11 | +import { Form, message } from 'antd'; | ||
12 | + | ||
13 | +export default ({ dataList, setVisible, onClose }) => { | ||
14 | + let mainOrderIds = dataList?.map((item) => { | ||
15 | + return item.id; | ||
16 | + }); | ||
17 | + let firstMainOrder = dataList[0]; | ||
18 | + let bank = firstMainOrder?.bank; | ||
19 | + let bankAccountNumber = firstMainOrder?.bankAccountNumber; | ||
20 | + let invoiceIdentificationNumber = firstMainOrder?.invoiceIdentificationNumber; | ||
21 | + | ||
22 | + const [form] = Form.useForm<{ | ||
23 | + invoicingTime: string; | ||
24 | + financialReceiptIssuanceTime: string; | ||
25 | + invoicingNotes: string; | ||
26 | + afterInvoicingStatus: string; | ||
27 | + collectMoneyTime: string; | ||
28 | + }>(); | ||
29 | + return ( | ||
30 | + <DrawerForm | ||
31 | + open | ||
32 | + title="合并开票" | ||
33 | + resize={{ | ||
34 | + onResize() { | ||
35 | + console.log('resize!'); | ||
36 | + }, | ||
37 | + maxWidth: window.innerWidth * 0.8, | ||
38 | + minWidth: 400, | ||
39 | + }} | ||
40 | + form={form} | ||
41 | + autoFocusFirstInput | ||
42 | + drawerProps={{ | ||
43 | + destroyOnClose: true, | ||
44 | + }} | ||
45 | + submitTimeout={2000} | ||
46 | + onFinish={async (values) => { | ||
47 | + let res = await postServiceOrderMergeInvoicing({ | ||
48 | + data: { | ||
49 | + ...values, | ||
50 | + mainOrderIds: mainOrderIds, | ||
51 | + }, | ||
52 | + }); | ||
53 | + | ||
54 | + if (res.result === RESPONSE_CODE.SUCCESS) { | ||
55 | + message.success(res.message); | ||
56 | + onClose(); | ||
57 | + } | ||
58 | + }} | ||
59 | + onOpenChange={(val) => { | ||
60 | + return !val && setVisible(); | ||
61 | + }} | ||
62 | + > | ||
63 | + <ProFormText | ||
64 | + width="lg" | ||
65 | + name="invoiceIdentificationNumber" | ||
66 | + label="开票信息" | ||
67 | + placeholder="请输入开票信息" | ||
68 | + initialValue={invoiceIdentificationNumber} | ||
69 | + disabled | ||
70 | + /> | ||
71 | + <ProFormText | ||
72 | + width="lg" | ||
73 | + name="bank" | ||
74 | + label="开户银行" | ||
75 | + placeholder="请输入开户银行" | ||
76 | + initialValue={bank} | ||
77 | + disabled | ||
78 | + /> | ||
79 | + <ProFormText | ||
80 | + width="lg" | ||
81 | + name="bankAccountNumber" | ||
82 | + label="开户银行账号" | ||
83 | + placeholder="请输入开户银行账号" | ||
84 | + initialValue={bankAccountNumber} | ||
85 | + disabled | ||
86 | + /> | ||
87 | + | ||
88 | + <ProFormDatePicker | ||
89 | + key="invoicingTime" | ||
90 | + width="lg" | ||
91 | + name="invoicingTime" | ||
92 | + label="开票时间" | ||
93 | + rules={[{ required: true, message: '这是必填项' }]} | ||
94 | + /> | ||
95 | + <ProFormDatePicker | ||
96 | + key="financialReceiptIssuanceTime" | ||
97 | + width="lg" | ||
98 | + name="financialReceiptIssuanceTime" | ||
99 | + label="开收据时间" | ||
100 | + /> | ||
101 | + <ProFormDatePicker | ||
102 | + key="collectMoneyTime" | ||
103 | + width="lg" | ||
104 | + name="collectMoneyTime" | ||
105 | + label="收款时间" | ||
106 | + /> | ||
107 | + | ||
108 | + <ProFormSelect | ||
109 | + placeholder="是否完全开票" | ||
110 | + name="afterInvoicingStatus" | ||
111 | + width="lg" | ||
112 | + label="是否完全开票" | ||
113 | + options={[ | ||
114 | + { label: '完全开票', value: 'COMPLETE_INVOICING' }, | ||
115 | + { label: '部分开票', value: 'PARTIAL_INVOICING' }, | ||
116 | + ]} | ||
117 | + initialValue={'COMPLETE_INVOICING'} | ||
118 | + disabled | ||
119 | + /> | ||
120 | + <ProFormTextArea width="lg" name="invoicingNotes" label="备注" /> | ||
121 | + </DrawerForm> | ||
122 | + ); | ||
123 | +}; |
src/pages/Order/components/FinancialReceiptsModal.tsx
1 | -import { ModalForm } from '@ant-design/pro-components'; | 1 | +import { |
2 | + EditableProTable, | ||
3 | + ModalForm, | ||
4 | + ProColumns, | ||
5 | + ProForm, | ||
6 | +} from '@ant-design/pro-components'; | ||
2 | import { Form } from 'antd'; | 7 | import { Form } from 'antd'; |
8 | +import { useState } from 'react'; | ||
3 | 9 | ||
4 | // import { cloneDeep } from 'lodash'; | 10 | // import { cloneDeep } from 'lodash'; |
5 | export default ({ setVisible, onClose }) => { | 11 | export default ({ setVisible, onClose }) => { |
6 | const [form] = Form.useForm<{ name: string; company: string }>(); | 12 | const [form] = Form.useForm<{ name: string; company: string }>(); |
7 | - | 13 | + type DataSourceType = { |
14 | + id: React.Key; | ||
15 | + receiptsType?: string; | ||
16 | + receiptsPrice?: number; | ||
17 | + receiptsTime?: string; | ||
18 | + notes?: string; | ||
19 | + }; | ||
20 | + const defaultData: DataSourceType[] = [ | ||
21 | + { | ||
22 | + id: 1, | ||
23 | + receiptsType: '预付款', | ||
24 | + receiptsPrice: 1234, | ||
25 | + receiptsTime: '2023-01-02', | ||
26 | + notes: '备注', | ||
27 | + }, | ||
28 | + { | ||
29 | + id: 2, | ||
30 | + receiptsType: '发货款', | ||
31 | + receiptsPrice: 1234, | ||
32 | + receiptsTime: '2023-01-02', | ||
33 | + notes: '备注', | ||
34 | + }, | ||
35 | + { | ||
36 | + id: 3, | ||
37 | + receiptsType: '验收款', | ||
38 | + receiptsPrice: 1234, | ||
39 | + receiptsTime: '2023-01-02', | ||
40 | + notes: '备注', | ||
41 | + }, | ||
42 | + { | ||
43 | + id: 4, | ||
44 | + receiptsType: '尾款', | ||
45 | + receiptsPrice: 1234, | ||
46 | + receiptsTime: '2023-01-02', | ||
47 | + notes: '备注', | ||
48 | + }, | ||
49 | + ]; | ||
50 | + const [editableKeys, setEditableRowKeys] = useState<React.Key[]>(() => | ||
51 | + // defaultData.map((item) => item.id), | ||
52 | + [3, 4], | ||
53 | + ); | ||
54 | + const columns: ProColumns<DataSourceType>[] = [ | ||
55 | + { | ||
56 | + title: '款项', | ||
57 | + dataIndex: 'receiptsType', | ||
58 | + editable: false, | ||
59 | + width: '10%', | ||
60 | + }, | ||
61 | + { | ||
62 | + title: '已收金额', | ||
63 | + dataIndex: 'receiptsPrice', | ||
64 | + valueType: 'digit', | ||
65 | + width: '15%', | ||
66 | + }, | ||
67 | + { | ||
68 | + title: '收款时间', | ||
69 | + dataIndex: 'receiptsTime', | ||
70 | + valueType: 'dateTime', | ||
71 | + width: '25%', | ||
72 | + }, | ||
73 | + { | ||
74 | + title: '备注', | ||
75 | + dataIndex: 'receiptsNotes', | ||
76 | + }, | ||
77 | + ]; | ||
8 | return ( | 78 | return ( |
9 | <> | 79 | <> |
10 | <ModalForm<{ | 80 | <ModalForm<{ |
11 | name: string; | 81 | name: string; |
12 | company: string; | 82 | company: string; |
13 | }> | 83 | }> |
14 | - width={500} | 84 | + width={1100} |
15 | open | 85 | open |
16 | title="收款记录" | 86 | title="收款记录" |
17 | form={form} | 87 | form={form} |
18 | autoFocusFirstInput | 88 | autoFocusFirstInput |
19 | modalProps={{ | 89 | modalProps={{ |
20 | - okText: '通过', | 90 | + okText: '保存', |
21 | cancelText: '取消', | 91 | cancelText: '取消', |
22 | destroyOnClose: true, | 92 | destroyOnClose: true, |
23 | onCancel: () => { | 93 | onCancel: () => { |
@@ -29,7 +99,160 @@ export default ({ setVisible, onClose }) => { | @@ -29,7 +99,160 @@ export default ({ setVisible, onClose }) => { | ||
29 | onClose(); | 99 | onClose(); |
30 | }} | 100 | }} |
31 | onOpenChange={setVisible} | 101 | onOpenChange={setVisible} |
32 | - ></ModalForm> | 102 | + > |
103 | + <ProForm.Item | ||
104 | + label="" | ||
105 | + name="dataSource" | ||
106 | + initialValue={defaultData} | ||
107 | + trigger="onValuesChange" | ||
108 | + > | ||
109 | + <EditableProTable<DataSourceType> | ||
110 | + rowKey="id" | ||
111 | + toolBarRender={false} | ||
112 | + columns={columns} | ||
113 | + recordCreatorProps={{ | ||
114 | + newRecordType: 'dataSource', | ||
115 | + position: 'top', | ||
116 | + record: () => ({ | ||
117 | + id: Date.now(), | ||
118 | + addonBefore: 'ccccccc', | ||
119 | + decs: 'testdesc', | ||
120 | + }), | ||
121 | + style: { | ||
122 | + display: 'none', | ||
123 | + }, | ||
124 | + }} | ||
125 | + editable={{ | ||
126 | + type: 'multiple', | ||
127 | + editableKeys, | ||
128 | + onChange: setEditableRowKeys, | ||
129 | + actionRender: (row, _, dom) => { | ||
130 | + return [dom.delete]; | ||
131 | + }, | ||
132 | + }} | ||
133 | + /> | ||
134 | + </ProForm.Item> | ||
135 | + | ||
136 | + {/* <ProForm.Group> | ||
137 | + <ProFormText | ||
138 | + width="sm" | ||
139 | + name="name1" | ||
140 | + label="款项" | ||
141 | + tooltip="最长为 24 位" | ||
142 | + initialValue={"预付款"} | ||
143 | + disabled | ||
144 | + placeholder="请输入名称" | ||
145 | + /> | ||
146 | + | ||
147 | + <ProFormText | ||
148 | + width="sm" | ||
149 | + name="company" | ||
150 | + label="收款时间" | ||
151 | + placeholder="请输入名称" | ||
152 | + /> | ||
153 | + | ||
154 | + <ProFormText | ||
155 | + width="sm" | ||
156 | + name="price" | ||
157 | + label="收款金额" | ||
158 | + placeholder="请输入名称" | ||
159 | + /> | ||
160 | + | ||
161 | + <ProFormText | ||
162 | + width="sm" | ||
163 | + name="notes" | ||
164 | + label="备注" | ||
165 | + placeholder="请输入名称" | ||
166 | + /> | ||
167 | + </ProForm.Group> | ||
168 | + | ||
169 | + <ProForm.Group> | ||
170 | + <ProFormText | ||
171 | + width="sm" | ||
172 | + name="name2" | ||
173 | + initialValue={"发货款"} | ||
174 | + disabled | ||
175 | + tooltip="最长为 24 位" | ||
176 | + placeholder="请输入名称" | ||
177 | + /> | ||
178 | + | ||
179 | + <ProFormText | ||
180 | + width="sm" | ||
181 | + name="company" | ||
182 | + placeholder="请输入名称" | ||
183 | + /> | ||
184 | + | ||
185 | + <ProFormText | ||
186 | + width="sm" | ||
187 | + name="price" | ||
188 | + placeholder="请输入名称" | ||
189 | + /> | ||
190 | + | ||
191 | + <ProFormText | ||
192 | + width="sm" | ||
193 | + name="notes" | ||
194 | + placeholder="请输入名称" | ||
195 | + /> | ||
196 | + </ProForm.Group> | ||
197 | + | ||
198 | + <ProForm.Group> | ||
199 | + <ProFormText | ||
200 | + width="sm" | ||
201 | + name="name3" | ||
202 | + initialValue={"验收款"} | ||
203 | + disabled | ||
204 | + tooltip="最长为 24 位" | ||
205 | + placeholder="请输入名称" | ||
206 | + /> | ||
207 | + | ||
208 | + <ProFormText | ||
209 | + width="sm" | ||
210 | + name="company" | ||
211 | + placeholder="请输入名称" | ||
212 | + /> | ||
213 | + | ||
214 | + <ProFormText | ||
215 | + width="sm" | ||
216 | + name="price" | ||
217 | + placeholder="请输入名称" | ||
218 | + /> | ||
219 | + | ||
220 | + <ProFormText | ||
221 | + width="sm" | ||
222 | + name="notes" | ||
223 | + placeholder="请输入名称" | ||
224 | + /> | ||
225 | + </ProForm.Group> | ||
226 | + | ||
227 | + <ProForm.Group> | ||
228 | + <ProFormText | ||
229 | + width="sm" | ||
230 | + name="name4" | ||
231 | + disabled | ||
232 | + initialValue={"尾款"} | ||
233 | + tooltip="最长为 24 位" | ||
234 | + placeholder="请输入名称" | ||
235 | + /> | ||
236 | + | ||
237 | + <ProFormText | ||
238 | + width="sm" | ||
239 | + name="company" | ||
240 | + placeholder="请输入名称" | ||
241 | + /> | ||
242 | + | ||
243 | + <ProFormText | ||
244 | + width="sm" | ||
245 | + name="price" | ||
246 | + placeholder="请输入名称" | ||
247 | + /> | ||
248 | + | ||
249 | + <ProFormText | ||
250 | + width="sm" | ||
251 | + name="notes" | ||
252 | + placeholder="请输入名称" | ||
253 | + /> | ||
254 | + </ProForm.Group> */} | ||
255 | + </ModalForm> | ||
33 | </> | 256 | </> |
34 | ); | 257 | ); |
35 | }; | 258 | }; |
src/pages/Order/constant.ts
@@ -490,6 +490,14 @@ export const MAIN_ORDER_COLUMNS = [ | @@ -490,6 +490,14 @@ export const MAIN_ORDER_COLUMNS = [ | ||
490 | }, | 490 | }, |
491 | }, | 491 | }, |
492 | }, | 492 | }, |
493 | + | ||
494 | + // { | ||
495 | + // title: '是否完全收款', | ||
496 | + // dataIndex: 'receiptsStatus', | ||
497 | + // valueType: 'select', | ||
498 | + // hideInTable: true, | ||
499 | + // valueEnum:[{text:'是',status:'YES'},{text:'否',status:'NO'}] | ||
500 | + // } | ||
493 | ]; | 501 | ]; |
494 | 502 | ||
495 | export const SUB_ORDER_COLUMNS = [ | 503 | export const SUB_ORDER_COLUMNS = [ |
src/pages/Order/index.tsx
@@ -56,6 +56,7 @@ import DeliverInfoDrawer from './components/DeliverInfoDrawer'; | @@ -56,6 +56,7 @@ import DeliverInfoDrawer from './components/DeliverInfoDrawer'; | ||
56 | import DeliverModal from './components/DeliverModal'; | 56 | import DeliverModal from './components/DeliverModal'; |
57 | import FinancialDrawer from './components/FinancialDrawer'; | 57 | import FinancialDrawer from './components/FinancialDrawer'; |
58 | import FinancialEditDrawer from './components/FinancialEditDrawer'; | 58 | import FinancialEditDrawer from './components/FinancialEditDrawer'; |
59 | +import FinancialMergeDrawer from './components/FinancialMergeDrawer'; | ||
59 | import FinancialReceiptsModal from './components/FinancialReceiptsModal'; | 60 | import FinancialReceiptsModal from './components/FinancialReceiptsModal'; |
60 | import HistoryModal from './components/HistoryModal'; | 61 | import HistoryModal from './components/HistoryModal'; |
61 | import ImportModal from './components/ImportModal'; | 62 | import ImportModal from './components/ImportModal'; |
@@ -92,6 +93,8 @@ const OrderPage = () => { | @@ -92,6 +93,8 @@ const OrderPage = () => { | ||
92 | ] = useState<boolean>(false); | 93 | ] = useState<boolean>(false); |
93 | const [data, setData] = useState([]); //列表数据 | 94 | const [data, setData] = useState([]); //列表数据 |
94 | const [notesEditVisible, setNotesEditVisible] = useState<boolean>(false); | 95 | const [notesEditVisible, setNotesEditVisible] = useState<boolean>(false); |
96 | + const [financialMergeDrawerVisible, setFinancialMergeDrawerVisible] = | ||
97 | + useState<boolean>(false); | ||
95 | const [attachmentModalVisible, setAttachmentModalVisible] = | 98 | const [attachmentModalVisible, setAttachmentModalVisible] = |
96 | useState<boolean>(false); | 99 | useState<boolean>(false); |
97 | const [financialReceiptsModalVisible, setFinancialReceiptsModalVisible] = | 100 | const [financialReceiptsModalVisible, setFinancialReceiptsModalVisible] = |
@@ -136,6 +139,9 @@ const OrderPage = () => { | @@ -136,6 +139,9 @@ const OrderPage = () => { | ||
136 | const [onlyShowCancelOrder, setOnlyShowCancelOrder] = useState(false); | 139 | const [onlyShowCancelOrder, setOnlyShowCancelOrder] = useState(false); |
137 | const [onlyShowProcureToBeProcessed, setOnlyShowProcureToBeProcessed] = | 140 | const [onlyShowProcureToBeProcessed, setOnlyShowProcureToBeProcessed] = |
138 | useState(false); | 141 | useState(false); |
142 | + const [mainOrderSelectedMap, setMainOrderSelectedMap] = useState(new Map()); //选中的主订单Map | ||
143 | + setMainOrderSelectedMap(new Map()); | ||
144 | + const [mainOrderSelectedRows, setMainOrderSelectedRows] = useState([]); //选中的主订单集合 | ||
139 | const [onlyShowFinancialToBeProcessed, setOnlyShowFinancialToBeProcessed] = | 145 | const [onlyShowFinancialToBeProcessed, setOnlyShowFinancialToBeProcessed] = |
140 | useState(false); | 146 | useState(false); |
141 | const mainTableRef = useRef(); | 147 | const mainTableRef = useRef(); |
@@ -273,12 +279,16 @@ const OrderPage = () => { | @@ -273,12 +279,16 @@ const OrderPage = () => { | ||
273 | if (selectedItems.includes(record.id)) { | 279 | if (selectedItems.includes(record.id)) { |
274 | newSelectedItems = selectedItems.filter((key) => key !== record.id); | 280 | newSelectedItems = selectedItems.filter((key) => key !== record.id); |
275 | setSelectedRowKeys([]); | 281 | setSelectedRowKeys([]); |
282 | + console.log(selectedRowObj); | ||
276 | setSelectedRowObj({ | 283 | setSelectedRowObj({ |
277 | ...setSelectedRowObj, | 284 | ...setSelectedRowObj, |
278 | [record.id]: [], | 285 | [record.id]: [], |
279 | }); | 286 | }); |
280 | selectedRowObj[record.id] = []; | 287 | selectedRowObj[record.id] = []; |
281 | setSelectedRows([]); | 288 | setSelectedRows([]); |
289 | + | ||
290 | + //取消选中主订单 | ||
291 | + mainOrderSelectedMap.delete(record.id); | ||
282 | } else { | 292 | } else { |
283 | newSelectedItems = [...selectedItems, record.id]; | 293 | newSelectedItems = [...selectedItems, record.id]; |
284 | //子订单全部自动选中 | 294 | //子订单全部自动选中 |
@@ -286,12 +296,16 @@ const OrderPage = () => { | @@ -286,12 +296,16 @@ const OrderPage = () => { | ||
286 | return item.id; | 296 | return item.id; |
287 | }); | 297 | }); |
288 | setSelectedRowKeys(subIds); | 298 | setSelectedRowKeys(subIds); |
299 | + | ||
289 | setSelectedRowObj({ | 300 | setSelectedRowObj({ |
290 | ...setSelectedRowObj, | 301 | ...setSelectedRowObj, |
291 | [record.id]: record.subOrderInformationLists, | 302 | [record.id]: record.subOrderInformationLists, |
292 | }); | 303 | }); |
293 | selectedRowObj[record.id] = record.subOrderInformationLists; | 304 | selectedRowObj[record.id] = record.subOrderInformationLists; |
294 | setSelectedRows(record.subOrderInformationLists); | 305 | setSelectedRows(record.subOrderInformationLists); |
306 | + | ||
307 | + //选中主订单 | ||
308 | + mainOrderSelectedMap.set(record.id, record); | ||
295 | } | 309 | } |
296 | setSelectedItems(newSelectedItems); | 310 | setSelectedItems(newSelectedItems); |
297 | }; | 311 | }; |
@@ -302,8 +316,11 @@ const OrderPage = () => { | @@ -302,8 +316,11 @@ const OrderPage = () => { | ||
302 | const allMainCheckBoxChange = () => { | 316 | const allMainCheckBoxChange = () => { |
303 | let checked = !allMainChecked; | 317 | let checked = !allMainChecked; |
304 | setAllMainChecked(checked); | 318 | setAllMainChecked(checked); |
319 | + | ||
320 | + mainOrderSelectedMap.clear(); | ||
305 | if (checked) { | 321 | if (checked) { |
306 | let mainOrderIds = data?.map((item) => { | 322 | let mainOrderIds = data?.map((item) => { |
323 | + mainOrderSelectedMap.set(item.id, item); | ||
307 | return item.id; | 324 | return item.id; |
308 | }); | 325 | }); |
309 | 326 | ||
@@ -882,7 +899,7 @@ const OrderPage = () => { | @@ -882,7 +899,7 @@ const OrderPage = () => { | ||
882 | '' | 899 | '' |
883 | )} | 900 | )} |
884 | 901 | ||
885 | - {true ? ( | 902 | + {false ? ( |
886 | <Button | 903 | <Button |
887 | className="p-0" | 904 | className="p-0" |
888 | type="link" | 905 | type="link" |
@@ -2190,7 +2207,45 @@ const OrderPage = () => { | @@ -2190,7 +2207,45 @@ const OrderPage = () => { | ||
2190 | }} | 2207 | }} |
2191 | disabled={selectedItems?.length === 0} | 2208 | disabled={selectedItems?.length === 0} |
2192 | > | 2209 | > |
2193 | - 合并开票 | 2210 | + {userInfo?.roleSmallVO?.code === 'admin' ? '合并(销售)' : '合并开票'} |
2211 | + </Button>, | ||
2212 | + ); | ||
2213 | + } | ||
2214 | + | ||
2215 | + if (rolePath?.includes('mergeInvoicing')) { | ||
2216 | + toolBtns.push( | ||
2217 | + <Button | ||
2218 | + type="primary" | ||
2219 | + key="out" | ||
2220 | + onClick={() => { | ||
2221 | + //检查订单状态是否正确 | ||
2222 | + // 遍历Map中的键值对 | ||
2223 | + let errorIds = []; | ||
2224 | + let mainOrders = []; | ||
2225 | + mainOrderSelectedMap.forEach((value) => { | ||
2226 | + mainOrders.push(value); | ||
2227 | + for (let subOrder of value.subOrderInformationLists) { | ||
2228 | + if (subOrder.afterInvoicingStatus !== 'APPLY_FOR_INVOICING') { | ||
2229 | + errorIds.push(value.id); | ||
2230 | + return; | ||
2231 | + } | ||
2232 | + } | ||
2233 | + }); | ||
2234 | + if (errorIds.length > 0) { | ||
2235 | + message.error( | ||
2236 | + '订单号为:' + | ||
2237 | + errorIds.join(',') + | ||
2238 | + '的订单存在不是[申请开票]状态的子订单,请检查!', | ||
2239 | + ); | ||
2240 | + return; | ||
2241 | + } | ||
2242 | + | ||
2243 | + setMainOrderSelectedRows(mainOrders); | ||
2244 | + setFinancialMergeDrawerVisible(true); | ||
2245 | + }} | ||
2246 | + disabled={selectedItems?.length === 0} | ||
2247 | + > | ||
2248 | + {userInfo?.roleSmallVO?.code === 'admin' ? '合并(财务)' : '合并开票'} | ||
2194 | </Button>, | 2249 | </Button>, |
2195 | ); | 2250 | ); |
2196 | } | 2251 | } |
@@ -2372,6 +2427,9 @@ const OrderPage = () => { | @@ -2372,6 +2427,9 @@ const OrderPage = () => { | ||
2372 | total: data?.total || 0, | 2427 | total: data?.total || 0, |
2373 | }; | 2428 | }; |
2374 | }} | 2429 | }} |
2430 | + toolbar={{ | ||
2431 | + multipleLine: true, | ||
2432 | + }} | ||
2375 | toolBarRender={() => { | 2433 | toolBarRender={() => { |
2376 | return toolBarRender(); | 2434 | return toolBarRender(); |
2377 | }} | 2435 | }} |
@@ -2622,6 +2680,18 @@ const OrderPage = () => { | @@ -2622,6 +2680,18 @@ const OrderPage = () => { | ||
2622 | /> | 2680 | /> |
2623 | )} | 2681 | )} |
2624 | 2682 | ||
2683 | + {financialMergeDrawerVisible && ( | ||
2684 | + <FinancialMergeDrawer | ||
2685 | + setVisible={setFinancialMergeDrawerVisible} | ||
2686 | + dataList={mainOrderSelectedRows} | ||
2687 | + onClose={() => { | ||
2688 | + setFinancialMergeDrawerVisible(false); | ||
2689 | + setMainOrderSelectedRows([]); | ||
2690 | + refreshTable(); | ||
2691 | + }} | ||
2692 | + /> | ||
2693 | + )} | ||
2694 | + | ||
2625 | {financialReceiptsModalVisible && ( | 2695 | {financialReceiptsModalVisible && ( |
2626 | <FinancialReceiptsModal | 2696 | <FinancialReceiptsModal |
2627 | setVisible={setFinancialReceiptsModalVisible} | 2697 | setVisible={setFinancialReceiptsModalVisible} |
src/services/request.ts
@@ -26,6 +26,7 @@ import type { | @@ -26,6 +26,7 @@ import type { | ||
26 | DictionaryQueryVO, | 26 | DictionaryQueryVO, |
27 | DictionaryVO, | 27 | DictionaryVO, |
28 | Dto, | 28 | Dto, |
29 | + ModelAndView, | ||
29 | OrderAddVO, | 30 | OrderAddVO, |
30 | OrderAuditLogQueryVO, | 31 | OrderAuditLogQueryVO, |
31 | OrderBaseInfoQueryVO, | 32 | OrderBaseInfoQueryVO, |
@@ -228,9 +229,7 @@ export interface GetErrorResponse { | @@ -228,9 +229,7 @@ export interface GetErrorResponse { | ||
228 | * @description | 229 | * @description |
229 | * OK | 230 | * OK |
230 | */ | 231 | */ |
231 | - 200: { | ||
232 | - [propertyName: string]: any; | ||
233 | - }; | 232 | + 200: ModelAndView; |
234 | /** | 233 | /** |
235 | * @description | 234 | * @description |
236 | * Unauthorized | 235 | * Unauthorized |
@@ -251,9 +250,9 @@ export interface GetErrorResponse { | @@ -251,9 +250,9 @@ export interface GetErrorResponse { | ||
251 | export type GetErrorResponseSuccess = GetErrorResponse[200]; | 250 | export type GetErrorResponseSuccess = GetErrorResponse[200]; |
252 | /** | 251 | /** |
253 | * @description | 252 | * @description |
254 | - * error | 253 | + * errorHtml |
255 | * @tags basic-error-controller | 254 | * @tags basic-error-controller |
256 | - * @produces * | 255 | + * @produces text/html |
257 | */ | 256 | */ |
258 | export const getError = /* #__PURE__ */ (() => { | 257 | export const getError = /* #__PURE__ */ (() => { |
259 | const method = 'get'; | 258 | const method = 'get'; |
@@ -277,9 +276,7 @@ export interface PutErrorResponse { | @@ -277,9 +276,7 @@ export interface PutErrorResponse { | ||
277 | * @description | 276 | * @description |
278 | * OK | 277 | * OK |
279 | */ | 278 | */ |
280 | - 200: { | ||
281 | - [propertyName: string]: any; | ||
282 | - }; | 279 | + 200: ModelAndView; |
283 | /** | 280 | /** |
284 | * @description | 281 | * @description |
285 | * Created | 282 | * Created |
@@ -305,9 +302,9 @@ export interface PutErrorResponse { | @@ -305,9 +302,9 @@ export interface PutErrorResponse { | ||
305 | export type PutErrorResponseSuccess = PutErrorResponse[200]; | 302 | export type PutErrorResponseSuccess = PutErrorResponse[200]; |
306 | /** | 303 | /** |
307 | * @description | 304 | * @description |
308 | - * error | 305 | + * errorHtml |
309 | * @tags basic-error-controller | 306 | * @tags basic-error-controller |
310 | - * @produces * | 307 | + * @produces text/html |
311 | * @consumes application/json | 308 | * @consumes application/json |
312 | */ | 309 | */ |
313 | export const putError = /* #__PURE__ */ (() => { | 310 | export const putError = /* #__PURE__ */ (() => { |
@@ -332,9 +329,7 @@ export interface PostErrorResponse { | @@ -332,9 +329,7 @@ export interface PostErrorResponse { | ||
332 | * @description | 329 | * @description |
333 | * OK | 330 | * OK |
334 | */ | 331 | */ |
335 | - 200: { | ||
336 | - [propertyName: string]: any; | ||
337 | - }; | 332 | + 200: ModelAndView; |
338 | /** | 333 | /** |
339 | * @description | 334 | * @description |
340 | * Created | 335 | * Created |
@@ -360,9 +355,9 @@ export interface PostErrorResponse { | @@ -360,9 +355,9 @@ export interface PostErrorResponse { | ||
360 | export type PostErrorResponseSuccess = PostErrorResponse[200]; | 355 | export type PostErrorResponseSuccess = PostErrorResponse[200]; |
361 | /** | 356 | /** |
362 | * @description | 357 | * @description |
363 | - * error | 358 | + * errorHtml |
364 | * @tags basic-error-controller | 359 | * @tags basic-error-controller |
365 | - * @produces * | 360 | + * @produces text/html |
366 | * @consumes application/json | 361 | * @consumes application/json |
367 | */ | 362 | */ |
368 | export const postError = /* #__PURE__ */ (() => { | 363 | export const postError = /* #__PURE__ */ (() => { |
@@ -387,9 +382,7 @@ export interface DeleteErrorResponse { | @@ -387,9 +382,7 @@ export interface DeleteErrorResponse { | ||
387 | * @description | 382 | * @description |
388 | * OK | 383 | * OK |
389 | */ | 384 | */ |
390 | - 200: { | ||
391 | - [propertyName: string]: any; | ||
392 | - }; | 385 | + 200: ModelAndView; |
393 | /** | 386 | /** |
394 | * @description | 387 | * @description |
395 | * No Content | 388 | * No Content |
@@ -410,9 +403,9 @@ export interface DeleteErrorResponse { | @@ -410,9 +403,9 @@ export interface DeleteErrorResponse { | ||
410 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; | 403 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; |
411 | /** | 404 | /** |
412 | * @description | 405 | * @description |
413 | - * error | 406 | + * errorHtml |
414 | * @tags basic-error-controller | 407 | * @tags basic-error-controller |
415 | - * @produces * | 408 | + * @produces text/html |
416 | */ | 409 | */ |
417 | export const deleteError = /* #__PURE__ */ (() => { | 410 | export const deleteError = /* #__PURE__ */ (() => { |
418 | const method = 'delete'; | 411 | const method = 'delete'; |
@@ -436,9 +429,7 @@ export interface OptionsErrorResponse { | @@ -436,9 +429,7 @@ export interface OptionsErrorResponse { | ||
436 | * @description | 429 | * @description |
437 | * OK | 430 | * OK |
438 | */ | 431 | */ |
439 | - 200: { | ||
440 | - [propertyName: string]: any; | ||
441 | - }; | 432 | + 200: ModelAndView; |
442 | /** | 433 | /** |
443 | * @description | 434 | * @description |
444 | * No Content | 435 | * No Content |
@@ -459,9 +450,9 @@ export interface OptionsErrorResponse { | @@ -459,9 +450,9 @@ export interface OptionsErrorResponse { | ||
459 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; | 450 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; |
460 | /** | 451 | /** |
461 | * @description | 452 | * @description |
462 | - * error | 453 | + * errorHtml |
463 | * @tags basic-error-controller | 454 | * @tags basic-error-controller |
464 | - * @produces * | 455 | + * @produces text/html |
465 | * @consumes application/json | 456 | * @consumes application/json |
466 | */ | 457 | */ |
467 | export const optionsError = /* #__PURE__ */ (() => { | 458 | export const optionsError = /* #__PURE__ */ (() => { |
@@ -486,9 +477,7 @@ export interface HeadErrorResponse { | @@ -486,9 +477,7 @@ export interface HeadErrorResponse { | ||
486 | * @description | 477 | * @description |
487 | * OK | 478 | * OK |
488 | */ | 479 | */ |
489 | - 200: { | ||
490 | - [propertyName: string]: any; | ||
491 | - }; | 480 | + 200: ModelAndView; |
492 | /** | 481 | /** |
493 | * @description | 482 | * @description |
494 | * No Content | 483 | * No Content |
@@ -509,9 +498,9 @@ export interface HeadErrorResponse { | @@ -509,9 +498,9 @@ export interface HeadErrorResponse { | ||
509 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; | 498 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; |
510 | /** | 499 | /** |
511 | * @description | 500 | * @description |
512 | - * error | 501 | + * errorHtml |
513 | * @tags basic-error-controller | 502 | * @tags basic-error-controller |
514 | - * @produces * | 503 | + * @produces text/html |
515 | * @consumes application/json | 504 | * @consumes application/json |
516 | */ | 505 | */ |
517 | export const headError = /* #__PURE__ */ (() => { | 506 | export const headError = /* #__PURE__ */ (() => { |
@@ -536,9 +525,7 @@ export interface PatchErrorResponse { | @@ -536,9 +525,7 @@ export interface PatchErrorResponse { | ||
536 | * @description | 525 | * @description |
537 | * OK | 526 | * OK |
538 | */ | 527 | */ |
539 | - 200: { | ||
540 | - [propertyName: string]: any; | ||
541 | - }; | 528 | + 200: ModelAndView; |
542 | /** | 529 | /** |
543 | * @description | 530 | * @description |
544 | * No Content | 531 | * No Content |
@@ -559,9 +546,9 @@ export interface PatchErrorResponse { | @@ -559,9 +546,9 @@ export interface PatchErrorResponse { | ||
559 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; | 546 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; |
560 | /** | 547 | /** |
561 | * @description | 548 | * @description |
562 | - * error | 549 | + * errorHtml |
563 | * @tags basic-error-controller | 550 | * @tags basic-error-controller |
564 | - * @produces * | 551 | + * @produces text/html |
565 | * @consumes application/json | 552 | * @consumes application/json |
566 | */ | 553 | */ |
567 | export const patchError = /* #__PURE__ */ (() => { | 554 | export const patchError = /* #__PURE__ */ (() => { |
@@ -580,6 +567,54 @@ export const patchError = /* #__PURE__ */ (() => { | @@ -580,6 +567,54 @@ export const patchError = /* #__PURE__ */ (() => { | ||
580 | return request; | 567 | return request; |
581 | })(); | 568 | })(); |
582 | 569 | ||
570 | +/** @description response type for getKingdeeTestGetToken */ | ||
571 | +export interface GetKingdeeTestGetTokenResponse { | ||
572 | + /** | ||
573 | + * @description | ||
574 | + * OK | ||
575 | + */ | ||
576 | + 200: string; | ||
577 | + /** | ||
578 | + * @description | ||
579 | + * Unauthorized | ||
580 | + */ | ||
581 | + 401: any; | ||
582 | + /** | ||
583 | + * @description | ||
584 | + * Forbidden | ||
585 | + */ | ||
586 | + 403: any; | ||
587 | + /** | ||
588 | + * @description | ||
589 | + * Not Found | ||
590 | + */ | ||
591 | + 404: any; | ||
592 | +} | ||
593 | + | ||
594 | +export type GetKingdeeTestGetTokenResponseSuccess = | ||
595 | + GetKingdeeTestGetTokenResponse[200]; | ||
596 | +/** | ||
597 | + * @description | ||
598 | + * getToken | ||
599 | + * @tags kingdee-test-controller | ||
600 | + * @produces * | ||
601 | + */ | ||
602 | +export const getKingdeeTestGetToken = /* #__PURE__ */ (() => { | ||
603 | + const method = 'get'; | ||
604 | + const url = '/kingdee/test/getToken'; | ||
605 | + function request(): Promise<GetKingdeeTestGetTokenResponseSuccess> { | ||
606 | + return requester(request.url, { | ||
607 | + method: request.method, | ||
608 | + }) as unknown as Promise<GetKingdeeTestGetTokenResponseSuccess>; | ||
609 | + } | ||
610 | + | ||
611 | + /** http method */ | ||
612 | + request.method = method; | ||
613 | + /** request url */ | ||
614 | + request.url = url; | ||
615 | + return request; | ||
616 | +})(); | ||
617 | + | ||
583 | /** @description request parameter type for postOfficialWebsiteUploadAliOss */ | 618 | /** @description request parameter type for postOfficialWebsiteUploadAliOss */ |
584 | export interface PostOfficialWebsiteUploadAliOssOption { | 619 | export interface PostOfficialWebsiteUploadAliOssOption { |
585 | /** | 620 | /** |
@@ -5858,18 +5893,13 @@ export const postServiceOrderInvoicing = /* #__PURE__ */ (() => { | @@ -5858,18 +5893,13 @@ export const postServiceOrderInvoicing = /* #__PURE__ */ (() => { | ||
5858 | export interface PostServiceOrderMergeApplyInvoicingOption { | 5893 | export interface PostServiceOrderMergeApplyInvoicingOption { |
5859 | /** | 5894 | /** |
5860 | * @description | 5895 | * @description |
5861 | - * 销售发起开票备注 | 5896 | + * dto |
5862 | */ | 5897 | */ |
5863 | - query?: { | ||
5864 | - /** | ||
5865 | - @description | ||
5866 | - 销售发起开票备注 */ | ||
5867 | - applyInvoicingNotes?: string; | ||
5868 | - 'filePaths[0].url'?: string; | 5898 | + body: { |
5869 | /** | 5899 | /** |
5870 | @description | 5900 | @description |
5871 | - 主订单id集合 */ | ||
5872 | - mainOrderIds?: Array<number>; | 5901 | + dto */ |
5902 | + dto: Dto; | ||
5873 | }; | 5903 | }; |
5874 | } | 5904 | } |
5875 | 5905 | ||
@@ -5915,7 +5945,7 @@ export const postServiceOrderMergeApplyInvoicing = /* #__PURE__ */ (() => { | @@ -5915,7 +5945,7 @@ export const postServiceOrderMergeApplyInvoicing = /* #__PURE__ */ (() => { | ||
5915 | const method = 'post'; | 5945 | const method = 'post'; |
5916 | const url = '/service/order/mergeApplyInvoicing'; | 5946 | const url = '/service/order/mergeApplyInvoicing'; |
5917 | function request( | 5947 | function request( |
5918 | - option?: PostServiceOrderMergeApplyInvoicingOption, | 5948 | + option: PostServiceOrderMergeApplyInvoicingOption, |
5919 | ): Promise<PostServiceOrderMergeApplyInvoicingResponseSuccess> { | 5949 | ): Promise<PostServiceOrderMergeApplyInvoicingResponseSuccess> { |
5920 | return requester(request.url, { | 5950 | return requester(request.url, { |
5921 | method: request.method, | 5951 | method: request.method, |
@@ -5930,6 +5960,77 @@ export const postServiceOrderMergeApplyInvoicing = /* #__PURE__ */ (() => { | @@ -5930,6 +5960,77 @@ export const postServiceOrderMergeApplyInvoicing = /* #__PURE__ */ (() => { | ||
5930 | return request; | 5960 | return request; |
5931 | })(); | 5961 | })(); |
5932 | 5962 | ||
5963 | +/** @description request parameter type for postServiceOrderMergeInvoicing */ | ||
5964 | +export interface PostServiceOrderMergeInvoicingOption { | ||
5965 | + /** | ||
5966 | + * @description | ||
5967 | + * dto | ||
5968 | + */ | ||
5969 | + body: { | ||
5970 | + /** | ||
5971 | + @description | ||
5972 | + dto */ | ||
5973 | + dto: Dto; | ||
5974 | + }; | ||
5975 | +} | ||
5976 | + | ||
5977 | +/** @description response type for postServiceOrderMergeInvoicing */ | ||
5978 | +export interface PostServiceOrderMergeInvoicingResponse { | ||
5979 | + /** | ||
5980 | + * @description | ||
5981 | + * OK | ||
5982 | + */ | ||
5983 | + 200: ServerResult; | ||
5984 | + /** | ||
5985 | + * @description | ||
5986 | + * Created | ||
5987 | + */ | ||
5988 | + 201: any; | ||
5989 | + /** | ||
5990 | + * @description | ||
5991 | + * Unauthorized | ||
5992 | + */ | ||
5993 | + 401: any; | ||
5994 | + /** | ||
5995 | + * @description | ||
5996 | + * Forbidden | ||
5997 | + */ | ||
5998 | + 403: any; | ||
5999 | + /** | ||
6000 | + * @description | ||
6001 | + * Not Found | ||
6002 | + */ | ||
6003 | + 404: any; | ||
6004 | +} | ||
6005 | + | ||
6006 | +export type PostServiceOrderMergeInvoicingResponseSuccess = | ||
6007 | + PostServiceOrderMergeInvoicingResponse[200]; | ||
6008 | +/** | ||
6009 | + * @description | ||
6010 | + * 财务合并开票 | ||
6011 | + * @tags 内部订单 | ||
6012 | + * @produces * | ||
6013 | + * @consumes application/json | ||
6014 | + */ | ||
6015 | +export const postServiceOrderMergeInvoicing = /* #__PURE__ */ (() => { | ||
6016 | + const method = 'post'; | ||
6017 | + const url = '/service/order/mergeInvoicing'; | ||
6018 | + function request( | ||
6019 | + option: PostServiceOrderMergeInvoicingOption, | ||
6020 | + ): Promise<PostServiceOrderMergeInvoicingResponseSuccess> { | ||
6021 | + return requester(request.url, { | ||
6022 | + method: request.method, | ||
6023 | + ...option, | ||
6024 | + }) as unknown as Promise<PostServiceOrderMergeInvoicingResponseSuccess>; | ||
6025 | + } | ||
6026 | + | ||
6027 | + /** http method */ | ||
6028 | + request.method = method; | ||
6029 | + /** request url */ | ||
6030 | + request.url = url; | ||
6031 | + return request; | ||
6032 | +})(); | ||
6033 | + | ||
5933 | /** @description request parameter type for postServiceOrderNoNeedInvoicingEdit */ | 6034 | /** @description request parameter type for postServiceOrderNoNeedInvoicingEdit */ |
5934 | export interface PostServiceOrderNoNeedInvoicingEditOption { | 6035 | export interface PostServiceOrderNoNeedInvoicingEditOption { |
5935 | /** | 6036 | /** |