index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <wrapper
  3. fill
  4. margin
  5. padding
  6. background
  7. >
  8. <schema-table
  9. ref="table"
  10. :schema="schema"
  11. />
  12. <confirm-dialog
  13. ref="rejectDialog"
  14. title="拒绝原因"
  15. @confirm="onConfirmReject"
  16. >
  17. <div class="c-grid-form u-align-self--center">
  18. <span class="c-grid-form__label">拒绝原因</span>
  19. <el-select
  20. v-model="review.type"
  21. placeholder="请选择"
  22. >
  23. <el-option
  24. v-for="option in reviewOptions"
  25. :key="option.label"
  26. :label="option.label"
  27. :value="option.value"
  28. />
  29. </el-select>
  30. <template v-if="review.type === 'reject'">
  31. <span class="c-grid-form__label u-required">描述</span>
  32. <el-input
  33. v-model.trim="review.reason"
  34. type="textarea"
  35. placeholder="请填写拒绝原因"
  36. maxlength="50"
  37. :rows="3"
  38. resize="none"
  39. show-word-limit
  40. />
  41. </template>
  42. </div>
  43. </confirm-dialog>
  44. <preview-dialog ref="previewDialog" />
  45. </wrapper>
  46. </template>
  47. <script>
  48. import { State } from '@/constant'
  49. import {
  50. parseByte,
  51. parseDuration,
  52. transformOrderAssetToAsset
  53. } from '@/utils'
  54. import {
  55. getAssets,
  56. resolveAsset,
  57. rejectAsset
  58. } from '../api'
  59. export default {
  60. name: 'AdAssetReview',
  61. data () {
  62. return {
  63. schema: {
  64. list: getAssets,
  65. transform: this.transformAsset,
  66. condition: { status: State.SUBMITTED },
  67. cols: [
  68. { prop: 'typeInfo', type: 'refresh', width: 80 },
  69. { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
  70. { prop: 'size', label: '文件大小', align: 'right' },
  71. { prop: 'ratio', label: '分辨率', align: 'right' },
  72. { prop: 'diff', label: '其他', align: 'right' },
  73. { prop: 'createTime', label: '提交时间', width: 160, align: 'right' },
  74. { type: 'invoke', width: 160, render: [
  75. { label: '查看', on: this.onViewAsset },
  76. { label: '通过', on: this.onResolve },
  77. { label: '拒绝', on: this.onReject }
  78. ] }
  79. ]
  80. },
  81. reviewOptions: [
  82. { value: 'reject', label: '自定义' },
  83. { value: '内容不合规' }
  84. ],
  85. review: {
  86. type: '',
  87. reason: ''
  88. }
  89. }
  90. },
  91. methods: {
  92. transformAsset (asset) {
  93. const data = transformOrderAssetToAsset(asset)
  94. if (data.file) {
  95. const { width, height, status, reason, size, duration, createTime } = asset
  96. data.ratio = width && height ? `${width}x${height}` : '-'
  97. data.statusTag = {
  98. type: ['', 'primay', 'success', 'danger'][status],
  99. label: ['-', '待审核', '通过', '驳回'][status],
  100. msg: reason
  101. }
  102. data.size = parseByte(size)
  103. data.diff = parseDuration(duration)
  104. data.createTime = createTime
  105. }
  106. data.keyName = asset.keyName
  107. return data
  108. },
  109. onResolve (asset) {
  110. resolveAsset(asset).then(() => {
  111. this.$refs.table.decrease(1)
  112. })
  113. },
  114. onReject (asset) {
  115. this.$asset = asset
  116. this.review = {
  117. type: 'reject',
  118. reason: ''
  119. }
  120. this.$refs.rejectDialog.show()
  121. },
  122. onConfirmReject (done) {
  123. const reason = this.review.type === 'reject' ? this.review.reason : this.review.type
  124. if (!reason) {
  125. this.$message({
  126. type: 'warning',
  127. message: '请选择或填写驳回原因'
  128. })
  129. return
  130. }
  131. rejectAsset(this.$asset, reason).then(() => {
  132. done()
  133. this.$refs.table.decrease(1)
  134. })
  135. },
  136. onViewAsset ({ file }) {
  137. this.$refs.previewDialog.show(file)
  138. }
  139. }
  140. }
  141. </script>