Files
hfb_sys/frontend/src/features/seller/views/SellerPickupsView.vue
T
2026-07-08 00:16:07 +08:00

150 lines
4.9 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 setup lang="ts">
import { onMounted, reactive, ref } from 'vue'
import { Refresh, Search } from '@element-plus/icons-vue'
import { fetchSellerPickups, type SellerPickup } from '@/features/seller/api/sellerPickup'
import { formatCentWithSymbol } from '@/shared/utils/money'
import { formatDateTime } from '@/shared/utils/time'
import { pickupStatusLabel } from '@/shared/utils/statusLabels'
const loading = ref(false)
const items = ref<SellerPickup[]>([])
const total = ref(0)
const filters = reactive({ page: 1, page_size: 20, status: '' })
onMounted(loadList)
async function loadList() {
loading.value = true
try {
const result = await fetchSellerPickups(filters)
items.value = result.items
total.value = result.total
} finally {
loading.value = false
}
}
function handleSearch() {
filters.page = 1
loadList()
}
function handlePageChange(p: number) {
filters.page = p
loadList()
}
function handleSizeChange(s: number) {
filters.page_size = s
filters.page = 1
loadList()
}
function statusType(status: string) {
if (status === 'picking_up') return 'warning'
if (status === 'completed') return 'success'
if (status === 'cancelled') return 'info'
return ''
}
function ratioText(value: number) {
const ratio = Number(value || 0)
if (ratio <= 0) return '-'
const rounded = Math.round(ratio * 100) / 100
return `1:${Number.isInteger(rounded) ? rounded : rounded.toFixed(2)}`
}
</script>
<template>
<section class="page">
<div class="page-header-row">
<div class="page-header">
<p class="eyebrow">Seller Pickup</p>
<h1>提号记录</h1>
<p>您的账号被管理员线下提号的记录完成后结算金额会进入钱包余额</p>
</div>
</div>
<div class="filter-bar">
<el-select v-model="filters.status" placeholder="状态" clearable style="width: 130px">
<el-option label="提号中" value="picking_up" />
<el-option label="已完成" value="completed" />
<el-option label="已取消" value="cancelled" />
</el-select>
<el-button type="primary" :icon="Search" @click="handleSearch">查询</el-button>
<el-button :icon="Refresh" @click="loadList">刷新</el-button>
</div>
<el-table v-loading="loading" :data="items" class="table-panel">
<el-table-column prop="pickup_no" label="提号编号" width="190" />
<el-table-column prop="account_title" label="账号" min-width="180" />
<el-table-column label="区服/平台" width="150">
<template #default="{ row }"
>{{ row.server_region || '-' }} / {{ row.login_platform || '-' }}</template
>
</el-table-column>
<el-table-column label="交易渠道" width="110">
<template #default="{ row }">{{ row.platform || '-' }}</template>
</el-table-column>
<el-table-column label="号主价" width="120">
<template #default="{ row }">{{ formatCentWithSymbol(row.owner_price_cent) }}</template>
</el-table-column>
<el-table-column label="回收比例" width="110">
<template #default="{ row }">{{ ratioText(row.seller_ratio) }}</template>
</el-table-column>
<el-table-column label="结算金额" width="140">
<template #default="{ row }">
<span v-if="row.status === 'completed'" class="amount-in">
{{ formatCentWithSymbol(row.settle_amount_cent) }}
</span>
<span v-else class="text-muted"></span>
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag :type="statusType(row.status)" effect="light">
{{ pickupStatusLabel(row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="时间" width="170">
<template #default="{ row }">
<span v-if="row.status === 'completed' && row.completed_at">
{{ formatDateTime(row.completed_at) }}
</span>
<span v-else>{{ formatDateTime(row.created_at) }}</span>
</template>
</el-table-column>
<el-table-column label="备注" min-width="160">
<template #default="{ row }">
<span v-if="row.status === 'completed' && row.complete_remark">{{
row.complete_remark
}}</span>
<span v-else-if="row.remark">{{ row.remark }}</span>
<span v-else class="text-muted"></span>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrapper">
<el-pagination
:current-page="filters.page"
:page-size="filters.page_size"
:page-sizes="[20, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handlePageChange"
/>
</div>
</section>
</template>
<style scoped>
.text-muted {
color: #94a3b8;
}
.amount-in {
color: #16a34a;
font-weight: 600;
}
</style>