|
|
|
@ -22,6 +22,8 @@ |
|
|
|
:route-locked-by-other-ids="routeLockedByOtherRouteIds" |
|
|
|
:deduction-time-minutes="deductionMinutesFromK" |
|
|
|
:room-id="currentRoomId" |
|
|
|
:platform-box-select-mode="platformBoxSelectMode" |
|
|
|
@request-exit-platform-box-select="onRequestExitPlatformBoxSelect" |
|
|
|
@draw-complete="handleMapDrawComplete" |
|
|
|
@route-lock-changed="handleRouteLockChanged" |
|
|
|
@drawing-points-update="missionDrawingPointsCount = $event" |
|
|
|
@ -30,6 +32,8 @@ |
|
|
|
@open-waypoint-dialog="handleOpenWaypointEdit" |
|
|
|
@open-route-dialog="handleOpenRouteEdit" |
|
|
|
@copy-route="handleCopyRoute" |
|
|
|
@route-segment-pick="handleRouteSegmentPick" |
|
|
|
@route-segment-placed="handleRouteSegmentPlaced" |
|
|
|
@single-route-deduction="handleSingleRouteDeduction" |
|
|
|
@route-copy-placed="handleRouteCopyPlaced" |
|
|
|
@add-waypoint-at="handleAddWaypointAt" |
|
|
|
@ -39,6 +43,7 @@ |
|
|
|
@missile-deleted="handleMissileDeleted" |
|
|
|
@scale-click="handleScaleClick" |
|
|
|
@platform-icon-updated="onPlatformIconUpdated" |
|
|
|
@platform-icons-batch-updated="onPlatformIconsBatchUpdated" |
|
|
|
@platform-icon-removed="onPlatformIconRemoved" |
|
|
|
@viewer-ready="onViewerReady" |
|
|
|
@drawing-entities-changed="onDrawingEntitiesChanged" |
|
|
|
@ -68,7 +73,7 @@ |
|
|
|
<div class="red-dot"></div> |
|
|
|
<i class="el-icon-s-unfold icon-inside"></i> |
|
|
|
</div> |
|
|
|
<el-dialog title="保存新航线" :visible.sync="showNameDialog" width="30%" :append-to-body="true" @open="onSaveRouteDialogOpen" @close="tempMapPlatform = null; saveDialogScenarioId = null"> |
|
|
|
<el-dialog title="保存新航线" :visible.sync="showNameDialog" width="30%" :append-to-body="true" @open="onSaveRouteDialogOpen" @close="onSaveNewRouteDialogClose"> |
|
|
|
<el-form label-width="80px"> |
|
|
|
<el-form-item label="航线名称"> |
|
|
|
<el-input v-model="newRouteName" placeholder="例如:航线一"></el-input> |
|
|
|
@ -559,6 +564,8 @@ export default { |
|
|
|
return { |
|
|
|
drawDom:false, |
|
|
|
airspaceDrawDom:false, |
|
|
|
/** 左侧菜单「框选平台」:多选房间平台图标并整体平移 */ |
|
|
|
platformBoxSelectMode: false, |
|
|
|
/** 是否允许地图拖动(由顶部小手图标切换,默认关闭) */ |
|
|
|
mapDragEnabled: false, |
|
|
|
// 在线成员弹窗 |
|
|
|
@ -589,6 +596,8 @@ export default { |
|
|
|
showNameDialog: false, |
|
|
|
newRouteName: '', |
|
|
|
tempMapPoints: [], |
|
|
|
/** 拆分航段:保存新航线成功后从原航线删除这些航点 id */ |
|
|
|
pendingSegmentSplitAfterNewRoute: null, |
|
|
|
/** 从平台右键「在此之前/在此之后插入航线」完成时传入,保存航线时用作 platformId */ |
|
|
|
tempMapPlatform: null, |
|
|
|
/** 保存新航线弹窗内选择的方案 ID(弹窗内可直接选方案,无需先展开侧边) */ |
|
|
|
@ -643,6 +652,7 @@ export default { |
|
|
|
{ id: '4t', name: '4T', icon: 'T' }, |
|
|
|
{ id: 'start', name: '冲突', icon: 'chongtu' }, |
|
|
|
{ id: 'insert', name: '平台', icon: 'el-icon-s-platform' }, |
|
|
|
{ id: 'platformBoxSelect', name: '框选平台', icon: 'el-icon-crop', action: 'platformBoxSelect' }, |
|
|
|
{ id: 'pattern', name: '空域', icon: 'ky' }, |
|
|
|
{ id: 'deduction', name: '推演', icon: 'el-icon-video-play' }, |
|
|
|
{ id: 'modify', name: '测距', icon: 'cj' }, |
|
|
|
@ -670,6 +680,7 @@ export default { |
|
|
|
}, |
|
|
|
// 顶部导航菜单项(用于图标选择)- 只显示指定的菜单项 |
|
|
|
topNavItems: [ |
|
|
|
{ id: 'platformBoxSelect', name: '框选平台', icon: 'el-icon-crop' }, |
|
|
|
{ id: 'routeEdit', name: '航线编辑', icon: 'el-icon-edit-outline' }, |
|
|
|
{ id: 'militaryMarking', name: '军事标绘', icon: 'el-icon-crop' }, |
|
|
|
{ id: 'attributeEdit', name: '属性修改', icon: 'el-icon-setting' }, |
|
|
|
@ -1584,11 +1595,58 @@ export default { |
|
|
|
|
|
|
|
/** 复制航线已放置:用当前偏移后的航点打开「保存新航线」弹窗 */ |
|
|
|
handleRouteCopyPlaced(points) { |
|
|
|
this.pendingSegmentSplitAfterNewRoute = null; |
|
|
|
this.tempMapPoints = points || []; |
|
|
|
this.tempMapPlatform = null; |
|
|
|
this.showNameDialog = true; |
|
|
|
}, |
|
|
|
|
|
|
|
/** 右键拆分航段/拆分复制:拉取航点后进入地图两点选范围 */ |
|
|
|
async handleRouteSegmentPick({ routeId, mode }) { |
|
|
|
if (routeId == null) return; |
|
|
|
if (this.routeLocked[routeId]) { |
|
|
|
this.$message.info('该航线已上锁,请先解锁后再操作'); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (this.isRouteLockedByOther(routeId)) { |
|
|
|
this.$message.warning('该航线正被其他成员编辑,请稍后再试'); |
|
|
|
return; |
|
|
|
} |
|
|
|
try { |
|
|
|
const res = await getRoutes(routeId); |
|
|
|
if (res.code !== 200 || !res.data) { |
|
|
|
this.$message.error('获取航线数据失败'); |
|
|
|
return; |
|
|
|
} |
|
|
|
const waypoints = res.data.waypoints || []; |
|
|
|
if (waypoints.length < 2) { |
|
|
|
this.$message.warning('航线航点不足,无法选取航段'); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (this.$refs.cesiumMap && typeof this.$refs.cesiumMap.startRouteSegmentPickMode === 'function') { |
|
|
|
const routeStyle = this.parseRouteStyle(res.data.attributes); |
|
|
|
this.$refs.cesiumMap.startRouteSegmentPickMode(routeId, waypoints, mode, routeStyle); |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
this.$message.error('获取航线数据失败'); |
|
|
|
console.error(e); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** 航段预览已放置:打开保存弹窗;拆分航段时记下待从原航线删除的航点 id */ |
|
|
|
handleRouteSegmentPlaced(payload) { |
|
|
|
const { mode, sourceRouteId, removedWaypointIds, points } = payload || {}; |
|
|
|
if (!points || points.length < 2) return; |
|
|
|
this.tempMapPoints = points; |
|
|
|
this.tempMapPlatform = null; |
|
|
|
if (mode === 'split' && sourceRouteId != null && removedWaypointIds && removedWaypointIds.length) { |
|
|
|
this.pendingSegmentSplitAfterNewRoute = { sourceRouteId, waypointIds: removedWaypointIds }; |
|
|
|
} else { |
|
|
|
this.pendingSegmentSplitAfterNewRoute = null; |
|
|
|
} |
|
|
|
this.showNameDialog = true; |
|
|
|
}, |
|
|
|
|
|
|
|
/** 地图上拖拽航点结束:将新位置写回数据库并刷新显示 */ |
|
|
|
async handleWaypointPositionChanged({ dbId, routeId, lat, lng, alt }) { |
|
|
|
if (this.isRouteLockedByOther(routeId)) { |
|
|
|
@ -2114,12 +2172,19 @@ export default { |
|
|
|
const styleRes = await getPlatformStyle({ roomId: rId, routeId, platformId: route.platformId }); |
|
|
|
if (styleRes.data && this.$refs.cesiumMap) { |
|
|
|
this.$refs.cesiumMap.setPlatformStyle(routeId, styleRes.data); |
|
|
|
if (styleRes.data.detectionZoneVisible !== false && styleRes.data.detectionZoneRadius != null && Number(styleRes.data.detectionZoneRadius) > 0) { |
|
|
|
this.$refs.cesiumMap.ensureDetectionZoneForRoute(routeId, styleRes.data.detectionZoneRadius, styleRes.data.detectionZoneColor || 'rgba(0, 150, 255, 0.35)', styleRes.data.detectionZoneOpacity); |
|
|
|
} |
|
|
|
if (styleRes.data.powerZoneVisible !== false && styleRes.data.powerZoneRadius != null && Number(styleRes.data.powerZoneRadius) > 0) { |
|
|
|
this.$refs.cesiumMap.ensurePowerZoneForRoute(routeId, styleRes.data.powerZoneRadius, styleRes.data.powerZoneAngle ?? 120, styleRes.data.powerZoneColor || 'rgba(255, 0, 0, 0.3)', styleRes.data.powerZoneOpacity); |
|
|
|
} |
|
|
|
const normalized = this.$refs.cesiumMap.normalizeZonesFromStyle(styleRes.data); |
|
|
|
(normalized.detectionZones || []).forEach(dz => { |
|
|
|
if (!dz) return; |
|
|
|
if (dz.radiusKm == null || Number(dz.radiusKm) <= 0) return; |
|
|
|
const opacity = dz.visible === false ? 0 : dz.opacity; |
|
|
|
this.$refs.cesiumMap.ensureDetectionZoneForRoute(routeId, dz.zoneId, dz.radiusKm, dz.color, opacity); |
|
|
|
}); |
|
|
|
(normalized.powerZones || []).forEach(pz => { |
|
|
|
if (!pz) return; |
|
|
|
if (pz.radiusKm == null || Number(pz.radiusKm) <= 0) return; |
|
|
|
const opacity = pz.visible === false ? 0 : pz.opacity; |
|
|
|
this.$refs.cesiumMap.ensurePowerZoneForRoute(routeId, pz.zoneId, pz.radiusKm, pz.angleDeg ?? 120, pz.color, opacity); |
|
|
|
}); |
|
|
|
} |
|
|
|
} catch (_) {} |
|
|
|
} |
|
|
|
@ -2470,6 +2535,26 @@ export default { |
|
|
|
}); |
|
|
|
|
|
|
|
this.routes = allRoutes; |
|
|
|
|
|
|
|
// 回滚/删除后后端可能不存在某些旧 routeId:右侧列表会消失,但地图实体如果不清理就会残留。 |
|
|
|
// 这里先把 activeRouteIds 与后端现存 routes 做一致性校正,并同步移除地图上“已消失的航线实体”。 |
|
|
|
const existingIdSet = new Set(allRoutes.map(r => String(r.id))); |
|
|
|
const missingRouteIds = (this.activeRouteIds || []).filter(id => !existingIdSet.has(String(id))); |
|
|
|
if (missingRouteIds.length > 0 && this.$refs.cesiumMap) { |
|
|
|
missingRouteIds.forEach((routeId) => { |
|
|
|
// removeRouteById 负责移除主航线/航点/盘旋与转弯半径弧等实体 |
|
|
|
this.$refs.cesiumMap.removeRouteById(routeId); |
|
|
|
// 同时清理探测区/威力区(removeRouteById 不覆盖这两类时显式保持一致) |
|
|
|
this.$refs.cesiumMap.removeDetectionZoneByRouteId(routeId); |
|
|
|
this.$refs.cesiumMap.removePowerZoneByRouteId(routeId); |
|
|
|
}); |
|
|
|
} |
|
|
|
this.activeRouteIds = (this.activeRouteIds || []).filter(id => existingIdSet.has(String(id))); |
|
|
|
// 如果当前选中航线也已回滚消失,则清空选中状态,避免右侧面板/地图再引用旧数据 |
|
|
|
if (this.selectedRouteId != null && !existingIdSet.has(String(this.selectedRouteId))) { |
|
|
|
this.selectedRouteId = null; |
|
|
|
this.selectedRouteDetails = null; |
|
|
|
} |
|
|
|
// 先预取所有展示中航线的平台样式,再渲染,避免平台图标先黑后变色(大房间时用方案所属子房间的 roomId) |
|
|
|
if (this.activeRouteIds.length > 0 && this.$refs.cesiumMap) { |
|
|
|
const roomId = this.currentRoomId; |
|
|
|
@ -2534,6 +2619,7 @@ export default { |
|
|
|
this.drawDom = false; |
|
|
|
return; |
|
|
|
} |
|
|
|
this.pendingSegmentSplitAfterNewRoute = null; |
|
|
|
this.tempMapPoints = points; |
|
|
|
this.tempMapPlatform = (options && (options.platformId != null || options.platform)) ? options : null; |
|
|
|
this.showNameDialog = true; |
|
|
|
@ -2543,6 +2629,12 @@ export default { |
|
|
|
this.saveDialogScenarioId = this.selectedPlanId || (this.plans[0] && this.plans[0].id) || null; |
|
|
|
}, |
|
|
|
|
|
|
|
onSaveNewRouteDialogClose() { |
|
|
|
this.tempMapPlatform = null; |
|
|
|
this.saveDialogScenarioId = null; |
|
|
|
this.pendingSegmentSplitAfterNewRoute = null; |
|
|
|
}, |
|
|
|
|
|
|
|
openAddHoldDuringDrawing() { |
|
|
|
this.addHoldContext = { mode: 'drawing' }; |
|
|
|
this.addHoldForm = { holdType: 'hold_circle', edgeLengthKm: 20, clockwise: true, startTime: '', startTimeMinutes: 60 }; |
|
|
|
@ -2617,6 +2709,21 @@ export default { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const pendingSplit = this.pendingSegmentSplitAfterNewRoute; |
|
|
|
if (pendingSplit && pendingSplit.sourceRouteId != null && Array.isArray(pendingSplit.waypointIds) && pendingSplit.waypointIds.length > 0) { |
|
|
|
const roomIdParam = this.currentRoomId != null ? { roomId: this.currentRoomId } : {}; |
|
|
|
try { |
|
|
|
for (const wid of pendingSplit.waypointIds) { |
|
|
|
await delWaypoints(wid, roomIdParam); |
|
|
|
} |
|
|
|
this.wsConnection?.sendSyncWaypoints?.(pendingSplit.sourceRouteId); |
|
|
|
} catch (splitErr) { |
|
|
|
console.error(splitErr); |
|
|
|
this.$message.warning('新航线已保存,但从原航线切除所选航段失败,请手动删除原航线上的对应航点'); |
|
|
|
} |
|
|
|
} |
|
|
|
this.pendingSegmentSplitAfterNewRoute = null; |
|
|
|
|
|
|
|
// 1. 更新当前选中详情 |
|
|
|
this.selectedRouteId = newRouteId; |
|
|
|
this.selectedRouteDetails = JSON.parse(JSON.stringify(savedRoute)); |
|
|
|
@ -3332,7 +3439,8 @@ export default { |
|
|
|
'toggleRoute': () => this.toggleRoute(), |
|
|
|
'layerFavorites': () => this.layerFavorites(), |
|
|
|
'routeFavorites': () => this.routeFavorites(), |
|
|
|
'refresh': () => this.captureMapScreenshot() |
|
|
|
'refresh': () => this.captureMapScreenshot(), |
|
|
|
'platformBoxSelect': () => this.togglePlatformBoxSelectMenu() |
|
|
|
} |
|
|
|
|
|
|
|
if (actionMap[actionId]) { |
|
|
|
@ -3340,6 +3448,27 @@ export default { |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** 左侧「框选平台」:与菜单项 id 无关,统一用 action: platformBoxSelect 触发(含图标编辑添加的随机 id 项) */ |
|
|
|
togglePlatformBoxSelectMenu() { |
|
|
|
this.platformBoxSelectMode = !this.platformBoxSelectMode |
|
|
|
this.activeMenu = this.platformBoxSelectMode ? 'platformBoxSelect' : '' |
|
|
|
if (!this.platformBoxSelectMode) { |
|
|
|
if (this.$refs.cesiumMap && typeof this.$refs.cesiumMap.exitPlatformBoxSelectMode === 'function') { |
|
|
|
this.$refs.cesiumMap.exitPlatformBoxSelectMode() |
|
|
|
} |
|
|
|
} else { |
|
|
|
this.drawDom = false |
|
|
|
this.airspaceDrawDom = false |
|
|
|
this.isRightPanelHidden = true |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** 地图内右键退出框选(子组件 emit) */ |
|
|
|
onRequestExitPlatformBoxSelect() { |
|
|
|
this.platformBoxSelectMode = false |
|
|
|
this.activeMenu = '' |
|
|
|
}, |
|
|
|
|
|
|
|
/** 截图:隐藏上下左右菜单只保留地图,用 postRender + readPixels 避免 WebGL 缓冲被清空导致黑屏 */ |
|
|
|
async captureMapScreenshot() { |
|
|
|
const cm = this.$refs.cesiumMap |
|
|
|
@ -4010,7 +4139,7 @@ export default { |
|
|
|
map.setPlatformIconServerId(entityData.id, res.data.id, this.currentRoomId) |
|
|
|
entityData.serverId = res.data.id |
|
|
|
entityData.roomId = this.currentRoomId |
|
|
|
this.$message.success('平台图标已保存到当前房间') |
|
|
|
// 保存成功提示会遮挡地图,当前禁用该提示 |
|
|
|
this.wsConnection?.sendSyncPlatformIcons?.() |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
@ -4035,6 +4164,27 @@ export default { |
|
|
|
}).catch(() => {}) |
|
|
|
}, 500) |
|
|
|
}, |
|
|
|
/** 框选整体拖拽结束:批量写库(避免多次 emit 被防抖合并为只保存最后一个) */ |
|
|
|
onPlatformIconsBatchUpdated(list) { |
|
|
|
if (!list || !list.length) return |
|
|
|
const payloads = list.filter(e => e && e.serverId) |
|
|
|
if (!payloads.length) return |
|
|
|
Promise.all( |
|
|
|
payloads.map(ed => |
|
|
|
updateRoomPlatformIcon({ |
|
|
|
id: ed.serverId, |
|
|
|
lng: ed.lng, |
|
|
|
lat: ed.lat, |
|
|
|
heading: ed.heading != null ? ed.heading : 0, |
|
|
|
iconScale: ed.iconScale != null ? ed.iconScale : 1 |
|
|
|
}) |
|
|
|
) |
|
|
|
) |
|
|
|
.then(() => { |
|
|
|
this.wsConnection?.sendSyncPlatformIcons?.() |
|
|
|
}) |
|
|
|
.catch(() => {}) |
|
|
|
}, |
|
|
|
/** 平台图标从地图删除时同步删除服务端记录 */ |
|
|
|
onPlatformIconRemoved({ serverId }) { |
|
|
|
if (!serverId) return |
|
|
|
@ -4191,6 +4341,21 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
selectMenu(item) { |
|
|
|
// 带 action 的项会先触发 handleMenuAction 再进此处;框选已在 handleMenuAction 中切换,避免重复 |
|
|
|
if (item.action === 'platformBoxSelect') { |
|
|
|
return |
|
|
|
} |
|
|
|
// 旧版菜单数据可能仅有 id、无 action |
|
|
|
if (item.id === 'platformBoxSelect') { |
|
|
|
this.togglePlatformBoxSelectMenu() |
|
|
|
return |
|
|
|
} |
|
|
|
if (this.platformBoxSelectMode) { |
|
|
|
this.platformBoxSelectMode = false |
|
|
|
if (this.$refs.cesiumMap && typeof this.$refs.cesiumMap.exitPlatformBoxSelectMode === 'function') { |
|
|
|
this.$refs.cesiumMap.exitPlatformBoxSelectMode() |
|
|
|
} |
|
|
|
} |
|
|
|
this.activeMenu = item.id; |
|
|
|
if (item.action) { |
|
|
|
this.handleMenuAction(item.action) |
|
|
|
@ -5542,6 +5707,62 @@ export default { |
|
|
|
if (cache) { |
|
|
|
routeIdToTimeline[routeId] = cache; |
|
|
|
routeIdsWithTimeline.push(routeId); |
|
|
|
|
|
|
|
// 关键修复:缓存命中时也要生成“时间类冲突”,否则第二次点击会只剩空间类冲突导致空结果 |
|
|
|
const { earlyArrivalLegs, lateArrivalLegs, holdDelayConflicts } = cache; |
|
|
|
const routeName = route.name || `航线${route.id}`; |
|
|
|
(earlyArrivalLegs || []).forEach(leg => { |
|
|
|
const earlyMin = leg.earlyMinutes != null ? Math.round(leg.earlyMinutes * 10) / 10 : 0; |
|
|
|
const earlyStr = earlyMin >= 0.1 ? `约 ${earlyMin} 分钟` : `约 ${Math.round(earlyMin * 60)} 秒`; |
|
|
|
const speedStr = leg.suggestedSpeedKmh != null && Number.isFinite(leg.suggestedSpeedKmh) ? `约 ${leg.suggestedSpeedKmh} km/h` : '(按计划时间反算)'; |
|
|
|
const kTimeStr = this.minutesToStartTime(leg.scheduled); |
|
|
|
allRaw.push({ |
|
|
|
type: CONFLICT_TYPE.TIME, |
|
|
|
subType: 'early_arrival', |
|
|
|
title: '提前到达', |
|
|
|
routeName, |
|
|
|
routeIds: [routeId], |
|
|
|
fromWaypoint: leg.fromName, |
|
|
|
toWaypoint: leg.toName, |
|
|
|
time: this.minutesToStartTime(leg.actualArrival), |
|
|
|
suggestion: `① 将本段速度降至 ${speedStr} ② 若下一航点为盘旋点,可盘旋等待 ${earlyStr} ③ 将下一航点相对K时调至 ${kTimeStr} 或更晚`, |
|
|
|
severity: 'high' |
|
|
|
}); |
|
|
|
}); |
|
|
|
(lateArrivalLegs || []).forEach(leg => { |
|
|
|
const kTimeStr = leg.actualArrival != null && Number.isFinite(leg.actualArrival) ? this.minutesToStartTime(leg.actualArrival) : ''; |
|
|
|
const part2 = kTimeStr ? ` ② 或将下一航点相对K时调至 ${kTimeStr} 或更晚` : ' ② 或将下一航点相对K时调晚'; |
|
|
|
allRaw.push({ |
|
|
|
type: CONFLICT_TYPE.TIME, |
|
|
|
subType: 'late_arrival', |
|
|
|
title: '无法按时到达', |
|
|
|
routeName, |
|
|
|
routeIds: [routeId], |
|
|
|
fromWaypoint: leg.fromName, |
|
|
|
toWaypoint: leg.toName, |
|
|
|
suggestion: `① 将本段速度提升至 ≥${leg.requiredSpeedKmh} km/h${part2} ③ 调整上游航段速度或时间`, |
|
|
|
severity: 'high' |
|
|
|
}); |
|
|
|
}); |
|
|
|
(holdDelayConflicts || []).forEach(conf => { |
|
|
|
allRaw.push({ |
|
|
|
type: CONFLICT_TYPE.TIME, |
|
|
|
subType: 'hold_delay', |
|
|
|
title: '盘旋时间不足', |
|
|
|
routeName, |
|
|
|
routeIds: [routeId], |
|
|
|
fromWaypoint: conf.fromName, |
|
|
|
toWaypoint: conf.toName, |
|
|
|
time: this.minutesToStartTime(conf.setExitTime), |
|
|
|
position: conf.holdCenter ? `经度 ${conf.holdCenter.lng.toFixed(5)}°, 纬度 ${conf.holdCenter.lat.toFixed(5)}°` : undefined, |
|
|
|
suggestion: `实际切出将延迟 ${conf.delaySeconds} 秒。① 延长该盘旋点相对K时 ② 定时盘旋调转弯半径,非定时调上一航点速度或本点相对K时 ③ 微调上下游航点相对K时`, |
|
|
|
severity: 'high', |
|
|
|
holdCenter: conf.holdCenter, |
|
|
|
positionLng: conf.holdCenter && conf.holdCenter.lng, |
|
|
|
positionLat: conf.holdCenter && conf.holdCenter.lat, |
|
|
|
positionAlt: conf.holdCenter && conf.holdCenter.alt |
|
|
|
}); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
let pathData = null; |
|
|
|
if (this.$refs.cesiumMap && this.$refs.cesiumMap.getRoutePathWithSegmentIndices) { |
|
|
|
@ -5554,7 +5775,11 @@ export default { |
|
|
|
routeIdToTimeline[routeId] = { |
|
|
|
segments: timeline.segments, |
|
|
|
path: pathData && pathData.path ? pathData.path : null, |
|
|
|
segmentEndIndices: pathData && pathData.segmentEndIndices ? pathData.segmentEndIndices : null |
|
|
|
segmentEndIndices: pathData && pathData.segmentEndIndices ? pathData.segmentEndIndices : null, |
|
|
|
// 缓存时间类冲突的中间结果,避免第二次点击时“只算空间不算时间” |
|
|
|
earlyArrivalLegs: timeline.earlyArrivalLegs || [], |
|
|
|
lateArrivalLegs: timeline.lateArrivalLegs || [], |
|
|
|
holdDelayConflicts: timeline.holdDelayConflicts || [] |
|
|
|
}; |
|
|
|
this._setConflictTimelineCache(routeId, route.waypoints, minMinutes, maxMinutes, routeIdToTimeline[routeId]); |
|
|
|
routeIdsWithTimeline.push(routeId); |
|
|
|
|