Compare commits
4 Commits
bc9e0d642c
...
07873b26cf
| Author | SHA1 | Date | |
|---|---|---|---|
| 07873b26cf | |||
| 58fe72f717 | |||
| 8fdc23d76d | |||
| aabd46fcac |
Binary file not shown.
|
After Width: | Height: | Size: 863 B |
@ -53,9 +53,9 @@ defineProps({
|
||||
|
||||
// 地理位置信息数据
|
||||
const locationInfo = [
|
||||
{ label: '线路编号', value: 'S710', icon: lineCodeIcon },
|
||||
{ label: '路线班号', value: 'S199', icon: classNumberIcon },
|
||||
{ label: '路段巡查员', value: '张强', icon: inspectorIcon },
|
||||
{ label: '线路编号', value: 'S204', icon: lineCodeIcon },
|
||||
{ label: '灾害桩号', value: 'K130 + 800', icon: classNumberIcon },
|
||||
{ label: '路段巡路员', value: '张强', icon: inspectorIcon },
|
||||
{ label: '联系电话', value: '13987657892', icon: phoneIcon },
|
||||
]
|
||||
</script>
|
||||
|
||||
@ -707,22 +707,24 @@ const handleDeletePlan = (id) => {
|
||||
|
||||
:deep(.el-textarea__inner) {
|
||||
background: #052044 !important;
|
||||
border: 1px solid rgba(28, 161, 255, 0.3) !important;
|
||||
border: none !important;
|
||||
box-shadow: 0 0 0 1px rgba(28, 161, 255, 0.3) inset !important;
|
||||
border-radius: vw(4);
|
||||
color: var(--text-white);
|
||||
font-size: fs(13);
|
||||
font-family: SourceHanSansCN-Regular, sans-serif;
|
||||
line-height: 1.6;
|
||||
padding: vh(8) vw(12);
|
||||
transition: border-color 0.3s ease;
|
||||
transition: box-shadow 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: 0 0 0 1px var(--primary-color) inset !important;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: none !important;
|
||||
&:focus,
|
||||
&:focus-visible {
|
||||
box-shadow: 0 0 0 1px var(--primary-color) inset !important;
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
@ -835,22 +837,24 @@ const handleDeletePlan = (id) => {
|
||||
.follow-up-textarea {
|
||||
:deep(.el-textarea__inner) {
|
||||
background: #052044 !important;
|
||||
border: 1px solid rgba(28, 161, 255, 0.3) !important;
|
||||
border: none !important;
|
||||
box-shadow: 0 0 0 1px rgba(28, 161, 255, 0.3) inset !important;
|
||||
border-radius: vw(4);
|
||||
color: var(--text-white);
|
||||
font-size: fs(13);
|
||||
font-family: SourceHanSansCN-Regular, sans-serif;
|
||||
line-height: 1.8;
|
||||
padding: vh(10) vw(14);
|
||||
transition: border-color 0.3s ease;
|
||||
transition: box-shadow 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: 0 0 0 1px var(--primary-color) inset !important;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-color: var(--primary-color) !important;
|
||||
box-shadow: none !important;
|
||||
&:focus,
|
||||
&:focus-visible {
|
||||
box-shadow: 0 0 0 1px var(--primary-color) inset !important;
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
|
||||
@ -65,6 +65,20 @@
|
||||
>
|
||||
{{ title }}
|
||||
</span>
|
||||
<!-- 视频图标按钮 -->
|
||||
<button
|
||||
v-if="showVideoIcon && videoIconSrc"
|
||||
type="button"
|
||||
class="map-tooltip__video-btn"
|
||||
:aria-label="videoIconAriaLabel"
|
||||
@click.stop="emit('video-icon-click')"
|
||||
>
|
||||
<img
|
||||
:src="videoIconSrc"
|
||||
alt=""
|
||||
class="map-tooltip__video-icon"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</slot>
|
||||
</div>
|
||||
@ -197,6 +211,30 @@ const props = defineProps({
|
||||
closable: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
|
||||
/**
|
||||
* 是否在标题右侧显示视频图标
|
||||
*/
|
||||
showVideoIcon: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
|
||||
/**
|
||||
* 视频图标的图片路径
|
||||
*/
|
||||
videoIconSrc: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* 视频图标的无障碍标签
|
||||
*/
|
||||
videoIconAriaLabel: {
|
||||
type: String,
|
||||
default: '打开视频监控'
|
||||
}
|
||||
})
|
||||
|
||||
@ -211,7 +249,11 @@ const emit = defineEmits([
|
||||
/**
|
||||
* 支持 v-model:visible 双向绑定
|
||||
*/
|
||||
'update:visible'
|
||||
'update:visible',
|
||||
/**
|
||||
* 用户点击视频图标时触发
|
||||
*/
|
||||
'video-icon-click'
|
||||
])
|
||||
|
||||
/**
|
||||
@ -354,6 +396,47 @@ const handleClose = () => {
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/**
|
||||
* 视频图标按钮
|
||||
* 显示在标题右侧,用于打开视频监控
|
||||
*/
|
||||
.map-tooltip__video-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: vw(24);
|
||||
height: vw(24);
|
||||
padding: 0;
|
||||
border: none;
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.15);
|
||||
filter: brightness(1.2);
|
||||
}
|
||||
|
||||
&:active {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
&:focus-visible {
|
||||
outline: 2px solid var(--primary-color);
|
||||
outline-offset: 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.map-tooltip__video-icon {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
display: block;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭按钮
|
||||
* 使用纯 CSS 实现 X 图标,避免额外的图片资源
|
||||
|
||||
@ -116,6 +116,9 @@
|
||||
:title="mapTooltip.title"
|
||||
:icon="mapTooltip.icon"
|
||||
:z-index="mapTooltip.zIndex"
|
||||
:show-video-icon="mapTooltip.data && mapTooltip.data.supportVideo"
|
||||
:video-icon-src="mediaIcon"
|
||||
@video-icon-click="handleVideoIconClick"
|
||||
@close="handleMapTooltipClose"
|
||||
>
|
||||
<!-- Tooltip 内容插槽 - 根据实际业务数据渲染 -->
|
||||
@ -168,6 +171,14 @@
|
||||
@close="showCenterDetail = false"
|
||||
/>
|
||||
|
||||
<!-- 视频监控弹窗 -->
|
||||
<VideoModal
|
||||
v-if="showVideoModal"
|
||||
:visible="showVideoModal"
|
||||
:monitor="selectedVideoMonitor"
|
||||
@close="handleVideoModalClose"
|
||||
/>
|
||||
|
||||
<!-- 智能应急方案弹窗 -->
|
||||
<StretchableModal
|
||||
v-model:visible="showStretchableModal"
|
||||
@ -203,6 +214,7 @@ import MapViewer from "./components/MapViewer/index.vue";
|
||||
import RightPanel from "./components/RightPanel/index.vue";
|
||||
import PersonnelDetail from "./components/Popups/PersonnelDetail.vue";
|
||||
import EmergencyCenterDetail from "./components/Popups/EmergencyCenterDetail.vue";
|
||||
import VideoModal from "./components/RightPanel/VideoModal.vue";
|
||||
import MapTooltip from "./components/shared/MapTooltip.vue";
|
||||
import SceneLabel from "./components/SceneLabel.vue";
|
||||
import StretchableModal from "./components/shared/StretchableModal.vue";
|
||||
@ -224,6 +236,7 @@ import soldierIcon from "./assets/images/SketchPngfbec927027ff9e49207749ebaafd22
|
||||
import deviceIcon from "./assets/images/SketchPng860d54f2a31f5f441fc6a88081224f1e98534bf6d5ca1246e420983bdf690380.png";
|
||||
import emergencyBaseIcon from "./assets/images/应急基地.png";
|
||||
import reserveCenterIcon from "./assets/images/储备中心.png";
|
||||
import mediaIcon from "./assets/images/media.png";
|
||||
|
||||
// 折叠按钮图标
|
||||
import collapseLeftArrow from "./assets/images/折叠面板左箭头.png";
|
||||
@ -459,6 +472,9 @@ const showMarkerTooltip = (viewer, entity, screenPosition, icon) => {
|
||||
let title = '';
|
||||
const fields = [];
|
||||
const actions = [];
|
||||
let supportVideo = false;
|
||||
let videoTitle = '';
|
||||
const videoSrc = 'http://222.212.85.86:9000/300bdf2b-a150-406e-be63-d28bd29b409f/demo/ylzg/单兵视角.mp4';
|
||||
|
||||
if (type === 'soldier') {
|
||||
// 应急人员
|
||||
@ -510,6 +526,8 @@ const showMarkerTooltip = (viewer, entity, screenPosition, icon) => {
|
||||
{ label: '隶属单位', value: '交通公路部门' },
|
||||
{ label: '位置信息', value: `目前为止距离现场${distance}公里` }
|
||||
);
|
||||
supportVideo = true;
|
||||
videoTitle = '应急中心';
|
||||
} else {
|
||||
// 其他养护站显示 tooltip
|
||||
title = '养护站';
|
||||
@ -525,6 +543,8 @@ const showMarkerTooltip = (viewer, entity, screenPosition, icon) => {
|
||||
{ label: '名称', value: properties.name?.getValue() || '-' },
|
||||
{ label: '位置信息', value: properties.location?.getValue() || '-' }
|
||||
);
|
||||
supportVideo = true;
|
||||
videoTitle = '储备中心';
|
||||
} else if (type === 'presetPoint') {
|
||||
// 预置点
|
||||
title = '预置点';
|
||||
@ -532,6 +552,8 @@ const showMarkerTooltip = (viewer, entity, screenPosition, icon) => {
|
||||
{ label: '名称', value: properties.name?.getValue() || '-' },
|
||||
{ label: '位置信息', value: properties.location?.getValue() || '-' }
|
||||
);
|
||||
supportVideo = true;
|
||||
videoTitle = '预置点';
|
||||
}
|
||||
|
||||
// 显示 Tooltip,使用实体的屏幕坐标
|
||||
@ -540,7 +562,13 @@ const showMarkerTooltip = (viewer, entity, screenPosition, icon) => {
|
||||
y: canvasPosition.y,
|
||||
title,
|
||||
icon,
|
||||
data: { fields, actions: actions.length > 0 ? actions : undefined }
|
||||
data: {
|
||||
fields,
|
||||
actions: actions.length > 0 ? actions : undefined,
|
||||
supportVideo,
|
||||
videoTitle,
|
||||
videoSrc
|
||||
}
|
||||
});
|
||||
|
||||
// 保存当前实体,用于相机移动时更新位置
|
||||
@ -989,6 +1017,7 @@ const handleMapToolChange = async ({ tool, active }) => {
|
||||
const showPersonnelDetail = ref(false);
|
||||
const showCenterDetail = ref(false);
|
||||
const showStretchableModal = ref(false);
|
||||
const showVideoModal = ref(false);
|
||||
|
||||
// 选中的数据
|
||||
const selectedPersonnel = ref({
|
||||
@ -1007,6 +1036,16 @@ const selectedCenter = ref({
|
||||
image: null,
|
||||
});
|
||||
|
||||
const selectedVideoMonitor = ref({
|
||||
id: '',
|
||||
title: '',
|
||||
videoSrc: '',
|
||||
dateRange: '',
|
||||
hasMegaphone: false,
|
||||
hasAudio: true,
|
||||
hasDirectionControl: false
|
||||
});
|
||||
|
||||
// 返回驾驶舱
|
||||
const handleBack = () => {
|
||||
console.log("返回驾驶舱");
|
||||
@ -1080,6 +1119,33 @@ const handleMapTooltipClose = () => {
|
||||
mapTooltip.value.visible = false;
|
||||
};
|
||||
|
||||
/**
|
||||
* 处理视频图标点击事件
|
||||
* 打开视频弹窗并设置视频源
|
||||
*/
|
||||
const handleVideoIconClick = () => {
|
||||
const { data } = mapTooltip.value;
|
||||
if (data && data.supportVideo) {
|
||||
selectedVideoMonitor.value = {
|
||||
id: Date.now().toString(),
|
||||
title: data.videoTitle || '视频监控',
|
||||
videoSrc: data.videoSrc || '',
|
||||
dateRange: new Date().toLocaleDateString(),
|
||||
hasMegaphone: false,
|
||||
hasAudio: true,
|
||||
hasDirectionControl: false
|
||||
};
|
||||
showVideoModal.value = true;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 处理视频弹窗关闭事件
|
||||
*/
|
||||
const handleVideoModalClose = () => {
|
||||
showVideoModal.value = false;
|
||||
};
|
||||
|
||||
// 路径线实体引用
|
||||
const pathLineEntities = ref([]);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user