| | |
| | | <!-- 历史任务详情 --> |
| | | <template> |
| | | <el-dialog class="ztzf-dialog" append-to-body modal-class="detailsOfHistoricalTasks" v-model="isShow" title="历史任务详情" |
| | | :width="pxToRem(1800)" :close-on-click-modal="false" :destroy-on-close="true"> |
| | | <el-dialog class="ztzf-dialog" append-to-body modal-class="detailsOfHistoricalTasks" v-model="isShow" title="巡检任务详情" |
| | | :width="pxToRem(1800)" :close-on-click-modal="false" :destroy-on-close="true"> |
| | | <div class="content"> |
| | | <div class="contentLeft"> |
| | | <div class="machineTableDetailsTitle"><img src="/src/assets/images/task/sign.svg" alt=""><span>详情</span></div> |
| | | <div class="machineTableDetailsTitle"><img src="/src/assets/images/task/sign.svg" alt=""> |
| | | <div class="title"> |
| | | 详情 |
| | | </div> |
| | | |
| | | <div class="btn" v-show="videoData.length > 0"> |
| | | <el-button |
| | | class="playback-video-btn" |
| | | v-show="videoData.length == 1" |
| | | type="primary" |
| | | @click="openPlaybackVideoDialog(videoData[0])" |
| | | size="small" |
| | | > |
| | | 回放直播 |
| | | </el-button> |
| | | |
| | | <el-popover placement="bottom-start" popper-class="ztzf-custom-popover bottom"> |
| | | <template #reference> |
| | | <el-button class="playback-video-btn" v-show="videoData.length > 1" type="primary" size="small"> |
| | | 回放直播 |
| | | </el-button> |
| | | </template> |
| | | |
| | | <div class="playback-video-list"> |
| | | <div v-for="(item, index) in videoData" :key="index"> |
| | | {{ formatTimestamp(item.execute_time) }} |
| | | |
| | | <div class="play-btn" @click="openPlaybackVideoDialog(item)">播放</div> |
| | | </div> |
| | | </div> |
| | | </el-popover> |
| | | </div> |
| | | </div> |
| | | <div class="infoBox"> |
| | | <div class="itemBoxLeft"> |
| | | <div v-for="(item, index) in infoList" :key="index" class="itemCon"> |
| | | <div class="itemBox"> |
| | | <div class="itemTitle">{{ item.name }}:</div> |
| | | <div truncated class="itemValue" v-if="item.name !== '飞行事件' && item.name !== '任务执行次数'">{{ |
| | | item.value ? item.value : '--' }}</div> |
| | | <div class="itemValue" v-if="item.name === '任务执行次数'">{{ item.value ? item.value : '0' |
| | | }}次</div> |
| | | <div truncated class="itemValue" v-if="item.name !== '飞行事件' && item.name !== '任务执行次数'"> |
| | | {{ item.value ? item.value : '--' }} |
| | | </div> |
| | | <div class="itemValue" v-if="item.name === '任务执行次数'">{{ item.value ? item.value : '0' }}次</div> |
| | | <!-- 飞行事件 --> |
| | | <div class="flightEvents" v-if="item.name === '飞行事件'"> |
| | | <template v-if="flightEvents.length"> |
| | | <img v-for="(item, index) in flightEvents" alt="" :src="item.img" |
| | | :title="item.name" :key="index"></img> |
| | | <img |
| | | v-for="(item, index) in flightEvents" |
| | | alt="" |
| | | :src="item.imgUrl" |
| | | :title="item.label" |
| | | :key="index" |
| | | /> |
| | | </template> |
| | | <div class="itemValue" v-else>--</div> |
| | | </div> |
| | |
| | | </div> |
| | | |
| | | </div> |
| | | <JobRelatedEvents :jobTimes="jobTimes" :batchNo="batchNo" /> |
| | | <JobRelatedEvents :jobTimes="jobTimes" :batchNo="batchNo" :waylineJobId="waylineJobId" :detailName="detailName" :isShowExportTheTask="isShowExportTheTask"/> |
| | | <div class="devicetitle" v-if="isShow"> |
| | | <div> |
| | | <img src="/src/assets/images/task/sign.svg" alt=""> |
| | |
| | | </div> |
| | | <div class="rightBox" v-if="total"> |
| | | <div class="downloadBtn" @click="htlsrwxq === 100 && downloadFun()"> |
| | | <el-progress v-if="htlsrwxq !== 100" :percentage="htlsrwxq" :show-text="false" striped striped-flow :duration="1" /> |
| | | <el-progress v-if="htlsrwxq !== 100" :percentage="htlsrwxq" :show-text="false" striped striped-flow |
| | | :duration="1" /> |
| | | <div class="downloadBtnText"> |
| | | <span v-if="htlsrwxq === 100">下载</span> |
| | | <template v-else> |
| | | 处理中<el-icon @click="cancelDownload"><CircleClose /></el-icon> |
| | | 处理中<el-icon @click="cancelDownload"> |
| | | <CircleClose /> |
| | | </el-icon> |
| | | </template> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- <div class="imgListBox">--> |
| | | <!-- <!– 图片显示 –>--> |
| | | <!-- <template v-for="(item, index) in achievementList.slice(0, visibleCount)" :key="index">--> |
| | | <!-- <div class="result-item">--> |
| | | <!-- <el-checkbox v-model="item.checked" />--> |
| | | <!-- <div class="itemName">{{ item.createTime }}</div>--> |
| | | <!-- <!– 正射 –>--> |
| | | <!-- <el-image v-if="item.resultType === 4" :src="item.smallUrl" :preview-src-list="[item.showUrl]" fit="cover"--> |
| | | <!-- preview-teleported />--> |
| | | <!-- <!– 全景 –>--> |
| | | <!-- <img v-else-if="item.resultType === 5" class="quanjing" @click="clickpanorama(item)" :src="item?.smallUrl"--> |
| | | <!-- alt="" />--> |
| | | <!-- <!– 视频 –>--> |
| | | <!-- <div v-else-if="item.resultType === 1" class="videotime">--> |
| | | <!-- <img class="videoDisplay" :src="convertVideoUrlToThumbnail(item.link)" alt=""--> |
| | | <!-- @click="enterFullScreen(index)" />--> |
| | | <!-- <img @click="enterFullScreen(index)" class="videobutton" src="@/assets/images/task/videoshow.png"--> |
| | | <!-- alt="" />--> |
| | | <!-- </div>--> |
| | | <!-- <!– 图片 –>--> |
| | | <!-- <el-image v-else :src="item.smallUrl" :preview-src-list="[item.showUrl]" preview-teleported--> |
| | | <!-- :initial-index="index" fit="cover" />--> |
| | | |
| | | |
| | | <!-- </div>--> |
| | | |
| | | <!-- </template>--> |
| | | |
| | | <!-- </div>--> |
| | | <div class="imgListBox"> |
| | | <!-- 图片显示 --> |
| | | <template v-for="(item, index) in achievementList.slice(0, visibleCount)" :key="index"> |
| | | <div class="result-item"> |
| | | <el-checkbox v-model="item.checked" /> |
| | | <div class="itemName">{{ item.createTime }}</div> |
| | | <!-- 正射 --> |
| | | <el-image |
| | | v-if="item.resultType === 4" |
| | | :src="item.smallUrl" |
| | | :preview-src-list="[item.showUrl]" |
| | | fit="cover" |
| | | preview-teleported |
| | | /> |
| | | <el-image v-if="item.resultType === 4" :src="item?.smallUrl" fit="cover" preview-teleported @click="clickPlay(index)"/> |
| | | <!-- 全景 --> |
| | | <img |
| | | v-else-if="item.resultType === 5" |
| | | class="quanjing" |
| | | @click="clickpanorama(item)" |
| | | @click="clickPlay(index)" |
| | | :src="item?.smallUrl" |
| | | alt="" |
| | | /> |
| | |
| | | class="videoDisplay" |
| | | :src="convertVideoUrlToThumbnail(item.link)" |
| | | alt="" |
| | | @click="enterFullScreen(index)" |
| | | @click="clickPlay(index)" |
| | | /> |
| | | <img |
| | | @click="enterFullScreen(index)" |
| | | @click="clickPlay(index)" |
| | | class="videobutton" |
| | | src="@/assets/images/task/videoshow.png" |
| | | src="@/assets/images/signMachineNest/videoshow.png" |
| | | alt="" |
| | | /> |
| | | </div> |
| | | <!-- 图片 --> |
| | | <el-image |
| | | v-else |
| | | :src="item.smallUrl" |
| | | :preview-src-list="[item.showUrl]" |
| | | preview-teleported |
| | | :initial-index="index" |
| | | fit="cover" |
| | | /> |
| | | |
| | | |
| | | <el-image v-else :src="item?.smallUrl" fit="cover" preview-teleported @click="clickPlay(index)"/> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | </div> |
| | | <el-image-viewer |
| | | v-if="showViewer" |
| | |
| | | :initial-index="activeIndex" |
| | | @close="showViewer = false" |
| | | /> |
| | | <div class="cg-empty" v-if="achievementList.length === 0">暂无数据</div> |
| | | </div> |
| | | |
| | | <div class="content-right" v-if="isShow"> |
| | | <DeviceJobDetailsMap |
| | | :detailsData="detailsData" |
| | | :yuanImages="yuanImages" |
| | | @showImageeclick="showImageeclick" |
| | | :jobId="props.jobId" |
| | | /> |
| | | <DeviceJobDetailsMap :detailsData="detailsData" :yuanImages="yuanImages" @showImageeclick="showImageeclick" |
| | | :jobId="props.jobId" /> |
| | | <div class="content-map-popups"></div> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | | class="ztzf-dialog" |
| | | append-to-body |
| | | modal-class="detailsOfHistoricalTasks" |
| | | v-model="VideoShow" |
| | | :width="pxToRem(1600)" |
| | | :close-on-click-modal="false" |
| | | :destroy-on-close="true" |
| | | > |
| | | <div class="fullscreen"> |
| | | <video |
| | | ref="fullscreenVideo" |
| | | class="fullscreen-video" |
| | | :src="currentVideoUrl" |
| | | :style="{ width: pxToRem(1567), height: '80vh' }" |
| | | controls |
| | | preload="auto" |
| | | @play="handleVideoPlay" |
| | | @ended="handleVideoEnded" |
| | | ></video> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog class="ztzf-dialog" append-to-body modal-class="detailsOfHistoricalTasks" v-model="VideoShow" |
| | | :width="pxToRem(1600)" :close-on-click-modal="false" :destroy-on-close="true"> |
| | | <div class="fullscreen"> |
| | | <video ref="fullscreenVideo" class="fullscreen-video" :src="currentVideoUrl" |
| | | :style="{ width: pxToRem(1567), height: '80vh' }" controls preload="auto" @play="handleVideoPlay" |
| | | @ended="handleVideoEnded"></video> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- 全景360 --> |
| | | <PanoramaPopup |
| | | v-if="'全景'" |
| | | v-model:panoramaParamsShow="panoramaParamsShow" |
| | | v-model:panoramaParamsUrl="panoramaParamsUrl" |
| | | /> |
| | | <PanoramaPopup v-if="'全景'" v-model:panoramaParamsShow="panoramaParamsShow" |
| | | v-model:panoramaParamsUrl="panoramaParamsUrl" /> |
| | | |
| | | <PlaybackVideo v-model:show="playbackVideo" v-model:detailData="openVideoDetail" :detailsData="detailsData" /> |
| | | <FileTypePlay v-model:show="carouselShow" :list="achievementList" :cIndex="currentIndex"></FileTypePlay> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue'; |
| | | import { getShowImg, getSmallImg, getzsSmallImg, getzsShowImg, aLinkDownloadUtil } from '@/utils/util'; |
| | | import { getaiImagesPageAPI,cancelDownloadApi,getDownloadStatusApi,attachDownload,aiImagesPage} from '@/api/dataCenter/dataCenter'; |
| | | import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue' |
| | | import PlaybackVideo from '@/components/PlaybackVideo/PlaybackVideo.vue' |
| | | import FileTypePlay from '@/views/job/components/FileTypePlay.vue'; |
| | | import { getWaylinejobLiveRecordPage } from '@/api/playback' |
| | | import { getShowImg, getSmallImg, getzsSmallImg, getzsShowImg, aLinkDownloadUtil } from '@/utils/util' |
| | | import { getaiImagesPageAPI, cancelDownloadApi, getDownloadStatusApi, attachDownload, aiImagesPage } from '@/api/dataCenter/dataCenter' |
| | | import { getFindAction } from '@/views/RoutePlan/PointAirLine/pointWayLineUtils' |
| | | import { pxToRem } from '@/utils/rem' |
| | | import JobRelatedEvents from './JobRelatedEvents.vue' |
| | | import { getEventMediaListApi, getJobDetails, getJobInfoFiles,getJobsAllFiles } from '@/api/job/task' |
| | | import { getEventMediaListApi, getJobDetails, getJobInfoFiles, getJobsAllFiles } from '@/api/job/task' |
| | | import DeviceJobDetailsMap from './DeviceJobDetailsMap.vue' |
| | | import { droneEventList } from '../const/drc' |
| | | import { ElMessage,ElLoading } from 'element-plus' |
| | | import { useStore } from 'vuex'; |
| | | import EventBus from '@/utils/eventBus'; |
| | | const store = useStore(); |
| | | import { ElMessage, ElLoading } from 'element-plus' |
| | | import { useStore } from 'vuex' |
| | | import EventBus from '@/utils/eventBus' |
| | | const store = useStore() |
| | | const htlsrwxq = computed(() => store.state.common.downloadProgress?.htlsrwxq || 100) |
| | | const isShow = defineModel('show') |
| | | const VideoShow = ref(false) |
| | | const showAll = ref(false) // 是否展示全部 |
| | | let loadingData |
| | | const fullscreenVideo = ref(null) |
| | | const playbackVideo = ref(false) |
| | | const carouselShow = ref(false) // 是否轮播 |
| | | const currentIndex = ref(-1) |
| | | // 视频播放事件处理 |
| | | const handleVideoPlay = (event) => { |
| | | if (event.target.playbackRate !== 0.75) { |
| | |
| | | } |
| | | // 原图 |
| | | const yuanImages = ref([]) |
| | | function convertVideoUrlToThumbnail(videoUrl) { |
| | | function convertVideoUrlToThumbnail (videoUrl) { |
| | | // 检查是否是有效的视频URL |
| | | if (!videoUrl || typeof videoUrl !== 'string') { |
| | | return videoUrl |
| | |
| | | const infoList = ref([ |
| | | { name: '任务编号', value: '', field: 'job_info_num' }, |
| | | { name: '任务名称', value: '', field: 'name' }, |
| | | { name: '任务类型', value: '', field: 'industry_type_str' }, |
| | | { name: '任务类型', value: '', field: 'rep_rule_type' }, |
| | | { name: '飞行事件', value: '', field: 'event_number' }, |
| | | { name: '所属机巢', value: '', field: 'device_names' }, |
| | | { name: '创建人', value: '', field: 'creator_name' }, |
| | | { name: '所属部门', value: '', field: 'dept_name' }, |
| | | { name: '任务时间', value: '', field: 'cycle_time_value' }, |
| | | { name: '任务频次', value: '', field: 'rep_rule_type' }, |
| | | { name: '关联算法', value: '', field: 'ai_type_str' }, |
| | | { name: '自定义识别区', value: '', field: 'enable_custom_area' }, |
| | | { name: '任务描述', value: '', field: 'remark' }, |
| | |
| | | industry_type_str: null, |
| | | area_code: null, |
| | | ai_type_str: null, |
| | | enable_custom_area:null, |
| | | enable_custom_area: null, |
| | | begin_time: null, |
| | | end_time: null, |
| | | device_names: null, |
| | |
| | | // 任务成果 |
| | | const total = ref(0) |
| | | const achievementList = ref([]) |
| | | const props = defineProps(['wayLineJobInfoId', 'waylineJobId', 'batchNo','jobId']) |
| | | const props = defineProps(['wayLineJobInfoId', 'waylineJobId', 'batchNo', 'jobId']) |
| | | const wayLineJobInfoId = computed(() => props.wayLineJobInfoId) |
| | | const jobId = computed(() => props.jobId) |
| | | provide('wayLineJobInfoId', wayLineJobInfoId) |
| | | provide('jobId', jobId) |
| | | |
| | | // 可见数量 |
| | | const visibleCount = computed(() => |
| | | showAll.value ? achievementList.value.length : Math.min(5, achievementList.value.length) |
| | | ) |
| | | const getAchievement = () => { |
| | | if (!props.jobId) return |
| | | |
| | | const attachmentsParams = { |
| | | 'wayLineJobId': props.jobId, |
| | | 'resultTypes': [0, 1, 2, 4, 5], |
| | | 'orderByCreateTime': true, |
| | | current: 1, |
| | | size: 2000, |
| | | } |
| | | const pageParams = { |
| | | current: 1, |
| | | size: 2000, |
| | | } |
| | | aiImagesPage(attachmentsParams ).then(res => { |
| | | achievementList.value = res.data.data.records.map(i => ({ |
| | | ...i, |
| | | checked: false, |
| | | smallUrl: i.resultType === 4 ? getzsSmallImg(i.link) : getSmallImg(i.link), |
| | | showUrl: i.resultType === 4 ? getzsShowImg(i.link) : getShowImg(i.link), |
| | | })) |
| | | total.value = res.data.data.total |
| | | // console.log('成果数据', res.data.data) |
| | | }) |
| | | } |
| | | const jumpMore = () => { |
| | | ElMessage.warning('正在加急开发中...') |
| | | } |
| | | |
| | | const flightEvents = ref([]) |
| | | const jobTimes = ref([]) |
| | | const historyTime = ref('') |
| | | const jumpDataCenter = ref(null) |
| | | const cycle_time = ref(null) |
| | | const detailName = ref(null) |
| | | const isShowExportTheTask = ref(null) |
| | | |
| | | const getDetails = () => { |
| | | const params = { |
| | | wayLineJobInfoId: props.wayLineJobInfoId, |
| | | waylineJobId: props.waylineJobId, |
| | | // waylineJobId: props.waylineJobId, |
| | | batchNo: props.batchNo |
| | | } |
| | | getJobDetails(params).then(res => { |
| | | detailsData.value = res.data.data |
| | | jobTimes.value = res.data.data.job_times |
| | | jumpDataCenter.value = res.data.data |
| | | cycle_time.value = res.data.data.cycle_time_value |
| | | detailName.value = detailsData.value.name |
| | | const aiTypeStr = detailsData.value.ai_type_str || ''; |
| | | isShowExportTheTask.value = aiTypeStr && !/人|车|船/.test(aiTypeStr) |
| | | infoList.value.forEach(item => { |
| | | item.value = detailsData.value?.[item.field] || '--' |
| | | if (item.name === '任务频次') { |
| | | const { rep_rule_type = '',final_cycle_frequency = '' } = detailsData?.value || {} |
| | | item.value = rep_rule_type ? final_cycle_frequency : '1次' |
| | | } else { |
| | | item.value = detailsData.value?.[item.field] || '--' |
| | | item.value = detailsData?.value.rep_rule_type ? detailsData?.value.final_cycle_frequency : '1次' |
| | | } |
| | | if (item.name === '任务类型') { |
| | | const { rep_rule_type = '' } = detailsData?.value || {} |
| | | item.value = rep_rule_type ? '周期任务' : '临时任务' |
| | | } |
| | | if (item.name === '飞行事件') { |
| | | const { action_modes = [] } = detailsData?.value || {} |
| | | flightEvents.value = action_modes.flatMap(({ actionActuatorFunc }) => |
| | | droneEventList.filter(({ value }) => actionActuatorFunc === value) |
| | | ) |
| | | flightEvents.value = action_modes.flatMap(getFindAction) |
| | | } |
| | | if (item.name === '自定义识别区') { |
| | | item.value = res.data.data.enable_custom_area ? '是': '否' |
| | | if (item.name === '自定义识别区' && infoList?.value[9].value !== '--') { |
| | | item.value = res.data.data.enable_custom_area ? '是' : '否' |
| | | } |
| | | getJobsAllFiles({ |
| | | wayLineJobId: detailsData.value.way_lines.map(item => item.job_id).join(','), |
| | | resultTypes: [0, 2, 4, 5], |
| | | }).then(result => { |
| | | if (result.data.code !== 200) return |
| | | yuanImages.value = result.data.data.records |
| | | |
| | | |
| | | }) |
| | | }) |
| | | // flystatus.value = res.data.data.ai_type_str |
| | | getJobsAllFiles({ |
| | | wayLineJobId: detailsData.value.way_lines.map(item => item.job_id).join(','), |
| | | resultTypes: [0, 1, 2, 4, 5], |
| | | orderByCreateTime: true, |
| | | }).then(result => { |
| | | if (result.data.code !== 200) return |
| | | achievementList.value = result.data.data.records.map(i => ({ |
| | | ...i, |
| | | checked: false, |
| | | smallUrl: i.resultType === 4 ? getzsSmallImg(i.link) : getSmallImg(i.link), |
| | | showUrl: i.resultType === 4 ? getzsShowImg(i.link) : getShowImg(i.link), |
| | | })) |
| | | total.value = result.data.data.total |
| | | |
| | | yuanImages.value = result.data.data.records.filter(item => item.resultType !== 1) |
| | | }) |
| | | }) |
| | | } |
| | | // 播放 |
| | | const videoRef = ref(null); |
| | | const videoRef = ref(null) |
| | | const currentVideoIndex = ref(-1) |
| | | |
| | | const enterFullScreen = (index) => { |
| | |
| | | } |
| | | // 下载 |
| | | const downloadFun = async () => { |
| | | const list = achievementList.value.filter(i => i.checked) |
| | | console.log('list',list); |
| | | if (!list?.length) return ElMessage.warning('请选择文件') |
| | | if (list.length === 1) { |
| | | list.forEach((item, index) => { |
| | | const suffix = item.link.split('.').pop() |
| | | aLinkDownloadUtil(item.link, item.nickName + '.' + suffix) |
| | | }) |
| | | } else { |
| | | loadingData = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' }) |
| | | const fileIds = list.map(i => i.id) |
| | | const res = await getDownloadStatusApi({type: 'htlsrwxq'}) |
| | | if (!['CANCELLED','COMPLETED'].includes(res.data.data?.status || 'COMPLETED')){ |
| | | return ElMessage.warning('还有正在处理的') |
| | | } |
| | | attachDownload({ attachIds: fileIds,type:'htlsrwxq' }).finally(()=>{ |
| | | loadingData.close() |
| | | }) |
| | | } |
| | | const list = achievementList.value.filter(i => i.checked) |
| | | console.log('list', list) |
| | | if (!list?.length) return ElMessage.warning('请选择文件') |
| | | if (list.length === 1) { |
| | | list.forEach((item, index) => { |
| | | const suffix = item.link.split('.').pop() |
| | | aLinkDownloadUtil(item.link, item.nickName + '.' + suffix) |
| | | }) |
| | | } else { |
| | | loadingData = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' }) |
| | | const fileIds = list.map(i => i.id) |
| | | const res = await getDownloadStatusApi({ type: 'htlsrwxq' }) |
| | | if (!['CANCELLED', 'COMPLETED'].includes(res.data.data?.status || 'COMPLETED')) { |
| | | return ElMessage.warning('还有正在处理的') |
| | | } |
| | | attachDownload({ attachIds: fileIds, type: 'htlsrwxq' }).finally(() => { |
| | | loadingData.close() |
| | | }) |
| | | } |
| | | } |
| | | // 全景预览 |
| | | const panoramaParamsShow = ref(false) |
| | |
| | | } |
| | | } |
| | | // 取消下载 |
| | | function cancelDownload() { |
| | | cancelDownloadApi({ type:'htlsrwxq' }).then(res =>{ |
| | | function cancelDownload () { |
| | | cancelDownloadApi({ type: 'htlsrwxq' }).then(res => { |
| | | ElMessage.success('取消成功') |
| | | }).catch(e =>{ |
| | | EventBus.emit('useGlobalWS-messageHandler', {biz_code: 'DOWNLOAD_PROGRESS',data:{status: 'CANCELLED',type:'htlsrwxq'}}) |
| | | }).catch(e => { |
| | | EventBus.emit('useGlobalWS-messageHandler', { biz_code: 'DOWNLOAD_PROGRESS', data: { status: 'CANCELLED', type: 'htlsrwxq' } }) |
| | | }) |
| | | } |
| | | |
| | | // 执行机巢详情 |
| | | // const taskData = ref([]) |
| | | // const getNestDetailApi = () => { |
| | | // const params = { |
| | | // jobInfoId: props.wayLineJobInfoId, |
| | | // batchNo: props.batchNo, |
| | | // } |
| | | // NestDetailApi(params).then(res => { |
| | | // taskData.value = res.data.data |
| | | // }) |
| | | // } |
| | | |
| | | // 获取回放直播列表 |
| | | const videoData = ref([]) |
| | | const openVideoDetail = ref({}) |
| | | const getVideoList = () => { |
| | | getWaylinejobLiveRecordPage({ job_info_id: props.wayLineJobInfoId }).then(videoDetails => { |
| | | videoData.value = videoDetails.data.data.records |
| | | }) |
| | | } |
| | | |
| | | const openPlaybackVideoDialog = data => { |
| | | playbackVideo.value = true |
| | | openVideoDetail.value = data |
| | | } |
| | | |
| | | |
| | | |
| | | function clickPlay(index) { |
| | | carouselShow.value = true |
| | | currentIndex.value = index |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getDetails() |
| | | getAchievement() |
| | | getVideoList() |
| | | }) |
| | | </script> |
| | | |
| | |
| | | .content { |
| | | display: flex; |
| | | height: 100%; |
| | | |
| | | .contentLeft { |
| | | margin-left: 35px; |
| | | margin-right: 24px; |
| | |
| | | overflow: auto; |
| | | |
| | | .machineTableDetailsTitle { |
| | | margin-bottom: 10px; |
| | | display: flex; |
| | | //margin-bottom: 10px; |
| | | // background: url('/src/assets/images/task/detailtitle.png') no-repeat center; |
| | | border-bottom: 2px solid #e4e7ed; |
| | | background-size: 100% 100%; |
| | | img{ |
| | | |
| | | img { |
| | | width: 15px; |
| | | height: 15px;} |
| | | span { |
| | | height: 15px; |
| | | margin-top: 6px; |
| | | } |
| | | |
| | | .title { |
| | | display: inline-block; |
| | | margin-left: 10px; |
| | | font-size: 16px; |
| | |
| | | line-height: 20px; |
| | | text-align: left; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .btn { |
| | | margin-left: 16px; |
| | | margin-bottom: 8px; |
| | | line-height: 20px; |
| | | } |
| | | } |
| | | |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-content: center; |
| | | .rightBox{ |
| | | |
| | | .rightBox { |
| | | display: flex; |
| | | align-items: center; |
| | | padding-right: 10px; |
| | | gap: 0 10px; |
| | | |
| | | .downloadBtn{ |
| | | .downloadBtn { |
| | | position: relative; |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | cursor: pointer; |
| | | color: #1C5CFF; |
| | | |
| | | .downloadBtnText{ |
| | | .downloadBtnText { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 5px; |
| | | z-index: 5; |
| | | } |
| | | .el-progress{ |
| | | |
| | | .el-progress { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | width: 100%; |
| | | |
| | | :deep(){ |
| | | .el-progress-bar__outer{ |
| | | :deep() { |
| | | .el-progress-bar__outer { |
| | | height: 28px !important; |
| | | border-radius: 0 !important; |
| | | background: transparent !important; |
| | | |
| | | .el-progress-bar__inner{ |
| | | .el-progress-bar__inner { |
| | | border-radius: 0 !important; |
| | | } |
| | | } |
| | |
| | | |
| | | } |
| | | } |
| | | img{ |
| | | |
| | | img { |
| | | width: 15px; |
| | | height: 15px;} |
| | | height: 15px; |
| | | } |
| | | |
| | | p { |
| | | display: inline-block; |
| | | margin-left: 10px; |
| | |
| | | gap: 10px; |
| | | margin-bottom: 49px; |
| | | |
| | | > * { |
| | | >* { |
| | | width: 100%; |
| | | height: 200px; |
| | | position: relative; |
| | | border-radius: 0px 0px 4px 4px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.el-checkbox__inner) { |
| | | width: 17px !important; |
| | | height: 17px !important; |
| | |
| | | border-radius: 4px 4px 4px 4px; |
| | | border: 1px solid #ffffff !important; |
| | | } |
| | | |
| | | .el-checkbox { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 6px; |
| | | } |
| | | |
| | | :deep(.el-checkbox__inner:after) { |
| | | position: absolute; |
| | | left: 50% !important; |
| | | top: 40% !important; |
| | | transform: translate(-50%, -50%) rotate(45deg) !important; |
| | | } |
| | | |
| | | :deep(.el-checkbox.is-checked .el-checkbox__inner) { |
| | | background-color: #09297b !important; |
| | | border-color: #1c5cff !important; |
| | | } |
| | | |
| | | .el-image { |
| | | width: 100%; |
| | | height: 100%; |
| | |
| | | object-fit: cover; |
| | | } |
| | | } |
| | | |
| | | .itemName { |
| | | position: absolute; |
| | | bottom: 0; |
| | |
| | | background: #999; |
| | | border-radius: 50%; |
| | | } |
| | | |
| | | .videoDisplay { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | |
| | | .content-map-popups { |
| | | pointer-events: none; |
| | | |
| | | > * { |
| | | >* { |
| | | pointer-events: auto !important; |
| | | } |
| | | } |