foreign-admin-ui/src/views/order/withdraw/index.vue

216 lines
5.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="order-withdraw-page table_form-container">
<!-- 搜索区域按设计图保留订单号开始时间结束时间并补一个导出按钮 -->
<OrderWithdrawSearch :search-form="searchForm" :search-options="searchOptions" @search="handleSearch"
@reset="handleReset">
<template #button>
<el-button type="primary" @click="handleExport">
导出
</el-button>
</template>
</OrderWithdrawSearch>
<!-- 列表区域 -->
<OrderWithdrawTable :table-data="pagedTableData" :columns="tableColumnsOptions" :highlight-current-row="false" :loading="loading" />
<!-- 分页区域保持和订单模块其他页面一致的交互结构 -->
<OrderWithdrawPagination v-model="currentPage" v-model:pageSizeValue="pageSize" :total="total"
@pagination-change="handlePaginationChange" />
</div>
</template>
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import dayjs from 'dayjs'
defineOptions({
name: 'Withdraw'
})
import { computed, onMounted, ref } from 'vue'
import OrderWithdrawSearch from '@/components/common/Search.vue'
import OrderWithdrawTable from '@/components/common/Table.vue'
import OrderWithdrawPagination from '@/components/common/Pagination.vue'
import { exportToExcel } from '@/utils/exportToExcel'
import { usePageLoading } from '@/composables/useLoading'
import { search, tableColumns } from './options'
import { getWithdrawOrderList } from '@/api/modules/capital/withdraw'
// 提现订单数据结构(展示用)
interface WithdrawOrderListItem {
id: number
user_id: number
order_no: string
channel_id: number
amount: string
withdraw_fee: string
status: number
created_at: string
updated_at: string
user?: {
username?: string
}
withdraw_currency?: {
symbol?: string
}
real_currency?: {
symbol?: string
}
channel?: {
name?: string
}
}
interface WithdrawOrderVo {
id: number
user_id: number
order_no: string
channel_id: number
amount: string
withdraw_fee: string
status: number
created_at: string
updated_at: string
// 映射嵌套字段到扁平化字段
user_name: string
withdraw_currency_symbol: string
real_currency_symbol: string
channel_name: string
}
// 搜索表单结构
interface SearchFormData {
user_name: string
startTime: string
endTime: string
}
// 搜索项配置
const searchOptions = ref(search)
// 搜索表单
const createDefaultSearchForm = (): SearchFormData => ({
user_name: '',
startTime: dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
endTime: dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'),
})
const searchForm = ref<SearchFormData>(createDefaultSearchForm())
// 列表数据
const tableData = ref<WithdrawOrderVo[]>([])
// 表格列配置
const tableColumnsOptions = ref(tableColumns)
// 分页状态
const currentPage = ref(1)
const pageSize = ref(10)
const total = ref(0)
// 加载状态
const { loading, startLoading, stopLoading } = usePageLoading()
// 将接口数据映射为展示用数据
const mapToVo = (item: WithdrawOrderListItem): WithdrawOrderVo => {
return {
...item,
user_name: item.user?.username || '',
withdraw_currency_symbol: item.withdraw_currency?.symbol || '',
real_currency_symbol: item.real_currency?.symbol || '',
channel_name: item.channel?.name || '',
// 状态字段保持原值,表格列配置中的 options 会自动映射标签
}
}
// 获取列表数据
const fetchList = async () => {
startLoading()
try {
const data = await getWithdrawOrderList({
page: currentPage.value,
page_size: pageSize.value,
start_time: searchForm.value.startTime || undefined,
end_time: searchForm.value.endTime || undefined,
user_name: searchForm.value.user_name || undefined,
})
tableData.value = ((data as any)?.data || []).map(mapToVo)
// 如果接口返回总数有 total 字段,可以这里设置
total.value = (data as any)?.total || tableData.value.length
stopLoading()
} catch (error) {
stopLoading()
console.error('获取提现订单列表失败', error)
// ElMessage.error('获取提现订单列表失败')
}
}
// 搜索
const handleSearch = () => {
currentPage.value = 1
fetchList()
}
// 重置
const handleReset = () => {
searchForm.value = createDefaultSearchForm()
currentPage.value = 1
fetchList()
}
// 导出
const handleExport = async () => {
await exportToExcel({
tableData: tableData.value,
columns: tableColumnsOptions.value,
title: '导出提现订单',
defaultFileNamePrefix: '提现订单',
})
}
// 分页切换
const handlePaginationChange = (page: { currentPage: number; pageSize: number }) => {
currentPage.value = page.currentPage
pageSize.value = page.pageSize
fetchList()
}
// 当前页数据
const pagedTableData = computed(() => {
return tableData.value
})
// 页面加载时获取数据
onMounted(() => {
fetchList()
})
</script>
<style scoped lang="scss">
.order-withdraw-page {
// min-height: 100%;
// 覆盖公共搜索组件的拉伸行为让控件尺寸更接近设计图
:deep(.search-container .el-form) {
display: flex;
flex-wrap: wrap;
align-items: center;
}
:deep(.search-container .el-form-item) {
flex: 0 0 auto;
margin-bottom: 8px;
}
:deep(.search-container .el-input),
:deep(.search-container .el-select),
:deep(.search-container .el-date-editor) {
width: 100%;
}
:deep(.table-container) {
height: calc(100vh - 220px);
}
}
</style>