Commit 6fda7d6ad4df62af576119dbe1e39d01d107b41b
1 parent
a45593e0
feat: 手动开票
Showing
1 changed file
with
133 additions
and
19 deletions
src/pages/Order/OrderList/ApplyForInvoicingModal.tsx
1 | import { RESPONSE_CODE } from '@/constants/enum'; | 1 | import { RESPONSE_CODE } from '@/constants/enum'; |
2 | -import { postServiceOrderApplyInvoicing } from '@/services'; | 2 | +import { |
3 | + postServiceOrderApplyInvoicing, | ||
4 | + postServiceOrderQueryServiceOrder, | ||
5 | +} from '@/services'; | ||
3 | import { FloatAdd, enumToSelect, getAliYunOSSFileNameFromUrl } from '@/utils'; | 6 | import { FloatAdd, enumToSelect, getAliYunOSSFileNameFromUrl } from '@/utils'; |
4 | import { | 7 | import { |
5 | ModalForm, | 8 | ModalForm, |
@@ -36,6 +39,7 @@ export default ({ | @@ -36,6 +39,7 @@ export default ({ | ||
36 | const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< | 39 | const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< |
37 | SelectOption[] | 40 | SelectOption[] |
38 | >([]); | 41 | >([]); |
42 | + const [additionalMainOrders, setAdditionalMainOrders] = useState<any[]>([]); | ||
39 | 43 | ||
40 | let ids = subOrders?.map((item) => { | 44 | let ids = subOrders?.map((item) => { |
41 | return item.id; | 45 | return item.id; |
@@ -49,13 +53,46 @@ export default ({ | @@ -49,13 +53,46 @@ export default ({ | ||
49 | availableAmount: number; | 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 | // 获取唯一的主订单ID及其相关金额信息 | 89 | // 获取唯一的主订单ID及其相关金额信息 |
53 | const getUniqueMainOrderIds = (): MainOrderData[] => { | 90 | const getUniqueMainOrderIds = (): MainOrderData[] => { |
54 | console.log(subOrders, mainOrders); | 91 | console.log(subOrders, mainOrders); |
55 | const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); | 92 | const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); |
56 | const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); | 93 | const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); |
57 | 94 | ||
58 | - return uniqueIds.map((id) => { | 95 | + const result = uniqueIds.map((id) => { |
59 | // 获取该主订单的数据 | 96 | // 获取该主订单的数据 |
60 | const mainOrder = mainOrders | 97 | const mainOrder = mainOrders |
61 | ? mainOrders.find((item: any) => item.id === id) | 98 | ? mainOrders.find((item: any) => item.id === id) |
@@ -97,6 +134,19 @@ export default ({ | @@ -97,6 +134,19 @@ export default ({ | ||
97 | availableAmount, | 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 | let mainIdSet = new Set(); | 152 | let mainIdSet = new Set(); |
@@ -134,23 +184,54 @@ export default ({ | @@ -134,23 +184,54 @@ export default ({ | ||
134 | invoiceType: string; // 新增发票类型字段 | 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 | useEffect(() => { | 210 | useEffect(() => { |
138 | //显示拼接的主订单id | 211 | //显示拼接的主订单id |
139 | form.setFieldValue('applyInvoicingNotes', mainIds); | 212 | form.setFieldValue('applyInvoicingNotes', mainIds); |
140 | 213 | ||
141 | - // 设置每个主订单的可开票金额初始值 | 214 | + // 转换收款单位选项并保存 |
215 | + const options = enumToSelect(PAYEE_OPTIONS); | ||
216 | + setReceivingCompanyOptions(options); | ||
217 | + }, []); | ||
218 | + | ||
219 | + useEffect(() => { | ||
220 | + // 当额外的主订单数据变化时,设置可开票金额初始值 | ||
142 | const mainOrders = getUniqueMainOrderIds(); | 221 | const mainOrders = getUniqueMainOrderIds(); |
143 | mainOrders.forEach((order) => { | 222 | mainOrders.forEach((order) => { |
144 | - form.setFieldValue( | 223 | + // 只为新添加的订单设置初始值,避免覆盖用户已输入的值 |
224 | + const currentValue = form.getFieldValue( | ||
145 | `invoiceAvailableAmount_${order.value}`, | 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 | return ( | 236 | return ( |
156 | <ModalForm<{ | 237 | <ModalForm<{ |
@@ -180,7 +261,26 @@ export default ({ | @@ -180,7 +261,26 @@ export default ({ | ||
180 | }} | 261 | }} |
181 | submitTimeout={2000} | 262 | submitTimeout={2000} |
182 | onFinish={async (values) => { | 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 | values.filePaths = values.filePaths?.map((item) => { | 285 | values.filePaths = values.filePaths?.map((item) => { |
186 | return { url: item.response.data[0] }; | 286 | return { url: item.response.data[0] }; |
@@ -216,11 +316,16 @@ export default ({ | @@ -216,11 +316,16 @@ export default ({ | ||
216 | ); | 316 | ); |
217 | const receivingCompanyName = selectedOption ? selectedOption.label : ''; | 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 | const reqData = { | 325 | const reqData = { |
221 | ...values, | 326 | ...values, |
222 | receivingCompanyName, // 添加收款单位名称 | 327 | receivingCompanyName, // 添加收款单位名称 |
223 | - mainOrderIds: mainIds, // 使用已有的主订单ID字符串 | 328 | + mainOrderIds: allMainOrderIds, // 使用包含所有订单的ID字符串 |
224 | invoiceOrderAmounts, | 329 | invoiceOrderAmounts, |
225 | }; | 330 | }; |
226 | const res = await postServiceOrderApplyInvoicing({ data: reqData }); | 331 | const res = await postServiceOrderApplyInvoicing({ data: reqData }); |
@@ -253,6 +358,12 @@ export default ({ | @@ -253,6 +358,12 @@ export default ({ | ||
253 | 0, | 358 | 0, |
254 | item.totalPayment - item.invoiceIssuedAmount, | 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 | return ( | 367 | return ( |
257 | <div | 368 | <div |
258 | key={index} | 369 | key={index} |
@@ -261,9 +372,15 @@ export default ({ | @@ -261,9 +372,15 @@ export default ({ | ||
261 | marginBottom: 8, | 372 | marginBottom: 8, |
262 | padding: '8px 0', | 373 | padding: '8px 0', |
263 | borderBottom: '1px solid #f0f0f0', | 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 | <div style={{ flex: 18, textAlign: 'right' }}> | 384 | <div style={{ flex: 18, textAlign: 'right' }}> |
268 | ¥ {item.totalPayment.toFixed(2)} | 385 | ¥ {item.totalPayment.toFixed(2)} |
269 | </div> | 386 | </div> |
@@ -309,12 +426,9 @@ export default ({ | @@ -309,12 +426,9 @@ export default ({ | ||
309 | name="applyInvoicingNotes" | 426 | name="applyInvoicingNotes" |
310 | key="applyInvoicingNotes" | 427 | key="applyInvoicingNotes" |
311 | placeholder="请输入备注" | 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 | /> |