ReportSpaceFormsPage.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 clearable v-model="pages.type" style="width: 200px">
  18. <el-option label="日" value="day" />
  19. <el-option label="月" value="month" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="区域">
  23. <el-select filterable clearable v-model="pages.province" style="width: 200px">
  24. <el-option
  25. v-for="item in provinces"
  26. :key="item.value"
  27. :label="item.label"
  28. :value="item.value"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="广告主">
  33. <el-select
  34. multiple
  35. collapse-tags
  36. filterable
  37. clearable
  38. v-model="pages.advertiserIds"
  39. style="width: 200px"
  40. >
  41. <el-option
  42. v-for="item in advertisers"
  43. :key="item.advertiserId"
  44. :label="item.enterpriseName"
  45. :value="item.advertiserId"
  46. />
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="创意">
  50. <el-select
  51. multiple
  52. collapse-tags
  53. filterable
  54. clearable
  55. v-model="pages.creativeIds"
  56. style="width: 200px"
  57. >
  58. <el-option
  59. v-for="item in originalitys"
  60. :key="item.creativeId"
  61. :label="item.creativeName"
  62. :value="item.creativeId"
  63. />
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="素材">
  67. <el-select
  68. multiple
  69. collapse-tags
  70. filterable
  71. clearable
  72. v-model="pages.stuffIds"
  73. style="width: 200px"
  74. >
  75. <el-option
  76. v-for="item in SourceMaterials"
  77. :key="item.stuffId"
  78. :label="item.stuffName"
  79. :value="item.stuffId"
  80. />
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item>
  84. <el-button type="primary" @click="onSubmit">搜索</el-button>
  85. <el-button type="primary" @click="() => onSubmit()">导出</el-button>
  86. </el-form-item>
  87. </el-form>
  88. <el-table :data="tableData" stripe style="width: 100%">
  89. <el-table-column prop="sdate" label="日期" />
  90. <el-table-column prop="requestCount" label="请求数" />
  91. <el-table-column prop="exposureCount" label="曝光数" />
  92. <el-table-column prop="clickCount" label="点击数" />
  93. <el-table-column prop="uvCount" label="用户数" />
  94. </el-table>
  95. <br />
  96. <el-pagination
  97. background
  98. layout="prev, pager, next"
  99. :total="pages.total"
  100. @current-change="page"
  101. />
  102. </div>
  103. </template>
  104. <script setup lang="ts">
  105. import type { OriginalityItem } from '@/types/AdListPage'
  106. import type { Advertiser } from '@/types/Advertiser'
  107. import type { Pages } from '@/types/Tool'
  108. import type { SourceMaterialList } from '@/types/SourceMaterial'
  109. import type { IReportItem } from '@/types/Report'
  110. import {
  111. getAdvertiserList,
  112. getOriginalityList,
  113. getMaterialList,
  114. getMediaReport,
  115. getMediaMonthReport,
  116. getProvinceCity,
  117. } from '@/api/index'
  118. import { formatDate } from '@/tool/index'
  119. import { reactive, ref } from 'vue'
  120. const tableData = ref<IReportItem[]>([])
  121. const date_ = formatDate(new Date().getTime())
  122. const pages = reactive<Pages>({
  123. pageNum: 1,
  124. pageSize: 10,
  125. advertiserIds: [],
  126. creativeIds: [],
  127. stuffIds: [],
  128. province: '',
  129. datas: [
  130. date_.fmtYear + '-' + date_.fmtMonth + '-' + date_.fmtDay,
  131. date_.fmtYear + '-' + date_.fmtMonth + '-' + date_.fmtDay,
  132. ],
  133. total: 0,
  134. type: 'day',
  135. })
  136. const advertisers = ref<Advertiser[]>([])
  137. const originalitys = ref<OriginalityItem[]>([])
  138. const SourceMaterials = ref<SourceMaterialList>([])
  139. const loading = ref(false)
  140. const provinces = ref<{ label: string; value: string }[]>([])
  141. const getList = () => {
  142. getAdvertiserList({
  143. pageNum: 1,
  144. pageSize: 999999,
  145. }).then(({ data }) => {
  146. // 广告主列表
  147. advertisers.value = data.records || []
  148. })
  149. getOriginalityList({
  150. pageNum: 1,
  151. pageSize: 999999,
  152. keyword: '',
  153. }).then(({ data }) => {
  154. // 创意列表
  155. originalitys.value = data.records || []
  156. })
  157. getMaterialList({
  158. pageNum: 1,
  159. pageSize: 999999,
  160. }).then(({ data }) => {
  161. // 素材列表
  162. SourceMaterials.value = data.records || []
  163. })
  164. getProvinceCity().then(({ data }) => {
  165. provinces.value = data.area.map((item: { name: string }) => {
  166. return {
  167. label: item.name,
  168. value: item.name,
  169. }
  170. })
  171. })
  172. }
  173. const onSubmit = (isExport = false) => {
  174. const p = {
  175. advertiserIds: pages.advertiserIds,
  176. creativeIds: pages.creativeIds,
  177. stuffIds: pages.stuffIds,
  178. startDate: pages.datas ? pages.datas[0] : '',
  179. endDate: pages.datas ? pages.datas[1] : '',
  180. provinces: [pages.province || ''],
  181. pageNum: pages.pageNum,
  182. pageSize: isExport ? 999999 : pages.pageSize,
  183. }
  184. const Func = pages.type == 'day' ? getMediaReport : getMediaMonthReport
  185. Func(p).then(({ data }) => {
  186. if (!isExport) {
  187. loading.value = false
  188. tableData.value = data.records
  189. pages.total = data.total
  190. return
  191. }
  192. if (!data.records || data.records.length == 0) {
  193. loading.value = false
  194. return
  195. }
  196. // 生成数据
  197. let strcsv = 'data:text/csv;charset=utf-8,\uFEFF日期,请求数,曝光数,点击数,用户数\r\n'
  198. ;(data.records || []).map((v: IReportItem) => {
  199. strcsv += `${v.sdate},${v.requestCount},${v.exposureCount},${v.clickCount},${v.uvCount},\r\n`
  200. })
  201. // 导出
  202. let link: HTMLAnchorElement | undefined = document.createElement('a')
  203. link.id = 'download-csv'
  204. link.setAttribute('href', encodeURI(strcsv))
  205. link.setAttribute('download', '广告位' + '.csv')
  206. link.click()
  207. link = undefined
  208. loading.value = false
  209. })
  210. }
  211. const page = (val: number) => {
  212. pages.pageNum = val
  213. onSubmit()
  214. }
  215. getList()
  216. onSubmit()
  217. </script>
  218. <style></style>