AdvertisingSpaceDatePage.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <!-- 推广位甘特图 -->
  2. <template>
  3. <el-form :inline="true">
  4. <el-form-item label="时间">
  5. <el-date-picker
  6. v-model="from.datas"
  7. type="daterange"
  8. format="YYYY-MM-DD"
  9. value-format="YYYY-MM-DD"
  10. range-separator="-"
  11. start-placeholder="开始时间"
  12. end-placeholder="结束时间"
  13. />
  14. </el-form-item>
  15. <el-form-item label="站点">
  16. <el-select
  17. filterable
  18. clearable
  19. v-model="from.mediaId"
  20. placeholder="站点"
  21. style="width: 200px"
  22. >
  23. <el-option
  24. v-for="item in SiteList"
  25. :key="item.mediaId"
  26. :label="item.mediaName"
  27. :value="item.mediaId"
  28. />
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item>
  32. <el-button type="primary" @click="getDataList" :loading="loading">搜索</el-button>
  33. </el-form-item>
  34. </el-form>
  35. <el-empty v-show="!dataList || !dataList.length" description="暂无数据" />
  36. <div class="row" v-show="dataList && dataList.length">
  37. <div class="col">广告位</div>
  38. <div
  39. class="col"
  40. :style="'width: calc((100% - 100px)/' + dayCha + ')'"
  41. v-for="v in tableHeader"
  42. :key="v"
  43. v-text="v"
  44. ></div>
  45. </div>
  46. <div class="row" v-show="dataList && dataList.length" v-for="item in dataList" :key="item.name">
  47. <div class="col" style="" v-text="item.name"></div>
  48. <div
  49. class="col"
  50. :style="
  51. 'width: calc((100% - 100px)/' +
  52. dayCha +
  53. ');background-color: ' +
  54. (v ? '#409eff' : '#ffffff00')
  55. "
  56. v-for="v in item.datesList"
  57. :key="v"
  58. >
  59. <el-tooltip v-if="v" effect="dark" :content="v" placement="top-start">
  60. <div style="width: 100%; height: 100%"></div>
  61. </el-tooltip>
  62. </div>
  63. </div>
  64. </template>
  65. <script setup lang="ts">
  66. import { ref } from 'vue'
  67. import type { AsSpaceItem, CreativesList, AsSpaceList } from '@/types/AsSpace'
  68. import type { Pages } from '@/types/Tool'
  69. import type { SiteList } from '@/types/Site'
  70. import { getAsSpaceList, getSiteList } from '@/api/index'
  71. import { formatDateSite } from '@/tool/index'
  72. const SiteList = ref<SiteList>([])
  73. getSiteList().then((res) => {
  74. SiteList.value.push(...res.data)
  75. })
  76. const time = new Date().getTime()
  77. const loading = ref(false)
  78. const from = ref<Pages>({
  79. pageNum: 1,
  80. pageSize: 999999,
  81. datas: [formatDateSite(time - 30 * 86400000, 'Y-M-D'), formatDateSite(time, 'Y-M-D')],
  82. })
  83. const dataList = ref<AsSpaceList[]>()
  84. const firstDay = ref<Date>()
  85. const changeDate = (date: string[][]): string[] => {
  86. if (!firstDay.value) return []
  87. const list: string[] = new Array(dayCha.value)
  88. const e = dayCha.value || 0
  89. for (let i = 0; i < e; i++) {
  90. const li: string[] = []
  91. const D = firstDay.value.getTime() + 86400000 * i
  92. for (let p = 0; p < date.length; p++) {
  93. const v = date[p]
  94. const s = new Date(v[0] + ' 00:00:00').getTime()
  95. const e = new Date(v[1] + ' 23:59:59').getTime()
  96. if (D >= s && D <= e) {
  97. li.push(v[2])
  98. }
  99. }
  100. list[i] = li.join('、')
  101. }
  102. return list
  103. }
  104. const getDataList = () => {
  105. const t = setTimeout(() => {
  106. clearTimeout(t)
  107. loading.value = true
  108. }, 500)
  109. if (!from.value.datas || !from.value.datas.length) return
  110. getAsSpaceList({
  111. pageNum: 1,
  112. pageSize: 999999,
  113. keyword: null,
  114. status: 10,
  115. mediaId: from.value.mediaId,
  116. startDate: from.value.datas[0],
  117. endDate: from.value.datas[1],
  118. })
  119. .then(({ data: { records } }) => {
  120. if (!from.value.datas || !from.value.datas.length) return
  121. firstDay.value = new Date(from.value.datas[0] + ' 00:00:00')
  122. dayCha.value = DateDifference(from.value.datas[0], from.value.datas[1])
  123. dataList.value = records.map((item: AsSpaceItem) => {
  124. const dates = item.creativesList.map((v: CreativesList) => {
  125. return [v.startDate, v.endDate, v.creativeName]
  126. })
  127. const datesList: string[] = changeDate(dates)
  128. return {
  129. name: item.slotName,
  130. dates,
  131. datesList,
  132. }
  133. })
  134. renderTableHeader()
  135. clearTimeout(t)
  136. loading.value = false
  137. })
  138. .catch(() => {
  139. clearTimeout(t)
  140. loading.value = false
  141. })
  142. }
  143. const DateDifference = (start: string, end: string) => {
  144. console.log(start, end)
  145. const startDate = new Date(start + ' 00:00:00')
  146. const endDate = new Date(end + ' 00:00:00')
  147. return Math.ceil((endDate.getTime() - startDate.getTime()) / 86400000) + 1
  148. }
  149. const dayCha = ref<number>()
  150. if (from.value.datas && from.value.datas.length)
  151. dayCha.value = DateDifference(from.value.datas[0], from.value.datas[1])
  152. const tableHeader = ref<string[]>([])
  153. const renderTableHeader = () => {
  154. if (!firstDay.value) return
  155. const TH: string[] = []
  156. const e = dayCha.value || 0
  157. for (let i = 0; i < e; i++) {
  158. const date = new Date(firstDay.value.getTime() + 86400000 * i)
  159. TH.push(date.getDate().toString())
  160. }
  161. tableHeader.value = TH
  162. }
  163. getDataList()
  164. </script>
  165. <style scoped>
  166. .row {
  167. /* 禁止换行 */
  168. white-space: nowrap;
  169. border: 1px solid var(--el-border-color);
  170. border-right: none;
  171. font-size: 0;
  172. }
  173. .row:not(:last-child) {
  174. border-bottom: none;
  175. }
  176. .col {
  177. display: inline-block;
  178. height: 1.7em;
  179. line-height: 1.7em;
  180. overflow: hidden;
  181. border-right: 1px solid var(--el-border-color);
  182. font-size: 14px;
  183. width: 100px;
  184. text-align: center;
  185. }
  186. </style>