ReportFormsPage.vue 6.0 KB

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