Commit 545177edf0b6405819a32a4512d7b2dc56094a85

Authored by 柏杨
2 parents fa87b7a2 61e781a9

Merge branch 'bugfix-0702' into 'master'

Bugfix 0702



See merge request !62
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&lt;
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&lt;
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&lt;
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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 }) =&gt; {
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&lt;PaymentRecordModalProps&gt; = ({
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 }) =&gt; {
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 }) =&gt; {
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 +};
... ...