## 2026-03-31 日志

### 用户问题解答
- 解释了 `isChange_flag_firstBackDate` 字段的作用：这是一个时间轴和 WebSocket 数据流同步的状态标志
  - 字段含义：首次返回数据变化标志
  - 用途：协调用户时间选择和数据更新的时序，防止竞态条件
  - 工作机制：拖动时间轴时设为 false，WebSocket 返回数据时设为 true，只有当为 true 时才允许根据时间变化更新子系统数据

- 解释了 `selectedEndTime` 监听的作用：
  - 时间驱动的数据分发中心，连接用户操作、WebSocket 数据流、UE 场景和子系统图表
  - 主要功能：更新子系统数据、通知 UE 场景、控制自动播放、同步全局状态

- 分析了 `callBackCycleTimePointFn` 一秒发两次的问题：
  - 原因：`selectedEndTime` 在短时间内被更新两次，可能是自动播放逻辑中的双重更新
  - 解决方案：添加防抖/节流控制，确保一秒内只发送一次

- 查找了 `gridInfoList` 的更新位置：
  - 主要更新位置：`header/index.vue` 中的 `getGridInfoListData()` 函数
  - 触发时机：页面加载时 (`onMounted`) 获取一次
  - 数据用途：热力图组件中合并和显示卫星格网数据

- 查找了 `satelliteData` 通过 WS 赋值的流程：
  - 数据流：WebSocket → footer/timers.vue → Pinia Store → lefts/index.vue 监听器 → satelliteData
  - 关键赋值位置：lefts/index.vue 第858行（历史模式）和第914行（实时模式）
  - 转换函数：`wssTransformSatelliteData()` 将后端数据转换为前端表格格式

- 查找了设置开始时间和结束时间的代码位置：
  - 主要设置函数：`handleDateRangeChange()`（用户选择日期范围）
  - 核心计算函数：`updateSelectedTimes()`（根据滑块百分比计算选中时间）
  - 时间变量：`startDateTime`/`endDateTime`（总范围），`selectedStartTime`/`selectedEndTime`（选中范围）
  - 数据流向：用户选择 → 更新 store → 计算选中时间 → 触发监听更新界面

### 之前的 CSS 修复
- 修复了 `screenConfigeDialog.vue` 中的背景图语法错误
- 修正了 `index.vue` 中 el-dialog 的背景色和宽度设置
- 解决了 WebUI 页面透明问题（UE 地球场景透出）

- 修复了时间轴固定时间被覆盖的 Bug：
  - 根本原因：`footer/component/timers.vue` 第756行有一个 `setInterval`（每1秒执行），启动时立刻调用 `autoHandleDateRangeChange`，强制将时间重置为"当前时间往前推24小时"
  - 修复方案：注释掉该初始 `setInterval`（保留 `watch` 里受 `isDateRangeNotEmpty` 控制的部分）
  - 同时修复了 `updateTimeline()` 中 `endHandlePercent.value = 0` 的 Bug，改为 `100`

- 修复了时间轴刻度标签多显示1天的 Bug：
  - 根本原因：`timeMarkers` 计算中每个 label 都多加了 `.add(1, 'day')`
  - 修复方案：去掉 label 生成时的 `.add(1, 'day')`

### 关键发现
- 项目时间轴组件使用 WebSocket 与后端通信，数据流同步机制较为复杂
- `isChange_flag_firstBackDate` 是实现数据时序控制的核心标志之一
- 项目有复杂的 UE 和 WebUI 集成机制，涉及时间同步和数据分发
- 左侧卫星数据表格通过 WebSocket 实时更新，数据流经过多个组件传递
- **时间轴有自动实时滚动机制**：通过 `autoUpdateDateRange` setInterval 每秒更新一次，正常模式下应注释掉初始定时器，用 `isDateRangeNotEmpty` watch 控制实时/历史模式切换

### 主系统/子系统实时模式状态同步（2026-04-03）
- **问题1**：历史模式从子系统返回后可以恢复播放，实时模式返回后会被重置
- **根本原因**：onMounted 中只判断了历史模式 (`globalLeftWssCONTINE.type === "history"`)，实时模式走了 else 分支，调用了 `updateTimeline()` 和 `realTimeData()`，导致从头开始
- **修复方案1**：
  1. 在 Store 添加 `globalIsRealtime` 字段保存实时/历史模式状态
  2. `onUnmounted` 时保存 `is_flag_isRealtime` 到 `globalIsRealtime`
  3. `onMounted` 中添加实时模式返回的判断分支：
     - 恢复 `is_flag_isRealtime = true`
     - 只刷新刻度（`generateTimelineDates()`），不调用 `updateTimeline()`
     - 重新开启实时 WS（`realTimeData()`）
     - 重新启动自动播放（`startAutoPlay()`）
  4. 避免底部 `!isPlaying` 判断重复调用 `realTimeData()`（增加 `!footerTimeHasedSelectTimeToSub` 条件）

- **问题2**：历史模式返回的判断条件不精确，原代码用 `!globalIsRealtime` 判断，这不够准确
- **根本原因**：应该通过 WebSocket 数据对象 `globalLeftWssCONTINE.type` 来精确区分历史模式和实时模式
- **修复方案2**：
  - 历史模式判断从 `!globalIsRealtime` 改为 `globalLeftWssCONTINE?.type === "history"`
  - 同时将历史模式恢复时 `wssOpenHandle` 的 `isRealtime` 参数改为 `false`，确保参数正确性

- **代码位置**：
  - Store：`src/store/module/app.js`（添加 `globalIsRealtime` 和 `setGlobalIsRealtime`）
  - 组件：`src/pages/footer/component/timers.vue`（修改 `onUnmounted` 和 `onMounted` 的三个分支）