index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <template>
  2. <div class="overview-tabs">
  3. <DateRangePicker v-model="dateRange"></DateRangePicker>
  4. <el-select
  5. v-model="selectedPortfolios"
  6. placeholder="SP"
  7. style="width: 200px"
  8. collapse-tags
  9. collapse-tags-tooltip
  10. :max-collapse-tags="3"
  11. >
  12. <el-option v-for="info of portfolios" :label="info.label" :value="info.value" :disabled="info.disabled"></el-option>
  13. </el-select>
  14. </div>
  15. <fs-page class="fs-page-custom" style="margin-top: -11px">
  16. <fs-crud ref="crudRef" v-bind="crudBinding">
  17. <template #header-middle>
  18. <el-tabs v-model="tabActiveName" class="chart-tabs" type="border-card">
  19. <DataTendencyChart
  20. v-if="tabActiveName === 'dataTendency'"
  21. :query="queryParams"
  22. :fetchCard="getCardData"
  23. :fetchLine="getLineData"
  24. :fetch-line-month="getLineMonthData"
  25. :fetch-line-week="getLineWeekData">
  26. </DataTendencyChart>
  27. </el-tabs>
  28. </template>
  29. <template #cell_percentTimeInBudget="scope">
  30. <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0" />
  31. </template>
  32. <template #cell_campaignName="scope">
  33. <el-link type="primary" :underline="false" @click="jumpGroup(scope.row)">{{ scope.row.campaignName }}</el-link>
  34. </template>
  35. <template #cell_MissedImpressions="scope">
  36. {{ scope.row.MissedImpressionsLower ?? '0' }} ~ {{ scope.row.MissedImpressionsUpper ?? '0' }}
  37. </template>
  38. <template #cell_MissedClicks="scope"> {{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }} </template>
  39. <template #cell_MissedSales="scope"> {{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }} </template>
  40. <template v-for="field of Object.keys(BaseColumn)" #[`cell_${field}`]="scope">
  41. <DataCompare
  42. :field="field"
  43. :value="scope.row[field]"
  44. :prev-val="scope.row[`prev${field}`]"
  45. :gap-val="scope.row[`gap${field}`]"
  46. :date-range="dateRange"
  47. :show-compare="showCompare"/>
  48. </template>
  49. </fs-crud>
  50. </fs-page>
  51. </template>
  52. <script lang="ts" setup>
  53. import {onMounted, Ref, ref, watch} from 'vue'
  54. import {FsPage, useFs} from '@fast-crud/fast-crud'
  55. import {createCrudOptions} from './crud'
  56. import {useShopInfo} from '/@/stores/shopInfo'
  57. import {usePublicData} from '/@/stores/publicData'
  58. import {storeToRefs} from 'pinia'
  59. import {useRouter} from 'vue-router'
  60. import DataTendencyChart from '/@/views/adManage/ad-overview/chartComponents/dataTendency.vue'
  61. import {getCardData, getLineData, getLineMonthData, getLineWeekData} from './api'
  62. import {BaseColumn} from '/@/views/adManage/utils/commonTabColumn.js'
  63. import DataCompare from '/@/components/dataCompare/index.vue'
  64. import DateRangePicker from '/@/components/DateRangePicker/index.vue'
  65. const selectedPortfolios = ref('sp')
  66. const portfolios = [
  67. {
  68. value: 'sp/sb/sd',
  69. label: 'SP/SB/SD'
  70. },
  71. {
  72. value: 'sp',
  73. label: 'SP'
  74. },
  75. {
  76. value:'sb',
  77. label:'SB'
  78. },
  79. {
  80. value:'sd',
  81. label:'SD'
  82. },
  83. {
  84. value: 'dsp',
  85. label: 'DSP',
  86. disabled: true
  87. }
  88. ]
  89. const tabActiveName = ref('dataTendency')
  90. const shopInfo = useShopInfo()
  91. const publicData = usePublicData()
  92. const { dateRange } = storeToRefs(publicData)
  93. const { profile } = storeToRefs(shopInfo)
  94. const queryParams = ref({
  95. dateRange,
  96. profileId: profile.value.profile_id,
  97. campaignType: selectedPortfolios.value
  98. })
  99. const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
  100. const router = useRouter()
  101. const showCompare = ref(false)
  102. onMounted(async () => {
  103. crudExpose.doRefresh()
  104. })
  105. const jumpGroup = (row: any) => {
  106. router.push({
  107. name: 'CampaignDetail',
  108. query: { campaignId: row.campaignId, tagsViewName: row.campaignName },
  109. })
  110. }
  111. watch(queryParams, async () => {
  112. crudExpose.doRefresh()
  113. }, { deep: true })
  114. </script>
  115. <style lang="scss" scoped>
  116. .campare-switch {
  117. flex: none;
  118. }
  119. ::v-deep(.el-table--border .el-table__footer-wrapper) {
  120. border: none;
  121. }
  122. ::v-deep(.el-table .el-table__footer-wrapper .cell) {
  123. font-weight: 600;
  124. }
  125. </style>