index.vue 5.6 KB

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