WholeProcessPlatform/frontend/docs/地图模块重构实施清单.md

381 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 地图模块重构实施清单
## 1. 使用说明
本文档是地图模块重构的执行清单,只保留当前已经明确、可以直接落地的实施项。
以下内容暂不纳入本清单:
- 仍需进一步讨论的方案;
- 依赖后端配合后才能确定的优化项;
- 暂未确定收益与改造成本的预研项;
- 调试面板、埋点体系、长期性能平台化建设等扩展项。
执行原则:
- 先止血,再拆层,再提速;
- 每一步都要保证现有业务可用;
- 每个阶段结束后都要做功能回归;
- 不在同一阶段同时改动 UI、Store、地图渲染层的大块逻辑。
---
## 2. 本轮重构目标
本轮只完成以下确定目标:
- 收口当前明显缺陷和遗留代码;
- 建立基础类型和索引;
- 将分散在组件中的核心业务规则收口;
- 拆分地图 Store建立更清晰的数据职责
- 抽离统一编排层;
- 拆分 `map.ol.ts` 的核心管理职责;
- 保证图层树、图例、锚点显隐链路更清晰;
- 为后续继续重构预留稳定结构。
---
## 3. 阶段一:现状收口与问题修复
## 3.1 清理明显遗留问题
- [ ] 删除 `map.ol.ts` 中无意义代码和重复日志
- [ ] 清理大段失效注释,保留必要说明
- [ ] 统一地图相关文件中的临时 `console.log`
涉及文件:
- `src/components/gis/map.ol.ts`
验收标准:
- 页面可正常编译;
- 首次进入地图页面不报错;
- 控制台不再出现未定义函数或变量错误;
- 默认图层、图例、锚点仍可正常显示。
## 3.2 补充基础类型定义
- [ ] 新增地图图层类型定义
- [ ] 新增图例结构类型定义
- [ ] 新增锚点数据类型定义
- [ ] 新增筛选参数类型定义
- [ ]`map.ts`、`map.class.ts`、`map.ol.ts` 替换第一批高频 `any`
建议新增文件:
- `src/modules/map/types/map-layer.ts`
- `src/modules/map/types/map-legend.ts`
- `src/modules/map/types/map-point.ts`
- `src/modules/map/types/map-filter.ts`
验收标准:
- 核心地图模块类型边界可读;
- 新增类型后不影响现有运行;
- `map.ts`、`map.ol.ts` 中关键方法参数不再全部使用 `any`
## 3.3 建立基础索引
- [x] 建立 `layerByKey` 索引
- [x] 建立 `legendByNameEn` 索引
- [x] 建立 `legendByLayerCode` 索引
- [x]`findLayerByKey()` 的高频调用逐步替换为索引访问
- [x] 将图例派生中的重复递归改为“初始化索引 + 增量查询”
优先改造位置:
- `src/store/modules/map.ts`
验收标准:
- 图层查找和图例查找不再完全依赖全量递归;
- 图层勾选、图例切换后响应速度不下降;
- 功能表现与现状一致。
---
## 4. 阶段二:规则收口
## 4.1 收口互斥规则
- [x] 将图层互斥逻辑从 `LayerController.vue` 中移出
- [x] 将视频监控站与 AI 视频监控站互斥统一到规则函数
- [x] 将环保设施与环保设施在建互斥统一到规则函数
- [x] 将珍稀鱼类与沿程鱼类互斥统一到规则函数
- [x] 保证互斥规则只有一个入口执行
建议新增文件:
- `src/modules/map/domain/map-layer-rules.ts`
涉及文件:
- `src/components/mapController/LayerController.vue`
- `src/store/modules/map.ts`
验收标准:
- 图层树勾选时互斥结果稳定;
- 不再同时在组件和 Store 两处维护同一套互斥规则;
- 勾选结果、图例结果、地图显示结果保持一致。
## 4.2 收口图例派生规则
- [x] 将“图层选中后生成图例”逻辑提炼为独立函数
- [x] 将“环保设施图例自动补充”逻辑提炼为独立规则
- [x] 分离图例原始结构与图例选中状态
- [x] 保证 `legendDataOriginal` 不再被运行态逻辑污染
建议新增文件:
- `src/modules/map/domain/legend-deriver.ts`
涉及文件:
- `src/store/modules/map.ts`
- `src/components/mapLegend/index.vue`
验收标准:
- 图例显示仍按当前选中图层正确联动;
- 图例点击后锚点显隐正确;
- 图例原始结构与运行时状态职责更清晰。
---
## 5. 阶段三:拆分 Store
## 5.1 拆分配置状态
- [ ] 抽离图层树配置状态
- [ ] 抽离图例原始配置状态
- [ ] 抽离页面地图配置加载逻辑
建议新增文件:
- `src/modules/map/stores/map-config.store.ts`
当前迁移来源:
- `src/store/modules/map.ts`
- `src/api/map.ts`
## 5.2 拆分运行状态
- [ ] 抽离当前选中图层 key
- [ ] 抽离当前选中图例 key
- [ ] 抽离当前基地、时间范围、缩放级别等运行态
- [ ] 统一“当前地图状态”的唯一来源
建议新增文件:
- `src/modules/map/stores/map-view.store.ts`
## 5.3 拆分数据缓存
- [ ] 抽离锚点缓存
- [ ] 抽离图层加载状态
- [ ] 抽离锚点合并数据 `pointData`
- [ ] 为每个图层维护独立 `loading / loaded / error`
建议新增文件:
- `src/modules/map/stores/map-data.store.ts`
验收标准:
-`map.ts` 体积明显下降;
- 配置、运行态、数据缓存职责分离;
- 现有组件仍可通过兼容方式读取数据;
- 默认图层、图例、锚点加载不受影响。
---
## 6. 阶段四:建立统一编排层
## 6.1 新增地图编排器
- [x] 新增地图模块统一编排入口
- [x] 将地图初始化流程迁移到编排器
- [x] 将图层勾选、图例勾选、基地切换、时间筛选、搜索定位改为统一命令
- [x] 收口 `GisView.vue` 中的配置加载与监听联动逻辑
建议新增文件:
- `src/modules/map/application/map-orchestrator.ts`
## 6.2 统一入口命令
- [x] 定义 `initialize(pageKey)`
- [x] 定义 `toggleLayer(layerKey)`
- [x] 定义 `toggleLegend(layerKey, legendKey)`
- [x] 定义 `changeBaseId(baseId)`
- [x] 定义 `changeTimeRange(range)`
- [x] 定义 `focusPoint(pointId)`
涉及文件:
- `src/components/gis/GisView.vue`
- `src/components/mapController/LayerController.vue`
- `src/components/mapLegend/index.vue`
- `src/components/mapFilter/index.vue`
验收标准:
- 地图相关 UI 组件不再直接拼复杂业务逻辑;
- 组件交互都通过统一入口触发;
- 图层树、图例、筛选的联动链路更容易追踪。
---
## 7. 阶段五:拆分 OpenLayers 渲染层
## 7.1 拆分点图层管理
- [ ]`map.ol.ts` 中抽离锚点图层创建逻辑
- [ ]`map.ol.ts` 中抽离锚点显隐逻辑
- [ ]`map.ol.ts` 中抽离图例控制锚点逻辑
- [ ] 在点图层管理模块中维护图层注册表
建议新增文件:
- `src/components/gis/ol/point-layer-manager.ts`
当前迁移来源:
- `src/components/gis/map.ol.ts`
## 7.2 拆分 Popup 管理
- [ ] 抽离 `initPopupOverlay()`
- [ ] 抽离 `detectFeatureAtPixel()`
- [ ] 抽离 `showPopup()`
- [ ] 收口 hover 和 click 交互逻辑
建议新增文件:
- `src/components/gis/ol/popup-manager.ts`
## 7.3 拆分区域过滤管理
- [x] 抽离基地切换后的区域裁切逻辑
- [x] 抽离点在面内判断逻辑
- [x] 抽离区域外锚点显隐逻辑
- [x] 抽离遮罩应用与清理逻辑
建议新增文件:
- `src/components/gis/ol/region-mask-manager.ts`
验收标准:
- `map.ol.ts` 文件长度和职责明显收缩;
- 点图层、Popup、基地裁切三类逻辑各自独立
- 现有地图交互行为不变。
---
## 8. 阶段六:组件瘦身
## 8.1 `GisView.vue`
- [x] 仅保留地图容器、地图初始化调用、组件挂载
- [x] 移除配置请求和复杂 watch 编排逻辑
- [x] 只通过编排器触发初始化和页面切换
## 8.2 `LayerController.vue`
- [x] 只保留树渲染与勾选事件
- [x] 移除互斥规则
- [x] 移除基础图层初始化编排逻辑
## 8.3 `MapLegend.vue`
- [x] 只保留图例渲染与点击事件分发
- [x] 不直接调用地图实例
## 8.4 `MapFilter.vue`
- [x] 只保留表单与用户输入
- [x] 搜索、容量、时间、基地变化全部通过编排器分发
- [x] 不直接修改图例运行态和锚点显隐
验收标准:
- 组件文件职责单一;
- UI 组件中不再出现大段业务逻辑;
- 地图相关行为主要集中在编排层和 Store。
---
## 9. 阶段七:性能优化
## 9.1 请求与缓存优化
- [x]`GisUrlList.ts` 预编译为索引字典,而不是每次请求时重建
- [x] 实现真实请求去重
- [x] 增加请求取消能力,避免菜单切换时旧请求回写
- [x] 对图层加载增加并发控制
- [x] 将缓存 key 与图层 key、筛选条件绑定
## 9.2 锚点显示优化
- [x] 图例切换时只处理目标图例对应的锚点集合
- [x] 图层切换时优先切换图层可见性,不重复加点
- [x] 减少 hover 时全量点图层重绘
- [x] 减少样式函数中的业务判断复杂度
验收标准:
- 首屏加载时长不高于当前;
- 图层勾选、图例勾选、基地切换响应速度优于当前;
- 菜单快速切换时不出现旧数据回写。
---
## 10. 回归测试清单
每完成一个阶段,至少回归以下功能:
- [x] 地图初始化正常
- [x] 默认基础图层正常显示
- [x] 图层树勾选与取消勾选正常
- [x] 图例随图层选中动态显示
- [x] 图例点击能正确控制锚点显隐
- [x] 基地切换后区域裁切和锚点过滤正常
- [x] 锚点 hover Popup 正常
- [x] 锚点点击详情弹窗正常
- [x] 时间筛选、容量筛选、搜索定位正常
- [x] 视频监控站与 AI 视频监控站互斥正常
- [x] 菜单切换后地图数据不串页
---
## 11. 实施顺序建议
推荐严格按以下顺序执行:
1. 阶段一:现状收口与问题修复
2. 阶段二:规则收口
3. 阶段三:拆分 Store
4. 阶段四:建立统一编排层
5. 阶段五:拆分 OpenLayers 渲染层
6. 阶段六:组件瘦身
7. 阶段七:性能优化
不建议直接跳到渲染层拆分或性能优化,否则会在旧结构上重复返工。
---
## 12. 本轮交付标准
当本清单全部完成后,应达到以下结果:
- 地图模块核心职责划分清晰;
- 图层树、图例、锚点、筛选、基地切换链路可追踪;
- 关键规则不再散落在多个组件里;
- `map.ts``map.ol.ts` 体积明显下降;
- 新增地图业务时有明确扩展点;
- 后续继续做底图体系优化、长期性能建设时不需要再推翻本轮结构。