From 39f6fca28e3f78abe48f08e474ec011abb990b36 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 09 九月 2026 10:39:21 +0800
Subject: [PATCH] update
---
frontend/src/views/WithdrawalsView.vue | 31 +++++++++++++++++++++----------
1 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/frontend/src/views/WithdrawalsView.vue b/frontend/src/views/WithdrawalsView.vue
index 8cc23cb..49513a8 100644
--- a/frontend/src/views/WithdrawalsView.vue
+++ b/frontend/src/views/WithdrawalsView.vue
@@ -13,9 +13,13 @@
const current = ref(null)
const query = reactive({ page: 1, size: 10, keyword: '', status: '' })
const processForm = reactive({ status: 'APPROVED', auditRemark: '' })
-const statusMap = { PENDING: { label: '未处理', type: 'primary' }, TRANSFERRING: { label: '划账处理中', type: 'warning' }, TRANSFERRED: { label: '待发起取现', type: 'warning' }, PROCESSING: { label: '到账处理中', type: 'warning' }, APPROVED: { label: '已到账', type: 'success' }, REJECTED: { label: '已驳回', type: 'danger' } }
+const statusMap = { PENDING: { label: '未处理', type: 'primary' }, TRANSFERRING: { label: '划账处理中', type: 'warning' }, TRANSFER_FAILED: { label: '划账失败', type: 'danger' }, TRANSFERRED: { label: '待发起取现', type: 'warning' }, PROCESSING: { label: '到账处理中', type: 'warning' }, APPROVED: { label: '已到账', type: 'success' }, REJECTED: { label: '已驳回', type: 'danger' } }
const formatMoney = (value) => Number(value || 0).toFixed(2)
const formatDateTime = (value) => value ? value.replace('T', ' ').slice(0, 19) : '-'
+const isTransferFailed = (row) => row?.status === 'TRANSFER_FAILED'
+ || (row?.status === 'PENDING' && row?.processedAt && row?.payoutMessage?.startsWith('主账户划账失败'))
+const canProcess = (row) => row?.status === 'PENDING' || isTransferFailed(row)
+const rowStatus = (row) => isTransferFailed(row) ? statusMap.TRANSFER_FAILED : statusMap[row.status]
const loadWithdrawals = async () => {
loading.value = true
@@ -35,10 +39,17 @@
if (processForm.status === 'REJECTED' && !processForm.auditRemark.trim()) { ElMessage.warning('驳回提现时请填写处理备注'); return }
processing.value = true
try {
- await processWithdrawal(current.value.id, { status: processForm.status, auditRemark: processForm.auditRemark.trim() || undefined })
- ElMessage.success(processForm.status === 'APPROVED' ? '提现申请已受理,等待到账结果' : '提现申请已驳回')
+ const result = await processWithdrawal(current.value.id, { status: processForm.status, auditRemark: processForm.auditRemark.trim() || undefined })
+ const index = records.value.findIndex((item) => item.id === result.id)
+ if (index >= 0) records.value[index] = result
+ current.value = result
+ if (isTransferFailed(result)) {
+ ElMessage.error(result.payoutMessage || '主账户划账失败,请重试')
+ } else {
+ ElMessage.success(processForm.status === 'APPROVED' ? '提现申请已受理,等待到账结果' : '提现申请已驳回')
+ }
dialogVisible.value = false
- loadWithdrawals()
+ await loadWithdrawals()
} finally { processing.value = false }
}
onMounted(loadWithdrawals)
@@ -51,7 +62,7 @@
<el-form class="query-form" label-position="left" label-width="70px" @submit.prevent="search">
<el-form-item label="导游搜索"><el-input v-model="query.keyword" clearable placeholder="请输入导游手机号/导游姓名/提现编号" @keyup.enter="search" /></el-form-item>
<el-form-item label="申请时间"><el-date-picker v-model="dateRange" type="daterange" value-format="YYYY-MM-DD" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" /></el-form-item>
- <el-form-item label="状态"><el-select v-model="query.status" clearable placeholder="全部"><el-option label="未处理" value="PENDING" /><el-option label="划账处理中" value="TRANSFERRING" /><el-option label="待发起取现" value="TRANSFERRED" /><el-option label="到账处理中" value="PROCESSING" /><el-option label="已到账" value="APPROVED" /><el-option label="已驳回" value="REJECTED" /></el-select></el-form-item>
+ <el-form-item label="状态"><el-select v-model="query.status" clearable placeholder="全部"><el-option label="未处理" value="PENDING" /><el-option label="划账处理中" value="TRANSFERRING" /><el-option label="划账失败" value="TRANSFER_FAILED" /><el-option label="待发起取现" value="TRANSFERRED" /><el-option label="到账处理中" value="PROCESSING" /><el-option label="已到账" value="APPROVED" /><el-option label="已驳回" value="REJECTED" /></el-select></el-form-item>
<div class="query-actions"><el-button type="primary" :icon="Search" @click="search">查询</el-button><el-button :icon="Refresh" @click="reset">重置</el-button></div>
</el-form>
<el-table v-loading="loading" :data="records" border row-key="id">
@@ -60,13 +71,13 @@
<el-table-column prop="guideMobile" label="导游手机号" min-width="140" align="center" />
<el-table-column label="申请时间" min-width="170" align="center"><template #default="{ row }">{{ formatDateTime(row.appliedAt) }}</template></el-table-column>
<el-table-column label="提现金额" min-width="120" align="center"><template #default="{ row }">{{ formatMoney(row.amount) }}</template></el-table-column>
- <el-table-column label="状态" width="110" align="center"><template #default="{ row }"><el-tag :type="statusMap[row.status]?.type || 'info'" effect="plain">{{ statusMap[row.status]?.label || row.status }}</el-tag></template></el-table-column>
- <el-table-column label="操作" width="110" fixed="right" align="center"><template #default="{ row }"><el-button link type="primary" @click="openProcess(row)">{{ row.status === 'PENDING' ? '处理' : '查看' }}</el-button></template></el-table-column>
+ <el-table-column label="状态" width="110" align="center"><template #default="{ row }"><el-tag :type="rowStatus(row)?.type || 'info'" effect="plain">{{ rowStatus(row)?.label || row.status }}</el-tag></template></el-table-column>
+ <el-table-column label="操作" width="110" fixed="right" align="center"><template #default="{ row }"><el-button link type="primary" @click="openProcess(row)">{{ isTransferFailed(row) ? '重试' : canProcess(row) ? '处理' : '查看' }}</el-button></template></el-table-column>
<template #empty><el-empty description="暂无提现申请" /></template>
</el-table>
<div class="pagination-row"><span>共 {{ total }} 条</span><el-pagination background layout="sizes, prev, pager, next, jumper" :current-page="query.page" :page-size="query.size" :page-sizes="[10, 20, 50]" :total="total" @current-change="changePage" @size-change="changePageSize" /></div>
</el-card>
- <el-dialog v-model="dialogVisible" :title="current?.status === 'PENDING' ? '处理提现申请' : '提现申请详情'" width="560px">
+ <el-dialog v-model="dialogVisible" :title="isTransferFailed(current) ? '重新处理提现申请' : canProcess(current) ? '处理提现申请' : '提现申请详情'" width="560px">
<el-descriptions v-if="current" :column="2" border>
<el-descriptions-item label="提现编号">{{ current.withdrawalNo }}</el-descriptions-item><el-descriptions-item label="导游名称">{{ current.guideName }}</el-descriptions-item>
<el-descriptions-item label="导游手机号">{{ current.guideMobile }}</el-descriptions-item><el-descriptions-item label="提现金额">{{ formatMoney(current.amount) }}</el-descriptions-item>
@@ -76,12 +87,12 @@
<el-descriptions-item v-if="current.cashReqSeqId" label="取现流水" :span="2">{{ current.cashReqSeqId }}</el-descriptions-item>
<el-descriptions-item v-if="current.payoutMessage" label="资金状态" :span="2">{{ current.payoutMessage }}</el-descriptions-item>
</el-descriptions>
- <el-form v-if="current?.status === 'PENDING'" class="process-form" label-width="82px">
+ <el-form v-if="canProcess(current)" class="process-form" label-width="82px">
<el-form-item label="处理结果"><el-radio-group v-model="processForm.status"><el-radio-button value="APPROVED">通过</el-radio-button><el-radio-button value="REJECTED">驳回</el-radio-button></el-radio-group></el-form-item>
<el-form-item label="处理备注"><el-input v-model="processForm.auditRemark" type="textarea" :rows="3" maxlength="255" show-word-limit /></el-form-item>
</el-form>
<div v-else-if="current?.auditRemark" class="remark-row"><strong>处理备注:</strong>{{ current.auditRemark }}</div>
- <template #footer><el-button @click="dialogVisible = false">关闭</el-button><el-button v-if="current?.status === 'PENDING'" type="primary" :loading="processing" @click="submitProcess">确认处理</el-button></template>
+ <template #footer><el-button @click="dialogVisible = false">关闭</el-button><el-button v-if="canProcess(current)" type="primary" :loading="processing" @click="submitProcess">确认处理</el-button></template>
</el-dialog>
</section>
</template>
--
Gitblit v1.7.1