index.vue 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div class="page-container">
  3. <div class="page-header">
  4. <div>
  5. <h1 class="page-title">代理收益报表</h1>
  6. <p class="page-desc">各代理收入排名、趋势与汇总</p>
  7. </div>
  8. </div>
  9. <!-- 时间范围切换 -->
  10. <el-card shadow="never" class="mb16 filter-card">
  11. <el-radio-group v-model="daysRange" size="small" @change="fetchData">
  12. <el-radio-button :label="7">近7天</el-radio-button>
  13. <el-radio-button :label="30">近30天</el-radio-button>
  14. <el-radio-button :label="90">近90天</el-radio-button>
  15. </el-radio-group>
  16. </el-card>
  17. <!-- 代理收入排名 -->
  18. <el-card shadow="hover" style="margin-top:16px;border-radius:16px;border:none">
  19. <div slot="header" class="card-header">
  20. <div class="card-header-left">
  21. <div class="card-header-icon" style="background: linear-gradient(135deg, #3b82f6, #60a5fa);">
  22. <i class="el-icon-s-data" style="color:#fff;font-size:16px"></i>
  23. </div>
  24. <span class="card-header-title">代理收入排名</span>
  25. </div>
  26. </div>
  27. <el-table :data="agentReport" border v-loading="loading" size="small" style="width:100%">
  28. <el-table-column type="index" label="#" width="60" />
  29. <el-table-column prop="proxyName" label="代理名称" min-width="120" />
  30. <el-table-column prop="companyName" label="公司" min-width="140" />
  31. <el-table-column label="平台折扣(%)" width="110" align="center">
  32. <template slot-scope="s">{{ s.row.platformDiscount || s.row.profitShareRatio || 0 }}%</template>
  33. </el-table-column>
  34. <el-table-column label="本期佣金" min-width="130" sortable :sort-method="(a,b)=>a.commission-b.commission">
  35. <template slot-scope="s">
  36. <span style="color:#3b82f6;font-weight:600">¥{{ (s.row.commission || 0).toFixed(2) }}</span>
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="代理余额" min-width="130" sortable>
  40. <template slot-scope="s">¥{{ (s.row.balance || 0).toFixed(2) }}</template>
  41. </el-table-column>
  42. <el-table-column label="累计提现" min-width="130" sortable>
  43. <template slot-scope="s">¥{{ (s.row.totalWithdrawal || 0).toFixed(2) }}</template>
  44. </el-table-column>
  45. </el-table>
  46. </el-card>
  47. </div>
  48. </template>
  49. <script>
  50. import { listProxy } from '@/api/admin/proxy'
  51. export default {
  52. name: 'AdminAgentReport',
  53. data() {
  54. return {
  55. loading: false,
  56. daysRange: 30,
  57. agentReport: []
  58. }
  59. },
  60. created() {
  61. this.fetchData()
  62. },
  63. methods: {
  64. fetchData() {
  65. this.loading = true
  66. listProxy({ pageNum: 1, pageSize: 200 }).then(res => {
  67. this.agentReport = (res.rows || []).map(p => ({
  68. proxyId: p.proxyId,
  69. proxyName: p.proxyName,
  70. companyName: p.companyName,
  71. platformDiscount: p.platformDiscount || p.profitShareRatio,
  72. commission: p.totalCommission || 0,
  73. balance: p.balance || 0,
  74. totalWithdrawal: p.totalWithdrawal || 0
  75. }))
  76. }).catch(() => {}).finally(() => { this.loading = false })
  77. }
  78. }
  79. }
  80. </script>
  81. <style scoped>
  82. .page-container { padding: 16px; }
  83. .page-header { margin-bottom: 16px; }
  84. .page-title { font-size: 22px; font-weight: 700; color: #1e293b; margin: 0 0 4px 0; }
  85. .page-desc { font-size: 14px; color: #94a3b8; margin: 0; }
  86. .mb16 { margin-bottom: 16px; }
  87. .filter-card { border-radius: 16px; border: none; padding-bottom: 0; }
  88. .card-header { display: flex; justify-content: space-between; align-items: center; }
  89. .card-header-left { display: flex; align-items: center; gap: 10px; }
  90. .card-header-icon { width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; }
  91. .card-header-title { font-size: 15px; font-weight: 600; color: #1e293b; }
  92. </style>