|
|
@ -108,17 +108,17 @@ const fetchData = async () => { |
|
|
pageSize: queryParams.pageSize, |
|
|
pageSize: queryParams.pageSize, |
|
|
fundsDTO: { |
|
|
fundsDTO: { |
|
|
jwcode: queryParams.jwcode, |
|
|
jwcode: queryParams.jwcode, |
|
|
localMarket:queryParams.markets, |
|
|
|
|
|
|
|
|
localMarket: queryParams.markets, |
|
|
startTime: queryParams.timeRange?.[0] ? dayjs(queryParams.timeRange[0]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
startTime: queryParams.timeRange?.[0] ? dayjs(queryParams.timeRange[0]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
endTime: queryParams.timeRange?.[1] ? dayjs(queryParams.timeRange[1]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
endTime: queryParams.timeRange?.[1] ? dayjs(queryParams.timeRange[1]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
payType: normalizePayType(queryParams.payType || ''), |
|
|
payType: normalizePayType(queryParams.payType || ''), |
|
|
orderCode: queryParams.orderCode, |
|
|
orderCode: queryParams.orderCode, |
|
|
statuses: formatStatuses(queryParams.statuses), |
|
|
statuses: formatStatuses(queryParams.statuses), |
|
|
markets:[], |
|
|
|
|
|
|
|
|
markets: [], |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('查询参数:', params) |
|
|
console.log('查询参数:', params) |
|
|
const res = await Moneyfunds(params) |
|
|
const res = await Moneyfunds(params) |
|
|
@ -192,10 +192,10 @@ const refundFormData = ref({}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const resetRefund = () => { |
|
|
const resetRefund = () => { |
|
|
refundFormData.value.refundModel = '' |
|
|
|
|
|
refundFormData.value.refundReason = '' |
|
|
|
|
|
refundFormData.value.permanentGold = null |
|
|
|
|
|
refundFormData.value.freeGold = null |
|
|
|
|
|
|
|
|
refundFormData.value.refundModel = '' |
|
|
|
|
|
refundFormData.value.refundReason = '' |
|
|
|
|
|
refundFormData.value.permanentGold = null |
|
|
|
|
|
refundFormData.value.freeGold = null |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
const handleRefund = async () => { |
|
|
const handleRefund = async () => { |
|
|
@ -244,35 +244,35 @@ const exportListLoading = ref(false) |
|
|
const handleExport = async () => { |
|
|
const handleExport = async () => { |
|
|
|
|
|
|
|
|
const formatStatuses = (statuses) => { |
|
|
const formatStatuses = (statuses) => { |
|
|
// 情况1:非数组/空值 → 返回空数组 |
|
|
|
|
|
if (!Array.isArray(statuses)) { |
|
|
|
|
|
return []; |
|
|
|
|
|
} |
|
|
|
|
|
// 情况2:数组中包含 null 或 undefined → 返回空数组 |
|
|
|
|
|
if (statuses.some(item => item === null || item === undefined)) { |
|
|
|
|
|
return []; |
|
|
|
|
|
} |
|
|
|
|
|
// 情况3:正常数组 → 返回原数组 |
|
|
|
|
|
return statuses; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
// 情况1:非数组/空值 → 返回空数组 |
|
|
|
|
|
if (!Array.isArray(statuses)) { |
|
|
|
|
|
return []; |
|
|
|
|
|
} |
|
|
|
|
|
// 情况2:数组中包含 null 或 undefined → 返回空数组 |
|
|
|
|
|
if (statuses.some(item => item === null || item === undefined)) { |
|
|
|
|
|
return []; |
|
|
|
|
|
} |
|
|
|
|
|
// 情况3:正常数组 → 返回原数组 |
|
|
|
|
|
return statuses; |
|
|
|
|
|
}; |
|
|
try { |
|
|
try { |
|
|
const params = { |
|
|
|
|
|
|
|
|
const params = { |
|
|
pageNum: queryParams.pageNum, |
|
|
pageNum: queryParams.pageNum, |
|
|
pageSize: queryParams.pageSize, |
|
|
pageSize: queryParams.pageSize, |
|
|
fundsDTO: { |
|
|
fundsDTO: { |
|
|
jwcode: queryParams.jwcode, |
|
|
jwcode: queryParams.jwcode, |
|
|
localMarket:queryParams.markets, |
|
|
|
|
|
|
|
|
localMarket: queryParams.markets, |
|
|
startTime: queryParams.timeRange?.[0] ? dayjs(queryParams.timeRange[0]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
startTime: queryParams.timeRange?.[0] ? dayjs(queryParams.timeRange[0]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
endTime: queryParams.timeRange?.[1] ? dayjs(queryParams.timeRange[1]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
endTime: queryParams.timeRange?.[1] ? dayjs(queryParams.timeRange[1]).format('YYYY-MM-DD HH:mm:ss') : '', |
|
|
payType: normalizePayType(queryParams.payType || ''), |
|
|
payType: normalizePayType(queryParams.payType || ''), |
|
|
orderCode: queryParams.orderCode, |
|
|
orderCode: queryParams.orderCode, |
|
|
statuses: formatStatuses(queryParams.statuses), |
|
|
statuses: formatStatuses(queryParams.statuses), |
|
|
markets:[], |
|
|
|
|
|
|
|
|
markets: [], |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// TODO: 确认导出接口 URL |
|
|
// TODO: 确认导出接口 URL |
|
|
const res = await exportFunds( params ) |
|
|
|
|
|
|
|
|
const res = await exportFunds(params) |
|
|
if (res.code == 200) { |
|
|
if (res.code == 200) { |
|
|
|
|
|
|
|
|
console.log('导出参数', params) |
|
|
console.log('导出参数', params) |
|
|
@ -372,7 +372,7 @@ const findValueByLabel = (options, label) => { |
|
|
|
|
|
|
|
|
onMounted(async () => { |
|
|
onMounted(async () => { |
|
|
await getMarket() |
|
|
await getMarket() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理从工作台跳转过来的地区参数 |
|
|
// 处理从工作台跳转过来的地区参数 |
|
|
// 如果出现URL中的?region=a®ion=b 这种重复key,router会解析为['a','b'], 取第一个地区ID |
|
|
// 如果出现URL中的?region=a®ion=b 这种重复key,router会解析为['a','b'], 取第一个地区ID |
|
|
const regionName = Array.isArray(route.query.region) ? route.query.region[0] : route.query.region |
|
|
const regionName = Array.isArray(route.query.region) ? route.query.region[0] : route.query.region |
|
|
@ -383,7 +383,7 @@ onMounted(async () => { |
|
|
queryParams.markets = [matchedId] |
|
|
queryParams.markets = [matchedId] |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fetchData() |
|
|
fetchData() |
|
|
}) |
|
|
}) |
|
|
</script> |
|
|
</script> |
|
|
@ -402,16 +402,9 @@ onMounted(async () => { |
|
|
<div class="search-item"> |
|
|
<div class="search-item"> |
|
|
<span class="label">{{ t('common.market') }}:</span> |
|
|
<span class="label">{{ t('common.market') }}:</span> |
|
|
<!-- 下拉多选,使用 el-cascader 匹配地区树结构 --> |
|
|
<!-- 下拉多选,使用 el-cascader 匹配地区树结构 --> |
|
|
<el-cascader |
|
|
|
|
|
v-model="queryParams.markets" |
|
|
|
|
|
:options="marketOptions" |
|
|
|
|
|
:props="{ multiple: true, emitPath: false }" |
|
|
|
|
|
collapse-tags |
|
|
|
|
|
collapse-tags-tooltip |
|
|
|
|
|
:placeholder="t('common.marketPlaceholder')" |
|
|
|
|
|
clearable |
|
|
|
|
|
style="width: 220px;" |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
<el-cascader v-model="queryParams.markets" :options="marketOptions" |
|
|
|
|
|
:props="{ multiple: true, emitPath: false }" collapse-tags collapse-tags-tooltip |
|
|
|
|
|
:placeholder="t('common.marketPlaceholder')" clearable style="width: 220px;" /> |
|
|
</div> |
|
|
</div> |
|
|
<div class="search-item"> |
|
|
<div class="search-item"> |
|
|
<span class="label">{{ t('common.payPlatform1') }}:</span> |
|
|
<span class="label">{{ t('common.payPlatform1') }}:</span> |
|
|
@ -425,22 +418,16 @@ onMounted(async () => { |
|
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /> |
|
|
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /> |
|
|
</el-select> |
|
|
</el-select> |
|
|
</div> |
|
|
</div> |
|
|
<div class="search-item"> |
|
|
|
|
|
<span class="label">{{ t('common.orderNo') }}:</span> |
|
|
|
|
|
<el-input v-model="queryParams.orderCode" :placeholder="t('common.orderNoPlaceholder')" clearable /> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="search-item"> |
|
|
|
|
|
<span class="label">{{ t('common.orderNo') }}:</span> |
|
|
|
|
|
<el-input v-model="queryParams.orderCode" :placeholder="t('common.orderNoPlaceholder')" clearable /> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="search-item" style="width: auto;"> |
|
|
|
|
|
|
|
|
<div class="search-item" style="width: auto;"> |
|
|
<span class="label">{{ t('common.payTime2') }}:</span> |
|
|
<span class="label">{{ t('common.payTime2') }}:</span> |
|
|
<el-date-picker |
|
|
|
|
|
v-model="queryParams.timeRange" |
|
|
|
|
|
type="datetimerange" |
|
|
|
|
|
:range-separator="t('common.to')" |
|
|
|
|
|
:start-placeholder="t('common.startTime')" |
|
|
|
|
|
:end-placeholder="t('common.endTime')" |
|
|
|
|
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
|
|
|
|
|
style="width: 350px;" |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
<el-date-picker v-model="queryParams.timeRange" type="datetimerange" :range-separator="t('common.to')" |
|
|
|
|
|
:start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" |
|
|
|
|
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" style="width: 350px;" /> |
|
|
</div> |
|
|
</div> |
|
|
<div class="search-btn-group"> |
|
|
<div class="search-btn-group"> |
|
|
<el-button type="primary" @click="handleSearch">{{ t('common.search') }}</el-button> |
|
|
<el-button type="primary" @click="handleSearch">{{ t('common.search') }}</el-button> |
|
|
@ -455,26 +442,34 @@ onMounted(async () => { |
|
|
|
|
|
|
|
|
<!-- 表格区域 --> |
|
|
<!-- 表格区域 --> |
|
|
<el-card class="table-card"> |
|
|
<el-card class="table-card"> |
|
|
<el-table :data="tableData" v-loading="loading" style="width: 100%; flex: 1;" :cell-style="{ textAlign: 'center' }" :header-cell-style="{ background: '#F3FAFE', color: '#333',textAlign: 'center' }"> |
|
|
|
|
|
<el-table-column type="index" :label="t('common_list.id')" width="60" align="center" fixed="left" /> |
|
|
|
|
|
|
|
|
<el-table :data="tableData" v-loading="loading" style="width: 100%; flex: 1;" |
|
|
|
|
|
:cell-style="{ textAlign: 'center' }" |
|
|
|
|
|
:header-cell-style="{ background: '#F3FAFE', color: '#333', textAlign: 'center' }"> |
|
|
|
|
|
<el-table-column type="index" :label="t('common_list.id')" width="60" align="center" fixed="left"> |
|
|
|
|
|
<template #default="scope"> |
|
|
|
|
|
<span>{{ scope.$index + 1 + (queryParams.pageNum - 1) * queryParams.pageSize }}</span> |
|
|
|
|
|
</template> |
|
|
|
|
|
</el-table-column> |
|
|
<el-table-column prop="jwcode" :label="t('common_list.jwcode')" width="120" fixed="left" /> |
|
|
<el-table-column prop="jwcode" :label="t('common_list.jwcode')" width="120" fixed="left" /> |
|
|
<el-table-column prop="name" :label="t('common_list.name')" width="150" show-overflow-tooltip /> |
|
|
<el-table-column prop="name" :label="t('common_list.name')" width="150" show-overflow-tooltip /> |
|
|
<el-table-column prop="marketName" :label="t('common_list.market')" width="120" show-overflow-tooltip /> |
|
|
<el-table-column prop="marketName" :label="t('common_list.market')" width="120" show-overflow-tooltip /> |
|
|
<el-table-column prop="orderCode" :label="t('common_list.orderCode')" width="280" show-overflow-tooltip /> |
|
|
<el-table-column prop="orderCode" :label="t('common_list.orderCode')" width="280" show-overflow-tooltip /> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<el-table-column prop="paymentAmount" :label="t('common_list.payAmount')" width="150" align="right"> |
|
|
<el-table-column prop="paymentAmount" :label="t('common_list.payAmount')" width="150" align="right"> |
|
|
<!-- <template #default="{ row }"> |
|
|
<!-- <template #default="{ row }"> |
|
|
{{ row.paymentAmount }} {{ row.paymentCurrency }} |
|
|
{{ row.paymentAmount }} {{ row.paymentCurrency }} |
|
|
</template> --> |
|
|
</template> --> |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
<el-table-column prop="paymentCurrencyName" :label="t('common_list.payCurrency')" width="120" show-overflow-tooltip /> |
|
|
|
|
|
|
|
|
<el-table-column prop="paymentCurrencyName" :label="t('common_list.payCurrency')" width="120" |
|
|
|
|
|
show-overflow-tooltip /> |
|
|
|
|
|
|
|
|
<el-table-column prop="receivedAmount" :label="t('common_list.receiveAmount')" width="150" align="right"> |
|
|
<el-table-column prop="receivedAmount" :label="t('common_list.receiveAmount')" width="150" align="right"> |
|
|
<!-- <template #default="{ row }"> |
|
|
<!-- <template #default="{ row }"> |
|
|
{{ row.receivedAmount }} {{ row.receivedCurrency }} |
|
|
{{ row.receivedAmount }} {{ row.receivedCurrency }} |
|
|
</template> --> |
|
|
</template> --> |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
<el-table-column prop="receivedCurrencyName" :label="t('common_list.receiveCurrency')" width="120" show-overflow-tooltip /> |
|
|
|
|
|
|
|
|
<el-table-column prop="receivedCurrencyName" :label="t('common_list.receiveCurrency')" width="120" |
|
|
|
|
|
show-overflow-tooltip /> |
|
|
|
|
|
|
|
|
<el-table-column prop="handlingCharge" :label="t('common_list.fee')" width="100" align="right" /> |
|
|
<el-table-column prop="handlingCharge" :label="t('common_list.fee')" width="100" align="right" /> |
|
|
<el-table-column prop="payType" :label="t('common_list.payModel')" width="120" align="center" /> |
|
|
<el-table-column prop="payType" :label="t('common_list.payModel')" width="120" align="center" /> |
|
|
@ -483,36 +478,28 @@ onMounted(async () => { |
|
|
<el-table-column prop="status" :label="t('common_list.status')" width="120" align="center" fixed="right"> |
|
|
<el-table-column prop="status" :label="t('common_list.status')" width="120" align="center" fixed="right"> |
|
|
<template #default="{ row }"> |
|
|
<template #default="{ row }"> |
|
|
<div style="display: flex; align-items: center;"> |
|
|
<div style="display: flex; align-items: center;"> |
|
|
<el-tag :type="row.status === 4 ? 'success' : 'warning'" effect="plain"> |
|
|
|
|
|
{{ row.status === 4 ? t('common_list.received') : t('common_list.refunded') }} |
|
|
|
|
|
</el-tag> |
|
|
|
|
|
<el-popover |
|
|
|
|
|
trigger="hover" |
|
|
|
|
|
placement="top" |
|
|
|
|
|
popper-class="refund-popover" |
|
|
|
|
|
width="auto" |
|
|
|
|
|
v-if="row.status === 6" |
|
|
|
|
|
> |
|
|
|
|
|
<div class="popover-content"> |
|
|
|
|
|
<div class="popover-title">{{ t('common_list.refundDetail') }}</div> |
|
|
|
|
|
<div class="popover-item"> |
|
|
|
|
|
<span class="label">{{ t('common_list.refundAmount') }}:</span> |
|
|
|
|
|
<span class="value">{{ row.refundAmount || '-' }}</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="popover-item"> |
|
|
|
|
|
<span class="label">{{ t('common_list.refundCurrency') }}:</span> |
|
|
|
|
|
<span class="value">{{ row.refundCurrency || '-' }}</span> |
|
|
|
|
|
|
|
|
<el-tag :type="row.status === 4 ? 'success' : 'warning'" effect="plain"> |
|
|
|
|
|
{{ row.status === 4 ? t('common_list.received') : t('common_list.refunded') }} |
|
|
|
|
|
</el-tag> |
|
|
|
|
|
<el-popover trigger="hover" placement="top" popper-class="refund-popover" width="auto" |
|
|
|
|
|
v-if="row.status === 6"> |
|
|
|
|
|
<div class="popover-content"> |
|
|
|
|
|
<div class="popover-title">{{ t('common_list.refundDetail') }}</div> |
|
|
|
|
|
<div class="popover-item"> |
|
|
|
|
|
<span class="label">{{ t('common_list.refundAmount') }}:</span> |
|
|
|
|
|
<span class="value">{{ row.refundAmount || '-' }}</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="popover-item"> |
|
|
|
|
|
<span class="label">{{ t('common_list.refundCurrency') }}:</span> |
|
|
|
|
|
<span class="value">{{ row.refundCurrency || '-' }}</span> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<template #reference> |
|
|
|
|
|
<img |
|
|
|
|
|
@click.stop |
|
|
|
|
|
src="@/assets/SvgIcons/consume.svg" |
|
|
|
|
|
style="width: 15px; height: 15px; margin-left: 5px; cursor: pointer; display: inline-block;" |
|
|
|
|
|
> |
|
|
|
|
|
</template> |
|
|
|
|
|
</el-popover> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<template #reference> |
|
|
|
|
|
<img @click.stop src="@/assets/SvgIcons/consume.svg" |
|
|
|
|
|
style="width: 15px; height: 15px; margin-left: 5px; cursor: pointer; display: inline-block;"> |
|
|
|
|
|
</template> |
|
|
|
|
|
</el-popover> |
|
|
|
|
|
</div> |
|
|
</template> |
|
|
</template> |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
|
|
|
|
|
|
@ -700,6 +687,7 @@ onMounted(async () => { |
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
|
|
width: 100px; |
|
|
width: 100px; |
|
|
min-width: none; |
|
|
min-width: none; |
|
|
|
|
|
|
|
|
.el-popper__arrow::before { |
|
|
.el-popper__arrow::before { |
|
|
background-color: #EEF5FE !important; |
|
|
background-color: #EEF5FE !important; |
|
|
border-color: #EEF5FE !important; |
|
|
border-color: #EEF5FE !important; |
|
|
@ -707,32 +695,35 @@ onMounted(async () => { |
|
|
} |
|
|
} |
|
|
</style> |
|
|
</style> |
|
|
<style scoped lang="scss"> |
|
|
<style scoped lang="scss"> |
|
|
|
|
|
|
|
|
.popover-content { |
|
|
|
|
|
|
|
|
.popover-content { |
|
|
.popover-title { |
|
|
.popover-title { |
|
|
color: #409EFF; |
|
|
color: #409EFF; |
|
|
font-weight: bold; |
|
|
font-weight: bold; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
margin-bottom: 8px; |
|
|
margin-bottom: 8px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.popover-item { |
|
|
.popover-item { |
|
|
display: flex; |
|
|
display: flex; |
|
|
font-size: 13px; |
|
|
font-size: 13px; |
|
|
color: #606266; |
|
|
color: #606266; |
|
|
margin-bottom: 4px; |
|
|
margin-bottom: 4px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:last-child { |
|
|
&:last-child { |
|
|
margin-bottom: 0; |
|
|
margin-bottom: 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.label { |
|
|
.label { |
|
|
color: #606266; |
|
|
color: #606266; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.value { |
|
|
.value { |
|
|
color: #606266; |
|
|
color: #606266; |
|
|
margin-left: 4px; |
|
|
margin-left: 4px; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.cash-flow-container { |
|
|
.cash-flow-container { |
|
|
display: flex; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
flex-direction: column; |
|
|
|