(null)
+
+// 获取行标识的safe版本
+const getRowKeyValue = (row: any) => {
+ return props.rowKey ? row[props.rowKey] : row.id
+}
+
+const handleRadioChange = (row: any) => {
+ selectedRadioRow.value = getRowKeyValue(row)
+ emit('selection-change', [row])
+}
+
// 获取过滤后的数据
const filteredTableData = computed(() => {
if (!props.enableClientFilter || Object.keys(filterStates).length === 0) {
@@ -293,10 +314,18 @@ const initColumns = () => {
// 合并缓存和原始配置,保持缓存的顺序
localColumns.value = cachedConfig.map((cached: any) => {
+ // 优先按 prop 匹配
const originalCol = props.columns?.find((c) => c.prop === cached.prop)
if (originalCol) {
return { ...originalCol, ...cached }
}
+ // 对于没有 prop 的列(如操作列),按 slotName 匹配
+ if (cached.slotName) {
+ const slotCol = props.columns?.find((c) => c.slotName === cached.slotName)
+ if (slotCol) {
+ return { ...slotCol, ...cached }
+ }
+ }
return null
}).filter(Boolean)
} catch {
@@ -375,6 +404,26 @@ onMounted(() => {
}, 100)
})
+// 监听 tableData 变化,清除单选选中状态
+watch(
+ () => props.tableData,
+ () => {
+ if (props.singleSelect) {
+ selectedRadioRow.value = null
+ }
+ }
+)
+
+// 监听 tableData 变化,清除单选选中状态
+watch(
+ () => props.tableData,
+ () => {
+ if (props.singleSelect) {
+ selectedRadioRow.value = null
+ }
+ }
+)
+
// 处理勾选变化
const handleSelectionChange = (rows: any[]) => {
emit('selection-change', rows)
@@ -409,6 +458,15 @@ const handleRowContextmenu = (row: any, column: any, event: MouseEvent) => {
emit('row-contextmenu', row, column, event)
}
+// 监听 tableData 变化,清除单选选中状态
+watch(
+ () => props.tableData,
+ () => {
+ if (props.singleSelect) {
+ selectedRadioRow.value = null
+ }
+ }
+)
// 监听 tableData 变化
watch(
() => props.tableData,
diff --git a/src/views/capital/rechange/index.vue b/src/views/capital/rechange/index.vue
index 6bca30a..8026eae 100644
--- a/src/views/capital/rechange/index.vue
+++ b/src/views/capital/rechange/index.vue
@@ -101,9 +101,11 @@
-
-
![支付二维码]()
-
+
+
+
支付链接 {{ index + 1 }}
+
![支付二维码]()
+
请使用{{ getMethodName(selectedMethod) }}扫描上方二维码完成支付
@@ -277,6 +279,12 @@ const qrcodeLoading = ref(false)
// 二维码图片URL
const qrcodeImageUrl = ref('')
+// 多个二维码图片URL列表
+const qrcodeImageUrls = ref([])
+
+// 支付链接列表
+const paymentUrls = ref([])
+
// 生成二维码
const generateQRCode = async (url: string) => {
await nextTick()
@@ -286,7 +294,7 @@ const generateQRCode = async (url: string) => {
width: 200,
margin: 2,
})
- qrcodeImageUrl.value = dataUrl
+ qrcodeImageUrl.value = dataUrl
} catch (error) {
console.error('生成二维码失败:', error)
ElMessage.error('生成二维码失败')
@@ -296,6 +304,23 @@ const generateQRCode = async (url: string) => {
}
}
+// 批量生成二维码
+const generateQRCodes = async (urls: string[]) => {
+ // 直接生成所有二维码图片
+ for (let i = 0; i < urls.length; i++) {
+ try {
+ const dataUrl = await QRCode.toDataURL(urls[i] as any, {
+ width: 200,
+ margin: 2,
+ })
+ qrcodeImageUrls.value[i] = dataUrl as any
+ } catch (error) {
+ console.error('生成二维码失败:', error)
+ }
+ }
+ qrcodeLoading.value = false
+}
+
// 弹窗基础状态
const dialogVisible = ref(false)
const rechangeFormRef = ref()
@@ -458,10 +483,13 @@ const handleCreateOrder = async () => {
})
// 获取跳转URL并打开支付页面
- const payUrl = res.payment_urls[1]
- if (payUrl) {
+ const payUrls = res.payment_urls || []
+ if (payUrls.length > 0) {
+ paymentUrls.value = payUrls
if (isMobileDevice.value) {
- // 移动端:直接跳转支付页面
+ // 移动端:优先跳 safe.paylinktrust.com 域名,没有则跳第一个
+ const safeUrl = payUrls.find((url:string)=> url.includes('safe.paylinktrust.com'))
+ const payUrl = safeUrl || payUrls[0]
ElMessage.success('正在跳转支付页面...')
setTimeout(() => {
window.location.href = payUrl
@@ -469,9 +497,9 @@ const handleCreateOrder = async () => {
handleCancel()
}, 500)
} else {
- // 桌面端:生成二维码
+ // 桌面端:生成所有链接的二维码
ElMessage.success('正在生成支付二维码...')
- await generateQRCode(payUrl)
+ await generateQRCodes(payUrls)
}
} else {
ElMessage.error('获取支付链接失败')
@@ -543,6 +571,8 @@ const handleCancel = () => {
rechangeFormRef.value?.resetFields()
rechangeForm.value = createDefaultForm()
qrcodeImageUrl.value = ''
+ qrcodeImageUrls.value = []
+ paymentUrls.value = []
qrcodeLoading.value = false
payStep.value = 1
selectedMethod.value = ''
@@ -800,6 +830,26 @@ onMounted(() => {
display: block;
}
+.qrcode-list {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 24px;
+}
+
+.qrcode-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+}
+
+.qrcode-label {
+ font-size: 14px;
+ color: #606266;
+ font-weight: 500;
+}
+
.qrcode {
width: 200px;
height: 200px;
diff --git a/src/views/capital/rechangeCheck/index.vue b/src/views/capital/rechangeCheck/index.vue
index 524d7d6..046ea7e 100644
--- a/src/views/capital/rechangeCheck/index.vue
+++ b/src/views/capital/rechangeCheck/index.vue
@@ -9,13 +9,6 @@
@reset="handleReset"
>
-
- 驳回
- 通过
导出
@@ -27,9 +20,21 @@
:columns="tableColumns"
row-key="id"
:loading="loading"
- :show-selection="true"
+ :show-selection="false"
+ :single-select="false"
@selection-change="handleSelectionChange"
- />
+ >
+
+
+
+ 驳回
+
+ |
+
+ 通过
+
+
+
{
- console.log('selectedRows.value:', selectedRows.value);
- if (!selectedRows.value.length) {
+// 审核通过:支持从表格操作列传入当前行,或保持原有逻辑从选中行获取。
+const handleApprove = async (row?: any) => {
+ const targetRow = row || selectedRows.value[0]
+ if (!targetRow) {
ElMessage.warning('请先选择要通过的记录')
return
}
@@ -217,21 +222,22 @@ const handleApprove = async () => {
startLoading()
try {
- await reviewRechargeOrder({ id: selectedRows.value[0]?.id, status: '3' })
+ await reviewRechargeOrder({ id: targetRow.id, status: '3' })
await getList()
} finally {
stopLoading()
}
}
-// 审核驳回:当前保留前端提示,等待后续接接口。
-const handleReject = async () => {
- if (!selectedRows.value.length) {
+// 审核驳回:支持从表格操作列传入当前行,或保持原有逻辑从选中行获取。
+const handleReject = async (row?: any) => {
+ const targetRow = row || selectedRows.value[0]
+ if (!targetRow) {
ElMessage.warning('请先选择要驳回的记录')
return
}
try {
- await ElMessageBox.confirm(`是否确认驳回该审核?订单号:${selectedRows.value[0]?.orderNo}`, '审核确认', {
+ await ElMessageBox.confirm(`是否确认驳回该审核?订单号:${targetRow.orderNo}`, '审核确认', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
@@ -243,7 +249,7 @@ const handleReject = async () => {
//充值状态:1未审核,2未付款,3已付款,4驳回
startLoading()
try {
- await reviewRechargeOrder({ id: selectedRows.value[0]?.id, status: '4' })
+ await reviewRechargeOrder({ id: targetRow.id, status: '4' })
await getList()
} finally {
stopLoading()
@@ -269,7 +275,7 @@ const handlePaginationChange = (page: { currentPage: number; pageSize: number })