yumi-admin/apps/src/views/operate/bank-exchange-gold-list-base.vue
2026-03-31 17:40:10 +08:00

218 lines
5.6 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.

<script lang="ts" setup>
import { computed, reactive, ref, watch } from 'vue';
import { Page } from '@vben/common-ui';
import { useAccessStore } from '@vben/stores';
import { pageBankWithdrawGoldApply } from '#/api/legacy/operate';
import AccountInput from '#/components/account-input.vue';
import { formatDate, getAllowedSysOrigins } from '#/views/system/shared';
import {
Button,
Card,
DatePicker,
Select,
Space,
Table,
} from 'antdv-next';
import {
BANK_EXCHANGE_ACCEPT_OPTIONS,
buildDateRangePresets,
} from './shared';
import type { DayjsRange } from './shared';
import UserProfileLink from './components/user-profile-link.vue';
const props = withDefaults(
defineProps<{
amountType?: string;
title: string;
}>(),
{
amountType: '',
},
);
const accessStore = useAccessStore();
const sysOriginOptions = computed(() => {
const options = getAllowedSysOrigins(accessStore.accessCodes || []);
return options.length > 0 ? options : getAllowedSysOrigins([]);
});
const loading = ref(false);
const loadMoreLoading = ref(false);
const notData = ref(false);
const list = ref<Array<Record<string, any>>>([]);
const rangeDate = ref<DayjsRange | null>(null);
const query = reactive<Record<string, any>>({
acceptAccount: '',
acceptUserId: '',
endTime: '',
lastId: '',
limit: 20,
startTime: '',
submitUserId: '',
sysOrigin: '',
});
if (props.amountType) {
query.amountType = props.amountType;
}
watch(rangeDate, (value) => {
query.startTime = value?.[0]?.valueOf() || '';
query.endTime = value?.[1]?.valueOf() || '';
});
watch(
sysOriginOptions,
(options) => {
if (!query.sysOrigin) {
query.sysOrigin = String(options[0]?.value || '');
}
},
{ immediate: true },
);
const columns = [
{ dataIndex: 'sysOrigin', key: 'sysOrigin', title: '系统', width: 90 },
{ dataIndex: 'submitUser', key: 'submitUser', title: '提交用户', width: 260 },
{ dataIndex: 'acceptUser', key: 'acceptUser', title: '接收用户', width: 260 },
{ dataIndex: 'acceptAccountName', key: 'acceptAccountName', title: '接收方式', width: 120 },
{ dataIndex: 'amount', key: 'amount', title: '提交金额', width: 120 },
{ dataIndex: 'exchangeRate', key: 'exchangeRate', title: '兑换比率', width: 120 },
{ dataIndex: 'goldQuantity', key: 'goldQuantity', title: '获得金币', width: 120 },
{ dataIndex: 'createTime', key: 'createTime', title: '创建时间', width: 180 },
];
async function loadData(reset = false) {
if (!query.sysOrigin) {
return;
}
if (reset) {
query.lastId = '';
list.value = [];
notData.value = false;
}
if (reset) {
loading.value = true;
} else {
loadMoreLoading.value = true;
}
try {
const result = await pageBankWithdrawGoldApply({ ...query });
const current = result || [];
notData.value = current.length <= 0;
if (!notData.value) {
list.value = [...list.value, ...current];
query.lastId = String(list.value[list.value.length - 1]?.id || '');
}
} finally {
loading.value = false;
loadMoreLoading.value = false;
}
}
function handleSearch() {
void loadData(true);
}
watch(
() => query.sysOrigin,
(value) => {
if (value) {
void loadData(true);
}
},
{ immediate: true },
);
</script>
<template>
<Page :title="title">
<Card>
<div class="toolbar">
<Space wrap>
<SysOriginSelect v-model:value="query.sysOrigin" style="width: 140px"
:options="sysOriginOptions"
></SysOriginSelect>
<AccountInput
v-model:value="query.submitUserId"
:sys-origin="query.sysOrigin"
placeholder="提交用户ID"
style="width: 260px"
/>
<AccountInput
v-model:value="query.acceptUserId"
:sys-origin="query.sysOrigin"
placeholder="接收用户ID"
style="width: 260px"
/>
<Select option-label-prop="label"
v-model:value="query.acceptAccount"
allow-clear
placeholder="类型"
style="width: 160px"
@change="handleSearch"
:options="BANK_EXCHANGE_ACCEPT_OPTIONS.map((item) => ({ label: `${item.label}`, value: item.value as any }))"
/>
<DatePicker.RangePicker
v-model:value="rangeDate"
:presets="buildDateRangePresets()"
show-time
/>
<Button :loading="loading" type="primary" @click="handleSearch">
搜索
</Button>
</Space>
</div>
<Table
:columns="columns"
:data-source="list"
:loading="loading"
:pagination="false"
row-key="id"
:scroll="{ x: 1360 }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'submitUser'">
<UserProfileLink :profile="record.submitUser" />
</template>
<template v-else-if="column.key === 'acceptUser'">
<UserProfileLink :profile="record.acceptUser" />
</template>
<template v-else-if="column.key === 'createTime'">
创建日期{{ formatDate(record.createTime) }}
</template>
</template>
</Table>
<div v-if="list.length > 0" class="load-more">
<span v-if="notData">已加载全部</span>
<Button
v-else
:loading="loadMoreLoading"
size="small"
@click="loadData()"
>
加载更多
</Button>
</div>
</Card>
</Page>
</template>
<style scoped>
.toolbar {
margin-bottom: 16px;
}
.load-more {
padding: 20px 0 0;
text-align: center;
}
</style>