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,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< | @@ -309,7 +317,12 @@ const HirePurchaseUploadPayBillModal: React.FC< | ||
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< | @@ -319,7 +332,12 @@ const HirePurchaseUploadPayBillModal: React.FC< | ||
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< | @@ -329,7 +347,12 @@ const HirePurchaseUploadPayBillModal: React.FC< | ||
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 }) => { | @@ -156,7 +156,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1199,8 +1199,8 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1218,9 +1218,9 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1895,20 +1895,109 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1924,17 +2013,17 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1945,7 +2034,13 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1960,7 +2055,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1981,7 +2076,7 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 }) => { | @@ -1084,14 +1084,14 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
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 }) => { | @@ -2752,7 +2752,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
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 }) => { | @@ -2761,7 +2761,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
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 }) => { | @@ -2770,7 +2770,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
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 }) => { | @@ -2852,7 +2852,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { | ||
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<PaymentRecordModalProps> = ({ | @@ -90,11 +98,14 @@ const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({ | ||
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 }) => { | @@ -217,7 +217,10 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) => { | ||
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 }) => { | @@ -1611,7 +1611,24 @@ export default ({ onClose, data, subOrders, orderOptType }) => { | ||
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 | +}; |