index.vue 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <div class="app-container">
  3. <el-card shadow="never" class="mb16">
  4. <div slot="header">
  5. <span>总账号-租户费用明细</span>
  6. </div>
  7. <el-form :inline="true" label-width="90px">
  8. <el-form-item label="租户筛选">
  9. <el-select v-model="queryTenantId" clearable filterable placeholder="不选=全部租户" style="width: 360px">
  10. <el-option
  11. v-for="item in tenantOptions"
  12. :key="item.id"
  13. :label="item.tenantName + '(' + item.tenantCode + ')'"
  14. :value="item.id"
  15. />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button type="primary" icon="el-icon-search" size="mini" @click="loadDetails">查询</el-button>
  20. </el-form-item>
  21. </el-form>
  22. </el-card>
  23. <el-card shadow="never">
  24. <div slot="header" class="header-row">
  25. <span>费用明细列表</span>
  26. <el-button size="mini" type="primary" plain @click="loadDetails">刷新</el-button>
  27. </div>
  28. <el-table :data="detailList" v-loading="loading" border>
  29. <el-table-column label="租户ID" prop="tenantId" width="100" />
  30. <el-table-column label="事件ID" prop="eventId" min-width="180" />
  31. <el-table-column label="事件类型" prop="eventType" width="120" />
  32. <el-table-column label="子类型" prop="subType" width="120" />
  33. <el-table-column label="计费用量" prop="usageValue" width="120" />
  34. <el-table-column label="金额" prop="amount" width="120" />
  35. <el-table-column label="发生时间" prop="occurredAt" min-width="180" />
  36. </el-table>
  37. </el-card>
  38. </div>
  39. </template>
  40. <script>
  41. import { tenantList } from '@/api/tenant/tenant'
  42. import { listBillingDetailsAdmin } from '@/api/saas/billing'
  43. export default {
  44. name: 'SaasBillingAdmin',
  45. data() {
  46. return {
  47. loading: false,
  48. queryTenantId: null,
  49. tenantOptions: [],
  50. detailList: []
  51. }
  52. },
  53. created() {
  54. this.loadTenantOptions()
  55. this.loadDetails()
  56. },
  57. methods: {
  58. loadTenantOptions() {
  59. tenantList({}).then(res => {
  60. this.tenantOptions = res.rows || res.data || []
  61. })
  62. },
  63. loadDetails() {
  64. this.loading = true
  65. const params = {}
  66. if (this.queryTenantId) {
  67. params.tenantId = this.queryTenantId
  68. }
  69. listBillingDetailsAdmin(params).then(res => {
  70. this.detailList = res.rows || []
  71. }).finally(() => {
  72. this.loading = false
  73. })
  74. }
  75. }
  76. }
  77. </script>
  78. <style scoped>
  79. .mb16 {
  80. margin-bottom: 16px;
  81. }
  82. .header-row {
  83. display: flex;
  84. align-items: center;
  85. justify-content: space-between;
  86. }
  87. </style>