FamilyEarnings.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <div class="family-earnings admin-page">
  3. <div class="header admin-page-header">
  4. <h2 class="admin-page-title">家庭收益管理</h2>
  5. <div class="flex items-center gap-sm">
  6. <el-input v-model="searchKeyword" placeholder="搜索家庭ID..." prefix-icon="el-icon-search" style="width:200px" clearable @keyup.enter.native="loadList" @clear="loadList" />
  7. <el-button type="primary" @click="loadList">刷新</el-button>
  8. </div>
  9. </div>
  10. <div class="table-scroll-wrap">
  11. <el-table :data="list" v-loading="loading" border stripe :max-height="tableHeight" @row-click="showDetail">
  12. <el-table-column prop="id" label="ID" width="70" />
  13. <el-table-column prop="familyId" label="家庭ID" width="100" />
  14. <el-table-column label="累计推荐收入" width="140">
  15. <template slot-scope="{ row }">
  16. <span class="amount-orange">{{ fenToYuan(row.totalEarned) }}</span>
  17. </template>
  18. </el-table-column>
  19. <el-table-column label="可支配余额" width="140">
  20. <template slot-scope="{ row }">
  21. <span class="amount-green">{{ fenToYuan(row.availableAmount) }}</span>
  22. </template>
  23. </el-table-column>
  24. <el-table-column label="已提现" width="120">
  25. <template slot-scope="{ row }">
  26. {{ fenToYuan(row.withdrawnAmount) }}
  27. </template>
  28. </el-table-column>
  29. <el-table-column label="已分配" width="120">
  30. <template slot-scope="{ row }">
  31. {{ fenToYuan(row.distributedAmount) }}
  32. </template>
  33. </el-table-column>
  34. <el-table-column label="更新时间" width="160">
  35. <template slot-scope="{ row }">
  36. {{ row.updatedAt ? formatTime(row.updatedAt) : '-' }}
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="操作" width="100" fixed="right">
  40. <template slot-scope="{ row }">
  41. <el-button size="mini" type="primary" @click.stop="showDetail(row)">详情</el-button>
  42. </template>
  43. </el-table-column>
  44. </el-table>
  45. </div>
  46. <!-- 家庭收益详情弹窗 -->
  47. <el-dialog title="家庭收益详情" :visible.sync="detailVisible" width="700px" top="5vh">
  48. <div v-loading="detailLoading">
  49. <el-descriptions :column="2" border v-if="detail">
  50. <el-descriptions-item label="家庭ID">{{ detail.familyId || '-' }}</el-descriptions-item>
  51. <el-descriptions-item label="累计推荐收入">
  52. <span class="amount-orange">{{ fenToYuan(detail.totalEarned) }}</span>
  53. </el-descriptions-item>
  54. <el-descriptions-item label="可支配余额">
  55. <span class="amount-green">{{ fenToYuan(detail.availableAmount) }}</span>
  56. </el-descriptions-item>
  57. <el-descriptions-item label="已提现">{{ fenToYuan(detail.withdrawnAmount) }}</el-descriptions-item>
  58. <el-descriptions-item label="已分配">{{ fenToYuan(detail.distributedAmount) }}</el-descriptions-item>
  59. </el-descriptions>
  60. <h4 style="margin:20px 0 10px">成员贡献</h4>
  61. <el-table :data="detail.members || []" border stripe size="small" :max-height="300" v-if="detail && detail.members && detail.members.length > 0">
  62. <el-table-column label="昵称" prop="nickname" min-width="120" />
  63. <el-table-column label="已分配" width="120">
  64. <template slot-scope="{ row }">{{ fenToYuan(row.allocatedAmount) }}</template>
  65. </el-table-column>
  66. <el-table-column label="已消费" width="120">
  67. <template slot-scope="{ row }">{{ fenToYuan(row.consumedAmount) }}</template>
  68. </el-table-column>
  69. <el-table-column label="可用余额" width="120">
  70. <template slot-scope="{ row }"><span class="amount-green">{{ fenToYuan(row.availableAmount) }}</span></template>
  71. </el-table-column>
  72. <el-table-column label="池权限" width="100">
  73. <template slot-scope="{ row }">
  74. <el-tag :type="row.canUseFamilyBalance ? 'success' : 'info'" size="mini">
  75. {{ row.canUseFamilyBalance ? '可用' : '关闭' }}
  76. </el-tag>
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="管理员" width="80">
  80. <template slot-scope="{ row }">
  81. <el-tag v-if="row.isAdmin" type="warning" size="mini">是</el-tag>
  82. <span v-else>否</span>
  83. </template>
  84. </el-table-column>
  85. </el-table>
  86. </div>
  87. </el-dialog>
  88. </div>
  89. </template>
  90. <script>
  91. import { getFamilyEarningsList, getFamilyEarningsDetail } from '@/api/admin'
  92. export default {
  93. computed: {
  94. tableHeight() {
  95. return window.innerHeight - 300
  96. }
  97. },
  98. data() {
  99. return {
  100. list: [],
  101. loading: false,
  102. searchKeyword: '',
  103. detailVisible: false,
  104. detailLoading: false,
  105. detail: null
  106. }
  107. },
  108. mounted() {
  109. this.loadList()
  110. },
  111. methods: {
  112. async loadList() {
  113. this.loading = true
  114. try {
  115. var res = await getFamilyEarningsList()
  116. this.list = res.data || []
  117. } catch (e) {
  118. this.$message.error('加载失败')
  119. } finally {
  120. this.loading = false
  121. }
  122. },
  123. async showDetail(row) {
  124. this.detailVisible = true
  125. this.detailLoading = true
  126. try {
  127. var res = await getFamilyEarningsDetail(row.familyId || row.id)
  128. this.detail = res.data || row
  129. } catch (e) {
  130. this.$message.error('加载详情失败')
  131. this.detail = row
  132. } finally {
  133. this.detailLoading = false
  134. }
  135. },
  136. fenToYuan(fen) {
  137. if (fen === null || fen === undefined) return '0.00'
  138. var num = Number(fen)
  139. if (isNaN(num)) return '0.00'
  140. return (num / 100).toFixed(2)
  141. },
  142. formatTime(t) {
  143. if (!t) return '-'
  144. return t.replace ? t.replace('T', ' ').substring(0, 19) : String(t)
  145. }
  146. }
  147. }
  148. </script>
  149. <style scoped>
  150. .family-earnings {
  151. padding: 20px;
  152. }
  153. .amount-orange {
  154. font-weight: bold;
  155. color: #e6a23c;
  156. }
  157. .amount-green {
  158. font-weight: bold;
  159. color: #67c23a;
  160. }
  161. </style>