ReportSpaceFormsMonthPage.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <!-- 广告报表列表页 -->
  2. <template>
  3. <div v-loading="loading">
  4. <el-form :inline="true">
  5. <el-form-item label="周期">
  6. <el-date-picker
  7. v-model="pages.datas"
  8. type="daterange"
  9. format="YYYY-MM-DD"
  10. value-format="YYYY-MM-DD"
  11. range-separator="到"
  12. start-placeholder="开始时间"
  13. end-placeholder="结束时间"
  14. />
  15. </el-form-item>
  16. <el-form-item label="站点">
  17. <el-select
  18. filterable
  19. clearable
  20. multiple
  21. collapse-tags
  22. v-model="pages.mediaIds"
  23. placeholder="站点"
  24. style="width: 200px"
  25. >
  26. <el-option
  27. v-for="item in SiteList"
  28. :key="item.mediaId"
  29. :label="item.mediaName"
  30. :value="item.mediaId"
  31. />
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="广告位">
  35. <el-select
  36. filterable
  37. clearable
  38. multiple
  39. collapse-tags
  40. v-model="pages.slotIds"
  41. placeholder="广告位"
  42. style="width: 200px"
  43. >
  44. <el-option
  45. v-for="item in SlotIds"
  46. :key="item.slotId"
  47. :label="item.slotName"
  48. :value="item.slotId"
  49. />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item>
  53. <el-button type="primary" @click="() => onSubmit()">搜索</el-button>
  54. <el-button type="primary" @click="() => onSubmit(true)">导出</el-button>
  55. </el-form-item>
  56. </el-form>
  57. <el-table :data="tableData" stripe style="width: 100%">
  58. <el-table-column prop="sdate" label="日期" />
  59. <el-table-column prop="exposureCount" label="曝光数" />
  60. <el-table-column prop="clickCount" label="点击数" />
  61. <el-table-column prop="uvCount" label="用户数" />
  62. </el-table>
  63. <br />
  64. <el-pagination
  65. background
  66. layout="prev, pager, next"
  67. :total="pages.total"
  68. @current-change="page"
  69. />
  70. </div>
  71. </template>
  72. <script setup lang="ts">
  73. import type { Pages } from '@/types/Tool'
  74. import type { IReportItem } from '@/types/Report'
  75. import type { SiteList } from '@/types/Site'
  76. import type { AsSpaceItem } from '@/types/AsSpace'
  77. import { getMediaReport, getMediaMonthReport, getSiteList, getAsSpaceList } from '@/api/index'
  78. import { formatDate } from '@/tool/index'
  79. import { reactive, ref } from 'vue'
  80. const tableData = ref<IReportItem[]>([])
  81. const date_ = formatDate(new Date().getTime())
  82. const SiteList = ref<SiteList>([])
  83. const pages = reactive<Pages>({
  84. pageNum: 1,
  85. pageSize: 10,
  86. mediaIds: [],
  87. slotIds: [],
  88. datas: [
  89. date_.fmtYear + '-' + date_.fmtMonth + '-' + date_.fmtDay,
  90. date_.fmtYear + '-' + date_.fmtMonth + '-' + date_.fmtDay,
  91. ],
  92. total: 0,
  93. type: 'month',
  94. })
  95. const loading = ref(false)
  96. const SlotIds = ref<AsSpaceItem[]>([])
  97. const getAsSpaceListFunc = () => {
  98. return new Promise((resolve) => {
  99. let i = 0
  100. const len = pages.mediaIds?.length || 0
  101. pages.mediaIds?.map((v) => {
  102. getAsSpaceList({
  103. pageNum: 1,
  104. pageSize: 999999,
  105. mediaId: v,
  106. }).then(({ data }) => {
  107. SlotIds.value.push(...data.records)
  108. if (i++ >= len) resolve(true)
  109. })
  110. })
  111. })
  112. }
  113. const onSubmit = (isExport = false) => {
  114. const p = {
  115. startDate: pages.datas ? pages.datas[0] : '',
  116. endDate: pages.datas ? pages.datas[1] : '',
  117. pageNum: pages.pageNum,
  118. pageSize: isExport ? 999999 : pages.pageSize,
  119. }
  120. const Func = pages.type == 'day' ? getMediaReport : getMediaMonthReport
  121. Func(p).then(({ data }) => {
  122. if (!isExport) {
  123. loading.value = false
  124. tableData.value = data.records
  125. pages.total = data.total
  126. return
  127. }
  128. if (!data.records || data.records.length == 0) {
  129. loading.value = false
  130. return
  131. }
  132. // 生成数据
  133. let strcsv = 'data:text/csv;charset=utf-8,\uFEFF日期,曝光数,点击数,用户数\r\n'
  134. ;(data.records || []).map((v: IReportItem) => {
  135. strcsv += `${v.sdate},${v.exposureCount},${v.clickCount},${v.uvCount},\r\n`
  136. })
  137. // 导出
  138. let link: HTMLAnchorElement | undefined = document.createElement('a')
  139. link.id = 'download-csv'
  140. link.setAttribute('href', encodeURI(strcsv))
  141. link.setAttribute('download', '广告位' + '.csv')
  142. link.click()
  143. link = undefined
  144. loading.value = false
  145. })
  146. }
  147. const page = (val: number) => {
  148. pages.pageNum = val
  149. onSubmit()
  150. }
  151. getSiteList().then((res) => {
  152. SiteList.value = res.data || []
  153. pages.mediaIds = typeof SiteList.value[0].mediaId === 'number' ? [SiteList.value[0].mediaId] : []
  154. getAsSpaceListFunc().then(() => {
  155. onSubmit()
  156. })
  157. })
  158. </script>
  159. <style></style>