index.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <wrapper
  3. fill
  4. margin
  5. padding
  6. background
  7. >
  8. <schema-table
  9. ref="table"
  10. :schema="schema"
  11. />
  12. <table-dialog
  13. ref="assetDialog"
  14. title="个人媒资"
  15. size="lg"
  16. :schema="assetSchema"
  17. />
  18. <table-dialog
  19. ref="orderDialog"
  20. title="个人订单"
  21. size="lg"
  22. :schema="orderSchema"
  23. @row-click="onToggle"
  24. />
  25. <table-dialog
  26. ref="adDialog"
  27. title="上播内容"
  28. :schema="adSchema"
  29. />
  30. <preview-dialog ref="previewDialog" />
  31. </wrapper>
  32. </template>
  33. <script>
  34. import { State } from '@/constant'
  35. import {
  36. parseByte,
  37. parseDuration,
  38. transformOrderAssetToAsset
  39. } from '@/utils'
  40. import {
  41. getUsers,
  42. getAssets,
  43. getOrders
  44. } from '../api'
  45. export default {
  46. name: 'AdAssetReview',
  47. data () {
  48. return {
  49. schema: {
  50. list: getUsers,
  51. transform: this.transform,
  52. filters: [
  53. { key: 'phoneNumber', type: 'search', placeholder: '手机号' }
  54. ],
  55. cols: [
  56. { prop: 'file', type: 'asset', refresh: true },
  57. { prop: 'nickName', label: '昵称' },
  58. { prop: 'phoneNumber', label: '手机号', align: 'center', 'min-width': 120 },
  59. { type: 'invoke', render: [
  60. { label: '媒资', on: this.onAsset },
  61. { label: '订单', on: this.onOrder }
  62. ] }
  63. ]
  64. },
  65. assetSchema: {
  66. list: this.getAssets,
  67. transform: this.transformAsset,
  68. filters: [
  69. { key: 'status', type: 'select', placeholder: '状态', options: [
  70. { value: State.SUBMITTED, label: '待审核' },
  71. { value: State.RESOLVED, label: '通过' },
  72. { value: State.REJECTED, label: '驳回' }
  73. ] }
  74. ],
  75. cols: [
  76. { prop: 'typeInfo', type: 'refresh', width: 72, align: 'center' },
  77. { prop: 'file', label: '资源', type: 'asset', on: this.onViewAsset },
  78. { prop: 'size', label: '文件大小', align: 'right' },
  79. { prop: 'ratio', label: '分辨率', align: 'right' },
  80. { prop: 'diff', label: '其他', align: 'right' },
  81. { prop: 'statusTag', type: 'tag' },
  82. { prop: 'createTime', label: '上传时间', align: 'right', 'min-width': 120 },
  83. { type: 'invoke', render: [
  84. { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
  85. ] }
  86. ]
  87. },
  88. orderSchema: {
  89. list: this.getOrders,
  90. transform: this.transformOrder,
  91. filters: [
  92. { key: 'status', type: 'select', placeholder: '订单状态', options: [
  93. { value: 1, label: '待审核' },
  94. { value: 2, label: '通过' },
  95. { value: 3, label: '驳回' },
  96. { value: 4, label: '待支付' },
  97. { value: 5, label: '已过期' }
  98. ] }
  99. ],
  100. cols: [
  101. { type: 'expand', refresh: true, render: (data, h) => h('div', {
  102. staticClass: 'o-info'
  103. }, [
  104. h('div', null, `时段:${data.range}`),
  105. h('div', null, `频率:${data.freq}`)
  106. ]) },
  107. { prop: 'deviceName', label: '设备', 'min-width': 100 },
  108. { prop: 'startDate', label: '上刊日期', align: 'right', 'min-width': 100 },
  109. { prop: 'price', label: '总价(元)', 'min-width': 100, align: 'right' },
  110. { prop: 'statusTag', type: 'tag' },
  111. { prop: 'createTime', label: '提交时间', align: 'right', 'min-width': 120 },
  112. { prop: 'auditTime', label: '审核时间', align: 'right', 'min-width': 120 },
  113. { type: 'invoke', render: [
  114. { label: '上播内容', on: this.onViewOrderAssets }
  115. ] }
  116. ]
  117. },
  118. adSchema: {
  119. nonPagination: true,
  120. list: this.getOrderAssets,
  121. cols: [
  122. { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
  123. { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
  124. { prop: 'ratio', label: '分辨率', align: 'right' },
  125. { prop: 'adDuration', label: '上播时长', align: 'center' },
  126. { prop: 'statusTag', type: 'tag' },
  127. { type: 'invoke', render: [
  128. { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
  129. ] }
  130. ]
  131. }
  132. }
  133. },
  134. methods: {
  135. transform ({ openid, avatarUrl, nickName, phoneNumber }) {
  136. return {
  137. openid,
  138. file: avatarUrl && /^http/.test(avatarUrl)
  139. ? {
  140. net: true,
  141. thumb: avatarUrl
  142. }
  143. : null,
  144. nickName,
  145. phoneNumber
  146. }
  147. },
  148. getAssets (params) {
  149. return getAssets({
  150. openid: this.$openid,
  151. ...params
  152. })
  153. },
  154. transformAsset (asset) {
  155. const data = transformOrderAssetToAsset(asset)
  156. if (data.file) {
  157. const { width, height, status, reason, size, duration, createTime } = asset
  158. data.ratio = width && height ? `${width}x${height}` : '-'
  159. data.statusTag = {
  160. type: ['', 'primay', 'success', 'danger'][status],
  161. label: ['-', '待审核', '通过', '驳回'][status],
  162. msg: reason
  163. }
  164. data.size = parseByte(size)
  165. data.diff = parseDuration(duration)
  166. data.createTime = createTime
  167. }
  168. return data
  169. },
  170. onAsset ({ openid }) {
  171. this.$openid = openid
  172. this.$refs.assetDialog.show()
  173. },
  174. getOrders (params) {
  175. return getOrders({
  176. openid: this.$openid,
  177. ...params
  178. })
  179. },
  180. onOrder ({ openid }) {
  181. this.$openid = openid
  182. this.$refs.orderDialog.show()
  183. },
  184. transformOrder ({ id, price, status, expand, orders, assets, createTime, auditTime }) {
  185. const { startDate, startTime, endTime, day, duration, count } = orders[0]
  186. return {
  187. id,
  188. deviceName: orders[0].name,
  189. startDate,
  190. range: `${startTime}-${endTime}`,
  191. price: (price / 100).toFixed(2),
  192. freq: `${day}天 x ${duration}秒 x ${count}次`,
  193. statusTag: this.getOrderTag(status, expand),
  194. assets,
  195. createTime,
  196. auditTime
  197. }
  198. },
  199. getOrderTag (status, expand) {
  200. switch (status) {
  201. case 1:
  202. return {
  203. type: 'primay',
  204. label: '待审核'
  205. }
  206. case 2:
  207. return {
  208. type: 'success',
  209. label: '通过'
  210. }
  211. case 3:
  212. return {
  213. type: 'danger',
  214. label: '驳回',
  215. msg: expand
  216. }
  217. case 4:
  218. return {
  219. type: 'warning',
  220. label: '待支付'
  221. }
  222. case 5:
  223. return {
  224. type: 'danger',
  225. label: '已过期'
  226. }
  227. default:
  228. return null
  229. }
  230. },
  231. onToggle (row) {
  232. this.$refs.orderDialog.getTable().getInst().toggleRowExpansion(row)
  233. },
  234. onViewOrderAssets (order) {
  235. this.$order = order
  236. this.$refs.adDialog.show()
  237. },
  238. getOrderAssets () {
  239. return Promise.resolve({ data: this.$order.assets.map(this.transformAsset) })
  240. },
  241. onViewAsset ({ file }) {
  242. this.$refs.previewDialog.show(file)
  243. }
  244. }
  245. }
  246. </script>