|
|
@@ -71,6 +71,27 @@
|
|
|
const scenes = ref<SafetyScene[]>([]);
|
|
|
const manageSystemId = ref('');
|
|
|
|
|
|
+ // 记录入口 URL 中的场景 id;旧版定位参数会让子应用进入带工具栏的模式,先清理掉
|
|
|
+ const initialSceneId = (route.query.sysID || route.query.systemID || route.query.manageSystemId || route.query.sceneId || route.query.deviceid) as string;
|
|
|
+ if (route.query.sysID || route.query.type === 'tunMonitor' || route.query.deviceType || route.query.deviceid) {
|
|
|
+ const query: Record<string, any> = { ...route.query };
|
|
|
+ delete query.sysID;
|
|
|
+ delete query.deviceType;
|
|
|
+ delete query.deviceid;
|
|
|
+ if (query.type === 'tunMonitor') delete query.type;
|
|
|
+ // 模型加载期间改用 systemID 保留当前场景,避免用户此时刷新丢失场景
|
|
|
+ if (initialSceneId && !query.systemID && !query.manageSystemId && !query.sceneId) {
|
|
|
+ query.systemID = initialSceneId;
|
|
|
+ }
|
|
|
+ router.replace({ path: route.path, query });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 刷新后子应用要挂在带 sysID 的地址上才不会触发定位,所以等模型真正加载完成后再写入
|
|
|
+ const modelReady = ref(false);
|
|
|
+ let pendingSysID = '';
|
|
|
+ let modelReadyTimer: number | undefined;
|
|
|
+ let modelReadyDeadline = 0;
|
|
|
+
|
|
|
let dataInterval: number | undefined;
|
|
|
let summaryLoading = false;
|
|
|
|
|
|
@@ -167,7 +188,7 @@
|
|
|
|
|
|
scenes.value = list.length ? list : [{ ...FALLBACK_SCENE }];
|
|
|
// sysID 为当前定位参数,优先于旧版入口携带的场景参数
|
|
|
- const queryScene = (route.query.sysID ||
|
|
|
+ const queryScene = (initialSceneId ||
|
|
|
route.query.systemID ||
|
|
|
route.query.manageSystemId ||
|
|
|
route.query.sceneId ||
|
|
|
@@ -178,13 +199,8 @@
|
|
|
manageSystemId.value = queryScene || scenes.value[0]?.id || '';
|
|
|
}
|
|
|
|
|
|
- /** 场景切换时通过路由参数通知三维模型定位到对应场景 */
|
|
|
- function locateSceneInModel(scene?: SafetyScene) {
|
|
|
- const sysID = scene?.id || manageSystemId.value;
|
|
|
- if (!sysID) return;
|
|
|
-
|
|
|
+ function applySceneLocation(sysID: string) {
|
|
|
const currentSysID = Array.isArray(route.query.sysID) ? route.query.sysID[0] : route.query.sysID;
|
|
|
- // 旧版参数(type/deviceType/deviceid)会切到子应用带工具栏的模型页,这里一并清掉
|
|
|
const hasLegacyQuery = route.query.type === 'tunMonitor' || !!(route.query.deviceType || route.query.deviceid);
|
|
|
if (!hasLegacyQuery && currentSysID === sysID) return;
|
|
|
|
|
|
@@ -192,10 +208,66 @@
|
|
|
if (query.type === 'tunMonitor') delete query.type;
|
|
|
delete query.deviceType;
|
|
|
delete query.deviceid;
|
|
|
+ delete query.systemID;
|
|
|
+ delete query.manageSystemId;
|
|
|
+ delete query.sceneId;
|
|
|
|
|
|
router.replace({ path: route.path, query });
|
|
|
}
|
|
|
|
|
|
+ /** 三维子应用模型加载完成标识(子应用内部状态,仅用于判断首次定位时机) */
|
|
|
+ function isSubAppModelLoaded() {
|
|
|
+ const root = rootRef.value?.querySelector('#micro-vent-3dModal div[class*="3dModal"]') as any;
|
|
|
+ const app = root?.__vue__;
|
|
|
+ if (!app) return false;
|
|
|
+
|
|
|
+ let loaded = false;
|
|
|
+ const walk = (component: any, depth: number) => {
|
|
|
+ if (!component || loaded || depth > 18) return;
|
|
|
+ if (component.$data && typeof component.$data.modelLoaded === 'boolean') {
|
|
|
+ loaded = component.$data.modelLoaded;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ (component.$children || []).forEach((child: any) => walk(child, depth + 1));
|
|
|
+ };
|
|
|
+ walk(app, 0);
|
|
|
+ return loaded;
|
|
|
+ }
|
|
|
+
|
|
|
+ function waitModelReady() {
|
|
|
+ if (modelReady.value || modelReadyTimer) return;
|
|
|
+ modelReadyDeadline = Date.now() + 30000;
|
|
|
+ modelReadyTimer = window.setInterval(() => {
|
|
|
+ if (!isSubAppModelLoaded() && Date.now() < modelReadyDeadline) return;
|
|
|
+
|
|
|
+ if (modelReadyTimer) {
|
|
|
+ clearInterval(modelReadyTimer);
|
|
|
+ modelReadyTimer = undefined;
|
|
|
+ }
|
|
|
+ modelReady.value = true;
|
|
|
+ if (pendingSysID) {
|
|
|
+ const sysID = pendingSysID;
|
|
|
+ pendingSysID = '';
|
|
|
+ applySceneLocation(sysID);
|
|
|
+ }
|
|
|
+ }, 400);
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 场景切换时通过路由参数通知三维模型定位到对应场景 */
|
|
|
+ function locateSceneInModel(scene?: SafetyScene) {
|
|
|
+ const sysID = scene?.id || manageSystemId.value;
|
|
|
+ if (!sysID) return;
|
|
|
+
|
|
|
+ // 首次进入时先缓存目标场景,等模型加载完成后再写入地址触发定位
|
|
|
+ if (!modelReady.value) {
|
|
|
+ pendingSysID = sysID;
|
|
|
+ waitModelReady();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ applySceneLocation(sysID);
|
|
|
+ }
|
|
|
+
|
|
|
watch(manageSystemId, (id) => {
|
|
|
if (!id) return;
|
|
|
locateSceneInModel(scenes.value.find((scene) => scene.id === id));
|
|
|
@@ -218,6 +290,10 @@
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
clearInterval(dataInterval);
|
|
|
+ if (modelReadyTimer) {
|
|
|
+ clearInterval(modelReadyTimer);
|
|
|
+ modelReadyTimer = undefined;
|
|
|
+ }
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
@@ -305,12 +381,12 @@
|
|
|
}
|
|
|
|
|
|
&::before {
|
|
|
- right: 100%;
|
|
|
+ left: -200px;
|
|
|
background-image: url('@/assets/images/vent/home/selfIgnition/tab-wing-left.png');
|
|
|
}
|
|
|
|
|
|
&::after {
|
|
|
- left: 100%;
|
|
|
+ right: -200px;
|
|
|
background-image: url('@/assets/images/vent/home/selfIgnition/tab-wing-right.png');
|
|
|
}
|
|
|
}
|