Parcourir la source

feat(评价): 添加评分设置接口并优化评分组件

refactor(文件预览): 新增文件预览组件支持视频和下载功能

feat(课程流程): 在课程流程中添加指导文件预览功能
zhanghaijun il y a 9 mois
Parent
commit
8d19c87766

+ 33 - 0
src/views/train/course/list/file-view.vue

@@ -0,0 +1,33 @@
+<template>
+  <div v-if="fileUrl.endsWith('.mp4')" class="border-art-border-dashed-color w-[80%] border border-solid">
+    <ArtVideoPlayer playerId="my-video-1" :videoUrl="fileUrl" :posterUrl="posterUrl" :autoplay="false" :volume="1" :playbackRates="[0.5, 1, 1.5, 2]" />
+  </div>
+  <div v-else-if="!fileUrl"> 暂无指导文件 </div>
+  <div v-else @click="downloadUrl(fileUrl)" class="flex-1 cursor-pointer text-blue-500 underline hover:text-blue-600"> {{ fileUrl }} </div>
+</template>
+<script setup lang="ts">
+  import { ref } from 'vue'
+  import lockImg from '@imgs/cover/guide.png'
+
+  // 视频源和封面图片URL
+  const posterUrl = ref(lockImg)
+
+  interface Props {
+    fileUrl?: string
+  }
+
+  withDefaults(defineProps<Props>(), {
+    fileUrl: ''
+  })
+
+  const downloadUrl = (url: string, filename?: string) => {
+    // window.open(url, '_blank')
+    const link = document.createElement('a')
+    link.href = url
+    if (filename) link.download = filename // 可选,指定下载文件名
+    link.target = '_blank'
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+  }
+</script>

+ 4 - 0
src/views/train/course/trainer_run/course_process.vue

@@ -3,12 +3,14 @@
     <CommonForm :model="commonFormModel" />
     <TriggerForm :model="triggerFormModel" v-if="isFault" />
     <CourseForm :model="courseFormModel" />
+    <FileView v-if="fileUrl.length > 0" :fileUrl="fileUrl" />
   </div>
   <div v-else>
     <el-empty description="选择执行节点" />
   </div>
 </template>
 <script setup lang="ts">
+  import FileView from '../list/file-view.vue'
   import { Process } from '@/components/business/EasyProcess/common/process.type'
   import { nodeDataCommon, nodeDataTrigger } from '@/components/business/EasyProcess/core/course.scheme'
   import { useDetailForm } from '@/components/form'
@@ -17,6 +19,7 @@
   const commonFormModel = ref<Record<string, unknown>>({})
   const triggerFormModel = ref<Record<string, unknown>>({})
   const courseFormModel = ref<Record<string, unknown>>({})
+  const fileUrl = ref('')
 
   const isCourse = computed(() => processData.value?.nodeType === 'operation' || processData.value?.nodeType === 'fault' || processData.value?.nodeType === 'voice')
   const isFault = computed(() => processData.value?.nodeType === 'fault')
@@ -121,6 +124,7 @@
         event: nodeTrigger?.event ?? '',
         triggerDelay: Number(nodeTrigger?.triggerDelay ?? 0)
       }
+      fileUrl.value = String(nodeData?.guideFilePath || '')
       setCourseFormSchema()
     }
   })

+ 11 - 31
src/views/train/evaluation/list-referee.vue

@@ -1,26 +1,8 @@
 <template>
   <ArtTable ref="refereeTableRef" :loading="refereeLoading" :data="refereeData" :columns="refereeColumns" empty-height="360px">
-    <!-- 评价赋分 -->
-    <template #evaScore="{ row }">
-      <el-input-number
-        @blur="saveRefereeRow(row, 'evaScore', '评价赋分已修改')"
-        @keyup.enter="saveRefereeRow(row, 'evaScore', '评价赋分已修改')"
-        v-model="row.evaScore"
-        :min="0"
-        :max="100"
-        :step="1"
-      />
-    </template>
-    <!-- 评价失分 -->
-    <template #evaDeduction="{ row }">
-      <el-input-number
-        @blur="saveRefereeRow(row, 'evaDeduction', '评价失分已修改')"
-        @keyup.enter="saveRefereeRow(row, 'evaDeduction', '评价失分已修改')"
-        v-model="row.evaDeduction"
-        :min="0"
-        :max="100"
-        :step="1"
-      />
+    <!-- 操作得分 -->
+    <template #operScore="{ row }">
+      <el-slider v-model="row.operScore" range show-stops :max="row.evaScore" :min="Math.max(0, row.evaDeduction)" :input="saveRefereeRow(row, 'operScore', '操作得分已修改')" />
     </template>
     <!-- 是否失格项 -->
     <template #disqualificationItem="{ row }">
@@ -64,10 +46,10 @@
         { prop: 'evaSource', label: '评价来源', formatter: (row: RefereeData) => (row.evaSource === 0 ? '流程图' : row.evaSource === 1 ? '教员自定义' : '未知') },
         { prop: 'evaType', label: '评价类型', formatter: (row: RefereeData) => (row.evaType === 0 ? '主观评价' : row.evaType === 1 ? '客观评价' : '未知') },
         { prop: 'evaName', label: '节点名称', width: '250px' },
-        { prop: 'operScore', label: '操作得分' },
+        { prop: 'operScore', label: '操作得分', useSlot: true },
         { prop: 'operTime', label: '操作时间', formatter: (row: RefereeData) => formatSecondsToHHMMSS(Number(row.operTime ?? 0)) },
-        { prop: 'evaDeduction', label: '评价失分', useSlot: true, width: 180 },
-        { prop: 'evaScore', label: '评价赋分', useSlot: true, width: 180 },
+        { prop: 'evaDeduction', label: '评价失分', width: 180 },
+        { prop: 'evaScore', label: '评价赋分', width: 180 },
         { prop: 'disqualificationItem', label: '是否失格项', useSlot: true },
         { prop: 'isOperated', label: '是否操作', useSlot: true }
       ]
@@ -84,10 +66,10 @@
   })
 
   const saveRefereeRow = async (row: RefereeData, prop: string, tip: string = '修改成功') => {
-    if (!row.runLogID || !row.runOperID || !prop) {
-      return
-    }
-    if (prop === 'isOperated') {
+    if (!row.runLogID || !row.runOperID || !prop) return
+    if (prop === 'operScore') {
+      await RefereeServer.setScore(row.runLogID, row.seqNo, Number(row.operScore))
+    } else if (prop === 'isOperated') {
       await RefereeServer.isOperated(row.runLogID, row.seqNo, Number(row.isOperated))
     } else {
       await RefereeServer.update({
@@ -104,9 +86,7 @@
     }
     emit('refresh')
     ElMessage.success(tip)
-    nextTick(() => {
-      refreshRefereeData()
-    })
+    nextTick(() => refreshRefereeData())
   }
 
   // ---------- 新增 ----------

+ 1 - 0
src/views/train/evaluation/referee.api.ts

@@ -29,4 +29,5 @@ export class RefereeServer {
   public static remove = (runLogID: number, runOperID: number) => request.post('/evalog/delete', { runLogID, runOperID })
   public static update = (data: RefereeAddRequest) => request.post('/evalog/update', data)
   public static isOperated = (runLogID: number, seqNo: number, isOperated: number) => request.post('/eva/setoperated', { runLogID, seqNo, isOperated })
+  public static setScore = (runLogID: number, seqNo: number, evaScore: number) => request.post('/evalog/setscore', { runLogID, seqNo, evaScore })
 }