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,7 +1492,19 @@ export default ({ onClose, data, subOrders, orderOptType }) => {
1492 onChange={(val: any) => { 1492 onChange={(val: any) => {
1493 setPaymentMethod(val); 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 rules={[{ required: true, message: '支付方式必填' }]} 1508 rules={[{ required: true, message: '支付方式必填' }]}
1497 disabled={optType('after-sales-check')} 1509 disabled={optType('after-sales-check')}
1498 /> 1510 />
src/pages/Order/FeedBack/constant.ts
@@ -24,9 +24,10 @@ export const RECEIPTS_RECORD_TYPES = { @@ -24,9 +24,10 @@ export const RECEIPTS_RECORD_TYPES = {
24 export const PAYMENT_METHOD_OPTIONS = { 24 export const PAYMENT_METHOD_OPTIONS = {
25 UNPAID: '未付款', 25 UNPAID: '未付款',
26 TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款', 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 PLATFORM_SETTLEMENT: '平台结算', 31 PLATFORM_SETTLEMENT: '平台结算',
31 CASH_ON_DELIVERY: '货到付款', 32 CASH_ON_DELIVERY: '货到付款',
32 HIRE_PURCHASE: '分期付款', 33 HIRE_PURCHASE: '分期付款',
src/pages/Order/Order/components/OrderDrawer.tsx
@@ -1501,7 +1501,19 @@ export default ({ onClose, data, subOrders, orderOptType }) => { @@ -1501,7 +1501,19 @@ export default ({ onClose, data, subOrders, orderOptType }) => {
1501 onChange={(val: any) => { 1501 onChange={(val: any) => {
1502 setPaymentMethod(val); 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 rules={[{ required: true, message: '支付方式必填' }]} 1517 rules={[{ required: true, message: '支付方式必填' }]}
1506 disabled={optType('after-sales-check')} 1518 disabled={optType('after-sales-check')}
1507 /> 1519 />
src/pages/Order/OrderList/HirePurchaseUploadPayBillModal.tsx
@@ -22,6 +22,14 @@ interface HirePurchaseUploadPayBillModalProps { @@ -22,6 +22,14 @@ interface HirePurchaseUploadPayBillModalProps {
22 subOrders?: any[]; 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 const HirePurchaseUploadPayBillModal: React.FC< 33 const HirePurchaseUploadPayBillModal: React.FC<
26 HirePurchaseUploadPayBillModalProps 34 HirePurchaseUploadPayBillModalProps
27 > = ({ 35 > = ({
@@ -309,7 +317,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -309,7 +317,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
309 }} 317 }}
310 > 318 >
311 <span>订单总金额:</span> 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 </div> 326 </div>
314 <div 327 <div
315 style={{ 328 style={{
@@ -319,7 +332,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -319,7 +332,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
319 }} 332 }}
320 > 333 >
321 <span>已回款金额:</span> 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 </div> 341 </div>
324 <div 342 <div
325 style={{ 343 style={{
@@ -329,7 +347,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -329,7 +347,12 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
329 }} 347 }}
330 > 348 >
331 <span>待回款金额:</span> 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 </div> 356 </div>
334 </div> 357 </div>
335 <Form.Item 358 <Form.Item
src/pages/Order/OrderList/OrderDrawer.tsx
@@ -156,7 +156,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -156,7 +156,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
156 let entity_number = await getTeacherCustomFieldNumber(); 156 let entity_number = await getTeacherCustomFieldNumber();
157 157
158 //在单位详细信息中拿到自定义字段的值 158 //在单位详细信息中拿到自定义字段的值
159 - let customField = res?.custom_field; 159 + let customField = res?.customField;
160 if (customField) { 160 if (customField) {
161 let teacherName = customField[entity_number]; 161 let teacherName = customField[entity_number];
162 //填充到课题组老师表单字段中 162 //填充到课题组老师表单字段中
@@ -1199,8 +1199,8 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1199,8 +1199,8 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1199 1199
1200 const currentPaymentMethod = form.getFieldValue('paymentMethod'); 1200 const currentPaymentMethod = form.getFieldValue('paymentMethod');
1201 if (!currentPaymentMethod) { 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 } else if (!optType('copy')) { 1205 } else if (!optType('copy')) {
1206 // 非复制操作时,清空支付渠道和支付方式 1206 // 非复制操作时,清空支付渠道和支付方式
@@ -1218,9 +1218,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1218,9 +1218,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1218 form.setFieldsValue({ paymentChannel: 'TAOBAO' }); 1218 form.setFieldsValue({ paymentChannel: 'TAOBAO' });
1219 setPaymentChannelDisabled(true); 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 setPaymentMethodDisabled(true); 1224 setPaymentMethodDisabled(true);
1225 } else { 1225 } else {
1226 // 如果不是淘宝销售代码,解除锁定 1226 // 如果不是淘宝销售代码,解除锁定
@@ -1895,20 +1895,109 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1895,20 +1895,109 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1895 disabled={optType('after-sales-check')} 1895 disabled={optType('after-sales-check')}
1896 /> 1896 />
1897 </div> 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 <ProFormSelect 1970 <ProFormSelect
1900 placeholder="请输入支付渠道" 1971 placeholder="请输入支付渠道"
1901 name="paymentChannel" 1972 name="paymentChannel"
1902 width="lg" 1973 width="lg"
1903 key="paymentChannel" 1974 key="paymentChannel"
1904 label="支付渠道" 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 rules={[{ required: true, message: '支付渠道必填' }]} 2001 rules={[{ required: true, message: '支付渠道必填' }]}
1913 disabled={optType('after-sales-check') || paymentChannelDisabled} 2002 disabled={optType('after-sales-check') || paymentChannelDisabled}
1914 fieldProps={{ 2003 fieldProps={{
@@ -1924,17 +2013,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1924,17 +2013,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1924 }); 2013 });
1925 setPaymentMethod('WITHHOLDING_ADVANCE_DEPOSIT'); 2014 setPaymentMethod('WITHHOLDING_ADVANCE_DEPOSIT');
1926 } else if (val === 'TAOBAO') { 2015 } else if (val === 'TAOBAO') {
1927 - // 支付渠道为淘宝时,支付方式设置为预付 2016 + // 支付渠道为淘宝时,支付方式设置为淘宝
1928 setPaymentMethodDisabled(true); 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 } else { 2020 } else {
1932 // 支付渠道修改为其他的去除锁定状态 2021 // 支付渠道修改为其他的去除锁定状态
1933 setPaymentMethodDisabled(false); 2022 setPaymentMethodDisabled(false);
1934 } 2023 }
1935 }} 2024 }}
1936 /> 2025 />
1937 - <ProFormSelect 2026 + {/* <ProFormSelect
1938 placeholder="请输入支付方式" 2027 placeholder="请输入支付方式"
1939 name="paymentMethod" 2028 name="paymentMethod"
1940 width="lg" 2029 width="lg"
@@ -1945,7 +2034,13 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1945,7 +2034,13 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1945 }} 2034 }}
1946 options={[ 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 { label: '未付款', value: 'UNPAID', disabled: true }, 2045 { label: '未付款', value: 'UNPAID', disabled: true },
1951 { 2046 {
@@ -1960,7 +2055,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1960,7 +2055,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1960 }, 2055 },
1961 { 2056 {
1962 label: '淘宝', 2057 label: '淘宝',
1963 - value: 'PAYMENT_IN_ADVANCE', 2058 + value: 'PAYMENT_IN_TAOBAO',
1964 disabled: true, 2059 disabled: true,
1965 }, 2060 },
1966 { 2061 {
@@ -1981,7 +2076,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1981,7 +2076,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1981 fieldProps={{ 2076 fieldProps={{
1982 style: paymentMethodDisabled ? { backgroundColor: '#f5f5f5' } : {}, 2077 style: paymentMethodDisabled ? { backgroundColor: '#f5f5f5' } : {},
1983 }} 2078 }}
1984 - /> 2079 + /> */}
1985 {/* 隐藏字段用于存储真实UID和privatePocket标志 */} 2080 {/* 隐藏字段用于存储真实UID和privatePocket标志 */}
1986 <ProFormText name="realPrepaidUid" hidden /> 2081 <ProFormText name="realPrepaidUid" hidden />
1987 <ProFormText name="privatePocket" hidden /> 2082 <ProFormText name="privatePocket" hidden />
src/pages/Order/OrderList/OrderList.tsx
@@ -1084,14 +1084,14 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -1084,14 +1084,14 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1084 </span> 1084 </span>
1085 </div> 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 <span className="text-slate-700"> 1088 <span className="text-slate-700">
1089 {enumValueToLabel( 1089 {enumValueToLabel(
1090 optRecord.paymentReceiptStatus, 1090 optRecord.paymentReceiptStatus,
1091 PAYMENT_RECEIPTS_STATUS_OPTIONS, 1091 PAYMENT_RECEIPTS_STATUS_OPTIONS,
1092 )} 1092 )}
1093 </span> 1093 </span>
1094 - </div> 1094 + </div> */}
1095 {/* 回款审核状态 */} 1095 {/* 回款审核状态 */}
1096 {optRecord.paymentReceiptStatus !== null ? ( 1096 {optRecord.paymentReceiptStatus !== null ? (
1097 <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap"> 1097 <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
@@ -2752,7 +2752,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -2752,7 +2752,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2752 <div> 2752 <div>
2753 <span className="text-[#8C8C8C]">已回款金额:¥</span> 2753 <span className="text-[#8C8C8C]">已回款金额:¥</span>
2754 <span className="text-slate-700"> 2754 <span className="text-slate-700">
2755 - {record.payedMoney || '0.00'} 2755 + {record.payedMoney || '0'}
2756 </span> 2756 </span>
2757 </div> 2757 </div>
2758 <Divider type="vertical" /> 2758 <Divider type="vertical" />
@@ -2761,7 +2761,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -2761,7 +2761,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2761 <div> 2761 <div>
2762 <span className="text-[#8C8C8C]">未回款金额:¥</span> 2762 <span className="text-[#8C8C8C]">未回款金额:¥</span>
2763 <span className="text-slate-700"> 2763 <span className="text-slate-700">
2764 - {record.unPayedMoney || '0.00'} 2764 + {record.unPayedMoney || '0'}
2765 </span> 2765 </span>
2766 </div> 2766 </div>
2767 <Divider type="vertical" /> 2767 <Divider type="vertical" />
@@ -2770,7 +2770,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -2770,7 +2770,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2770 <div> 2770 <div>
2771 <span className="text-[#8C8C8C]">发票核销金额:¥</span> 2771 <span className="text-[#8C8C8C]">发票核销金额:¥</span>
2772 <span className="text-slate-700"> 2772 <span className="text-slate-700">
2773 - {record.invoiceMoney || '0.00'} 2773 + {record.invoiceMoney || '-'}
2774 </span> 2774 </span>
2775 </div> 2775 </div>
2776 <Divider type="vertical" /> 2776 <Divider type="vertical" />
@@ -2852,7 +2852,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -2852,7 +2852,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2852 <div> 2852 <div>
2853 <span className="text-[#8C8C8C]">总金额:¥</span> 2853 <span className="text-[#8C8C8C]">总金额:¥</span>
2854 <span className="text-lg font-medium"> 2854 <span className="text-lg font-medium">
2855 - {record.totalPayment} 2855 + {record.totalPayment || '-'}
2856 </span> 2856 </span>
2857 </div> 2857 </div>
2858 ) : ( 2858 ) : (
src/pages/Order/OrderList/PaymentRecordModal.tsx
@@ -20,6 +20,14 @@ interface PaymentRecord { @@ -20,6 +20,14 @@ interface PaymentRecord {
20 paymentReceiptAnnexPartial: string | null; 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 const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({ 31 const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({
24 visible, 32 visible,
25 mainOrderId, 33 mainOrderId,
@@ -90,11 +98,14 @@ const PaymentRecordModal: React.FC&lt;PaymentRecordModalProps&gt; = ({ @@ -90,11 +98,14 @@ const PaymentRecordModal: React.FC&lt;PaymentRecordModalProps&gt; = ({
90 <div className="payment-record-content"> 98 <div className="payment-record-content">
91 <div className="payment-record-info"> 99 <div className="payment-record-info">
92 <p> 100 <p>
93 - <strong>提交时间:</strong> {record.createTime} 101 + <strong>提交时间:</strong>{' '}
  102 + {displayValue(record.createTime)}
94 </p> 103 </p>
95 <p> 104 <p>
96 <strong>付款金额:</strong>{' '} 105 <strong>付款金额:</strong>{' '}
97 - {record.refundMoney.toFixed(2)} 106 + {displayValue(record.refundMoney, (val) =>
  107 + val.toFixed(2),
  108 + )}
98 </p> 109 </p>
99 {imageUrls.length > 0 && ( 110 {imageUrls.length > 0 && (
100 <p> 111 <p>
src/pages/Order/OrderList/UploadPayBillModal.tsx
@@ -217,7 +217,10 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; { @@ -217,7 +217,10 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
217 onOpenChange={setVisible} 217 onOpenChange={setVisible}
218 > 218 >
219 <div className="pb-4 text-base font-medium"> 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 </div> 224 </div>
222 <div className="flex items-start pb-4 text-base font-medium"> 225 <div className="flex items-start pb-4 text-base font-medium">
223 <div>付款凭证:</div> 226 <div>付款凭证:</div>
src/pages/Order/OrderWarning/components/OrderDrawer.tsx
@@ -1611,7 +1611,24 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -1611,7 +1611,24 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1611 onChange={(val: any) => { 1611 onChange={(val: any) => {
1612 setPaymentMethod(val); 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 rules={[{ required: true, message: '支付方式必填' }]} 1632 rules={[{ required: true, message: '支付方式必填' }]}
1616 disabled={optType('after-sales-check')} 1633 disabled={optType('after-sales-check')}
1617 /> 1634 />
src/pages/Order/constant.ts
@@ -24,22 +24,25 @@ export const RECEIPTS_RECORD_TYPES = { @@ -24,22 +24,25 @@ export const RECEIPTS_RECORD_TYPES = {
24 }; 24 };
25 25
26 export const PAYMENT_METHOD_OPTIONS = { 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 PLATFORM_SETTLEMENT: '平台结算', 33 PLATFORM_SETTLEMENT: '平台结算',
33 CASH_ON_DELIVERY: '货到付款', 34 CASH_ON_DELIVERY: '货到付款',
34 HIRE_PURCHASE: '分期付款', 35 HIRE_PURCHASE: '分期付款',
35 - PAYMENT_RECEIPT: '已回款', 36 + // PAYMENT_RECEIPT: '已回款',
36 PREPAID_NO_NEED_SEND: '预存款无需发货', 37 PREPAID_NO_NEED_SEND: '预存款无需发货',
37 }; 38 };
38 39
39 export const PAYMENT_METHOD_OPTIONS_4_ADD = { 40 export const PAYMENT_METHOD_OPTIONS_4_ADD = {
40 PAYMENT_IN_ADVANCE: '预付', 41 PAYMENT_IN_ADVANCE: '预付',
  42 + PAYMENT_IN_TAOBAO: '淘宝',
41 CASH_ON_DELIVERY: '货到付款', 43 CASH_ON_DELIVERY: '货到付款',
42 HIRE_PURCHASE: '分期付款', 44 HIRE_PURCHASE: '分期付款',
  45 + PREPAID_NO_NEED_SEND: '预存款无需发货',
43 }; 46 };
44 47
45 export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = { 48 export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = {
@@ -197,6 +200,12 @@ export const PAYMENT_RECEIPTS_STATUS_OPTIONS = { @@ -197,6 +200,12 @@ export const PAYMENT_RECEIPTS_STATUS_OPTIONS = {
197 PARTIAL_RECEIVED: '待提交', 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 export const ORDER_STATUS_OPTIONS = { 209 export const ORDER_STATUS_OPTIONS = {
201 WAIT_CONFIRM_DELIVER_AFTER_INVOICE: '待开票后确认发货', 210 WAIT_CONFIRM_DELIVER_AFTER_INVOICE: '待开票后确认发货',
202 SALES_CONFIRM: '销售待确认', 211 SALES_CONFIRM: '销售待确认',
@@ -596,6 +605,13 @@ export const MAIN_ORDER_COLUMNS = [ @@ -596,6 +605,13 @@ export const MAIN_ORDER_COLUMNS = [
596 valueEnum: enumToProTableEnumValue(ORDER_STATUS_OPTIONS), 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 title: '修改审核状态', 615 title: '修改审核状态',
600 dataIndex: 'modifiedAuditStatus', 616 dataIndex: 'modifiedAuditStatus',
601 valueType: 'select', 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 +};