|
|
@@ -1,7 +1,7 @@
|
|
|
<template>
|
|
|
<div class="dashboard-container">
|
|
|
<!-- 团队统计卡片 -->
|
|
|
- <div v-if="isAdmin || isTeam" class="stats-cards">
|
|
|
+ <div v-if="isAdmin || isTeam || isPromoter" class="stats-cards">
|
|
|
<!-- 管理员视图 -->
|
|
|
<div v-if="isAdmin" class="admin-stats">
|
|
|
<div class="card">
|
|
|
@@ -81,10 +81,32 @@
|
|
|
<p class="stat-value">{{ formatRate(teamStats?.averageCommissionRate) }}%</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 推广员视图 -->
|
|
|
+ <div v-else-if="isPromoter" class="promoter-stats">
|
|
|
+ <div class="card">
|
|
|
+ <h3>队员姓名</h3>
|
|
|
+ <p class="stat-value">{{ memberStats?.name || '-' }}</p>
|
|
|
+ </div>
|
|
|
+ <div class="card">
|
|
|
+ <h3>分成比例</h3>
|
|
|
+ <p class="stat-value">{{ formatRate(memberStats?.commissionRate) }}%</p>
|
|
|
+ </div>
|
|
|
+ <div class="card revenue-card">
|
|
|
+ <h3>总分成收入</h3>
|
|
|
+ <p class="stat-value revenue-value">{{ formatAmount(memberStats?.totalCommission) }}</p>
|
|
|
+ <p class="stat-label">累计分成</p>
|
|
|
+ </div>
|
|
|
+ <div class="card revenue-card">
|
|
|
+ <h3>今日分成收入</h3>
|
|
|
+ <p class="stat-value revenue-value">{{ formatAmount(memberStats?.todayCommission) }}</p>
|
|
|
+ <p class="stat-label">今日分成</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 收入图表 -->
|
|
|
- <div class="chart-container">
|
|
|
+ <div v-if="isAdmin || isTeam" class="chart-container">
|
|
|
<div class="chart-header">
|
|
|
<h2>最近7天收入统计</h2>
|
|
|
<div v-if="isAdmin" class="chart-team-selector">
|
|
|
@@ -148,7 +170,7 @@
|
|
|
import { ref, onMounted, onUnmounted, computed, inject, watch } from 'vue'
|
|
|
import { useUserStore } from '@/stores/user'
|
|
|
import { useTeamStore } from '@/stores/team'
|
|
|
-import { getAllTeamStatistics, getIncomeStatistics } from '@/services/api'
|
|
|
+import { getAllTeamStatistics, getIncomeStatistics, listMembers } from '@/services/api'
|
|
|
import Chart from 'chart.js/auto'
|
|
|
import Select from 'primevue/select'
|
|
|
import DataTable from 'primevue/datatable'
|
|
|
@@ -164,6 +186,7 @@ const isPromoter = inject('isPromoter')
|
|
|
|
|
|
// 数据
|
|
|
const teamStats = ref(null)
|
|
|
+const memberStats = ref(null) // 推广员个人统计数据
|
|
|
const selectedTeamId = ref(null)
|
|
|
const incomeStats = ref(null)
|
|
|
const loading = ref(true)
|
|
|
@@ -234,9 +257,27 @@ const loadTeamStats = async () => {
|
|
|
data.name = data.allTeams[0].name
|
|
|
}
|
|
|
teamStats.value = data
|
|
|
+ } else if (isPromoter.value) {
|
|
|
+ // 推广员角色加载个人统计数据,使用团队成员列表接口
|
|
|
+ const currentUserId = userStore.userInfo?.id
|
|
|
+ if (currentUserId) {
|
|
|
+ const response = await listMembers(0, 1, undefined, undefined, currentUserId)
|
|
|
+ // 从列表接口返回的数据中提取第一个成员(当前用户)的统计数据
|
|
|
+ if (response.content && response.content.length > 0) {
|
|
|
+ const memberData = response.content[0]
|
|
|
+ memberStats.value = {
|
|
|
+ name: memberData.name || '-',
|
|
|
+ commissionRate: memberData.commissionRate || 0,
|
|
|
+ totalCommission: memberData.totalRevenue || 0,
|
|
|
+ totalOrders: 0, // 列表接口没有返回订单数,设为0
|
|
|
+ todayCommission: memberData.todayRevenue || 0,
|
|
|
+ todayOrders: 0 // 列表接口没有返回订单数,设为0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
} catch (error) {
|
|
|
- console.error('加载团队统计数据失败:', error)
|
|
|
+ console.error('加载统计数据失败:', error)
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
|
@@ -502,6 +543,19 @@ onUnmounted(() => {
|
|
|
max-width: 300px;
|
|
|
}
|
|
|
|
|
|
+.promoter-stats {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 1rem;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.promoter-stats .card {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 200px;
|
|
|
+ max-width: 300px;
|
|
|
+}
|
|
|
+
|
|
|
.card {
|
|
|
background-color: white;
|
|
|
border-radius: 0.5rem;
|