Commit 545177edf0b6405819a32a4512d7b2dc56094a85
Merge branch 'bugfix-0702' into 'master'
Bugfix 0702 See merge request !62
Showing
11 changed files
with
322 additions
and
44 deletions
src/pages/Order/FeedBack/OrderDrawer.tsx
... | ... | @@ -1492,7 +1492,19 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1492 | 1492 | onChange={(val: any) => { |
1493 | 1493 | setPaymentMethod(val); |
1494 | 1494 | }} |
1495 | - options={enumToSelect(PAYMENT_METHOD_OPTIONS)} | |
1495 | + options={(() => { | |
1496 | + // 使用Set记录已经处理过的选项值,避免重复 | |
1497 | + const processedValues = new Set(); | |
1498 | + const finalOptions = []; | |
1499 | + | |
1500 | + // 处理可选项 | |
1501 | + enumToSelect(PAYMENT_METHOD_OPTIONS).forEach((option) => { | |
1502 | + finalOptions.push(option); | |
1503 | + processedValues.add(option.value); | |
1504 | + }); | |
1505 | + | |
1506 | + return finalOptions; | |
1507 | + })()} | |
1496 | 1508 | rules={[{ required: true, message: '支付方式必填' }]} |
1497 | 1509 | disabled={optType('after-sales-check')} |
1498 | 1510 | /> | ... | ... |
src/pages/Order/FeedBack/constant.ts
... | ... | @@ -24,9 +24,10 @@ export const RECEIPTS_RECORD_TYPES = { |
24 | 24 | export const PAYMENT_METHOD_OPTIONS = { |
25 | 25 | UNPAID: '未付款', |
26 | 26 | TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款', |
27 | - OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID: '官网订单已付款', | |
28 | - PAYMENT_IN_ADVANCE: '预付款', | |
29 | - WITHHOLDING_ADVANCE_DEPOSIT: '扣预存', | |
27 | + OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID: '官网已付', | |
28 | + PAYMENT_IN_ADVANCE: '预付', | |
29 | + PAYMENT_IN_TAOBAO: '淘宝', | |
30 | + WITHHOLDING_ADVANCE_DEPOSIT: '预付', | |
30 | 31 | PLATFORM_SETTLEMENT: '平台结算', |
31 | 32 | CASH_ON_DELIVERY: '货到付款', |
32 | 33 | HIRE_PURCHASE: '分期付款', | ... | ... |
src/pages/Order/Order/components/OrderDrawer.tsx
... | ... | @@ -1501,7 +1501,19 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1501 | 1501 | onChange={(val: any) => { |
1502 | 1502 | setPaymentMethod(val); |
1503 | 1503 | }} |
1504 | - options={enumToSelect(PAYMENT_METHOD_OPTIONS)} | |
1504 | + options={(() => { | |
1505 | + // 使用Set记录已经处理过的选项值,避免重复 | |
1506 | + const processedValues = new Set(); | |
1507 | + const finalOptions = []; | |
1508 | + | |
1509 | + // 处理可选项 | |
1510 | + enumToSelect(PAYMENT_METHOD_OPTIONS).forEach((option) => { | |
1511 | + finalOptions.push(option); | |
1512 | + processedValues.add(option.value); | |
1513 | + }); | |
1514 | + | |
1515 | + return finalOptions; | |
1516 | + })()} | |
1505 | 1517 | rules={[{ required: true, message: '支付方式必填' }]} |
1506 | 1518 | disabled={optType('after-sales-check')} |
1507 | 1519 | /> | ... | ... |
src/pages/Order/OrderList/HirePurchaseUploadPayBillModal.tsx
... | ... | @@ -22,6 +22,14 @@ interface HirePurchaseUploadPayBillModalProps { |
22 | 22 | subOrders?: any[]; |
23 | 23 | } |
24 | 24 | |
25 | +// Helper function to display dash for empty values | |
26 | +// const displayValue = (value: any, formatter?: (val: any) => string): string => { | |
27 | +// if (value === null || value === undefined || value === '') { | |
28 | +// return '-'; | |
29 | +// } | |
30 | +// return formatter ? formatter(value) : String(value); | |
31 | +// }; | |
32 | + | |
25 | 33 | const HirePurchaseUploadPayBillModal: React.FC< |
26 | 34 | HirePurchaseUploadPayBillModalProps |
27 | 35 | > = ({ |
... | ... | @@ -309,7 +317,12 @@ const HirePurchaseUploadPayBillModal: React.FC< |
309 | 317 | }} |
310 | 318 | > |
311 | 319 | <span>订单总金额:</span> |
312 | - <span>{totalPayment.toFixed(2)}元</span> | |
320 | + <span> | |
321 | + {totalPayment !== null && totalPayment !== undefined | |
322 | + ? totalPayment.toFixed(2) | |
323 | + : '-'} | |
324 | + 元 | |
325 | + </span> | |
313 | 326 | </div> |
314 | 327 | <div |
315 | 328 | style={{ |
... | ... | @@ -319,7 +332,12 @@ const HirePurchaseUploadPayBillModal: React.FC< |
319 | 332 | }} |
320 | 333 | > |
321 | 334 | <span>已回款金额:</span> |
322 | - <span>{installedMoney.toFixed(2)}元</span> | |
335 | + <span> | |
336 | + {installedMoney !== null && installedMoney !== undefined | |
337 | + ? installedMoney.toFixed(2) | |
338 | + : '-'} | |
339 | + 元 | |
340 | + </span> | |
323 | 341 | </div> |
324 | 342 | <div |
325 | 343 | style={{ |
... | ... | @@ -329,7 +347,12 @@ const HirePurchaseUploadPayBillModal: React.FC< |
329 | 347 | }} |
330 | 348 | > |
331 | 349 | <span>待回款金额:</span> |
332 | - <span>{remainingMoney.toFixed(2)}元</span> | |
350 | + <span> | |
351 | + {remainingMoney !== null && remainingMoney !== undefined | |
352 | + ? remainingMoney.toFixed(2) | |
353 | + : '-'} | |
354 | + 元 | |
355 | + </span> | |
333 | 356 | </div> |
334 | 357 | </div> |
335 | 358 | <Form.Item | ... | ... |
src/pages/Order/OrderList/OrderDrawer.tsx
... | ... | @@ -156,7 +156,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
156 | 156 | let entity_number = await getTeacherCustomFieldNumber(); |
157 | 157 | |
158 | 158 | //在单位详细信息中拿到自定义字段的值 |
159 | - let customField = res?.custom_field; | |
159 | + let customField = res?.customField; | |
160 | 160 | if (customField) { |
161 | 161 | let teacherName = customField[entity_number]; |
162 | 162 | //填充到课题组老师表单字段中 |
... | ... | @@ -1199,8 +1199,8 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1199 | 1199 | |
1200 | 1200 | const currentPaymentMethod = form.getFieldValue('paymentMethod'); |
1201 | 1201 | if (!currentPaymentMethod) { |
1202 | - form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_ADVANCE' }); | |
1203 | - setPaymentMethod('PAYMENT_IN_ADVANCE'); | |
1202 | + form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_TAOBAO' }); | |
1203 | + setPaymentMethod('PAYMENT_IN_TAOBAO'); | |
1204 | 1204 | } |
1205 | 1205 | } else if (!optType('copy')) { |
1206 | 1206 | // 非复制操作时,清空支付渠道和支付方式 |
... | ... | @@ -1218,9 +1218,9 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1218 | 1218 | form.setFieldsValue({ paymentChannel: 'TAOBAO' }); |
1219 | 1219 | setPaymentChannelDisabled(true); |
1220 | 1220 | |
1221 | - // 支付方式默认锁定为预付 | |
1222 | - form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_ADVANCE' }); | |
1223 | - setPaymentMethod('PAYMENT_IN_ADVANCE'); | |
1221 | + // 支付方式默认锁定为淘宝 | |
1222 | + form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_TAOBAO' }); | |
1223 | + setPaymentMethod('PAYMENT_IN_TAOBAO'); | |
1224 | 1224 | setPaymentMethodDisabled(true); |
1225 | 1225 | } else { |
1226 | 1226 | // 如果不是淘宝销售代码,解除锁定 |
... | ... | @@ -1895,20 +1895,109 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1895 | 1895 | disabled={optType('after-sales-check')} |
1896 | 1896 | /> |
1897 | 1897 | </div> |
1898 | + <ProFormSelect | |
1899 | + placeholder="请输入支付方式" | |
1900 | + name="paymentMethod" | |
1901 | + width="lg" | |
1902 | + key="paymentMethod" | |
1903 | + label="支付方式" | |
1904 | + onChange={(val: any) => { | |
1905 | + setPaymentMethod(val); | |
1906 | + }} | |
1907 | + options={(() => { | |
1908 | + // 使用Set记录已经处理过的选项值,避免重复 | |
1909 | + const processedValues = new Set(); | |
1910 | + const finalOptions = []; | |
1911 | + | |
1912 | + // 先处理默认可选项 | |
1913 | + enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD).forEach((option) => { | |
1914 | + // 将淘宝选项设置为禁用状态,使其无法手动选择 | |
1915 | + if (option.value === 'PAYMENT_IN_TAOBAO') { | |
1916 | + finalOptions.push({ ...option, disabled: true }); | |
1917 | + } else { | |
1918 | + finalOptions.push(option); | |
1919 | + } | |
1920 | + processedValues.add(option.value); | |
1921 | + }); | |
1922 | + | |
1923 | + // 添加强制禁用项,但只添加尚未存在的选项 | |
1924 | + const disabledOptions = [ | |
1925 | + { label: '未付款', value: 'UNPAID', disabled: true }, | |
1926 | + { | |
1927 | + label: '淘宝订单已付款', | |
1928 | + value: 'TAOBAO_ORDER_HAS_BEEN_PAID', | |
1929 | + disabled: true, | |
1930 | + }, | |
1931 | + { | |
1932 | + label: '官网已付', | |
1933 | + value: 'OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID', | |
1934 | + disabled: true, | |
1935 | + }, | |
1936 | + { label: '淘宝', value: 'PAYMENT_IN_TAOBAO', disabled: true }, | |
1937 | + { | |
1938 | + label: '预付', | |
1939 | + value: 'WITHHOLDING_ADVANCE_DEPOSIT', | |
1940 | + disabled: true, | |
1941 | + }, | |
1942 | + { | |
1943 | + label: '平台结算', | |
1944 | + value: 'PLATFORM_SETTLEMENT', | |
1945 | + disabled: true, | |
1946 | + }, | |
1947 | + { label: '已回款', value: 'PAYMENT_RECEIPT', disabled: true }, | |
1948 | + { | |
1949 | + label: '预存款无需发货', | |
1950 | + value: 'PREPAID_NO_NEED_SEND', | |
1951 | + disabled: true, | |
1952 | + }, | |
1953 | + ]; | |
1954 | + | |
1955 | + disabledOptions.forEach((option) => { | |
1956 | + if (!processedValues.has(option.value)) { | |
1957 | + finalOptions.push(option); | |
1958 | + processedValues.add(option.value); | |
1959 | + } | |
1960 | + }); | |
1898 | 1961 | |
1962 | + return finalOptions; | |
1963 | + })()} | |
1964 | + rules={[{ required: true, message: '支付方式必填' }]} | |
1965 | + disabled={optType('after-sales-check') || paymentMethodDisabled} | |
1966 | + fieldProps={{ | |
1967 | + style: paymentMethodDisabled ? { backgroundColor: '#f5f5f5' } : {}, | |
1968 | + }} | |
1969 | + /> | |
1899 | 1970 | <ProFormSelect |
1900 | 1971 | placeholder="请输入支付渠道" |
1901 | 1972 | name="paymentChannel" |
1902 | 1973 | width="lg" |
1903 | 1974 | key="paymentChannel" |
1904 | 1975 | label="支付渠道" |
1905 | - options={enumToSelect(PAYMENT_CHANNEL_OPTIONS).map((option) => { | |
1906 | - // 将淘宝选项设置为禁用状态,使其无法手动选择 | |
1907 | - if (option.value === 'TAOBAO') { | |
1908 | - return { ...option, disabled: true }; | |
1909 | - } | |
1910 | - return option; | |
1911 | - })} | |
1976 | + options={(() => { | |
1977 | + // 获取当前支付方式 | |
1978 | + const currentPaymentMethod = | |
1979 | + paymentMethod || form.getFieldValue('paymentMethod'); | |
1980 | + | |
1981 | + return enumToSelect(PAYMENT_CHANNEL_OPTIONS).map((option) => { | |
1982 | + // 将淘宝选项设置为禁用状态,使其无法手动选择 | |
1983 | + if (option.value === 'TAOBAO') { | |
1984 | + return { ...option, disabled: true }; | |
1985 | + } | |
1986 | + | |
1987 | + // 如果选择了"预存款无需发货",禁用"平台结算"和"官网已付"选项 | |
1988 | + if (currentPaymentMethod === 'PREPAID_NO_NEED_SEND') { | |
1989 | + if ( | |
1990 | + option.value === 'PLATFORM' || | |
1991 | + option.value === 'OFFICIAL_WEBSITE' || | |
1992 | + option.value === 'BALANCE' | |
1993 | + ) { | |
1994 | + return { ...option, disabled: true }; | |
1995 | + } | |
1996 | + } | |
1997 | + | |
1998 | + return option; | |
1999 | + }); | |
2000 | + })()} | |
1912 | 2001 | rules={[{ required: true, message: '支付渠道必填' }]} |
1913 | 2002 | disabled={optType('after-sales-check') || paymentChannelDisabled} |
1914 | 2003 | fieldProps={{ |
... | ... | @@ -1924,17 +2013,17 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1924 | 2013 | }); |
1925 | 2014 | setPaymentMethod('WITHHOLDING_ADVANCE_DEPOSIT'); |
1926 | 2015 | } else if (val === 'TAOBAO') { |
1927 | - // 支付渠道为淘宝时,支付方式设置为预付 | |
2016 | + // 支付渠道为淘宝时,支付方式设置为淘宝 | |
1928 | 2017 | setPaymentMethodDisabled(true); |
1929 | - form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_ADVANCE' }); | |
1930 | - setPaymentMethod('PAYMENT_IN_ADVANCE'); | |
2018 | + form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_TAOBAO' }); | |
2019 | + setPaymentMethod('PAYMENT_IN_TAOBAO'); | |
1931 | 2020 | } else { |
1932 | 2021 | // 支付渠道修改为其他的去除锁定状态 |
1933 | 2022 | setPaymentMethodDisabled(false); |
1934 | 2023 | } |
1935 | 2024 | }} |
1936 | 2025 | /> |
1937 | - <ProFormSelect | |
2026 | + {/* <ProFormSelect | |
1938 | 2027 | placeholder="请输入支付方式" |
1939 | 2028 | name="paymentMethod" |
1940 | 2029 | width="lg" |
... | ... | @@ -1945,7 +2034,13 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1945 | 2034 | }} |
1946 | 2035 | options={[ |
1947 | 2036 | // 默认可选项 |
1948 | - ...enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD), | |
2037 | + ...enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD).map(option => { | |
2038 | + // 将淘宝选项设置为禁用状态,使其无法手动选择 | |
2039 | + if (option.value === 'PAYMENT_IN_TAOBAO') { | |
2040 | + return { ...option, disabled: true }; | |
2041 | + } | |
2042 | + return option; | |
2043 | + }), | |
1949 | 2044 | // 强制禁用项 |
1950 | 2045 | { label: '未付款', value: 'UNPAID', disabled: true }, |
1951 | 2046 | { |
... | ... | @@ -1960,7 +2055,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1960 | 2055 | }, |
1961 | 2056 | { |
1962 | 2057 | label: '淘宝', |
1963 | - value: 'PAYMENT_IN_ADVANCE', | |
2058 | + value: 'PAYMENT_IN_TAOBAO', | |
1964 | 2059 | disabled: true, |
1965 | 2060 | }, |
1966 | 2061 | { |
... | ... | @@ -1981,7 +2076,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1981 | 2076 | fieldProps={{ |
1982 | 2077 | style: paymentMethodDisabled ? { backgroundColor: '#f5f5f5' } : {}, |
1983 | 2078 | }} |
1984 | - /> | |
2079 | + /> */} | |
1985 | 2080 | {/* 隐藏字段用于存储真实UID和privatePocket标志 */} |
1986 | 2081 | <ProFormText name="realPrepaidUid" hidden /> |
1987 | 2082 | <ProFormText name="privatePocket" hidden /> | ... | ... |
src/pages/Order/OrderList/OrderList.tsx
... | ... | @@ -1084,14 +1084,14 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
1084 | 1084 | </span> |
1085 | 1085 | </div> |
1086 | 1086 | {/* 回款状态 */} |
1087 | - <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap"> | |
1087 | + {/* <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap"> | |
1088 | 1088 | <span className="text-slate-700"> |
1089 | 1089 | {enumValueToLabel( |
1090 | 1090 | optRecord.paymentReceiptStatus, |
1091 | 1091 | PAYMENT_RECEIPTS_STATUS_OPTIONS, |
1092 | 1092 | )} |
1093 | 1093 | </span> |
1094 | - </div> | |
1094 | + </div> */} | |
1095 | 1095 | {/* 回款审核状态 */} |
1096 | 1096 | {optRecord.paymentReceiptStatus !== null ? ( |
1097 | 1097 | <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap"> |
... | ... | @@ -2752,7 +2752,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
2752 | 2752 | <div> |
2753 | 2753 | <span className="text-[#8C8C8C]">已回款金额:¥</span> |
2754 | 2754 | <span className="text-slate-700"> |
2755 | - {record.payedMoney || '0.00'} | |
2755 | + {record.payedMoney || '0'} | |
2756 | 2756 | </span> |
2757 | 2757 | </div> |
2758 | 2758 | <Divider type="vertical" /> |
... | ... | @@ -2761,7 +2761,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
2761 | 2761 | <div> |
2762 | 2762 | <span className="text-[#8C8C8C]">未回款金额:¥</span> |
2763 | 2763 | <span className="text-slate-700"> |
2764 | - {record.unPayedMoney || '0.00'} | |
2764 | + {record.unPayedMoney || '0'} | |
2765 | 2765 | </span> |
2766 | 2766 | </div> |
2767 | 2767 | <Divider type="vertical" /> |
... | ... | @@ -2770,7 +2770,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
2770 | 2770 | <div> |
2771 | 2771 | <span className="text-[#8C8C8C]">发票核销金额:¥</span> |
2772 | 2772 | <span className="text-slate-700"> |
2773 | - {record.invoiceMoney || '0.00'} | |
2773 | + {record.invoiceMoney || '-'} | |
2774 | 2774 | </span> |
2775 | 2775 | </div> |
2776 | 2776 | <Divider type="vertical" /> |
... | ... | @@ -2852,7 +2852,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
2852 | 2852 | <div> |
2853 | 2853 | <span className="text-[#8C8C8C]">总金额:¥</span> |
2854 | 2854 | <span className="text-lg font-medium"> |
2855 | - {record.totalPayment} | |
2855 | + {record.totalPayment || '-'} | |
2856 | 2856 | </span> |
2857 | 2857 | </div> |
2858 | 2858 | ) : ( | ... | ... |
src/pages/Order/OrderList/PaymentRecordModal.tsx
... | ... | @@ -20,6 +20,14 @@ interface PaymentRecord { |
20 | 20 | paymentReceiptAnnexPartial: string | null; |
21 | 21 | } |
22 | 22 | |
23 | +// Helper function to display dash for empty values | |
24 | +const displayValue = (value: any, formatter?: (val: any) => string): string => { | |
25 | + if (value === null || value === undefined || value === '') { | |
26 | + return '-'; | |
27 | + } | |
28 | + return formatter ? formatter(value) : String(value); | |
29 | +}; | |
30 | + | |
23 | 31 | const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({ |
24 | 32 | visible, |
25 | 33 | mainOrderId, |
... | ... | @@ -90,11 +98,14 @@ const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({ |
90 | 98 | <div className="payment-record-content"> |
91 | 99 | <div className="payment-record-info"> |
92 | 100 | <p> |
93 | - <strong>提交时间:</strong> {record.createTime} | |
101 | + <strong>提交时间:</strong>{' '} | |
102 | + {displayValue(record.createTime)} | |
94 | 103 | </p> |
95 | 104 | <p> |
96 | 105 | <strong>付款金额:</strong>{' '} |
97 | - {record.refundMoney.toFixed(2)} | |
106 | + {displayValue(record.refundMoney, (val) => | |
107 | + val.toFixed(2), | |
108 | + )} | |
98 | 109 | </p> |
99 | 110 | {imageUrls.length > 0 && ( |
100 | 111 | <p> | ... | ... |
src/pages/Order/OrderList/UploadPayBillModal.tsx
... | ... | @@ -217,7 +217,10 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) => { |
217 | 217 | onOpenChange={setVisible} |
218 | 218 | > |
219 | 219 | <div className="pb-4 text-base font-medium"> |
220 | - 付款金额:¥{mainOrder?.totalPayment?.toLocaleString() || '0.00'} | |
220 | + 付款金额:¥ | |
221 | + {mainOrder?.totalPayment | |
222 | + ? mainOrder.totalPayment.toLocaleString() | |
223 | + : '-'} | |
221 | 224 | </div> |
222 | 225 | <div className="flex items-start pb-4 text-base font-medium"> |
223 | 226 | <div>付款凭证:</div> | ... | ... |
src/pages/Order/OrderWarning/components/OrderDrawer.tsx
... | ... | @@ -1611,7 +1611,24 @@ export default ({ onClose, data, subOrders, orderOptType }) => { |
1611 | 1611 | onChange={(val: any) => { |
1612 | 1612 | setPaymentMethod(val); |
1613 | 1613 | }} |
1614 | - options={enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD)} | |
1614 | + options={(() => { | |
1615 | + // 使用Set记录已经处理过的选项值,避免重复 | |
1616 | + const processedValues = new Set(); | |
1617 | + const finalOptions = []; | |
1618 | + | |
1619 | + // 先处理默认可选项 | |
1620 | + enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD).forEach((option) => { | |
1621 | + // 将淘宝选项设置为禁用状态,使其无法手动选择 | |
1622 | + if (option.value === 'PAYMENT_IN_TAOBAO') { | |
1623 | + finalOptions.push({ ...option, disabled: true }); | |
1624 | + } else { | |
1625 | + finalOptions.push(option); | |
1626 | + } | |
1627 | + processedValues.add(option.value); | |
1628 | + }); | |
1629 | + | |
1630 | + return finalOptions; | |
1631 | + })()} | |
1615 | 1632 | rules={[{ required: true, message: '支付方式必填' }]} |
1616 | 1633 | disabled={optType('after-sales-check')} |
1617 | 1634 | /> | ... | ... |
src/pages/Order/constant.ts
... | ... | @@ -24,22 +24,25 @@ export const RECEIPTS_RECORD_TYPES = { |
24 | 24 | }; |
25 | 25 | |
26 | 26 | export const PAYMENT_METHOD_OPTIONS = { |
27 | - UNPAID: '未付款', | |
28 | - TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款', | |
29 | - OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID: '官网订单已付款', | |
30 | - PAYMENT_IN_ADVANCE: '预付款', | |
31 | - WITHHOLDING_ADVANCE_DEPOSIT: '预付', | |
27 | + // UNPAID: '未付款', | |
28 | + // TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款', | |
29 | + OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID: '官网已付', | |
30 | + PAYMENT_IN_ADVANCE: '预付', | |
31 | + PAYMENT_IN_TAOBAO: '淘宝', | |
32 | + WITHHOLDING_ADVANCE_DEPOSIT: '预付(扣预存)', | |
32 | 33 | PLATFORM_SETTLEMENT: '平台结算', |
33 | 34 | CASH_ON_DELIVERY: '货到付款', |
34 | 35 | HIRE_PURCHASE: '分期付款', |
35 | - PAYMENT_RECEIPT: '已回款', | |
36 | + // PAYMENT_RECEIPT: '已回款', | |
36 | 37 | PREPAID_NO_NEED_SEND: '预存款无需发货', |
37 | 38 | }; |
38 | 39 | |
39 | 40 | export const PAYMENT_METHOD_OPTIONS_4_ADD = { |
40 | 41 | PAYMENT_IN_ADVANCE: '预付', |
42 | + PAYMENT_IN_TAOBAO: '淘宝', | |
41 | 43 | CASH_ON_DELIVERY: '货到付款', |
42 | 44 | HIRE_PURCHASE: '分期付款', |
45 | + PREPAID_NO_NEED_SEND: '预存款无需发货', | |
43 | 46 | }; |
44 | 47 | |
45 | 48 | export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = { |
... | ... | @@ -197,6 +200,12 @@ export const PAYMENT_RECEIPTS_STATUS_OPTIONS = { |
197 | 200 | PARTIAL_RECEIVED: '待提交', |
198 | 201 | }; |
199 | 202 | |
203 | +export const PAYMENT_AUDIT_STATUS_OPTIONS = { | |
204 | + WAIT_PAYMENT: '待付款', | |
205 | + PARTIAL_PAYMENT: '部分付款', | |
206 | + COMPLETE_PAYMENT: '已付款', | |
207 | +}; | |
208 | + | |
200 | 209 | export const ORDER_STATUS_OPTIONS = { |
201 | 210 | WAIT_CONFIRM_DELIVER_AFTER_INVOICE: '待开票后确认发货', |
202 | 211 | SALES_CONFIRM: '销售待确认', |
... | ... | @@ -596,6 +605,13 @@ export const MAIN_ORDER_COLUMNS = [ |
596 | 605 | valueEnum: enumToProTableEnumValue(ORDER_STATUS_OPTIONS), |
597 | 606 | }, |
598 | 607 | { |
608 | + title: '付款状态', | |
609 | + dataIndex: 'paymentAuditStatus', | |
610 | + valueType: 'select', | |
611 | + hideInTable: true, | |
612 | + valueEnum: enumToProTableEnumValue(PAYMENT_AUDIT_STATUS_OPTIONS), | |
613 | + }, | |
614 | + { | |
599 | 615 | title: '修改审核状态', |
600 | 616 | dataIndex: 'modifiedAuditStatus', |
601 | 617 | valueType: 'select', | ... | ... |
src/utils/hooks.ts
0 → 100644
1 | +import { useRef } from 'react'; | |
2 | + | |
3 | +/** | |
4 | + * Custom hook to track and manage API requests with debouncing and manual refresh capabilities | |
5 | + * @param cooldownMs - Cooldown time in milliseconds between automatic requests | |
6 | + * @returns Object with tracking state and utility functions | |
7 | + */ | |
8 | +export const useRequestTracker = (cooldownMs = 5000) => { | |
9 | + // Use a ref to persist the state between renders | |
10 | + const trackerRef = useRef({ | |
11 | + initialRequestMade: false, | |
12 | + pendingRequest: false, | |
13 | + lastRequestTime: 0, | |
14 | + manualRefresh: false, | |
15 | + }); | |
16 | + | |
17 | + /** | |
18 | + * Checks if a request should be executed based on tracking state | |
19 | + * @returns boolean - Whether the request should proceed | |
20 | + */ | |
21 | + const shouldExecuteRequest = () => { | |
22 | + const now = Date.now(); | |
23 | + const tracker = trackerRef.current; | |
24 | + | |
25 | + // Always execute if it's a manual refresh | |
26 | + if (tracker.manualRefresh) { | |
27 | + console.log( | |
28 | + '[Request Tracker] Manual refresh triggered, executing request', | |
29 | + ); | |
30 | + tracker.manualRefresh = false; | |
31 | + tracker.lastRequestTime = now; | |
32 | + return true; | |
33 | + } | |
34 | + | |
35 | + // If there's a pending request, don't execute another | |
36 | + if (tracker.pendingRequest) { | |
37 | + console.log('[Request Tracker] Request already in progress, skipping'); | |
38 | + return false; | |
39 | + } | |
40 | + | |
41 | + // For automatic requests (not manually triggered), apply cooldown | |
42 | + if ( | |
43 | + tracker.initialRequestMade && | |
44 | + now - tracker.lastRequestTime < cooldownMs | |
45 | + ) { | |
46 | + console.log( | |
47 | + `[Request Tracker] Cooldown active (${cooldownMs}ms), skipping automatic request`, | |
48 | + ); | |
49 | + return false; | |
50 | + } | |
51 | + | |
52 | + // Otherwise, allow the request | |
53 | + console.log('[Request Tracker] Executing request'); | |
54 | + tracker.lastRequestTime = now; | |
55 | + return true; | |
56 | + }; | |
57 | + | |
58 | + /** | |
59 | + * Marks the beginning of a request | |
60 | + */ | |
61 | + const startRequest = () => { | |
62 | + trackerRef.current.pendingRequest = true; | |
63 | + }; | |
64 | + | |
65 | + /** | |
66 | + * Marks the completion of a request | |
67 | + */ | |
68 | + const finishRequest = () => { | |
69 | + const tracker = trackerRef.current; | |
70 | + tracker.pendingRequest = false; | |
71 | + tracker.initialRequestMade = true; | |
72 | + }; | |
73 | + | |
74 | + /** | |
75 | + * Marks a request as manually triggered (will bypass cooldown) | |
76 | + */ | |
77 | + const markAsManualRefresh = () => { | |
78 | + trackerRef.current.manualRefresh = true; | |
79 | + }; | |
80 | + | |
81 | + return { | |
82 | + tracker: trackerRef.current, | |
83 | + shouldExecuteRequest, | |
84 | + startRequest, | |
85 | + finishRequest, | |
86 | + markAsManualRefresh, | |
87 | + }; | |
88 | +}; | ... | ... |