Commit 6fda7d6ad4df62af576119dbe1e39d01d107b41b
1 parent
a45593e0
feat: 手动开票
Showing
1 changed file
with
133 additions
and
19 deletions
src/pages/Order/OrderList/ApplyForInvoicingModal.tsx
1 | 1 | import { RESPONSE_CODE } from '@/constants/enum'; |
2 | -import { postServiceOrderApplyInvoicing } from '@/services'; | |
2 | +import { | |
3 | + postServiceOrderApplyInvoicing, | |
4 | + postServiceOrderQueryServiceOrder, | |
5 | +} from '@/services'; | |
3 | 6 | import { FloatAdd, enumToSelect, getAliYunOSSFileNameFromUrl } from '@/utils'; |
4 | 7 | import { |
5 | 8 | ModalForm, |
... | ... | @@ -36,6 +39,7 @@ export default ({ |
36 | 39 | const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< |
37 | 40 | SelectOption[] |
38 | 41 | >([]); |
42 | + const [additionalMainOrders, setAdditionalMainOrders] = useState<any[]>([]); | |
39 | 43 | |
40 | 44 | let ids = subOrders?.map((item) => { |
41 | 45 | return item.id; |
... | ... | @@ -49,13 +53,46 @@ export default ({ |
49 | 53 | availableAmount: number; |
50 | 54 | } |
51 | 55 | |
56 | + // 解析输入框内容,识别格式如 "23123,2507310003" | |
57 | + const parseInputContent = (content: string): string[] => { | |
58 | + if (!content) return []; | |
59 | + return content | |
60 | + .split(',') | |
61 | + .map((id) => id.trim()) | |
62 | + .filter((id) => id); | |
63 | + }; | |
64 | + | |
65 | + // 查询未选择的订单数据 | |
66 | + const queryMissingOrders = async (missingIds: string[]) => { | |
67 | + try { | |
68 | + const { data } = await postServiceOrderQueryServiceOrder({ | |
69 | + // @ts-ignore | |
70 | + data: { | |
71 | + current: 1, | |
72 | + pageSize: 10, | |
73 | + id: missingIds, | |
74 | + condition: 0, | |
75 | + sorted: false, | |
76 | + isDeleteQueryOrder: false, | |
77 | + }, | |
78 | + }); | |
79 | + | |
80 | + if (data?.data) { | |
81 | + setAdditionalMainOrders(data.data); | |
82 | + } | |
83 | + } catch (error) { | |
84 | + console.error('查询订单失败:', error); | |
85 | + message.error('查询订单数据失败'); | |
86 | + } | |
87 | + }; | |
88 | + | |
52 | 89 | // 获取唯一的主订单ID及其相关金额信息 |
53 | 90 | const getUniqueMainOrderIds = (): MainOrderData[] => { |
54 | 91 | console.log(subOrders, mainOrders); |
55 | 92 | const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); |
56 | 93 | const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); |
57 | 94 | |
58 | - return uniqueIds.map((id) => { | |
95 | + const result = uniqueIds.map((id) => { | |
59 | 96 | // 获取该主订单的数据 |
60 | 97 | const mainOrder = mainOrders |
61 | 98 | ? mainOrders.find((item: any) => item.id === id) |
... | ... | @@ -97,6 +134,19 @@ export default ({ |
97 | 134 | availableAmount, |
98 | 135 | }; |
99 | 136 | }); |
137 | + | |
138 | + // 添加额外查询到的订单数据 | |
139 | + const additionalOrders = additionalMainOrders.map((order) => ({ | |
140 | + value: String(order.id), | |
141 | + totalPayment: order.totalPayment || 0, | |
142 | + invoiceIssuedAmount: order.invoiceIssuedAmount || 0, | |
143 | + availableAmount: Math.max( | |
144 | + 0, | |
145 | + (order.totalPayment || 0) - (order.invoiceIssuedAmount || 0), | |
146 | + ), | |
147 | + })); | |
148 | + | |
149 | + return [...result, ...additionalOrders]; | |
100 | 150 | }; |
101 | 151 | |
102 | 152 | let mainIdSet = new Set(); |
... | ... | @@ -134,23 +184,54 @@ export default ({ |
134 | 184 | invoiceType: string; // 新增发票类型字段 |
135 | 185 | }>(); |
136 | 186 | |
187 | + // 处理备注内容变化 | |
188 | + const handleNotesChange = async (value: string) => { | |
189 | + const inputIds = parseInputContent(value); | |
190 | + const selectedMainOrderIds = Array.from(mainIdSet).map((id) => String(id)); | |
191 | + | |
192 | + console.log('输入的订单ID:', inputIds); | |
193 | + console.log('已选择的主订单ID:', selectedMainOrderIds); | |
194 | + | |
195 | + // 找出输入框中存在但未选择的订单ID | |
196 | + const missingIds = inputIds.filter( | |
197 | + (id) => !selectedMainOrderIds.includes(id), | |
198 | + ); | |
199 | + | |
200 | + console.log('缺失的订单ID:', missingIds); | |
201 | + | |
202 | + if (missingIds.length > 0) { | |
203 | + await queryMissingOrders(missingIds); | |
204 | + } else { | |
205 | + // 如果没有缺失的订单,清空额外的订单数据 | |
206 | + setAdditionalMainOrders([]); | |
207 | + } | |
208 | + }; | |
209 | + | |
137 | 210 | useEffect(() => { |
138 | 211 | //显示拼接的主订单id |
139 | 212 | form.setFieldValue('applyInvoicingNotes', mainIds); |
140 | 213 | |
141 | - // 设置每个主订单的可开票金额初始值 | |
214 | + // 转换收款单位选项并保存 | |
215 | + const options = enumToSelect(PAYEE_OPTIONS); | |
216 | + setReceivingCompanyOptions(options); | |
217 | + }, []); | |
218 | + | |
219 | + useEffect(() => { | |
220 | + // 当额外的主订单数据变化时,设置可开票金额初始值 | |
142 | 221 | const mainOrders = getUniqueMainOrderIds(); |
143 | 222 | mainOrders.forEach((order) => { |
144 | - form.setFieldValue( | |
223 | + // 只为新添加的订单设置初始值,避免覆盖用户已输入的值 | |
224 | + const currentValue = form.getFieldValue( | |
145 | 225 | `invoiceAvailableAmount_${order.value}`, |
146 | - order.availableAmount, | |
147 | 226 | ); |
227 | + if (currentValue === undefined || currentValue === null) { | |
228 | + form.setFieldValue( | |
229 | + `invoiceAvailableAmount_${order.value}`, | |
230 | + order.availableAmount, | |
231 | + ); | |
232 | + } | |
148 | 233 | }); |
149 | - | |
150 | - // 转换收款单位选项并保存 | |
151 | - const options = enumToSelect(PAYEE_OPTIONS); | |
152 | - setReceivingCompanyOptions(options); | |
153 | - }, []); | |
234 | + }, [additionalMainOrders]); | |
154 | 235 | |
155 | 236 | return ( |
156 | 237 | <ModalForm<{ |
... | ... | @@ -180,7 +261,26 @@ export default ({ |
180 | 261 | }} |
181 | 262 | submitTimeout={2000} |
182 | 263 | onFinish={async (values) => { |
183 | - values.subIds = ids; | |
264 | + // 收集所有相关的子订单ID,包括额外查询到的主订单下的子订单 | |
265 | + const allSubIds = [...ids]; // 原始选择的子订单ID | |
266 | + | |
267 | + console.log('原始子订单ID:', ids); | |
268 | + console.log('额外查询的主订单:', additionalMainOrders); | |
269 | + | |
270 | + // 添加额外查询到的主订单下的子订单ID | |
271 | + additionalMainOrders.forEach((mainOrder: any) => { | |
272 | + if (mainOrder.subOrderInformationLists) { | |
273 | + mainOrder.subOrderInformationLists.forEach((subOrder: any) => { | |
274 | + if (subOrder.id && !allSubIds.includes(subOrder.id)) { | |
275 | + console.log('添加子订单ID:', subOrder.id); | |
276 | + allSubIds.push(subOrder.id); | |
277 | + } | |
278 | + }); | |
279 | + } | |
280 | + }); | |
281 | + | |
282 | + console.log('最终子订单ID列表:', allSubIds); | |
283 | + values.subIds = allSubIds; | |
184 | 284 | //附件处理 |
185 | 285 | values.filePaths = values.filePaths?.map((item) => { |
186 | 286 | return { url: item.response.data[0] }; |
... | ... | @@ -216,11 +316,16 @@ export default ({ |
216 | 316 | ); |
217 | 317 | const receivingCompanyName = selectedOption ? selectedOption.label : ''; |
218 | 318 | |
319 | + // 构建包含所有订单的mainOrderIds字符串 | |
320 | + const allMainOrderIds = getUniqueMainOrderIds() | |
321 | + .map((item) => item.value) | |
322 | + .join(','); | |
323 | + | |
219 | 324 | // 添加到请求数据中 |
220 | 325 | const reqData = { |
221 | 326 | ...values, |
222 | 327 | receivingCompanyName, // 添加收款单位名称 |
223 | - mainOrderIds: mainIds, // 使用已有的主订单ID字符串 | |
328 | + mainOrderIds: allMainOrderIds, // 使用包含所有订单的ID字符串 | |
224 | 329 | invoiceOrderAmounts, |
225 | 330 | }; |
226 | 331 | const res = await postServiceOrderApplyInvoicing({ data: reqData }); |
... | ... | @@ -253,6 +358,12 @@ export default ({ |
253 | 358 | 0, |
254 | 359 | item.totalPayment - item.invoiceIssuedAmount, |
255 | 360 | ); |
361 | + | |
362 | + // 检查是否是额外查询到的订单 | |
363 | + const isAdditionalOrder = additionalMainOrders.some( | |
364 | + (order) => String(order.id) === String(item.value), | |
365 | + ); | |
366 | + | |
256 | 367 | return ( |
257 | 368 | <div |
258 | 369 | key={index} |
... | ... | @@ -261,9 +372,15 @@ export default ({ |
261 | 372 | marginBottom: 8, |
262 | 373 | padding: '8px 0', |
263 | 374 | borderBottom: '1px solid #f0f0f0', |
375 | + backgroundColor: isAdditionalOrder ? '#f6ffed' : 'transparent', // 浅绿色背景表示新查询的订单 | |
376 | + border: isAdditionalOrder ? '1px solid #b7eb8f' : 'none', | |
377 | + borderRadius: isAdditionalOrder ? '4px' : '0', | |
264 | 378 | }} |
265 | 379 | > |
266 | - <div style={{ flex: 25 }}>{item.value}</div> | |
380 | + <div style={{ flex: 25 }}> | |
381 | + {item.value} | |
382 | + {isAdditionalOrder} | |
383 | + </div> | |
267 | 384 | <div style={{ flex: 18, textAlign: 'right' }}> |
268 | 385 | ¥ {item.totalPayment.toFixed(2)} |
269 | 386 | </div> |
... | ... | @@ -309,12 +426,9 @@ export default ({ |
309 | 426 | name="applyInvoicingNotes" |
310 | 427 | key="applyInvoicingNotes" |
311 | 428 | placeholder="请输入备注" |
312 | - onMetaChange={(val) => { | |
313 | - console.log(val); | |
314 | - }} | |
315 | - proFieldProps={{ | |
316 | - onchange: () => { | |
317 | - message.info('change'); | |
429 | + fieldProps={{ | |
430 | + onChange: (e) => { | |
431 | + handleNotesChange(e.target.value); | |
318 | 432 | }, |
319 | 433 | }} |
320 | 434 | /> | ... | ... |