This commit is contained in:
sion
2026-04-10 01:22:25 +08:00
parent 046744d83b
commit 8d3c3b36df
7 changed files with 46 additions and 18 deletions

View File

@@ -1,4 +1,4 @@
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, ShieldCheck, TrendingUp, Users } from 'lucide-vue-next'
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, ShieldCheck, TrendingUp, Users, Wallet } from 'lucide-vue-next'
import type { NavGroup } from '@/components/app-sidebar/types'
import { useAuthStore } from '@/stores/auth'
@@ -19,6 +19,7 @@ export function useSidebar() {
{ title: '数据看板', url: '/monisuo/dashboard', icon: DollarSign, roles: [1] },
{ title: '用户管理', url: '/monisuo/users', icon: Users, roles: [1] },
{ title: '币种管理', url: '/monisuo/coins', icon: Coins, roles: [1] },
{ title: '钱包管理', url: '/monisuo/wallets', icon: Wallet, roles: [1] },
{ title: '订单审批', url: '/monisuo/orders', icon: Receipt, roles: [1, 2] },
{ title: '财务审批', url: '/monisuo/finance-orders', icon: CircleDollarSign, roles: [1, 3] },
{ title: '业务分析', url: '/monisuo/analytics', icon: TrendingUp, roles: [1] },

View File

@@ -40,6 +40,11 @@ function formatVal(val: number | string | undefined | null): string {
return n.toFixed(2)
}
function tradeTotalValue(userStats: any): number {
if (!userStats?.tradeAccounts) return 0
return userStats.tradeAccounts.reduce((sum: number, t: any) => sum + (Number(t.value) || 0), 0)
}
function daysAgo(time: string | undefined | null): number {
if (!time) return 0
const d = new Date(time.replace('T', ' '))
@@ -132,7 +137,6 @@ function copyToClipboard(text: string) {
<UiTableHead class="text-right">
应出款
</UiTableHead>
<UiTableHead>审批人</UiTableHead>
<UiTableHead class="hidden xl:table-cell">
时间
</UiTableHead>
@@ -143,12 +147,12 @@ function copyToClipboard(text: string) {
</UiTableHeader>
<UiTableBody>
<UiTableRow v-if="pendingLoading">
<UiTableCell :col-span="8" class="text-center py-8">
<UiTableCell :col-span="7" class="text-center py-8">
<UiSpinner class="mx-auto" />
</UiTableCell>
</UiTableRow>
<UiTableRow v-else-if="pendingOrders.length === 0">
<UiTableCell :col-span="8" class="text-center py-8 text-muted-foreground">
<UiTableCell :col-span="7" class="text-center py-8 text-muted-foreground">
<Icon icon="lucide:inbox" class="size-8 mx-auto mb-2 opacity-50" />
<p>暂无待审核订单</p>
</UiTableCell>
@@ -167,9 +171,6 @@ function copyToClipboard(text: string) {
<UiTableCell class="text-right font-mono font-bold text-green-600">
{{ formatAmount(order.receivableAmount || 0) }}
</UiTableCell>
<UiTableCell class="text-sm">
{{ order.approveAdminName || '-' }}
</UiTableCell>
<UiTableCell class="hidden xl:table-cell text-muted-foreground text-sm">
{{ order.createTime }}
</UiTableCell>
@@ -227,9 +228,6 @@ function copyToClipboard(text: string) {
<div class="text-sm text-muted-foreground mt-1">
手续费: -{{ formatAmount(order.fee || 0) }} | 实际到账: {{ formatAmount(order.receivableAmount || 0) }}
</div>
<div class="text-sm text-muted-foreground mt-1">
审批人: {{ order.approveAdminName || '-' }}
</div>
<div v-if="order.walletAddress" class="mt-2 text-sm">
<span class="text-muted-foreground">提现地址:</span>
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
@@ -342,7 +340,7 @@ function copyToClipboard(text: string) {
</div>
</div>
</div>
<div class="grid grid-cols-3 gap-2 text-center pt-2 border-t">
<div class="grid grid-cols-4 gap-2 text-center pt-2 border-t">
<div>
<div class="text-xs text-muted-foreground">
冻结金额
@@ -351,6 +349,14 @@ function copyToClipboard(text: string) {
{{ formatVal(userStats.fundAccount?.frozen) }}
</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
交易账户
</div>
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">
{{ formatVal(tradeTotalValue(userStats)) }}
</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
推广人数
@@ -527,7 +533,7 @@ function copyToClipboard(text: string) {
</div>
</div>
<div class="text-muted-foreground text-center">
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 推广: {{ userStats.referralStats?.directCount || 0 }} | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 交易账户: {{ formatVal(tradeTotalValue(userStats)) }} | 推广: {{ userStats.referralStats?.directCount || 0 }} | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
</div>
</div>
<div>

View File

@@ -155,6 +155,12 @@ function formatVal(val: number | string | undefined | null): string {
return n.toFixed(2)
}
function tradeTotalValue(userStats: any): number {
if (!userStats?.tradeAccounts) return 0
return userStats.tradeAccounts.reduce((sum: number, t: any) => sum + (Number(t.value) || 0), 0)
}
function daysAgo(time: string | undefined | null): number {
if (!time) return 0
const d = new Date(time.replace('T', ' '))
@@ -204,6 +210,7 @@ function getStatusText(order: OrderFund): string {
case 2: return '已出款'
case 3: return '已驳回'
case 4: return '已取消'
case 5: return '待财务审核'
default: return '未知'
}
}
@@ -747,7 +754,7 @@ function copyToClipboard(text: string) {
</div>
</div>
</div>
<div class="grid grid-cols-3 gap-2 text-center pt-2 border-t">
<div class="grid grid-cols-4 gap-2 text-center pt-2 border-t">
<div>
<div class="text-xs text-muted-foreground">
冻结金额
@@ -756,6 +763,14 @@ function copyToClipboard(text: string) {
{{ formatVal(userStats.fundAccount?.frozen) }}
</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
交易账户
</div>
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">
{{ formatVal(tradeTotalValue(userStats)) }}
</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
推广人数
@@ -1050,7 +1065,7 @@ function copyToClipboard(text: string) {
</div>
</div>
<div class="text-muted-foreground text-center">
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 推广: {{ userStats.referralStats?.directCount || 0 }} | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 交易账户: {{ formatVal(tradeTotalValue(userStats)) }} | 推广: {{ userStats.referralStats?.directCount || 0 }} | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
</div>
</div>
</template>