浏览代码

feat: 流程审核功能完善,接口调试;模板库列表接口调试、详情接口调试

wangshuang 11 月之前
父节点
当前提交
7831050be1

+ 6 - 1
src/api/asset.js

@@ -131,6 +131,8 @@ export function getAssetUrl (keyName) {
 
 const LIMIT_SIZE = 1024 * 1024
 export function getThumbnailUrl (item, option) {
+  console.log('item::', item)
+  console.log('option::', option)
   let url
   if (item && typeof item === 'object') {
     const { size, keyName } = item
@@ -146,7 +148,10 @@ export function getThumbnailUrl (item, option) {
   if (url.charAt(0) === '/') {
     url = `${process.env.VUE_APP_THUMBNAIL_ORIGIN || location.origin}${url}`
   }
-  return `${process.env.VUE_APP_THUMBNAIL}/${option}/${url}`
+  console.log('url::', url)
+  console.log('urlurlurlreturn::', `${process.env.VUE_APP_THUMBNAIL}/${option}/${url}`)
+  return url
+  // return `${process.env.VUE_APP_THUMBNAIL}/${option}/${url}`
 }
 
 function getImageProxyOption (option, size) {

+ 10 - 1
src/api/program.js

@@ -49,7 +49,7 @@ export function getTemplateType () {
 export function getProgramTemplate (query) {
   const { pageNum: currentPage, pageSize: pageCount, ...params } = query
   return tenantRequest({
-    url: '/item/listByPage',
+    url: '/item/template/listByPage',
     method: 'POST',
     data: addTenant({
       currentPage, pageCount,
@@ -84,6 +84,7 @@ export function updateProgramDraft ({ id, name, duration, itemJsonStr, keyNameLi
   name && formData.append('name', name)
   generate && formData.append('keyNameList', JSON.stringify(keyNameList))
   formData.append('generate', generate)
+  console.log('formdata;;;;:', formData)
   return request({
     url: '/item/origin/update',
     method: 'POST',
@@ -144,6 +145,14 @@ export function getProgram (id, options) {
     ...options
   })
 }
+// 节目模板详情
+export function getTemplateProgram (id, options) {
+  return request({
+    url: `/item/template/getById/${id}`,
+    method: 'GET',
+    ...options
+  })
+}
 
 export function deleteProgram ({ id, name }) {
   return del({

+ 14 - 9
src/api/workflow.js

@@ -18,15 +18,20 @@ export function getAuditWorkflows (query, options) {
   const isFinal = access.has(Access.REVIEW_RELEASE_FINAL)
   if (!isFinal || !__JUMP_REVIEW__) {
     const arr = []
-    if (isFinal) {
-      arr.push(WorkflowState.FINAL_LEVEL)
-    }
-    if (access.has(Access.REVIEW_RELEASE_SECOND)) {
-      arr.push(WorkflowState.SECOND_LEVEL)
-    }
-    if (access.has(Access.REVIEW_RELEASE_FIRST)) {
-      arr.push(WorkflowState.FIRST_LEVEL)
-    }
+    // if (isFinal) {
+    //   arr.push(WorkflowState.FINAL_LEVEL)
+    // }
+    // if (access.has(Access.REVIEW_RELEASE_SECOND)) {
+    //   arr.push(WorkflowState.SECOND_LEVEL)
+    // }
+    // if (access.has(Access.REVIEW_RELEASE_FIRST)) {
+    //   arr.push(WorkflowState.FIRST_LEVEL)
+    // }
+
+    arr.push(WorkflowState.FINAL_LEVEL)
+    arr.push(WorkflowState.SECOND_LEVEL)
+    arr.push(WorkflowState.FIRST_LEVEL)
+
     condition.currentSeveralReviewedList = arr
   }
   return request({

+ 1 - 0
src/components/dialog/MaterialDialog/index.vue

@@ -155,6 +155,7 @@ export default {
       this.dialogVisible = true
     },
     getContentAssets () {
+      console.log('1234325436457568679780895634523---')
       return Promise.resolve({ data: this.assets })
     },
     transformAsset ({ tag, type, keyName, name, duration }) {

+ 178 - 0
src/components/dialog/MaterialTemplateDialog/index.vue

@@ -0,0 +1,178 @@
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    :custom-class="customClass"
+    title="上播内容"
+    :close-on-click-modal="false"
+    :show-close="false"
+    append-to-body
+    @open="onOpen"
+    @closed="onClosed"
+  >
+    <template v-if="contentRender">
+      <program
+        v-if="program"
+        :program="program"
+      />
+      <schedule
+        v-if="scheduleId"
+        class="l-flex__auto has-padding--h has-bottom-padding"
+        :schedule="scheduleId"
+      />
+      <schema-table
+        v-if="assets"
+        :schema="contentSchema"
+      >
+        <preview-dialog ref="previewDialog" />
+      </schema-table>
+      <i
+        class="l-flex__none c-dialog--preview__close el-icon-close has-active u-bold"
+        @click="hide"
+      />
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import {
+  PublishTargetType,
+  EventTarget,
+  AssetTagInfo,
+  AssetTypeInfo
+} from '@/constant'
+import { parseDuration } from '@/utils'
+import { getTemplateProgram } from '@/api/program'
+import Program from '@/views/screen/material/program/ast/Viewer'
+import dialogMixin from '@/mixins/dialog'
+
+export default {
+  name: 'MaterialTemplateDialog',
+  components: {
+    Program
+  },
+  mixins: [dialogMixin],
+  data () {
+    return {
+      program: null,
+      scheduleId: null,
+      assets: null,
+      contentSchema: {
+        singlePage: true,
+        list: this.getContentAssets,
+        cols: [
+          { prop: 'tagInfo', label: '分类', width: 80, align: 'center' },
+          { prop: 'typeInfo', label: '资源', width: 72, align: 'center' },
+          { prop: 'file', label: '', type: 'asset', on: this.onViewAsset },
+          { prop: 'name', label: '' },
+          { prop: 'adDuration', label: '上播时长', width: 80, align: 'center' },
+          { type: 'invoke', render: [
+            { label: '查看', allow: ({ file }) => !!file, on: this.onViewAsset }
+          ] }
+        ]
+      }
+    }
+  },
+  computed: {
+    customClass () {
+      if (this.assets) {
+        return 'c-dialog medium'
+      }
+      return `c-dialog--preview ${this.program ? 'program' : ''}`
+    }
+  },
+  methods: {
+    onClosed () {
+      this.contentRender = false
+      this.program = null
+      this.scheduleId = null
+      this.assets = null
+      this.$emit('closed')
+    },
+    showProgram (id) {
+      const loading = this.$showLoading()
+      getTemplateProgram(id).then(({ data }) => {
+        try {
+          const { id, status, name, resolutionRatio, itemJsonStr } = data
+          const [width, height] = resolutionRatio.split('x')
+          if (!width || !height) {
+            this.showMessage('error', '布局分辨率异常,请联系管理员')
+            return
+          }
+
+          this.program = {
+            id, status, name, resolutionRatio,
+            detail: {
+              width: Number(width),
+              height: Number(height),
+              ...JSON.parse(itemJsonStr)
+            }
+          }
+          this.dialogVisible = true
+        } catch (e) {
+          this.showMessage('error', '布局解析失败')
+        }
+      }).finally(() => {
+        this.$closeLoading(loading)
+      })
+    },
+    showSchedule (id) {
+      this.scheduleId = id
+      this.dialogVisible = true
+    },
+    showPublishTarget ({ type, detail }) {
+      switch (type) {
+        case PublishTargetType.CALENDAR:
+          this.showSchedule(detail)
+          break
+        case PublishTargetType.EVENT:
+          this.showEventTarget(detail.target)
+          break
+        default:
+          break
+      }
+    },
+    showEventTarget ({ type, id, sources }) {
+      switch (type) {
+        case EventTarget.PROGRAM:
+          this.showProgram(id)
+          break
+        case EventTarget.RECUR:
+          this.showSchedule(id)
+          break
+        case EventTarget.ASSETS:
+          this.showAssets(sources)
+          break
+        default:
+          break
+      }
+    },
+    showAssets (assets) {
+      assets = assets.map(this.transformAsset)
+      if (assets.length === 1) {
+        assets[0].adDuration = '独占'
+      }
+      this.assets = assets
+      this.dialogVisible = true
+    },
+    getContentAssets () {
+      console.log('1234325436457568679780895634523---')
+      return Promise.resolve({ data: this.assets })
+    },
+    transformAsset ({ tag, type, keyName, name, duration }) {
+      return {
+        tagInfo: AssetTagInfo[tag],
+        typeInfo: AssetTypeInfo[type],
+        file: {
+          type,
+          url: keyName
+        },
+        name: name || '',
+        adDuration: parseDuration(duration)
+      }
+    },
+    onViewAsset ({ file }) {
+      this.$refs.previewDialog.show(file)
+    }
+  }
+}
+</script>

+ 5 - 1
src/components/dialog/PreviewDialog/index.vue

@@ -50,7 +50,9 @@
           class="o-arrow o-icon el-icon-arrow-right has-active u-bold"
           @click="onNext"
         />
-        <div class="o-total">{{ active + 1 }}/{{ total }}</div>
+        <div class="o-total">
+          {{ active + 1 }}/{{ total }}
+        </div>
       </template>
     </template>
   </el-dialog>
@@ -93,6 +95,7 @@ export default {
       return this.fileType === AssetType.STREAMING_MEDIA
     },
     assetUrl () {
+      console.log('assetUrl---:', this.source && getAssetUrl(this.source.url))
       return this.source && getAssetUrl(this.source.url)
     }
   },
@@ -114,6 +117,7 @@ export default {
       this.active = 0
       this.source = this.$sources[this.active]
       this.dialogVisible = true
+      console.log('source::', this.$sources)
     },
     onOpen () {
       this.contentRender = true

+ 4 - 2
src/components/dialog/TemplateAssetChooseDialog/index.vue

@@ -289,7 +289,7 @@ import {
 import { getAssetsByQuery } from '@/api/asset'
 import Draggable from 'vuedraggable'
 import {
-  getProgram, updateProgramDraft
+  getTemplateProgram, updateProgramDraft
 } from '@/api/program'
 import { WidgetType } from '@/views/screen/material/program/ast/core/constant'
 import WidgetShortcut from '@/views/screen/material/program/ast/components/WidgetShortcut'
@@ -592,10 +592,11 @@ export default {
 
     show (id) {
       const loading = this.$showLoading()
-      getProgram(id)
+      getTemplateProgram(id)
         .then(({ data }) => {
           try {
             console.log('showProgram', data)
+            console.log('itemJsonStr', JSON.parse(data.itemJsonStr))
             const { id, status, name, resolutionRatio, itemJsonStr } = data
             const [width, height] = resolutionRatio.split('x')
             if (!width || !height) {
@@ -892,6 +893,7 @@ export default {
       console.log('options', options)
       try {
         const base64 = await this.snap()
+        console.log('base64:', base64)
         const result = await updateProgramDraft({
           id: this.program.id,
           duration: getDuration(this.node),

+ 26 - 0
src/views/screen/deploy/workflow/api.js

@@ -61,6 +61,20 @@ export function resolveWorkflow (workflowNodeId) {
     params: { workflowNodeId }
   })
 }
+export function resolveWorkflowV2 (workflowNodeId, userId, currentSeveralReviewed) {
+  console.log('store.getters.access:', store.getters.access)
+  console.log('jump_review', __JUMP_REVIEW__)
+  // if (__JUMP_REVIEW__ && store.getters.access.has(Access.REVIEW_RELEASE_FINAL)) {
+  //   return resolveFinal(workflowNodeId)
+  // }
+  return send({
+    url: '/workflow/reviewedAgree/v2',
+    method: 'GET',
+    params: { workflowNodeId,
+              userId,
+              currentSeveralReviewed }
+  })
+}
 
 export function rejectWorkflow (workflowNodeId, reason) {
   return send({
@@ -72,6 +86,18 @@ export function rejectWorkflow (workflowNodeId, reason) {
     }
   })
 }
+export function rejectWorkflowV2 (workflowNodeId, reason, userId, currentSeveralReviewed) {
+  return send({
+    url: '/workflow/reviewedRefuse/v2',
+    method: 'GET',
+    params: {
+      workflowNodeId,
+      reason,
+      userId,
+      currentSeveralReviewed
+    }
+  })
+}
 
 export function getAssetsByProgramSnap (itemId) {
   return request({

+ 20 - 6
src/views/screen/deploy/workflow/audit/index.vue

@@ -105,6 +105,7 @@
 
 <script>
 import { mapGetters } from 'vuex'
+import store from '@/store'
 import {
   State,
   Access,
@@ -119,8 +120,8 @@ import { parseDuration } from '@/utils'
 import { parseDeploy } from '../utils.js'
 import {
   getWorkflow,
-  resolveWorkflow,
-  rejectWorkflow,
+  resolveWorkflowV2,
+  rejectWorkflowV2,
   getAssetsByProgramSnap,
   getQrCodeStatus,
   updateQrCodeStatus
@@ -187,7 +188,8 @@ export default {
       qrCodeType: '0',
       qrCodeStatus: 1,
       qrCodeStatusTimer: -1,
-      qrCodeLoading: false
+      qrCodeLoading: false,
+      currentSeveralReviewed: 0
     }
   },
   computed: {
@@ -201,14 +203,23 @@ export default {
         return [WorkflowState.FIRST_LEVEL, WorkflowState.SECOND_LEVEL, WorkflowState.FINAL_LEVEL]
       }
       const arr = []
+      // 三级审核员 (有一审、二审、三审权限)
       if (isFinal) {
+        console.log('11111')
         arr.push(WorkflowState.FIRST_LEVEL)
+        arr.push(WorkflowState.SECOND_LEVEL)
+        arr.push(WorkflowState.FINAL_LEVEL)
       }
+      // 二级审核员(有一审、二审权限)
       if (this.access.has(Access.REVIEW_RELEASE_SECOND)) {
+        console.log('22222')
         arr.push(WorkflowState.SECOND_LEVEL)
+        arr.push(WorkflowState.FIRST_LEVEL)
       }
+      // 一级审核员(有一审权限)
       if (this.access.has(Access.REVIEW_RELEASE_FIRST)) {
-        arr.push(WorkflowState.FINAL_LEVEL)
+        console.log('33333')
+        arr.push(WorkflowState.FIRST_LEVEL)
       }
       return arr
     },
@@ -343,7 +354,9 @@ export default {
     getWorkflow () {
       this.loading = true
       this.error = false
+      console.log('this.status:', this.status)
       getWorkflow(this.id).then(({ data }) => {
+        this.currentSeveralReviewed = data.currentSeveralReviewed
         if (data.status === State.SUBMITTED && this.status.includes(data.currentSeveralReviewed)) {
           this.workflow = {
             id: data.id,
@@ -421,9 +434,10 @@ export default {
       this.$router.replace({ name: 'workflow-list' })
     },
     resolveWorkflow () {
-      return resolveWorkflow(this.workflowNodeId)
+      return resolveWorkflowV2(this.workflowNodeId, store.getters.userId, this.currentSeveralReviewed)
     },
     onResolve () {
+      console.log('222222')
       this.$confirm(
         '审核通过?',
         '操作确认',
@@ -450,7 +464,7 @@ export default {
         })
         return
       }
-      rejectWorkflow(this.workflowNodeId, reason).then(() => {
+      rejectWorkflowV2(this.workflowNodeId, reason, store.getters.userId, this.currentSeveralReviewed).then(() => {
         done()
         this.audit = 1
       })

+ 22 - 8
src/views/screen/deploy/workflow/audit/intercut/index.vue

@@ -100,6 +100,7 @@
 
 <script>
 import { mapGetters } from 'vuex'
+import store from '@/store'
 import {
   State,
   Access,
@@ -109,8 +110,8 @@ import {
 import { parseIntercutDeploy } from '../../utils.js'
 import {
   getWorkflow,
-  resolveWorkflow,
-  rejectWorkflow
+  rejectWorkflowV2,
+  resolveWorkflowV2
 } from '../../api.js'
 
 export default {
@@ -169,7 +170,8 @@ export default {
       review: {
         type: '',
         reason: ''
-      }
+      },
+      currentSeveralReviewed: 0
     }
   },
   computed: {
@@ -183,14 +185,23 @@ export default {
         return [WorkflowState.FIRST_LEVEL, WorkflowState.SECOND_LEVEL, WorkflowState.FINAL_LEVEL]
       }
       const arr = []
+      // 三级审核员 (有一审、二审、三审权限)
       if (isFinal) {
+        console.log('11111')
         arr.push(WorkflowState.FIRST_LEVEL)
+        arr.push(WorkflowState.SECOND_LEVEL)
+        arr.push(WorkflowState.FINAL_LEVEL)
       }
+      // 二级审核员(有一审、二审权限)
       if (this.access.has(Access.REVIEW_RELEASE_SECOND)) {
+        console.log('22222')
         arr.push(WorkflowState.SECOND_LEVEL)
+        arr.push(WorkflowState.FIRST_LEVEL)
       }
+      // 一级审核员(有一审权限)
       if (this.access.has(Access.REVIEW_RELEASE_FIRST)) {
-        arr.push(WorkflowState.FINAL_LEVEL)
+        console.log('33333')
+        arr.push(WorkflowState.FIRST_LEVEL)
       }
       return arr
     },
@@ -215,8 +226,10 @@ export default {
     getWorkflow () {
       this.loading = true
       this.error = false
+      console.log('this.status1:', this.status)
       getWorkflow(this.id).then(
         ({ data }) => {
+          this.currentSeveralReviewed = data.currentSeveralReviewed
           if (data.status === State.SUBMITTED && this.status.includes(data.currentSeveralReviewed)) {
             this.workflow = {
               id: data.id,
@@ -256,16 +269,17 @@ export default {
     onBack () {
       this.$router.replace({ name: 'workflow-list' })
     },
-    resolveWorkflow () {
-      return resolveWorkflow(this.workflowNodeId)
+    resolveWorkflowV2 () {
+      return resolveWorkflowV2(this.workflowNodeId, store.getters.userId, this.currentSeveralReviewed)
     },
     onResolve () {
+      console.log('1111111')
       this.$confirm(
         '审核通过?',
         '操作确认',
         { type: 'warning' }
       ).then(() => {
-        this.resolveWorkflow().then(() => {
+        this.resolveWorkflowV2().then(() => {
           this.audit = 1
         })
       })
@@ -286,7 +300,7 @@ export default {
         })
         return
       }
-      rejectWorkflow(this.workflowNodeId, reason).then(() => {
+      rejectWorkflowV2(this.workflowNodeId, reason, store.getters.userId, this.currentSeveralReviewed).then(() => {
         done()
         this.audit = 1
       })

+ 3 - 0
src/views/screen/deploy/workflow/index.vue

@@ -50,6 +50,9 @@ export default {
   },
   methods: {
     onAudit ({ id, type }) {
+      console.log('id:', id)
+      console.log('type:', type)
+      console.log('123')
       if (type === WorkflowType.INTERCUT) {
         this.$router.push({
           name: 'intercut-audit',

+ 5 - 2
src/views/screen/material/program/ProgramDesigner.vue

@@ -84,7 +84,7 @@
           </template>
         </program>
       </grid-table-item>
-      <material-dialog ref="materialTemplateDialog" />
+      <material-template-dialog ref="materialTemplateDialog" />
     </grid-table>
 
     <confirm-dialog
@@ -162,6 +162,7 @@ import Program from './components/Program.vue'
 import ProgramStore from './components/ProgramStore.vue'
 // import TemperatureConfigDialog from '@/views/realm/settings/components/TemperatureThresholdConfigDialog'
 import TemplateAssetChooseDialog from '@/components/dialog/TemplateAssetChooseDialog'
+import MaterialTemplateDialog from '@/components/dialog/MaterialTemplateDialog'
 import {
   AssetTag, AssetTagInfo, AssetType, AssetTypeInfo, TemplateType, TemplateTypeInfo
 } from '@/constant'
@@ -170,6 +171,7 @@ export default {
   name: 'ProgramDesigner',
   components: {
     TemplateAssetChooseDialog,
+    MaterialTemplateDialog,
     Program,
     ProgramStore
   },
@@ -289,6 +291,7 @@ export default {
       this.active = 'draft'
     },
     onMessage (event) {
+      console.log('onMessage11111', event)
       if (event.data?.type === 'PROGRAM_UPDATED') {
         if (this.isDraft) {
           this.$refs.table.pageTo(1)
@@ -379,7 +382,7 @@ export default {
       this.$designProgram(id)
     },
     onView ({ id }) {
-      console.log(id)
+      console.log('idididi:', id)
       // let idtest = '1856226701478084610'
       this.$refs.materialTemplateDialog.showProgram(id)
     },

+ 7 - 2
src/views/screen/material/program/ast/components/WidgetShortcut.vue

@@ -46,7 +46,9 @@
             {{ source.tag }}
           </div>
         </div>
-        <div class="o-widget-shortcut__info u-ellipsis">{{ source.origin.name }}</div>
+        <div class="o-widget-shortcut__info u-ellipsis">
+          {{ source.origin.name }}
+        </div>
         <template v-if="source.editable">
           <div
             v-if="diffInterval"
@@ -61,7 +63,9 @@
               :max="86400"
               step-strictly
             />
-            <div class="l-flex__none o-widget-shortcut__unit">秒</div>
+            <div class="l-flex__none o-widget-shortcut__unit">
+              秒
+            </div>
           </div>
           <div
             v-else
@@ -140,6 +144,7 @@ export default {
   },
   methods: {
     transform (data) {
+      console.log('data::', data)
       const type = data.type
       const source = {
         id: Math.random().toString(16).slice(2),