Files
bdrp-app/src/pages/agent.vue

233 lines
7.3 KiB
Vue
Raw Normal View History

2026-04-20 16:42:28 +08:00
<script setup>
import { storeToRefs } from 'pinia'
import { computed, ref } from 'vue'
definePage({ layout: 'home' })
const agentStore = useAgentStore()
const { isAgent } = storeToRefs(agentStore)
const data = ref(null)
const dateRangeMap = {
today: 'today',
week: 'last7d',
month: 'last30d',
}
const dateTextMap = {
today: '今日',
week: '近7天',
month: '近1月',
}
const promoteDateOptions = [
{ label: '今日', value: 'today' },
{ label: '近7天', value: 'week' },
{ label: '近1月', value: 'month' },
]
const selectedPromoteDate = ref('today')
const teamDateOptions = [
{ label: '今日', value: 'today' },
{ label: '近7天', value: 'week' },
{ label: '近1月', value: 'month' },
]
const selectedTeamDate = ref('today')
const currentPromoteData = computed(() => {
const range = dateRangeMap[selectedPromoteDate.value]
return data.value?.direct_push?.[range] || { commission: 0, report: 0 }
})
const currentTeamData = computed(() => {
const range = dateRangeMap[selectedTeamDate.value]
return data.value?.active_reward?.[range] || {
sub_promote_reward: 0,
sub_upgrade_reward: 0,
sub_withdraw_reward: 0,
}
})
const promoteTimeText = computed(() => dateTextMap[selectedPromoteDate.value] || '今日')
const teamTimeText = computed(() => dateTextMap[selectedTeamDate.value] || '今日')
async function getData() {
try {
2026-04-23 14:57:35 +08:00
const { data: res, error } = await useApiFetch('/agent/revenue', { silent: true }).get().json()
2026-04-20 16:42:28 +08:00
if (res.value?.code === 200 && !error.value) {
data.value = res.value.data
}
}
catch {
uni.showToast({ title: '网络错误', icon: 'none' })
}
}
onShow(() => {
if (isAgent.value) {
getData()
}
})
function goToPromoteDetail() {
uni.navigateTo({ url: '/pages/agent-promote-details' })
}
function goToRewardsDetail() {
uni.navigateTo({ url: '/pages/agent-rewards-details' })
}
function toWithdraw() {
uni.navigateTo({ url: '/pages/withdraw' })
}
function toWithdrawDetails() {
uni.navigateTo({ url: '/pages/withdraw-details' })
}
function toSubordinateList() {
uni.navigateTo({ url: '/pages/subordinate-list' })
}
</script>
<template>
<view class="safe-area-top min-h-screen p-4">
<view class="mb-4 rounded-xl from-blue-50/70 to-blue-100/50 bg-gradient-to-r p-6 shadow-lg">
<view class="mb-3 flex items-center justify-between">
<text class="text-lg text-gray-800 font-bold">
余额
</text>
<text class="text-3xl text-blue-600 font-bold">
¥ {{ (data?.balance || 0).toFixed(2) }}
</text>
</view>
<view class="mb-2 text-sm text-gray-500">
累计收益¥ {{ (data?.total_earnings || 0).toFixed(2) }}
</view>
<view class="mb-1 text-sm text-gray-500">
待结账金额¥ {{ (data?.frozen_balance || 0).toFixed(2) }}
</view>
<view class="mb-6 text-xs text-gray-400">
待结账金额将在订单创建24小时后自动结账
</view>
<view class="grid grid-cols-2 gap-3">
<wd-button type="primary" block @click="toWithdraw">
提现
</wd-button>
<wd-button plain block @click="toWithdrawDetails">
提现记录
</wd-button>
</view>
</view>
<view class="mb-4 rounded-xl from-blue-50/40 to-cyan-50/50 bg-gradient-to-r p-6 shadow-lg">
<view class="mb-4 flex items-center justify-between">
<text class="text-lg text-gray-800 font-bold">
直推报告收益
</text>
<view class="text-right">
<text class="text-2xl text-blue-600 font-bold">
¥ {{ (data?.direct_push?.total_commission || 0).toFixed(2) }}
</text>
<view class="mt-1 text-sm text-gray-500">
有效报告 {{ data?.direct_push?.total_report || 0 }}
</view>
</view>
</view>
<view class="grid grid-cols-3 mb-6 gap-2">
<view
v-for="item in promoteDateOptions"
:key="item.value"
class="rounded-full px-4 py-1 text-center text-sm transition-all"
:class="selectedPromoteDate === item.value ? 'bg-blue-500 text-white shadow-md' : 'border border-gray-200/50 bg-white/90 text-gray-600'"
@click="selectedPromoteDate = item.value"
>
{{ item.label }}
</view>
</view>
<view class="grid grid-cols-2 mb-6 gap-4">
<view class="rounded-lg bg-blue-50/60 p-3 backdrop-blur-sm">
<view class="text-sm text-gray-500">
{{ promoteTimeText }}收益
</view>
<text class="mt-1 text-xl text-blue-600 font-bold">
¥ {{ currentPromoteData.commission?.toFixed(2) || '0.00' }}
</text>
</view>
<view class="rounded-lg bg-blue-50/60 p-3 backdrop-blur-sm">
<view class="text-sm text-gray-500">
有效报告
</view>
<text class="mt-1 text-xl text-blue-600 font-bold">
{{ currentPromoteData.report || 0 }}
</text>
</view>
</view>
<view class="flex items-center justify-between text-sm text-blue-500 font-semibold" @click="goToPromoteDetail">
<text>查看收益明细</text>
<text class="text-lg">
</text>
</view>
</view>
<view class="rounded-xl from-green-50/40 to-cyan-50/30 bg-gradient-to-r p-6 shadow-lg">
<view class="mb-4">
<text class="text-lg text-gray-800 font-bold">
团队奖励
</text>
</view>
<view class="grid grid-cols-3 mb-6 gap-2">
<view
v-for="item in teamDateOptions"
:key="item.value"
class="rounded-full px-4 py-1 text-center text-sm transition-all"
:class="selectedTeamDate === item.value ? 'bg-green-500 text-white shadow-md' : 'border border-gray-200/50 bg-white/90 text-gray-600'"
@click="selectedTeamDate = item.value"
>
{{ item.label }}
</view>
</view>
<view class="grid grid-cols-1 mb-6 gap-2">
<view class="rounded-lg bg-green-50/60 p-3 backdrop-blur-sm">
<view class="text-sm text-gray-500">
{{ teamTimeText }}下级推广奖励
</view>
<text class="mt-1 text-xl text-green-600 font-bold">
¥ {{ (currentTeamData.sub_promote_reward || 0).toFixed(2) }}
</text>
</view>
<view class="rounded-lg bg-green-50/60 p-3 backdrop-blur-sm">
<view class="text-sm text-gray-500">
{{ teamTimeText }}下级转化奖励
</view>
<text class="mt-1 text-xl text-green-600 font-bold">
¥ {{ (currentTeamData.sub_upgrade_reward || 0).toFixed(2) }}
</text>
</view>
<view class="rounded-lg bg-green-50/60 p-3 backdrop-blur-sm">
<view class="text-sm text-gray-500">
{{ teamTimeText }}下级提现奖励
</view>
<text class="mt-1 text-xl text-green-600 font-bold">
¥ {{ (currentTeamData.sub_withdraw_reward || 0).toFixed(2) }}
</text>
</view>
</view>
<view class="grid grid-cols-1 gap-3 sm:grid-cols-2">
<wd-button plain block @click="goToRewardsDetail">
团队奖励明细
</wd-button>
<wd-button type="success" block @click="toSubordinateList">
查看我的下级
</wd-button>
</view>
</view>
</view>
</template>