<template>
|
<div class="workDetailContainer">
|
<div class="detailTop">
|
<div class="image-container">
|
<video
|
v-if="isVideoAttachment && mediaSrc"
|
ref="videoRef"
|
class="video-js vjs-default-skin vjs-big-play-centered detailVideo"
|
controls
|
preload="auto"
|
playsinline
|
></video>
|
<van-swipe v-else :autoplay="3000" indicator-color="#4C85FF">
|
<van-swipe-item v-for="(img, index) in [mediaSrc]" :key="index">
|
<van-image class="detailImage" :src="img" fit="cover" width="100%" height="235px"
|
@click="openPreview(index)" preview-visible="false" />
|
</van-swipe-item>
|
</van-swipe>
|
</div>
|
</div>
|
<!-- 工单内容 -->
|
<div class="worderContainer">
|
<div class="workOrderContent">
|
<div class="workOrderTitle">工单内容</div>
|
<div class="workOrderContainer">
|
<div class="orderRow">
|
<div class="rowTitle">工单编号</div>
|
<div>{{ workDetailData.eventNum }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">工单处置人</div>
|
<div>{{ workDetailData.disposeUserName }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">处置部门</div>
|
<div>{{ workDetailData.disposeDeptName }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">拍摄时间</div>
|
<div>{{ workDetailData.shootTime }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">分发人员</div>
|
<div>{{ workDetailData.distributeUserName }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">分发部门</div>
|
<div>{{ workDetailData.distributeDeptName }}</div>
|
</div>
|
|
<div class="orderRow">
|
<div class="rowTitle">分发时间</div>
|
<div>{{ workDetailData.distributeTime }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">工单位置</div>
|
<div class="rowAddress" @click="jumpMap(workDetailData)">{{ workDetailData.eventLocation }}</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script setup>
|
import {getSharingDetailsApi} from '@/api/work/index'
|
import { showToast, showNotify, showImagePreview } from 'vant'
|
import { getShowImg, getSmallImg } from '@/utils/util'
|
import { useRoute,useRouter } from 'vue-router'
|
import { getAiImg } from '@ztzf/utils'
|
import videojs from 'video.js'
|
import 'video.js/dist/video-js.css'
|
const keyword = ref('')
|
const route = useRoute()
|
const router = useRouter()
|
|
const workDetailData = ref({})
|
const videoRef = ref(null)
|
let player = null
|
|
const isVideoAttachment = computed(() => Number(workDetailData.value.attachmentType) === 3)
|
|
// 预览图片
|
const getImageList = computed(() => {
|
const imageArr = []
|
const detail = workDetailData.value
|
if (detail.eventImageUrl) {
|
const smallUrl = detail.eventImageUrl
|
imageArr.push(smallUrl)
|
}
|
return imageArr
|
})
|
const openPreview = () => {
|
if (isVideoAttachment.value || !mediaSrc.value) return
|
showImagePreview({
|
images: [mediaSrc.value],
|
startPosition: 0,
|
})
|
}
|
// 跳转地图
|
const jumpMap = item => {
|
router.push({
|
path: '/webViewWrapper/mapWork',
|
query: {
|
currentItem: JSON.stringify(item)
|
}
|
})
|
}
|
|
function replaceWithProxy(url) {
|
if (!url) return ''
|
return url.replace(
|
/^https?:\/\/[^/]+/,
|
'https://wrj.shuixiongit.com/ja-proxy'
|
)
|
}
|
|
function getVideoType(url) {
|
const path = (url || '').split('?')[0].toLowerCase()
|
if (path.endsWith('.m3u8')) return 'application/x-mpegURL'
|
if (path.endsWith('.mp4')) return 'video/mp4'
|
if (path.endsWith('.webm')) return 'video/webm'
|
if (path.endsWith('.ogg') || path.endsWith('.ogv')) return 'video/ogg'
|
if (path.endsWith('.mov')) return 'video/quicktime'
|
return ''
|
}
|
|
function getVideoSource() {
|
const type = getVideoType(mediaSrc.value)
|
return {
|
src: mediaSrc.value,
|
...(type ? { type } : {}),
|
}
|
}
|
|
function destroyPlayer() {
|
if (!player) return
|
player.dispose()
|
player = null
|
}
|
|
async function initPlayer() {
|
if (!isVideoAttachment.value || !mediaSrc.value) return
|
await nextTick()
|
if (!videoRef.value) return
|
|
if (player) {
|
player.src(getVideoSource())
|
player.load()
|
return
|
}
|
|
player = videojs(videoRef.value, {
|
controls: true,
|
preload: 'auto',
|
autoplay: false,
|
fluid: false,
|
sources: [getVideoSource()],
|
})
|
player.on('error', () => {
|
console.error('视频播放失败:', player?.error(), mediaSrc.value)
|
})
|
}
|
|
const mediaSrc = ref('')
|
|
watch([isVideoAttachment, mediaSrc], () => {
|
if (isVideoAttachment.value) {
|
initPlayer()
|
} else {
|
destroyPlayer()
|
}
|
})
|
|
onMounted(async () => {
|
keyword.value = JSON.parse(route.query.workDetailData)
|
try {
|
const res = await getSharingDetailsApi({ cacheKey: keyword.value })
|
workDetailData.value = res.data.data
|
let {eventImageUrl,geojson} = workDetailData.value
|
// http://220.177.172.27:8100 改为 https://wrj.shuixiongit.com/ja-proxy
|
eventImageUrl = replaceWithProxy(eventImageUrl)
|
if (eventImageUrl){
|
mediaSrc.value = !isVideoAttachment.value && geojson ? await getAiImg(eventImageUrl,geojson) : eventImageUrl
|
}
|
} catch (error) {
|
showToast('分享链接失效')
|
}
|
|
})
|
|
onBeforeUnmount(destroyPlayer)
|
</script>
|
<style lang="scss" scoped>
|
.workDetailContainer {
|
.detailTop {
|
.image-container {
|
position: relative;
|
width: 100%;
|
height: 235px;
|
.detailImage {
|
width: 100%;
|
height: 100%;
|
display: block;
|
object-fit: cover;
|
}
|
|
.detailVideo {
|
width: 100%;
|
height: 235px;
|
}
|
|
:deep(.video-js .vjs-tech) {
|
width: 100%;
|
height: 100%;
|
}
|
}
|
}
|
|
.worderContainer {
|
padding: 0 12px;
|
// padding-bottom: 2px;
|
background: #f6f6f6;
|
}
|
|
.workOrderContent {
|
margin-top: 15px;
|
background-color: #fff;
|
border-radius: 6px;
|
padding: 8px 10px;
|
margin-bottom: 17px;
|
|
.workOrderTitle {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: bold;
|
font-size: 16px;
|
color: #222324;
|
}
|
|
.workOrderContainer {
|
.orderRow {
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
min-height: 48px;
|
border-bottom: 1px solid #f5f5f5;
|
color: #7b7b7b;
|
}
|
|
.rowCard {
|
margin-top: 10px;
|
|
min-height: 48px;
|
border-bottom: 1px solid #f5f5f5;
|
color: #7b7b7b;
|
}
|
|
.guanlian {
|
display: flex;
|
}
|
|
.rowTitle {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 15px;
|
color: #222324;
|
white-space: nowrap;
|
|
span {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 10px;
|
color: #3a3a3a;
|
}
|
}
|
|
.addressBox {
|
display: flex;
|
align-items: center;
|
overflow: hidden;
|
}
|
|
.rowAddress {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 14px;
|
color: #1d6fe9;
|
text-decoration: underline;
|
text-align: right;
|
padding-top: 1px;
|
padding-left: 5px;
|
padding-right: 2px;
|
}
|
:deep(.custom-field) {
|
padding: 0 !important;
|
padding-left: 10px !important;
|
}
|
|
:deep(.custom-field .van-field__control) {
|
padding: 0 !important;
|
}
|
|
}
|
}
|
|
}
|
</style>
|