index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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, 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. // startDate: '2023-11-01',
  97. // endDate: '2023-11-15',
  98. profileId: profile.value.profile_id,
  99. campaignType: selectedPortfolios.value
  100. })
  101. const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
  102. const router = useRouter()
  103. const showCompare = ref(false)
  104. const jumpGroup = (row: any) => {
  105. router.push({
  106. name: 'CampaignDetail',
  107. query: { campaignId: row.campaignId, tagsViewName: row.campaignName },
  108. })
  109. }
  110. onMounted(async () => {
  111. crudExpose.doRefresh()
  112. })
  113. watch(queryParams, async () => {
  114. crudExpose.doRefresh()
  115. }, { deep: true })
  116. </script>
  117. <style lang="scss" scoped>
  118. .campare-switch {
  119. flex: none;
  120. }
  121. ::v-deep(.el-table--border .el-table__footer-wrapper) {
  122. border: none;
  123. }
  124. ::v-deep(.el-table .el-table__footer-wrapper .cell) {
  125. font-weight: 600;
  126. }
  127. </style>