index.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <fs-page class="fs-page-custom">
  3. <fs-crud ref="crudRef" v-bind="crudBinding">
  4. <template #header-middle>
  5. <el-tabs v-model="tabActiveName" class="chart-tabs" type="border-card">
  6. <el-tab-pane label="数据趋势" name="dataTendency">
  7. <DataTendencyChart
  8. v-if="tabActiveName === 'dataTendency'"
  9. :query="queryParams"
  10. :fetchCard="getCardData"
  11. :fetchLine="getLineData"
  12. :fetch-line-month="getLineMonthData"
  13. :fetch-line-week="getLineWeekData"></DataTendencyChart>
  14. </el-tab-pane>
  15. <el-tab-pane label="广告结构" name="adStruct">
  16. <AdStructChart v-if="tabActiveName === 'adStruct'" />
  17. </el-tab-pane>
  18. <el-tab-pane label="散点视图" name="scatterView">
  19. <div v-if="tabActiveName === 'scatterView'">散点视图</div>
  20. </el-tab-pane>
  21. </el-tabs>
  22. </template>
  23. <template #cell_percentTimeInBudget="scope">
  24. <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0" />
  25. </template>
  26. <template #cell_campaignName="scope">
  27. <el-tooltip effect="dark" :content="scope.row.campaignName" placement="top">
  28. <el-link type="primary" :underline="false" @click="jumpGroup(scope.row)">
  29. <div class="en-text">{{ scope.row.campaignName }}</div>
  30. </el-link>
  31. </el-tooltip>
  32. </template>
  33. <template #cell_MissedImpressions="scope">
  34. {{ scope.row.MissedImpressionsLower ?? '0' }} ~ {{ scope.row.MissedImpressionsUpper ?? '0' }}
  35. </template>
  36. <template #cell_MissedClicks="scope">{{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }}</template>
  37. <template #cell_MissedSales="scope">{{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }}</template>
  38. <template v-for="field of Object.keys(BaseColumn)" #[`cell_${field}`]="scope">
  39. <DataCompare
  40. :field="field"
  41. :value="scope.row[field]"
  42. :prev-val="scope.row[`prev${field}`]"
  43. :gap-val="scope.row[`gap${field}`]"
  44. :date-range="dateRange"
  45. :show-compare="showCompare" />
  46. </template>
  47. <template #toolbar-left>
  48. <div class="campare-switch">
  49. <span>数据对比</span>
  50. <el-switch v-model="showCompare" size="small" />
  51. </div>
  52. </template>
  53. </fs-crud>
  54. </fs-page>
  55. </template>
  56. <script lang="ts" setup>
  57. import { onMounted, ref, watch } from 'vue'
  58. import { FsPage, useFs } from '@fast-crud/fast-crud'
  59. import { createCrudOptions } from './crud'
  60. import { useShopInfo } from '/@/stores/shopInfo'
  61. import { usePublicData } from '/@/stores/publicData'
  62. import { storeToRefs } from 'pinia'
  63. import { useRouter } from 'vue-router'
  64. import AdStructChart from './chartComponents/adStruct.vue'
  65. import DataTendencyChart from '/@/views/adManage/sp/chartComponents/dataTendency.vue'
  66. import { getCardData, getLineData, getLineMonthData, getLineWeekData } from './api'
  67. import { BaseColumn } from '/@/views/adManage/utils/commonTabColumn.js'
  68. import DataCompare from '/@/components/dataCompare/index.vue'
  69. const tabActiveName = ref('dataTendency')
  70. const shopInfo = useShopInfo()
  71. const publicData = usePublicData()
  72. const { dateRange } = storeToRefs(publicData)
  73. const { profile } = storeToRefs(shopInfo)
  74. const queryParams = ref({
  75. profileId: profile.value.profile_id,
  76. dateRange,
  77. })
  78. const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
  79. const router = useRouter()
  80. const showCompare = ref(false)
  81. const jumpGroup = (row: any) => {
  82. router.push({
  83. name: 'SpCampaignDetail',
  84. query: { campaignId: row.campaignId, tagsViewName: row.campaignName },
  85. })
  86. }
  87. onMounted(async () => {
  88. crudExpose.doRefresh()
  89. })
  90. watch(
  91. queryParams,
  92. async () => {
  93. crudExpose.doRefresh()
  94. },
  95. { deep: true }
  96. )
  97. </script>
  98. <style lang="scss" scoped>
  99. .campare-switch {
  100. flex: none;
  101. }
  102. ::v-deep(.el-table__footer-wrapper td.el-table__cell:nth-child(n + 3):nth-child(-n + 10) .cell) {
  103. display: none;
  104. }
  105. ::v-deep(.el-table--border .el-table__footer-wrapper) {
  106. border: none;
  107. }
  108. ::v-deep(.el-table__footer-wrapper .el-table__footer tr) {
  109. background-color: #f5f7fa;
  110. }
  111. .en-text {
  112. max-width: 100%;
  113. font-size: 13px;
  114. font-weight: 420;
  115. word-break: break-word;
  116. overflow: hidden;
  117. text-overflow: ellipsis;
  118. white-space: normal;
  119. display: -webkit-box;
  120. -webkit-line-clamp: 1;
  121. -webkit-box-orient: vertical;
  122. }
  123. </style>