Commit ca07bc320f88cce48a5b09bd90d67551fee59198
1 parent
108b2671
feat: 开票弹窗
Showing
5 changed files
with
55 additions
and
19 deletions
src/pages/Invoice/waitProcessRecord/index.tsx
@@ -459,15 +459,12 @@ const InvoiceRecord = () => { | @@ -459,15 +459,12 @@ const InvoiceRecord = () => { | ||
459 | render: (_, record) => { | 459 | render: (_, record) => { |
460 | if (record.filePaths && record.filePaths.length > 0) { | 460 | if (record.filePaths && record.filePaths.length > 0) { |
461 | return record.filePaths.map((item) => { | 461 | return record.filePaths.map((item) => { |
462 | - // Extract filename from URL | ||
463 | const url = item; | 462 | const url = item; |
464 | const filenameMatch = url.match(/\/([^/]+)\?/); | 463 | const filenameMatch = url.match(/\/([^/]+)\?/); |
465 | const filename = filenameMatch ? filenameMatch[1] : 'file'; | 464 | const filename = filenameMatch ? filenameMatch[1] : 'file'; |
466 | 465 | ||
467 | - // Decode the filename to handle URL encoding | ||
468 | const decodedFilename = decodeURIComponent(filename); | 466 | const decodedFilename = decodeURIComponent(filename); |
469 | 467 | ||
470 | - // Get the clean filename without timestamp prefix if present | ||
471 | const cleanFilename = decodedFilename.replace(/^\d+-\d+-/, ''); | 468 | const cleanFilename = decodedFilename.replace(/^\d+-\d+-/, ''); |
472 | 469 | ||
473 | return ( | 470 | return ( |
src/pages/Order/OrderList/ApplyForInvoicingModal.tsx
@@ -19,7 +19,19 @@ interface SelectOption { | @@ -19,7 +19,19 @@ interface SelectOption { | ||
19 | value: string; | 19 | value: string; |
20 | } | 20 | } |
21 | 21 | ||
22 | -export default ({ setCheckVisible, isEdit, subOrders, onClose }) => { | 22 | +export default ({ |
23 | + setCheckVisible, | ||
24 | + isEdit, | ||
25 | + subOrders, | ||
26 | + mainOrders, | ||
27 | + onClose, | ||
28 | +}: { | ||
29 | + setCheckVisible: (val: boolean) => void; | ||
30 | + isEdit?: boolean; | ||
31 | + subOrders: any[]; | ||
32 | + mainOrders: any[]; | ||
33 | + onClose: () => void; | ||
34 | +}) => { | ||
23 | const [isUrgent, setIsUrgent] = useState(''); | 35 | const [isUrgent, setIsUrgent] = useState(''); |
24 | const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< | 36 | const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< |
25 | SelectOption[] | 37 | SelectOption[] |
@@ -39,29 +51,41 @@ export default ({ setCheckVisible, isEdit, subOrders, onClose }) => { | @@ -39,29 +51,41 @@ export default ({ setCheckVisible, isEdit, subOrders, onClose }) => { | ||
39 | 51 | ||
40 | // 获取唯一的主订单ID及其相关金额信息 | 52 | // 获取唯一的主订单ID及其相关金额信息 |
41 | const getUniqueMainOrderIds = (): MainOrderData[] => { | 53 | const getUniqueMainOrderIds = (): MainOrderData[] => { |
54 | + console.log(subOrders, mainOrders); | ||
42 | const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); | 55 | const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); |
43 | const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); | 56 | const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); |
44 | 57 | ||
45 | return uniqueIds.map((id) => { | 58 | return uniqueIds.map((id) => { |
59 | + // 获取该主订单的数据 | ||
60 | + const mainOrder = mainOrders | ||
61 | + ? mainOrders.find((item: any) => item.id === id) | ||
62 | + : null; | ||
63 | + | ||
46 | // 获取该主订单下所有子订单 | 64 | // 获取该主订单下所有子订单 |
47 | const orderSubOrders = subOrders.filter( | 65 | const orderSubOrders = subOrders.filter( |
48 | (item: any) => item.mainOrderId === id, | 66 | (item: any) => item.mainOrderId === id, |
49 | ); | 67 | ); |
50 | 68 | ||
51 | // 计算该主订单的总金额 | 69 | // 计算该主订单的总金额 |
52 | - let totalPayment = 0; | ||
53 | - orderSubOrders.forEach((item: any) => { | ||
54 | - totalPayment = FloatAdd(totalPayment, item.totalPayment || 0); | ||
55 | - }); | 70 | + let totalPayment = mainOrder ? mainOrder.totalPayment : 0; |
71 | + if (!totalPayment) { | ||
72 | + orderSubOrders.forEach((item: any) => { | ||
73 | + totalPayment = FloatAdd(totalPayment, item.totalPayment || 0); | ||
74 | + }); | ||
75 | + } | ||
56 | 76 | ||
57 | // 计算已开票金额(如果有的话) | 77 | // 计算已开票金额(如果有的话) |
58 | - let invoiceIssuedAmount = 0; | ||
59 | - orderSubOrders.forEach((item: any) => { | ||
60 | - invoiceIssuedAmount = FloatAdd( | ||
61 | - invoiceIssuedAmount, | ||
62 | - item.invoiceIssuedAmount || 0, | ||
63 | - ); | ||
64 | - }); | 78 | + let invoiceIssuedAmount = mainOrder |
79 | + ? mainOrder.invoiceIssuedAmount || 0 | ||
80 | + : 0; | ||
81 | + if (!invoiceIssuedAmount) { | ||
82 | + orderSubOrders.forEach((item: any) => { | ||
83 | + invoiceIssuedAmount = FloatAdd( | ||
84 | + invoiceIssuedAmount, | ||
85 | + item.invoiceIssuedAmount || 0, | ||
86 | + ); | ||
87 | + }); | ||
88 | + } | ||
65 | 89 | ||
66 | // 计算可开票金额 | 90 | // 计算可开票金额 |
67 | const availableAmount = Math.max(0, totalPayment - invoiceIssuedAmount); | 91 | const availableAmount = Math.max(0, totalPayment - invoiceIssuedAmount); |
src/pages/Order/OrderList/OrderDrawer.tsx
@@ -396,7 +396,18 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | @@ -396,7 +396,18 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
396 | */ | 396 | */ |
397 | function getInvoicingSelect() { | 397 | function getInvoicingSelect() { |
398 | if (optType('edit') || optType('after-sales-check')) { | 398 | if (optType('edit') || optType('after-sales-check')) { |
399 | - return enumToSelect(INVOCING_STATUS_OPTIONS_OLD); | 399 | + const options = enumToSelect(INVOCING_STATUS_OPTIONS_OLD); |
400 | + | ||
401 | + // 永远禁止选择专票和普票,但保留这些选项用于显示历史数据 | ||
402 | + return options.map((option: any) => { | ||
403 | + if ( | ||
404 | + option.value === 'SPECIALLY_INVOICED' || | ||
405 | + option.value === 'COMMON_INVOICED' | ||
406 | + ) { | ||
407 | + return { ...option, disabled: true }; | ||
408 | + } | ||
409 | + return option; | ||
410 | + }); | ||
400 | } | 411 | } |
401 | return enumToSelect(INVOCING_STATUS_OPTIONS); | 412 | return enumToSelect(INVOCING_STATUS_OPTIONS); |
402 | } | 413 | } |
@@ -2158,7 +2169,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | @@ -2158,7 +2169,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
2158 | placeholder="选择是否需要开票" | 2169 | placeholder="选择是否需要开票" |
2159 | name="invoicingStatus" | 2170 | name="invoicingStatus" |
2160 | width="lg" | 2171 | width="lg" |
2161 | - key="invoicingStatus" | 2172 | + key={`invoicingStatus-${invoicingStatus}`} |
2162 | label="是否需要开票" | 2173 | label="是否需要开票" |
2163 | options={getInvoicingSelect()} | 2174 | options={getInvoicingSelect()} |
2164 | disabled={optType('after-sales-check')} | 2175 | disabled={optType('after-sales-check')} |
src/pages/Order/OrderList/OrderList.tsx
@@ -5050,6 +5050,11 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | @@ -5050,6 +5050,11 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
5050 | ? [...subOrderSelectedMap.values()].flat() | 5050 | ? [...subOrderSelectedMap.values()].flat() |
5051 | : buildSubOrders() | 5051 | : buildSubOrders() |
5052 | } | 5052 | } |
5053 | + mainOrders={ | ||
5054 | + isMainOrder | ||
5055 | + ? [...mainOrderSelectedMap.values()] | ||
5056 | + : [buildMainOrder()] | ||
5057 | + } | ||
5053 | totalPayment={getApplyInvoicingTotalPayment()} | 5058 | totalPayment={getApplyInvoicingTotalPayment()} |
5054 | isMainOrder={isMainOrder} | 5059 | isMainOrder={isMainOrder} |
5055 | isEdit={isEdit} | 5060 | isEdit={isEdit} |
src/pages/Order/constant.ts
@@ -92,8 +92,7 @@ export const PROCURE_ORDER_STATUS = { | @@ -92,8 +92,7 @@ export const PROCURE_ORDER_STATUS = { | ||
92 | 92 | ||
93 | export const INVOCING_STATUS_OPTIONS = { | 93 | export const INVOCING_STATUS_OPTIONS = { |
94 | UN_INVOICE: '不需开票', | 94 | UN_INVOICE: '不需开票', |
95 | - SPECIALLY_INVOICED: '专票', | ||
96 | - COMMON_INVOICED: '普票', | 95 | + INVOICED: '需要开票', |
97 | }; | 96 | }; |
98 | 97 | ||
99 | export const INVOCING_STATUS = { | 98 | export const INVOCING_STATUS = { |